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.
Files changed (35) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +42 -1
  3. package/dist/cjs/validators/number.d.ts +3 -0
  4. package/dist/cjs/validators/number.d.ts.map +1 -1
  5. package/dist/cjs/validators/number.js +9 -0
  6. package/dist/cjs/validators/number.js.map +1 -1
  7. package/dist/cjs/validators/object/index.d.ts +2 -1
  8. package/dist/cjs/validators/object/index.d.ts.map +1 -1
  9. package/dist/cjs/validators/object/index.js +2 -1
  10. package/dist/cjs/validators/object/index.js.map +1 -1
  11. package/dist/cjs/validators/object/pick.d.ts +5 -0
  12. package/dist/cjs/validators/object/pick.d.ts.map +1 -0
  13. package/dist/cjs/validators/object/pick.js +54 -0
  14. package/dist/cjs/validators/object/pick.js.map +1 -0
  15. package/dist/cjs/validators/string/string.d.ts +3 -0
  16. package/dist/cjs/validators/string/string.d.ts.map +1 -1
  17. package/dist/cjs/validators/string/string.js +14 -3
  18. package/dist/cjs/validators/string/string.js.map +1 -1
  19. package/dist/esm/validators/number.d.ts +3 -0
  20. package/dist/esm/validators/number.d.ts.map +1 -1
  21. package/dist/esm/validators/number.js +9 -0
  22. package/dist/esm/validators/number.js.map +1 -1
  23. package/dist/esm/validators/object/index.d.ts +2 -1
  24. package/dist/esm/validators/object/index.d.ts.map +1 -1
  25. package/dist/esm/validators/object/index.js +2 -1
  26. package/dist/esm/validators/object/index.js.map +1 -1
  27. package/dist/esm/validators/object/pick.d.ts +5 -0
  28. package/dist/esm/validators/object/pick.d.ts.map +1 -0
  29. package/dist/esm/validators/object/pick.js +50 -0
  30. package/dist/esm/validators/object/pick.js.map +1 -0
  31. package/dist/esm/validators/string/string.d.ts +3 -0
  32. package/dist/esm/validators/string/string.d.ts.map +1 -1
  33. package/dist/esm/validators/string/string.js +14 -3
  34. package/dist/esm/validators/string/string.js.map +1 -1
  35. 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?: RegExp` - Regex pattern to match
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.
@@ -2,6 +2,9 @@ import type { Validator } from '../common';
2
2
  type NumberOptions = {
3
3
  min?: number;
4
4
  max?: number;
5
+ int?: boolean;
6
+ positive?: boolean;
7
+ negative?: boolean;
5
8
  coerce?: boolean;
6
9
  };
7
10
  export declare const num: (opts?: NumberOptions) => Validator<number>;
@@ -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,CA8B1D,CAAC"}
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;AAQ/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,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;AA9BW,QAAA,GAAG,OA8Bd"}
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,4 +1,5 @@
1
1
  export * from './object';
2
- export * from './partial';
3
2
  export * from './omit';
3
+ export * from './pick';
4
+ export * from './partial';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/validators/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,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,4CAA0B;AAC1B,yCAAuB"}
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"}
@@ -3,6 +3,9 @@ type StringOptions = {
3
3
  minLen?: number;
4
4
  maxLen?: number;
5
5
  pattern?: string;
6
+ startsWith?: string;
7
+ endsWith?: string;
8
+ trim?: boolean;
6
9
  coerce?: boolean;
7
10
  };
8
11
  export declare const str: (opts?: StringOptions) => Validator<string>;
@@ -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,CAkC1D,CAAC"}
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 val = opts?.coerce ? coerceString(value) : value;
12
- if (typeof val !== 'string') {
13
- const valueType = (0, getValueType_1.getValueType)(val);
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;AASlD,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,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,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,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;AAlCW,QAAA,GAAG,OAkCd"}
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"}
@@ -2,6 +2,9 @@ import type { Validator } from '../common';
2
2
  type NumberOptions = {
3
3
  min?: number;
4
4
  max?: number;
5
+ int?: boolean;
6
+ positive?: boolean;
7
+ negative?: boolean;
5
8
  coerce?: boolean;
6
9
  };
7
10
  export declare const num: (opts?: NumberOptions) => Validator<number>;
@@ -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,CA8B1D,CAAC"}
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;AAQ/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,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
+ {"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,4 +1,5 @@
1
1
  export * from './object';
2
- export * from './partial';
3
2
  export * from './omit';
3
+ export * from './pick';
4
+ export * from './partial';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/validators/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,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,4 +1,5 @@
1
1
  export * from './object';
2
- export * from './partial';
3
2
  export * from './omit';
3
+ export * from './pick';
4
+ export * from './partial';
4
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/validators/object/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,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"}
@@ -3,6 +3,9 @@ type StringOptions = {
3
3
  minLen?: number;
4
4
  maxLen?: number;
5
5
  pattern?: string;
6
+ startsWith?: string;
7
+ endsWith?: string;
8
+ trim?: boolean;
6
9
  coerce?: boolean;
7
10
  };
8
11
  export declare const str: (opts?: StringOptions) => Validator<string>;
@@ -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,CAkC1D,CAAC"}
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 val = opts?.coerce ? coerceString(value) : value;
9
- if (typeof val !== 'string') {
10
- const valueType = getValueType(val);
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;AASlD,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,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,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,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"}
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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sibyl-ts",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "TypeScript validation library with type-safe validators",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",