@oxog/vld 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +117 -102
- package/README.md +78 -13
- package/dist/coercion/bigint.d.ts +27 -0
- package/dist/coercion/bigint.d.ts.map +1 -0
- package/dist/coercion/bigint.js +108 -0
- package/dist/coercion/bigint.js.map +1 -0
- package/dist/coercion/boolean.d.ts +20 -0
- package/dist/coercion/boolean.d.ts.map +1 -0
- package/dist/coercion/boolean.js +63 -0
- package/dist/coercion/boolean.js.map +1 -0
- package/dist/coercion/date.d.ts +20 -0
- package/dist/coercion/date.d.ts.map +1 -0
- package/dist/coercion/date.js +52 -0
- package/dist/coercion/date.js.map +1 -0
- package/dist/coercion/number.d.ts +35 -0
- package/dist/coercion/number.d.ts.map +1 -0
- package/dist/coercion/number.js +144 -0
- package/dist/coercion/number.js.map +1 -0
- package/dist/coercion/string.d.ts +38 -0
- package/dist/coercion/string.d.ts.map +1 -0
- package/dist/coercion/string.js +168 -0
- package/dist/coercion/string.js.map +1 -0
- package/dist/index-new.d.ts.map +1 -0
- package/dist/index.d.ts +64 -257
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +86 -1164
- package/dist/index.js.map +1 -1
- package/dist/locales/af.js +3 -3
- package/dist/locales/af.js.map +1 -1
- package/dist/utils/deep-merge.d.ts +18 -0
- package/dist/utils/deep-merge.d.ts.map +1 -0
- package/dist/utils/deep-merge.js +68 -0
- package/dist/utils/deep-merge.js.map +1 -0
- package/dist/validators/any.d.ts +19 -0
- package/dist/validators/any.d.ts.map +1 -0
- package/dist/validators/any.js +25 -0
- package/dist/validators/any.js.map +1 -0
- package/dist/validators/array.d.ts +48 -0
- package/dist/validators/array.d.ts.map +1 -0
- package/dist/validators/array.js +135 -0
- package/dist/validators/array.js.map +1 -0
- package/dist/validators/base.d.ts +155 -0
- package/dist/validators/base.d.ts.map +1 -0
- package/dist/validators/base.js +245 -0
- package/dist/validators/base.js.map +1 -0
- package/dist/validators/bigint.d.ts +60 -0
- package/dist/validators/bigint.d.ts.map +1 -0
- package/dist/validators/bigint.js +104 -0
- package/dist/validators/bigint.js.map +1 -0
- package/dist/validators/boolean.d.ts +32 -0
- package/dist/validators/boolean.d.ts.map +1 -0
- package/dist/validators/boolean.js +86 -0
- package/dist/validators/boolean.js.map +1 -0
- package/dist/validators/date.d.ts +68 -0
- package/dist/validators/date.d.ts.map +1 -0
- package/dist/validators/date.js +148 -0
- package/dist/validators/date.js.map +1 -0
- package/dist/validators/enum.d.ts +25 -0
- package/dist/validators/enum.d.ts.map +1 -0
- package/dist/validators/enum.js +45 -0
- package/dist/validators/enum.js.map +1 -0
- package/dist/validators/index.d.ts +27 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/index.js +30 -0
- package/dist/validators/index.js.map +1 -0
- package/dist/validators/intersection.d.ts +25 -0
- package/dist/validators/intersection.d.ts.map +1 -0
- package/dist/validators/intersection.js +57 -0
- package/dist/validators/intersection.js.map +1 -0
- package/dist/validators/literal.d.ts +25 -0
- package/dist/validators/literal.d.ts.map +1 -0
- package/dist/validators/literal.js +45 -0
- package/dist/validators/literal.js.map +1 -0
- package/dist/validators/map.d.ts +26 -0
- package/dist/validators/map.d.ts.map +1 -0
- package/dist/validators/map.js +54 -0
- package/dist/validators/map.js.map +1 -0
- package/dist/validators/never.d.ts +19 -0
- package/dist/validators/never.d.ts.map +1 -0
- package/dist/validators/never.js +29 -0
- package/dist/validators/never.js.map +1 -0
- package/dist/validators/number.d.ts +92 -0
- package/dist/validators/number.d.ts.map +1 -0
- package/dist/validators/number.js +173 -0
- package/dist/validators/number.js.map +1 -0
- package/dist/validators/object-optimized.d.ts +23 -0
- package/dist/validators/object-optimized.d.ts.map +1 -0
- package/dist/validators/object-optimized.js +179 -0
- package/dist/validators/object-optimized.js.map +1 -0
- package/dist/validators/object-ultra.d.ts +34 -0
- package/dist/validators/object-ultra.d.ts.map +1 -0
- package/dist/validators/object-ultra.js +175 -0
- package/dist/validators/object-ultra.js.map +1 -0
- package/dist/validators/object.d.ts +73 -0
- package/dist/validators/object.d.ts.map +1 -0
- package/dist/validators/object.js +289 -0
- package/dist/validators/object.js.map +1 -0
- package/dist/validators/record.d.ts +25 -0
- package/dist/validators/record.d.ts.map +1 -0
- package/dist/validators/record.js +52 -0
- package/dist/validators/record.js.map +1 -0
- package/dist/validators/set.d.ts +25 -0
- package/dist/validators/set.d.ts.map +1 -0
- package/dist/validators/set.js +51 -0
- package/dist/validators/set.js.map +1 -0
- package/dist/validators/string-ultra.d.ts +49 -0
- package/dist/validators/string-ultra.d.ts.map +1 -0
- package/dist/validators/string-ultra.js +217 -0
- package/dist/validators/string-ultra.js.map +1 -0
- package/dist/validators/string.d.ts +109 -0
- package/dist/validators/string.d.ts.map +1 -0
- package/dist/validators/string.js +242 -0
- package/dist/validators/string.js.map +1 -0
- package/dist/validators/symbol.d.ts +24 -0
- package/dist/validators/symbol.d.ts.map +1 -0
- package/dist/validators/symbol.js +42 -0
- package/dist/validators/symbol.js.map +1 -0
- package/dist/validators/tuple.d.ts +31 -0
- package/dist/validators/tuple.d.ts.map +1 -0
- package/dist/validators/tuple.js +55 -0
- package/dist/validators/tuple.js.map +1 -0
- package/dist/validators/union-optimized.d.ts +15 -0
- package/dist/validators/union-optimized.d.ts.map +1 -0
- package/dist/validators/union-optimized.js +92 -0
- package/dist/validators/union-optimized.js.map +1 -0
- package/dist/validators/union.d.ts +33 -0
- package/dist/validators/union.d.ts.map +1 -0
- package/dist/validators/union.js +121 -0
- package/dist/validators/union.js.map +1 -0
- package/dist/validators/unknown.d.ts +19 -0
- package/dist/validators/unknown.d.ts.map +1 -0
- package/dist/validators/unknown.js +25 -0
- package/dist/validators/unknown.js.map +1 -0
- package/dist/validators/void.d.ts +19 -0
- package/dist/validators/void.d.ts.map +1 -0
- package/dist/validators/void.js +35 -0
- package/dist/validators/void.js.map +1 -0
- package/package.json +12 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../src/validators/literal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,qBAAa,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAE,SAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAKjG,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IALhC;;OAEG;IACH,OAAO;IAOP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAIhG;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC;IAUxB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC;CAY1C"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* Immutable literal validator for exact value matching
|
|
5
|
+
*/
|
|
6
|
+
export class VldLiteral extends VldBase {
|
|
7
|
+
/**
|
|
8
|
+
* Private constructor to enforce immutability
|
|
9
|
+
*/
|
|
10
|
+
constructor(literal, errorMessage) {
|
|
11
|
+
super();
|
|
12
|
+
this.literal = literal;
|
|
13
|
+
this.errorMessage = errorMessage;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create a new literal validator
|
|
17
|
+
*/
|
|
18
|
+
static create(literal) {
|
|
19
|
+
return new VldLiteral(literal);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parse and validate a literal value
|
|
23
|
+
*/
|
|
24
|
+
parse(value) {
|
|
25
|
+
if (value !== this.literal) {
|
|
26
|
+
throw new Error(this.errorMessage ||
|
|
27
|
+
getMessages().literalExpected(JSON.stringify(this.literal), JSON.stringify(value)));
|
|
28
|
+
}
|
|
29
|
+
return this.literal;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Safely parse and validate a literal value
|
|
33
|
+
*/
|
|
34
|
+
safeParse(value) {
|
|
35
|
+
if (value === this.literal) {
|
|
36
|
+
return { success: true, data: this.literal };
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
success: false,
|
|
40
|
+
error: new Error(this.errorMessage ||
|
|
41
|
+
getMessages().literalExpected(JSON.stringify(this.literal), JSON.stringify(value)))
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=literal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"literal.js","sourceRoot":"","sources":["../../src/validators/literal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,UAAmE,SAAQ,OAAa;IACnG;;OAEG;IACH,YACmB,OAAU,EACV,YAAqB;QAEtC,KAAK,EAAE,CAAC;QAHS,YAAO,GAAP,OAAO,CAAG;QACV,iBAAY,GAAZ,YAAY,CAAS;IAGxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CAAyD,OAAU;QAC9E,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,YAAY;gBACjB,WAAW,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnF,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAc;QACtB,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,KAAK,CACd,IAAI,CAAC,YAAY;gBACjB,WAAW,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CACnF;SACF,CAAC;IACJ,CAAC;CACF","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Immutable literal validator for exact value matching\n */\nexport class VldLiteral<T extends string | number | boolean | null | undefined> extends VldBase<T, T> {\n /**\n * Private constructor to enforce immutability\n */\n private constructor(\n private readonly literal: T,\n private readonly errorMessage?: string\n ) {\n super();\n }\n \n /**\n * Create a new literal validator\n */\n static create<T extends string | number | boolean | null | undefined>(literal: T): VldLiteral<T> {\n return new VldLiteral(literal);\n }\n \n /**\n * Parse and validate a literal value\n */\n parse(value: unknown): T {\n if (value !== this.literal) {\n throw new Error(\n this.errorMessage || \n getMessages().literalExpected(JSON.stringify(this.literal), JSON.stringify(value))\n );\n }\n return this.literal;\n }\n \n /**\n * Safely parse and validate a literal value\n */\n safeParse(value: unknown): ParseResult<T> {\n if (value === this.literal) {\n return { success: true, data: this.literal };\n }\n return { \n success: false, \n error: new Error(\n this.errorMessage || \n getMessages().literalExpected(JSON.stringify(this.literal), JSON.stringify(value))\n )\n };\n }\n}"]}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Immutable Map validator
|
|
4
|
+
*/
|
|
5
|
+
export declare class VldMap<K, V> extends VldBase<unknown, Map<K, V>> {
|
|
6
|
+
private readonly keyValidator;
|
|
7
|
+
private readonly valueValidator;
|
|
8
|
+
private readonly errorMessage?;
|
|
9
|
+
/**
|
|
10
|
+
* Private constructor to enforce immutability
|
|
11
|
+
*/
|
|
12
|
+
private constructor();
|
|
13
|
+
/**
|
|
14
|
+
* Create a new Map validator
|
|
15
|
+
*/
|
|
16
|
+
static create<K, V>(keyValidator: VldBase<unknown, K>, valueValidator: VldBase<unknown, V>): VldMap<K, V>;
|
|
17
|
+
/**
|
|
18
|
+
* Parse and validate a Map value
|
|
19
|
+
*/
|
|
20
|
+
parse(value: unknown): Map<K, V>;
|
|
21
|
+
/**
|
|
22
|
+
* Safely parse and validate a Map value
|
|
23
|
+
*/
|
|
24
|
+
safeParse(value: unknown): ParseResult<Map<K, V>>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/validators/map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,qBAAa,MAAM,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAKzD,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IANhC;;OAEG;IACH,OAAO;IAQP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAChB,YAAY,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EACjC,cAAc,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAClC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;IAIf;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAmBhC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAOlD"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* Immutable Map validator
|
|
5
|
+
*/
|
|
6
|
+
export class VldMap extends VldBase {
|
|
7
|
+
/**
|
|
8
|
+
* Private constructor to enforce immutability
|
|
9
|
+
*/
|
|
10
|
+
constructor(keyValidator, valueValidator, errorMessage) {
|
|
11
|
+
super();
|
|
12
|
+
this.keyValidator = keyValidator;
|
|
13
|
+
this.valueValidator = valueValidator;
|
|
14
|
+
this.errorMessage = errorMessage;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create a new Map validator
|
|
18
|
+
*/
|
|
19
|
+
static create(keyValidator, valueValidator) {
|
|
20
|
+
return new VldMap(keyValidator, valueValidator);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Parse and validate a Map value
|
|
24
|
+
*/
|
|
25
|
+
parse(value) {
|
|
26
|
+
if (!(value instanceof Map)) {
|
|
27
|
+
throw new Error(this.errorMessage || getMessages().invalidMap);
|
|
28
|
+
}
|
|
29
|
+
const result = new Map();
|
|
30
|
+
for (const [key, val] of value) {
|
|
31
|
+
try {
|
|
32
|
+
const validKey = this.keyValidator.parse(key);
|
|
33
|
+
const validValue = this.valueValidator.parse(val);
|
|
34
|
+
result.set(validKey, validValue);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
throw new Error(error.message);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Safely parse and validate a Map value
|
|
44
|
+
*/
|
|
45
|
+
safeParse(value) {
|
|
46
|
+
try {
|
|
47
|
+
return { success: true, data: this.parse(value) };
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
return { success: false, error: error };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=map.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map.js","sourceRoot":"","sources":["../../src/validators/map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,MAAa,SAAQ,OAA2B;IAC3D;;OAEG;IACH,YACmB,YAAiC,EACjC,cAAmC,EACnC,YAAqB;QAEtC,KAAK,EAAE,CAAC;QAJS,iBAAY,GAAZ,YAAY,CAAqB;QACjC,mBAAc,GAAd,cAAc,CAAqB;QACnC,iBAAY,GAAZ,YAAY,CAAS;IAGxC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,CACX,YAAiC,EACjC,cAAmC;QAEnC,OAAO,IAAI,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAc;QAClB,IAAI,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,WAAW,EAAE,CAAC,UAAU,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAQ,CAAC;QAC/B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAClD,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,KAAc;QACtB,IAAI,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAc,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;CACF","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Immutable Map validator\n */\nexport class VldMap<K, V> extends VldBase<unknown, Map<K, V>> {\n /**\n * Private constructor to enforce immutability\n */\n private constructor(\n private readonly keyValidator: VldBase<unknown, K>,\n private readonly valueValidator: VldBase<unknown, V>,\n private readonly errorMessage?: string\n ) {\n super();\n }\n \n /**\n * Create a new Map validator\n */\n static create<K, V>(\n keyValidator: VldBase<unknown, K>,\n valueValidator: VldBase<unknown, V>\n ): VldMap<K, V> {\n return new VldMap(keyValidator, valueValidator);\n }\n \n /**\n * Parse and validate a Map value\n */\n parse(value: unknown): Map<K, V> {\n if (!(value instanceof Map)) {\n throw new Error(this.errorMessage || getMessages().invalidMap);\n }\n \n const result = new Map<K, V>();\n for (const [key, val] of value) {\n try {\n const validKey = this.keyValidator.parse(key);\n const validValue = this.valueValidator.parse(val);\n result.set(validKey, validValue);\n } catch (error) {\n throw new Error((error as Error).message);\n }\n }\n \n return result;\n }\n \n /**\n * Safely parse and validate a Map value\n */\n safeParse(value: unknown): ParseResult<Map<K, V>> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n}"]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Validator that never succeeds
|
|
4
|
+
*/
|
|
5
|
+
export declare class VldNever extends VldBase<never, never> {
|
|
6
|
+
/**
|
|
7
|
+
* Create a new never validator
|
|
8
|
+
*/
|
|
9
|
+
static create(): VldNever;
|
|
10
|
+
/**
|
|
11
|
+
* Parse never value (always fails)
|
|
12
|
+
*/
|
|
13
|
+
parse(_value: unknown): never;
|
|
14
|
+
/**
|
|
15
|
+
* Safely parse never value (always fails)
|
|
16
|
+
*/
|
|
17
|
+
safeParse(_value: unknown): ParseResult<never>;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=never.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"never.d.ts","sourceRoot":"","sources":["../../src/validators/never.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,qBAAa,QAAS,SAAQ,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;IACjD;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,QAAQ;IAIzB;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,KAAK;IAI7B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC;CAM/C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* Validator that never succeeds
|
|
5
|
+
*/
|
|
6
|
+
export class VldNever extends VldBase {
|
|
7
|
+
/**
|
|
8
|
+
* Create a new never validator
|
|
9
|
+
*/
|
|
10
|
+
static create() {
|
|
11
|
+
return new VldNever();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Parse never value (always fails)
|
|
15
|
+
*/
|
|
16
|
+
parse(_value) {
|
|
17
|
+
throw new Error(getMessages().neverType);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Safely parse never value (always fails)
|
|
21
|
+
*/
|
|
22
|
+
safeParse(_value) {
|
|
23
|
+
return {
|
|
24
|
+
success: false,
|
|
25
|
+
error: new Error(getMessages().neverType)
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=never.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"never.js","sourceRoot":"","sources":["../../src/validators/never.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAe,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,QAAS,SAAQ,OAAqB;IACjD;;OAEG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,QAAQ,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAe;QACnB,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAe;QACvB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC;SAC1C,CAAC;IACJ,CAAC;CACF","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Validator that never succeeds\n */\nexport class VldNever extends VldBase<never, never> {\n /**\n * Create a new never validator\n */\n static create(): VldNever {\n return new VldNever();\n }\n \n /**\n * Parse never value (always fails)\n */\n parse(_value: unknown): never {\n throw new Error(getMessages().neverType);\n }\n \n /**\n * Safely parse never value (always fails)\n */\n safeParse(_value: unknown): ParseResult<never> {\n return { \n success: false, \n error: new Error(getMessages().neverType) \n };\n }\n}"]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
/**
|
|
3
|
+
* Type for number validation check functions
|
|
4
|
+
*/
|
|
5
|
+
type NumberCheck = (value: number) => boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Configuration for number validator
|
|
8
|
+
*/
|
|
9
|
+
interface NumberValidatorConfig {
|
|
10
|
+
readonly checks: ReadonlyArray<NumberCheck>;
|
|
11
|
+
readonly errorMessage?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Immutable number validator with chainable methods
|
|
15
|
+
*/
|
|
16
|
+
export declare class VldNumber extends VldBase<number, number> {
|
|
17
|
+
protected readonly config: NumberValidatorConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Protected constructor to allow extension while maintaining immutability
|
|
20
|
+
*/
|
|
21
|
+
protected constructor(config?: Partial<NumberValidatorConfig>);
|
|
22
|
+
/**
|
|
23
|
+
* Create a new number validator
|
|
24
|
+
*/
|
|
25
|
+
static create(): VldNumber;
|
|
26
|
+
/**
|
|
27
|
+
* Parse and validate a number value
|
|
28
|
+
*/
|
|
29
|
+
parse(value: unknown): number;
|
|
30
|
+
/**
|
|
31
|
+
* Safely parse and validate a number value
|
|
32
|
+
*/
|
|
33
|
+
safeParse(value: unknown): ParseResult<number>;
|
|
34
|
+
/**
|
|
35
|
+
* Create a new validator with minimum value constraint
|
|
36
|
+
*/
|
|
37
|
+
min(value: number, message?: string): VldNumber;
|
|
38
|
+
/**
|
|
39
|
+
* Create a new validator with maximum value constraint
|
|
40
|
+
*/
|
|
41
|
+
max(value: number, message?: string): VldNumber;
|
|
42
|
+
/**
|
|
43
|
+
* Create a new validator that checks for integer values
|
|
44
|
+
*/
|
|
45
|
+
int(message?: string): VldNumber;
|
|
46
|
+
/**
|
|
47
|
+
* Create a new validator that checks for positive values
|
|
48
|
+
*/
|
|
49
|
+
positive(message?: string): VldNumber;
|
|
50
|
+
/**
|
|
51
|
+
* Create a new validator that checks for negative values
|
|
52
|
+
*/
|
|
53
|
+
negative(message?: string): VldNumber;
|
|
54
|
+
/**
|
|
55
|
+
* Create a new validator that checks for non-negative values
|
|
56
|
+
*/
|
|
57
|
+
nonnegative(message?: string): VldNumber;
|
|
58
|
+
/**
|
|
59
|
+
* Create a new validator that checks for non-positive values
|
|
60
|
+
*/
|
|
61
|
+
nonpositive(message?: string): VldNumber;
|
|
62
|
+
/**
|
|
63
|
+
* Create a new validator that checks for finite values
|
|
64
|
+
*/
|
|
65
|
+
finite(message?: string): VldNumber;
|
|
66
|
+
/**
|
|
67
|
+
* Create a new validator that checks for safe integer values
|
|
68
|
+
*/
|
|
69
|
+
safe(message?: string): VldNumber;
|
|
70
|
+
/**
|
|
71
|
+
* Create a new validator that checks if value is multiple of another
|
|
72
|
+
*/
|
|
73
|
+
multipleOf(value: number, message?: string): VldNumber;
|
|
74
|
+
/**
|
|
75
|
+
* Alias for multipleOf
|
|
76
|
+
*/
|
|
77
|
+
step(value: number, message?: string): VldNumber;
|
|
78
|
+
/**
|
|
79
|
+
* Create a new validator with a range constraint
|
|
80
|
+
*/
|
|
81
|
+
between(min: number, max: number, message?: string): VldNumber;
|
|
82
|
+
/**
|
|
83
|
+
* Create a new validator that checks for even numbers
|
|
84
|
+
*/
|
|
85
|
+
even(message?: string): VldNumber;
|
|
86
|
+
/**
|
|
87
|
+
* Create a new validator that checks for odd numbers
|
|
88
|
+
*/
|
|
89
|
+
odd(message?: string): VldNumber;
|
|
90
|
+
}
|
|
91
|
+
export {};
|
|
92
|
+
//# sourceMappingURL=number.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/validators/number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAG9C;;GAEG;AACH,KAAK,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAE9C;;GAEG;AACH,UAAU,qBAAqB;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC5C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC;IACpD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;IAEjD;;OAEG;IACH,SAAS,aAAa,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAQ7D;;OAEG;IACH,MAAM,CAAC,MAAM,IAAI,SAAS;IAI1B;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM;IAe7B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;IAQ9C;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO/C;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO/C;;OAEG;IACH,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOhC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOrC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOrC;;OAEG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOxC;;OAEG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOxC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOnC;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOjC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOtD;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAIhD;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAO9D;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;IAOjC;;OAEG;IACH,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS;CAMjC"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { VldBase } from './base.js';
|
|
2
|
+
import { getMessages } from '../locales.js';
|
|
3
|
+
/**
|
|
4
|
+
* Immutable number validator with chainable methods
|
|
5
|
+
*/
|
|
6
|
+
export class VldNumber extends VldBase {
|
|
7
|
+
/**
|
|
8
|
+
* Protected constructor to allow extension while maintaining immutability
|
|
9
|
+
*/
|
|
10
|
+
constructor(config) {
|
|
11
|
+
super();
|
|
12
|
+
this.config = {
|
|
13
|
+
checks: config?.checks || [],
|
|
14
|
+
errorMessage: config?.errorMessage
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create a new number validator
|
|
19
|
+
*/
|
|
20
|
+
static create() {
|
|
21
|
+
return new VldNumber();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parse and validate a number value
|
|
25
|
+
*/
|
|
26
|
+
parse(value) {
|
|
27
|
+
if (typeof value !== 'number' || isNaN(value)) {
|
|
28
|
+
throw new Error(this.config.errorMessage || getMessages().invalidNumber);
|
|
29
|
+
}
|
|
30
|
+
// Apply all checks
|
|
31
|
+
for (const check of this.config.checks) {
|
|
32
|
+
if (!check(value)) {
|
|
33
|
+
throw new Error(this.config.errorMessage || getMessages().invalidNumber);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Safely parse and validate a number value
|
|
40
|
+
*/
|
|
41
|
+
safeParse(value) {
|
|
42
|
+
try {
|
|
43
|
+
return { success: true, data: this.parse(value) };
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return { success: false, error: error };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create a new validator with minimum value constraint
|
|
51
|
+
*/
|
|
52
|
+
min(value, message) {
|
|
53
|
+
return new VldNumber({
|
|
54
|
+
checks: [...this.config.checks, (v) => v >= value],
|
|
55
|
+
errorMessage: message || getMessages().numberMin(value)
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a new validator with maximum value constraint
|
|
60
|
+
*/
|
|
61
|
+
max(value, message) {
|
|
62
|
+
return new VldNumber({
|
|
63
|
+
checks: [...this.config.checks, (v) => v <= value],
|
|
64
|
+
errorMessage: message || getMessages().numberMax(value)
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create a new validator that checks for integer values
|
|
69
|
+
*/
|
|
70
|
+
int(message) {
|
|
71
|
+
return new VldNumber({
|
|
72
|
+
checks: [...this.config.checks, (v) => Number.isInteger(v)],
|
|
73
|
+
errorMessage: message || getMessages().numberInt
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Create a new validator that checks for positive values
|
|
78
|
+
*/
|
|
79
|
+
positive(message) {
|
|
80
|
+
return new VldNumber({
|
|
81
|
+
checks: [...this.config.checks, (v) => v > 0],
|
|
82
|
+
errorMessage: message || getMessages().numberPositive
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create a new validator that checks for negative values
|
|
87
|
+
*/
|
|
88
|
+
negative(message) {
|
|
89
|
+
return new VldNumber({
|
|
90
|
+
checks: [...this.config.checks, (v) => v < 0],
|
|
91
|
+
errorMessage: message || getMessages().numberNegative
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Create a new validator that checks for non-negative values
|
|
96
|
+
*/
|
|
97
|
+
nonnegative(message) {
|
|
98
|
+
return new VldNumber({
|
|
99
|
+
checks: [...this.config.checks, (v) => v >= 0],
|
|
100
|
+
errorMessage: message || getMessages().numberNonnegative
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Create a new validator that checks for non-positive values
|
|
105
|
+
*/
|
|
106
|
+
nonpositive(message) {
|
|
107
|
+
return new VldNumber({
|
|
108
|
+
checks: [...this.config.checks, (v) => v <= 0],
|
|
109
|
+
errorMessage: message || getMessages().numberNonpositive
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create a new validator that checks for finite values
|
|
114
|
+
*/
|
|
115
|
+
finite(message) {
|
|
116
|
+
return new VldNumber({
|
|
117
|
+
checks: [...this.config.checks, (v) => Number.isFinite(v)],
|
|
118
|
+
errorMessage: message || getMessages().numberFinite
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create a new validator that checks for safe integer values
|
|
123
|
+
*/
|
|
124
|
+
safe(message) {
|
|
125
|
+
return new VldNumber({
|
|
126
|
+
checks: [...this.config.checks, (v) => Number.isSafeInteger(v)],
|
|
127
|
+
errorMessage: message || getMessages().numberSafe
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create a new validator that checks if value is multiple of another
|
|
132
|
+
*/
|
|
133
|
+
multipleOf(value, message) {
|
|
134
|
+
return new VldNumber({
|
|
135
|
+
checks: [...this.config.checks, (v) => v % value === 0],
|
|
136
|
+
errorMessage: message || getMessages().numberMultipleOf(value)
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Alias for multipleOf
|
|
141
|
+
*/
|
|
142
|
+
step(value, message) {
|
|
143
|
+
return this.multipleOf(value, message);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Create a new validator with a range constraint
|
|
147
|
+
*/
|
|
148
|
+
between(min, max, message) {
|
|
149
|
+
return new VldNumber({
|
|
150
|
+
checks: [...this.config.checks, (v) => v >= min && v <= max],
|
|
151
|
+
errorMessage: message || `Number must be between ${min} and ${max}`
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Create a new validator that checks for even numbers
|
|
156
|
+
*/
|
|
157
|
+
even(message) {
|
|
158
|
+
return new VldNumber({
|
|
159
|
+
checks: [...this.config.checks, (v) => v % 2 === 0],
|
|
160
|
+
errorMessage: message || 'Number must be even'
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Create a new validator that checks for odd numbers
|
|
165
|
+
*/
|
|
166
|
+
odd(message) {
|
|
167
|
+
return new VldNumber({
|
|
168
|
+
checks: [...this.config.checks, (v) => v % 2 !== 0],
|
|
169
|
+
errorMessage: message || 'Number must be odd'
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=number.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/validators/number.ts"],"names":[],"mappings":"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","sourcesContent":["import { VldBase, ParseResult } from './base';\nimport { getMessages } from '../locales';\n\n/**\n * Type for number validation check functions\n */\ntype NumberCheck = (value: number) => boolean;\n\n/**\n * Configuration for number validator\n */\ninterface NumberValidatorConfig {\n readonly checks: ReadonlyArray<NumberCheck>;\n readonly errorMessage?: string;\n}\n\n/**\n * Immutable number validator with chainable methods\n */\nexport class VldNumber extends VldBase<number, number> {\n protected readonly config: NumberValidatorConfig;\n \n /**\n * Protected constructor to allow extension while maintaining immutability\n */\n protected constructor(config?: Partial<NumberValidatorConfig>) {\n super();\n this.config = {\n checks: config?.checks || [],\n errorMessage: config?.errorMessage\n };\n }\n \n /**\n * Create a new number validator\n */\n static create(): VldNumber {\n return new VldNumber();\n }\n \n /**\n * Parse and validate a number value\n */\n parse(value: unknown): number {\n if (typeof value !== 'number' || isNaN(value)) {\n throw new Error(this.config.errorMessage || getMessages().invalidNumber);\n }\n \n // Apply all checks\n for (const check of this.config.checks) {\n if (!check(value)) {\n throw new Error(this.config.errorMessage || getMessages().invalidNumber);\n }\n }\n \n return value;\n }\n \n /**\n * Safely parse and validate a number value\n */\n safeParse(value: unknown): ParseResult<number> {\n try {\n return { success: true, data: this.parse(value) };\n } catch (error) {\n return { success: false, error: error as Error };\n }\n }\n \n /**\n * Create a new validator with minimum value constraint\n */\n min(value: number, message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v >= value],\n errorMessage: message || getMessages().numberMin(value)\n });\n }\n \n /**\n * Create a new validator with maximum value constraint\n */\n max(value: number, message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v <= value],\n errorMessage: message || getMessages().numberMax(value)\n });\n }\n \n /**\n * Create a new validator that checks for integer values\n */\n int(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => Number.isInteger(v)],\n errorMessage: message || getMessages().numberInt\n });\n }\n \n /**\n * Create a new validator that checks for positive values\n */\n positive(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v > 0],\n errorMessage: message || getMessages().numberPositive\n });\n }\n \n /**\n * Create a new validator that checks for negative values\n */\n negative(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v < 0],\n errorMessage: message || getMessages().numberNegative\n });\n }\n \n /**\n * Create a new validator that checks for non-negative values\n */\n nonnegative(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v >= 0],\n errorMessage: message || getMessages().numberNonnegative\n });\n }\n \n /**\n * Create a new validator that checks for non-positive values\n */\n nonpositive(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v <= 0],\n errorMessage: message || getMessages().numberNonpositive\n });\n }\n \n /**\n * Create a new validator that checks for finite values\n */\n finite(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => Number.isFinite(v)],\n errorMessage: message || getMessages().numberFinite\n });\n }\n \n /**\n * Create a new validator that checks for safe integer values\n */\n safe(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => Number.isSafeInteger(v)],\n errorMessage: message || getMessages().numberSafe\n });\n }\n \n /**\n * Create a new validator that checks if value is multiple of another\n */\n multipleOf(value: number, message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v % value === 0],\n errorMessage: message || getMessages().numberMultipleOf(value)\n });\n }\n \n /**\n * Alias for multipleOf\n */\n step(value: number, message?: string): VldNumber {\n return this.multipleOf(value, message);\n }\n \n /**\n * Create a new validator with a range constraint\n */\n between(min: number, max: number, message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v >= min && v <= max],\n errorMessage: message || `Number must be between ${min} and ${max}`\n });\n }\n \n /**\n * Create a new validator that checks for even numbers\n */\n even(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v % 2 === 0],\n errorMessage: message || 'Number must be even'\n });\n }\n \n /**\n * Create a new validator that checks for odd numbers\n */\n odd(message?: string): VldNumber {\n return new VldNumber({\n checks: [...this.config.checks, (v: number) => v % 2 !== 0],\n errorMessage: message || 'Number must be odd'\n });\n }\n}"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { VldBase, ParseResult } from './base';
|
|
2
|
+
export declare class VldObjectOptimized<T extends Record<string, any>> extends VldBase<unknown, T> {
|
|
3
|
+
private readonly config;
|
|
4
|
+
private readonly shapeKeys;
|
|
5
|
+
private readonly shapeKeysSet;
|
|
6
|
+
private constructor();
|
|
7
|
+
static create<T extends Record<string, any>>(shape: {
|
|
8
|
+
[K in keyof T]: VldBase<unknown, T[K]>;
|
|
9
|
+
}): VldObjectOptimized<T>;
|
|
10
|
+
parse(value: unknown): T;
|
|
11
|
+
safeParse(value: unknown): ParseResult<T>;
|
|
12
|
+
strict(message?: string): VldObjectOptimized<T>;
|
|
13
|
+
passthrough(): VldObjectOptimized<T>;
|
|
14
|
+
partial(): VldObjectOptimized<{
|
|
15
|
+
[K in keyof T]?: T[K];
|
|
16
|
+
}>;
|
|
17
|
+
pick<K extends keyof T>(...keys: K[]): VldObjectOptimized<Pick<T, K>>;
|
|
18
|
+
omit<K extends keyof T>(...keys: K[]): VldObjectOptimized<Omit<T, K>>;
|
|
19
|
+
extend<U extends Record<string, any>>(extension: {
|
|
20
|
+
[K in keyof U]: VldBase<unknown, U[K]>;
|
|
21
|
+
}): VldObjectOptimized<T & U>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=object-optimized.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-optimized.d.ts","sourceRoot":"","sources":["../../src/validators/object-optimized.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAe,MAAM,QAAQ,CAAC;AAa3D,qBAAa,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAE,SAAQ,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAE3C,OAAO;IAQP,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzC,KAAK,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GAChD,kBAAkB,CAAC,CAAC,CAAC;IAIxB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC;IAgExB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC;IAgEzC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC;IAS/C,WAAW,IAAI,kBAAkB,CAAC,CAAC,CAAC;IAQpC,OAAO,IAAI,kBAAkB,CAAC;SAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;KAAE,CAAC;IAWxD,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAarE,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAcrE,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAClC,SAAS,EAAE;SAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;KAAE,GACpD,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC;CAM7B"}
|