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.
Files changed (65) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +213 -3
  3. package/dist/cjs/index.d.ts +3 -0
  4. package/dist/cjs/index.d.ts.map +1 -1
  5. package/dist/cjs/index.js +2 -0
  6. package/dist/cjs/index.js.map +1 -1
  7. package/dist/cjs/refine.d.ts +3 -0
  8. package/dist/cjs/refine.d.ts.map +1 -0
  9. package/dist/cjs/refine.js +23 -0
  10. package/dist/cjs/refine.js.map +1 -0
  11. package/dist/cjs/transform.d.ts +3 -0
  12. package/dist/cjs/transform.d.ts.map +1 -0
  13. package/dist/cjs/transform.js +14 -0
  14. package/dist/cjs/transform.js.map +1 -0
  15. package/dist/cjs/validators/number.d.ts +3 -0
  16. package/dist/cjs/validators/number.d.ts.map +1 -1
  17. package/dist/cjs/validators/number.js +9 -0
  18. package/dist/cjs/validators/number.js.map +1 -1
  19. package/dist/cjs/validators/object/index.d.ts +2 -1
  20. package/dist/cjs/validators/object/index.d.ts.map +1 -1
  21. package/dist/cjs/validators/object/index.js +2 -1
  22. package/dist/cjs/validators/object/index.js.map +1 -1
  23. package/dist/cjs/validators/object/object.d.ts +0 -3
  24. package/dist/cjs/validators/object/object.d.ts.map +1 -1
  25. package/dist/cjs/validators/object/object.js.map +1 -1
  26. package/dist/cjs/validators/object/pick.d.ts +5 -0
  27. package/dist/cjs/validators/object/pick.d.ts.map +1 -0
  28. package/dist/cjs/validators/object/pick.js +54 -0
  29. package/dist/cjs/validators/object/pick.js.map +1 -0
  30. package/dist/cjs/validators/string/string.d.ts +3 -0
  31. package/dist/cjs/validators/string/string.d.ts.map +1 -1
  32. package/dist/cjs/validators/string/string.js +14 -3
  33. package/dist/cjs/validators/string/string.js.map +1 -1
  34. package/dist/esm/index.d.ts +3 -0
  35. package/dist/esm/index.d.ts.map +1 -1
  36. package/dist/esm/index.js +2 -0
  37. package/dist/esm/index.js.map +1 -1
  38. package/dist/esm/refine.d.ts +3 -0
  39. package/dist/esm/refine.d.ts.map +1 -0
  40. package/dist/esm/refine.js +19 -0
  41. package/dist/esm/refine.js.map +1 -0
  42. package/dist/esm/transform.d.ts +3 -0
  43. package/dist/esm/transform.d.ts.map +1 -0
  44. package/dist/esm/transform.js +10 -0
  45. package/dist/esm/transform.js.map +1 -0
  46. package/dist/esm/validators/number.d.ts +3 -0
  47. package/dist/esm/validators/number.d.ts.map +1 -1
  48. package/dist/esm/validators/number.js +9 -0
  49. package/dist/esm/validators/number.js.map +1 -1
  50. package/dist/esm/validators/object/index.d.ts +2 -1
  51. package/dist/esm/validators/object/index.d.ts.map +1 -1
  52. package/dist/esm/validators/object/index.js +2 -1
  53. package/dist/esm/validators/object/index.js.map +1 -1
  54. package/dist/esm/validators/object/object.d.ts +0 -3
  55. package/dist/esm/validators/object/object.d.ts.map +1 -1
  56. package/dist/esm/validators/object/object.js.map +1 -1
  57. package/dist/esm/validators/object/pick.d.ts +5 -0
  58. package/dist/esm/validators/object/pick.d.ts.map +1 -0
  59. package/dist/esm/validators/object/pick.js +50 -0
  60. package/dist/esm/validators/object/pick.js.map +1 -0
  61. package/dist/esm/validators/string/string.d.ts +3 -0
  62. package/dist/esm/validators/string/string.d.ts.map +1 -1
  63. package/dist/esm/validators/string/string.js +14 -3
  64. package/dist/esm/validators/string/string.js.map +1 -1
  65. 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?: 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
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`:
@@ -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
@@ -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
@@ -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,3 @@
1
+ import { Validator } from './common';
2
+ export declare const refine: <T>(validator: Validator<T>, predicate: (value: T) => boolean, message: string) => Validator<T>;
3
+ //# sourceMappingURL=refine.d.ts.map
@@ -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,3 @@
1
+ import { Validator } from './common';
2
+ export declare const transform: <T, U>(validator: Validator<T>, transformFn: (value: T) => U) => Validator<U>;
3
+ //# sourceMappingURL=transform.d.ts.map
@@ -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"}
@@ -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"}
@@ -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;AAM9C,MAAM,MAAM,eAAe,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI;KACrE,CAAC,IAAI,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CACtE,CAAC;AAEF,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
+ {"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;AAO3C,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"}
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"}
@@ -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"}
@@ -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
@@ -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
@@ -1,4 +1,6 @@
1
1
  export * from './validators';
2
2
  export * from './error';
3
3
  export * from './withTryJudge';
4
+ export * from './refine';
5
+ export * from './transform';
4
6
  //# sourceMappingURL=index.js.map
@@ -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,3 @@
1
+ import { Validator } from './common';
2
+ export declare const refine: <T>(validator: Validator<T>, predicate: (value: T) => boolean, message: string) => Validator<T>;
3
+ //# sourceMappingURL=refine.d.ts.map
@@ -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,3 @@
1
+ import { Validator } from './common';
2
+ export declare const transform: <T, U>(validator: Validator<T>, transformFn: (value: T) => U) => Validator<U>;
3
+ //# sourceMappingURL=transform.d.ts.map
@@ -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"}
@@ -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"}
@@ -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;AAM9C,MAAM,MAAM,eAAe,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI;KACrE,CAAC,IAAI,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;CACtE,CAAC;AAEF,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
+ {"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;AAOlD,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"}
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"}
@@ -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.5.0",
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",