justus 0.1.5 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{dts-generator.js → dts-generator.cjs} +3 -3
- package/dist/{dts-generator.js.map → dts-generator.cjs.map} +1 -1
- package/{dts-generator.d.ts → dist/dts-generator.d.ts} +1 -1
- package/dist/dts-generator.mjs +1 -1
- package/dist/dts-generator.mjs.map +1 -1
- package/dist/errors.cjs +113 -0
- package/dist/errors.cjs.map +6 -0
- package/dist/errors.d.ts +55 -0
- package/dist/errors.mjs +85 -0
- package/dist/errors.mjs.map +6 -0
- package/dist/index.cjs +133 -0
- package/dist/index.cjs.map +6 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.mjs +23 -818
- package/dist/index.mjs.map +3 -3
- package/dist/schema.cjs +44 -0
- package/dist/schema.cjs.map +6 -0
- package/dist/schema.d.ts +16 -0
- package/dist/schema.mjs +18 -0
- package/dist/schema.mjs.map +6 -0
- package/dist/types.cjs +67 -0
- package/dist/types.cjs.map +6 -0
- package/dist/types.d.ts +136 -0
- package/dist/types.mjs +36 -0
- package/dist/types.mjs.map +6 -0
- package/dist/utilities.cjs +54 -0
- package/dist/utilities.cjs.map +6 -0
- package/dist/utilities.d.ts +7 -0
- package/dist/utilities.mjs +29 -0
- package/dist/utilities.mjs.map +6 -0
- package/dist/validators/any.cjs +39 -0
- package/dist/validators/any.cjs.map +6 -0
- package/dist/validators/any.d.ts +7 -0
- package/dist/validators/any.mjs +13 -0
- package/dist/validators/any.mjs.map +6 -0
- package/dist/validators/array.cjs +104 -0
- package/dist/validators/array.cjs.map +6 -0
- package/dist/validators/array.d.ts +32 -0
- package/dist/validators/array.mjs +76 -0
- package/dist/validators/array.mjs.map +6 -0
- package/dist/validators/boolean.cjs +56 -0
- package/dist/validators/boolean.cjs.map +6 -0
- package/dist/validators/boolean.d.ts +21 -0
- package/dist/validators/boolean.mjs +30 -0
- package/dist/validators/boolean.mjs.map +6 -0
- package/dist/validators/constant.cjs +51 -0
- package/dist/validators/constant.cjs.map +6 -0
- package/dist/validators/constant.d.ts +12 -0
- package/dist/validators/constant.mjs +24 -0
- package/dist/validators/constant.mjs.map +6 -0
- package/dist/validators/date.cjs +80 -0
- package/dist/validators/date.cjs.map +6 -0
- package/dist/validators/date.d.ts +22 -0
- package/dist/validators/date.mjs +54 -0
- package/dist/validators/date.mjs.map +6 -0
- package/dist/validators/never.cjs +44 -0
- package/dist/validators/never.cjs.map +6 -0
- package/dist/validators/never.d.ts +9 -0
- package/dist/validators/never.mjs +18 -0
- package/dist/validators/never.mjs.map +6 -0
- package/dist/validators/number.cjs +153 -0
- package/dist/validators/number.cjs.map +6 -0
- package/dist/validators/number.d.ts +48 -0
- package/dist/validators/number.mjs +126 -0
- package/dist/validators/number.mjs.map +6 -0
- package/dist/validators/object.cjs +129 -0
- package/dist/validators/object.cjs.map +6 -0
- package/dist/validators/object.d.ts +22 -0
- package/dist/validators/object.mjs +108 -0
- package/dist/validators/object.mjs.map +6 -0
- package/dist/validators/optional.cjs +61 -0
- package/dist/validators/optional.cjs.map +6 -0
- package/dist/validators/optional.d.ts +21 -0
- package/dist/validators/optional.mjs +35 -0
- package/dist/validators/optional.mjs.map +6 -0
- package/dist/validators/string.cjs +84 -0
- package/dist/validators/string.cjs.map +6 -0
- package/dist/validators/string.d.ts +35 -0
- package/dist/validators/string.mjs +57 -0
- package/dist/validators/string.mjs.map +6 -0
- package/dist/validators/tuple.cjs +95 -0
- package/dist/validators/tuple.cjs.map +6 -0
- package/dist/validators/tuple.d.ts +15 -0
- package/dist/validators/tuple.mjs +69 -0
- package/dist/validators/tuple.mjs.map +6 -0
- package/dist/validators/union.cjs +78 -0
- package/dist/validators/union.cjs.map +6 -0
- package/dist/validators/union.d.ts +22 -0
- package/dist/validators/union.mjs +50 -0
- package/dist/validators/union.mjs.map +6 -0
- package/dist/validators/url.cjs +117 -0
- package/dist/validators/url.cjs.map +6 -0
- package/dist/validators/url.d.ts +57 -0
- package/dist/validators/url.mjs +91 -0
- package/dist/validators/url.mjs.map +6 -0
- package/package.json +33 -23
- package/src/dts-generator.ts +4 -0
- package/src/index.ts +23 -23
- package/src/schema.ts +7 -5
- package/src/types.ts +51 -32
- package/src/utilities.ts +6 -2
- package/src/validators/array.ts +6 -5
- package/src/validators/boolean.ts +2 -2
- package/src/validators/constant.ts +3 -1
- package/src/validators/date.ts +1 -1
- package/src/validators/never.ts +4 -2
- package/src/validators/number.ts +8 -7
- package/src/validators/object.ts +12 -12
- package/src/validators/optional.ts +5 -8
- package/src/validators/string.ts +8 -6
- package/src/validators/tuple.ts +5 -3
- package/src/validators/union.ts +7 -5
- package/src/validators/url.ts +8 -7
- package/dist/index.js +0 -949
- package/dist/index.js.map +0 -6
- package/index.d.ts +0 -617
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// validators/object.ts
|
|
2
|
+
import { assertValidation, ValidationErrorBuilder } from "../errors.mjs";
|
|
3
|
+
import { allowAdditionalProperties } from "../schema.mjs";
|
|
4
|
+
import {
|
|
5
|
+
AbstractValidator,
|
|
6
|
+
additionalValidator,
|
|
7
|
+
defaultValidationOptions,
|
|
8
|
+
makeValidatorFactory,
|
|
9
|
+
restValidator,
|
|
10
|
+
schemaValidator
|
|
11
|
+
} from "../types.mjs";
|
|
12
|
+
import { getValidator } from "../utilities.mjs";
|
|
13
|
+
var AnyObjectValidator = class extends AbstractValidator {
|
|
14
|
+
validate(value) {
|
|
15
|
+
assertValidation(typeof value == "object", 'Value is not an "object"');
|
|
16
|
+
assertValidation(value !== null, 'Value is "null"');
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
var ObjectValidator = class extends AbstractValidator {
|
|
21
|
+
schema;
|
|
22
|
+
validators = /* @__PURE__ */ new Map();
|
|
23
|
+
additionalProperties;
|
|
24
|
+
constructor(schema) {
|
|
25
|
+
super();
|
|
26
|
+
const { [additionalValidator]: additional, ...properties } = schema;
|
|
27
|
+
if (additional)
|
|
28
|
+
this.additionalProperties = getValidator(additional);
|
|
29
|
+
for (const key of Object.keys(properties)) {
|
|
30
|
+
this.validators.set(key, getValidator(properties[key]));
|
|
31
|
+
}
|
|
32
|
+
this.schema = schema;
|
|
33
|
+
}
|
|
34
|
+
validate(value, options = defaultValidationOptions) {
|
|
35
|
+
assertValidation(typeof value === "object", 'Value is not an "object"');
|
|
36
|
+
assertValidation(value !== null, 'Value is "null"');
|
|
37
|
+
const { stripAdditionalProperties, stripOptionalNulls } = options;
|
|
38
|
+
const record = value;
|
|
39
|
+
const builder = new ValidationErrorBuilder();
|
|
40
|
+
const clone = {};
|
|
41
|
+
for (const [key, validator] of this.validators.entries()) {
|
|
42
|
+
const optional = !!validator.optional;
|
|
43
|
+
const original = record[key];
|
|
44
|
+
if (stripOptionalNulls && optional && original === null) {
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (original === void 0) {
|
|
48
|
+
try {
|
|
49
|
+
const validated = validator.validate(original, options);
|
|
50
|
+
if (!(optional && validated == void 0))
|
|
51
|
+
clone[key] = validated;
|
|
52
|
+
} catch (error) {
|
|
53
|
+
if (optional)
|
|
54
|
+
continue;
|
|
55
|
+
builder.record("Required property missing", key);
|
|
56
|
+
}
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const validated = validator.validate(original, options);
|
|
61
|
+
if (!(optional && validated == void 0))
|
|
62
|
+
clone[key] = validated;
|
|
63
|
+
} catch (error) {
|
|
64
|
+
builder.record(error, key);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const additionalKeys = Object.keys(record).filter((k) => !this.validators.has(k));
|
|
68
|
+
const additional = this.additionalProperties;
|
|
69
|
+
if (additional) {
|
|
70
|
+
additionalKeys.forEach((key) => {
|
|
71
|
+
if (record[key] === void 0)
|
|
72
|
+
return;
|
|
73
|
+
try {
|
|
74
|
+
clone[key] = additional.validate(record[key], options);
|
|
75
|
+
} catch (error) {
|
|
76
|
+
builder.record(error, key);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
} else if (!stripAdditionalProperties) {
|
|
80
|
+
additionalKeys.forEach((key) => {
|
|
81
|
+
if (record[key] !== void 0)
|
|
82
|
+
builder.record("Unknown property", key);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return builder.assert(clone);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
function _object(schema) {
|
|
89
|
+
const validator = new ObjectValidator(schema);
|
|
90
|
+
function* iterator() {
|
|
91
|
+
yield { [restValidator]: validator };
|
|
92
|
+
}
|
|
93
|
+
return Object.defineProperties(schema, {
|
|
94
|
+
[schemaValidator]: { value: validator, enumerable: false },
|
|
95
|
+
[Symbol.iterator]: { value: iterator, enumerable: false }
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
var object = makeValidatorFactory(new AnyObjectValidator(), _object);
|
|
99
|
+
function objectOf(validation) {
|
|
100
|
+
return new ObjectValidator({ ...allowAdditionalProperties(validation) });
|
|
101
|
+
}
|
|
102
|
+
export {
|
|
103
|
+
AnyObjectValidator,
|
|
104
|
+
ObjectValidator,
|
|
105
|
+
object,
|
|
106
|
+
objectOf
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=object.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/validators/object.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// validators/optional.ts
|
|
21
|
+
var optional_exports = {};
|
|
22
|
+
__export(optional_exports, {
|
|
23
|
+
OptionalValidator: () => OptionalValidator,
|
|
24
|
+
optional: () => optional
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(optional_exports);
|
|
27
|
+
var import_types = require("../types.cjs");
|
|
28
|
+
var import_utilities = require("../utilities.cjs");
|
|
29
|
+
var OptionalValidator = class extends import_types.AbstractValidator {
|
|
30
|
+
validator;
|
|
31
|
+
defaultValue;
|
|
32
|
+
constructor(validator, defaultValue) {
|
|
33
|
+
super();
|
|
34
|
+
this.validator = validator;
|
|
35
|
+
this.optional = defaultValue === void 0;
|
|
36
|
+
if (this.optional) {
|
|
37
|
+
this.defaultValue = void 0;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
this.defaultValue = validator.validate(defaultValue, import_types.defaultValidationOptions);
|
|
42
|
+
} catch (cause) {
|
|
43
|
+
throw new TypeError("Default value does not match validator", { cause });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
validate(value, options) {
|
|
47
|
+
if (value === void 0)
|
|
48
|
+
return this.defaultValue;
|
|
49
|
+
return this.validator.validate(value, options);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
function optional(validation, defaultValue) {
|
|
53
|
+
const validator = (0, import_utilities.getValidator)(validation);
|
|
54
|
+
return new OptionalValidator(validator, defaultValue);
|
|
55
|
+
}
|
|
56
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
57
|
+
0 && (module.exports = {
|
|
58
|
+
OptionalValidator,
|
|
59
|
+
optional
|
|
60
|
+
});
|
|
61
|
+
//# sourceMappingURL=optional.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/validators/optional.ts"],
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4D;AAC5D,uBAA6B;AAOtB,IAAM,oBAAN,cAGG,+BAA2D;AAAA,EACnE;AAAA,EACA;AAAA,EAKA,YAAY,WAAyB,cAAkB;AACrD,UAAM;AACN,SAAK,YAAY;AACjB,SAAK,WAAY,iBAAiB;AAClC,QAAI,KAAK,UAAU;AACjB,WAAK,eAAe;AACpB;AAAA,IACF;AAEA,QAAI;AACF,WAAK,eAAe,UAAU,SAAS,cAAc,qCAAwB;AAAA,IAC/E,SAAS,OAAP;AACA,YAAM,IAAI,UAAU,0CAA0C,EAAE,MAAM,CAAC;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,SAAS,OAAgB,SAAsE;AAC7F,QAAI,UAAU;AAAW,aAAO,KAAK;AACrC,WAAO,KAAK,UAAU,SAAS,OAAO,OAAO;AAAA,EAC/C;AACF;AAeO,SAAS,SAEd,YAAe,cAAyD;AACxE,QAAM,gBAAY,+BAAa,UAAU;AACzC,SAAO,IAAI,kBAAkB,WAAW,YAAY;AACtD;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AbstractValidator } from '../types';
|
|
2
|
+
import type { InferValidation, Validation, ValidationOptions, Validator } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* A `Validator` for _optional_ properties (that is `type | undefined`).
|
|
5
|
+
*/
|
|
6
|
+
export declare class OptionalValidator<T = any, // the type of the "validation", that is the optional type to validate
|
|
7
|
+
D = undefined> extends AbstractValidator<D extends undefined ? T | undefined : T> {
|
|
8
|
+
validator: Validator<T>;
|
|
9
|
+
defaultValue: T | undefined;
|
|
10
|
+
constructor(validator: Validator<T>);
|
|
11
|
+
constructor(validator: Validator<T>, defaultValue: D);
|
|
12
|
+
constructor(validator: Validator<T>, defaultValue?: void);
|
|
13
|
+
validate(value: unknown, options?: ValidationOptions): D extends undefined ? T | undefined : T;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Ensure that the property is marked as _optional_ in the `Schema`.
|
|
17
|
+
*
|
|
18
|
+
* @param validation - A `Validation` to be marked as _optional_.
|
|
19
|
+
*/
|
|
20
|
+
export declare function optional<V extends Validation>(validation: V): OptionalValidator<InferValidation<V>, undefined>;
|
|
21
|
+
export declare function optional<V extends Validation, D>(validation: V, defaultValue: D): OptionalValidator<InferValidation<V>, D>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// validators/optional.ts
|
|
2
|
+
import { AbstractValidator, defaultValidationOptions } from "../types.mjs";
|
|
3
|
+
import { getValidator } from "../utilities.mjs";
|
|
4
|
+
var OptionalValidator = class extends AbstractValidator {
|
|
5
|
+
validator;
|
|
6
|
+
defaultValue;
|
|
7
|
+
constructor(validator, defaultValue) {
|
|
8
|
+
super();
|
|
9
|
+
this.validator = validator;
|
|
10
|
+
this.optional = defaultValue === void 0;
|
|
11
|
+
if (this.optional) {
|
|
12
|
+
this.defaultValue = void 0;
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
this.defaultValue = validator.validate(defaultValue, defaultValidationOptions);
|
|
17
|
+
} catch (cause) {
|
|
18
|
+
throw new TypeError("Default value does not match validator", { cause });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
validate(value, options) {
|
|
22
|
+
if (value === void 0)
|
|
23
|
+
return this.defaultValue;
|
|
24
|
+
return this.validator.validate(value, options);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
function optional(validation, defaultValue) {
|
|
28
|
+
const validator = getValidator(validation);
|
|
29
|
+
return new OptionalValidator(validator, defaultValue);
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
OptionalValidator,
|
|
33
|
+
optional
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=optional.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/validators/optional.ts"],
|
|
4
|
+
"mappings": ";AAAA,SAAS,mBAAmB,gCAAgC;AAC5D,SAAS,oBAAoB;AAOtB,IAAM,oBAAN,cAGG,kBAA2D;AAAA,EACnE;AAAA,EACA;AAAA,EAKA,YAAY,WAAyB,cAAkB;AACrD,UAAM;AACN,SAAK,YAAY;AACjB,SAAK,WAAY,iBAAiB;AAClC,QAAI,KAAK,UAAU;AACjB,WAAK,eAAe;AACpB;AAAA,IACF;AAEA,QAAI;AACF,WAAK,eAAe,UAAU,SAAS,cAAc,wBAAwB;AAAA,IAC/E,SAAS,OAAP;AACA,YAAM,IAAI,UAAU,0CAA0C,EAAE,MAAM,CAAC;AAAA,IACzE;AAAA,EACF;AAAA,EAEA,SAAS,OAAgB,SAAsE;AAC7F,QAAI,UAAU;AAAW,aAAO,KAAK;AACrC,WAAO,KAAK,UAAU,SAAS,OAAO,OAAO;AAAA,EAC/C;AACF;AAeO,SAAS,SAEd,YAAe,cAAyD;AACxE,QAAM,YAAY,aAAa,UAAU;AACzC,SAAO,IAAI,kBAAkB,WAAW,YAAY;AACtD;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// validators/string.ts
|
|
21
|
+
var string_exports = {};
|
|
22
|
+
__export(string_exports, {
|
|
23
|
+
AnyStringValidator: () => AnyStringValidator,
|
|
24
|
+
StringValidator: () => StringValidator,
|
|
25
|
+
string: () => string
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(string_exports);
|
|
28
|
+
var import_errors = require("../errors.cjs");
|
|
29
|
+
var import_types = require("../types.cjs");
|
|
30
|
+
var AnyStringValidator = class extends import_types.AbstractValidator {
|
|
31
|
+
validate(value) {
|
|
32
|
+
(0, import_errors.assertValidation)(typeof value == "string", 'Value is not a "string"');
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
var StringValidator = class extends import_types.AbstractValidator {
|
|
37
|
+
maxLength;
|
|
38
|
+
minLength;
|
|
39
|
+
pattern;
|
|
40
|
+
brand;
|
|
41
|
+
constructor(constraints = {}) {
|
|
42
|
+
super();
|
|
43
|
+
const {
|
|
44
|
+
minLength = 0,
|
|
45
|
+
maxLength = Number.MAX_SAFE_INTEGER,
|
|
46
|
+
pattern
|
|
47
|
+
} = constraints;
|
|
48
|
+
if ("brand" in constraints)
|
|
49
|
+
this.brand = constraints.brand;
|
|
50
|
+
(0, import_errors.assertSchema)(minLength >= 0, `Constraint "minLength" (${minLength}) must be non-negative`);
|
|
51
|
+
(0, import_errors.assertSchema)(maxLength >= 0, `Constraint "maxLength" (${maxLength}) must be non-negative`);
|
|
52
|
+
(0, import_errors.assertSchema)(minLength <= maxLength, `Constraint "minLength" (${minLength}) is greater than "maxLength" (${maxLength})`);
|
|
53
|
+
this.maxLength = maxLength;
|
|
54
|
+
this.minLength = minLength;
|
|
55
|
+
this.pattern = pattern;
|
|
56
|
+
}
|
|
57
|
+
validate(value) {
|
|
58
|
+
(0, import_errors.assertValidation)(typeof value == "string", 'Value is not a "string"');
|
|
59
|
+
(0, import_errors.assertValidation)(
|
|
60
|
+
value.length >= this.minLength,
|
|
61
|
+
`String must have a minimum length of ${this.minLength}`
|
|
62
|
+
);
|
|
63
|
+
(0, import_errors.assertValidation)(
|
|
64
|
+
value.length <= this.maxLength,
|
|
65
|
+
`String must have a maximum length of ${this.maxLength}`
|
|
66
|
+
);
|
|
67
|
+
(0, import_errors.assertValidation)(
|
|
68
|
+
this.pattern ? this.pattern.test(value) : true,
|
|
69
|
+
`String does not match required pattern ${this.pattern}`
|
|
70
|
+
);
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
function _string(constraints) {
|
|
75
|
+
return new StringValidator(constraints);
|
|
76
|
+
}
|
|
77
|
+
var string = (0, import_types.makeValidatorFactory)(new AnyStringValidator(), _string);
|
|
78
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
79
|
+
0 && (module.exports = {
|
|
80
|
+
AnyStringValidator,
|
|
81
|
+
StringValidator,
|
|
82
|
+
string
|
|
83
|
+
});
|
|
84
|
+
//# sourceMappingURL=string.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/validators/string.ts"],
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+C;AAC/C,mBAAwD;AAqBjD,IAAM,qBAAN,cAAiC,+BAA0B;AAAA,EAChE,SAAS,OAAwB;AAC/B,wCAAiB,OAAO,SAAS,UAAU,yBAAyB;AACpE,WAAO;AAAA,EACT;AACF;AAGO,IAAM,kBAAN,cAAyD,+BAAqB;AAAA,EAC1E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,cAAiC,CAAC,GAAG;AAC/C,UAAM;AAEN,UAAM;AAAA,MACJ,YAAY;AAAA,MACZ,YAAY,OAAO;AAAA,MACnB;AAAA,IACF,IAAI;AAEJ,QAAI,WAAW;AAAa,WAAK,QAAe,YAAa;AAE7D,oCAAa,aAAa,GAAG,2BAA2B,iCAAiC;AACzF,oCAAa,aAAa,GAAG,2BAA2B,iCAAiC;AACzF,oCAAa,aAAa,WAAW,2BAA2B,2CAA2C,YAAY;AAEvH,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,SAAS,OAAmB;AAC1B,wCAAiB,OAAO,SAAS,UAAU,yBAAyB;AAEpE;AAAA,MAAiB,MAAM,UAAU,KAAK;AAAA,MAClC,wCAAwC,KAAK;AAAA,IAAW;AAE5D;AAAA,MAAiB,MAAM,UAAU,KAAK;AAAA,MAClC,wCAAwC,KAAK;AAAA,IAAW;AAE5D;AAAA,MAAiB,KAAK,UAAU,KAAK,QAAQ,KAAK,KAAK,IAAI;AAAA,MACvD,0CAA0C,KAAK;AAAA,IAAS;AAE5D,WAAO;AAAA,EACT;AACF;AAKA,SAAS,QAAQ,aAAmD;AAClE,SAAO,IAAI,gBAAgB,WAAW;AACxC;AAGO,IAAM,aAAS,mCAAqB,IAAI,mBAAmB,GAAG,OAAO;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AbstractValidator } from '../types';
|
|
2
|
+
import type { Branding } from '../types';
|
|
3
|
+
/** Constraints to validate a `string` with. */
|
|
4
|
+
export interface StringConstraints {
|
|
5
|
+
/** The _maximum_ length of a valid `string`: `value.length <= maxLength` */
|
|
6
|
+
maxLength?: number;
|
|
7
|
+
/** The _minimum_ length of a valid `string`: `value.length >= minLength` */
|
|
8
|
+
minLength?: number;
|
|
9
|
+
/** A `RegExp` enforcing a particular pattern for a valid `string`: `pattern.test(value)` */
|
|
10
|
+
pattern?: RegExp;
|
|
11
|
+
}
|
|
12
|
+
/** Constraints to validate a `string` with extra branding information. */
|
|
13
|
+
export interface BrandedStringConstraints<B extends string> extends StringConstraints {
|
|
14
|
+
/** The _brand_ of the string (will generate a `__brand_${B}` type property */
|
|
15
|
+
brand: B;
|
|
16
|
+
}
|
|
17
|
+
/** A `Validator` validating any `string`. */
|
|
18
|
+
export declare class AnyStringValidator extends AbstractValidator<string> {
|
|
19
|
+
validate(value: unknown): string;
|
|
20
|
+
}
|
|
21
|
+
/** A `Validator` validating `string`s with constraints. */
|
|
22
|
+
export declare class StringValidator<S extends string = string> extends AbstractValidator<S> {
|
|
23
|
+
readonly maxLength: number;
|
|
24
|
+
readonly minLength: number;
|
|
25
|
+
readonly pattern?: RegExp;
|
|
26
|
+
readonly brand?: string;
|
|
27
|
+
constructor(constraints?: StringConstraints);
|
|
28
|
+
validate(value: unknown): S;
|
|
29
|
+
}
|
|
30
|
+
declare function _string(constraints: StringConstraints): StringValidator<string>;
|
|
31
|
+
declare function _string<S extends string>(constraints: StringConstraints): StringValidator<S>;
|
|
32
|
+
declare function _string<B extends string>(constraints: BrandedStringConstraints<B>): StringValidator<string & Branding<B>>;
|
|
33
|
+
/** Validate `string`s. */
|
|
34
|
+
export declare const string: typeof _string & AnyStringValidator;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// validators/string.ts
|
|
2
|
+
import { assertSchema, assertValidation } from "../errors.mjs";
|
|
3
|
+
import { AbstractValidator, makeValidatorFactory } from "../types.mjs";
|
|
4
|
+
var AnyStringValidator = class extends AbstractValidator {
|
|
5
|
+
validate(value) {
|
|
6
|
+
assertValidation(typeof value == "string", 'Value is not a "string"');
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var StringValidator = class extends AbstractValidator {
|
|
11
|
+
maxLength;
|
|
12
|
+
minLength;
|
|
13
|
+
pattern;
|
|
14
|
+
brand;
|
|
15
|
+
constructor(constraints = {}) {
|
|
16
|
+
super();
|
|
17
|
+
const {
|
|
18
|
+
minLength = 0,
|
|
19
|
+
maxLength = Number.MAX_SAFE_INTEGER,
|
|
20
|
+
pattern
|
|
21
|
+
} = constraints;
|
|
22
|
+
if ("brand" in constraints)
|
|
23
|
+
this.brand = constraints.brand;
|
|
24
|
+
assertSchema(minLength >= 0, `Constraint "minLength" (${minLength}) must be non-negative`);
|
|
25
|
+
assertSchema(maxLength >= 0, `Constraint "maxLength" (${maxLength}) must be non-negative`);
|
|
26
|
+
assertSchema(minLength <= maxLength, `Constraint "minLength" (${minLength}) is greater than "maxLength" (${maxLength})`);
|
|
27
|
+
this.maxLength = maxLength;
|
|
28
|
+
this.minLength = minLength;
|
|
29
|
+
this.pattern = pattern;
|
|
30
|
+
}
|
|
31
|
+
validate(value) {
|
|
32
|
+
assertValidation(typeof value == "string", 'Value is not a "string"');
|
|
33
|
+
assertValidation(
|
|
34
|
+
value.length >= this.minLength,
|
|
35
|
+
`String must have a minimum length of ${this.minLength}`
|
|
36
|
+
);
|
|
37
|
+
assertValidation(
|
|
38
|
+
value.length <= this.maxLength,
|
|
39
|
+
`String must have a maximum length of ${this.maxLength}`
|
|
40
|
+
);
|
|
41
|
+
assertValidation(
|
|
42
|
+
this.pattern ? this.pattern.test(value) : true,
|
|
43
|
+
`String does not match required pattern ${this.pattern}`
|
|
44
|
+
);
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
function _string(constraints) {
|
|
49
|
+
return new StringValidator(constraints);
|
|
50
|
+
}
|
|
51
|
+
var string = makeValidatorFactory(new AnyStringValidator(), _string);
|
|
52
|
+
export {
|
|
53
|
+
AnyStringValidator,
|
|
54
|
+
StringValidator,
|
|
55
|
+
string
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=string.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/validators/string.ts"],
|
|
4
|
+
"mappings": ";AAAA,SAAS,cAAc,wBAAwB;AAC/C,SAAS,mBAAmB,4BAA4B;AAqBjD,IAAM,qBAAN,cAAiC,kBAA0B;AAAA,EAChE,SAAS,OAAwB;AAC/B,qBAAiB,OAAO,SAAS,UAAU,yBAAyB;AACpE,WAAO;AAAA,EACT;AACF;AAGO,IAAM,kBAAN,cAAyD,kBAAqB;AAAA,EAC1E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,cAAiC,CAAC,GAAG;AAC/C,UAAM;AAEN,UAAM;AAAA,MACJ,YAAY;AAAA,MACZ,YAAY,OAAO;AAAA,MACnB;AAAA,IACF,IAAI;AAEJ,QAAI,WAAW;AAAa,WAAK,QAAe,YAAa;AAE7D,iBAAa,aAAa,GAAG,2BAA2B,iCAAiC;AACzF,iBAAa,aAAa,GAAG,2BAA2B,iCAAiC;AACzF,iBAAa,aAAa,WAAW,2BAA2B,2CAA2C,YAAY;AAEvH,SAAK,YAAY;AACjB,SAAK,YAAY;AACjB,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,SAAS,OAAmB;AAC1B,qBAAiB,OAAO,SAAS,UAAU,yBAAyB;AAEpE;AAAA,MAAiB,MAAM,UAAU,KAAK;AAAA,MAClC,wCAAwC,KAAK;AAAA,IAAW;AAE5D;AAAA,MAAiB,MAAM,UAAU,KAAK;AAAA,MAClC,wCAAwC,KAAK;AAAA,IAAW;AAE5D;AAAA,MAAiB,KAAK,UAAU,KAAK,QAAQ,KAAK,KAAK,IAAI;AAAA,MACvD,0CAA0C,KAAK;AAAA,IAAS;AAE5D,WAAO;AAAA,EACT;AACF;AAKA,SAAS,QAAQ,aAAmD;AAClE,SAAO,IAAI,gBAAgB,WAAW;AACxC;AAGO,IAAM,SAAS,qBAAqB,IAAI,mBAAmB,GAAG,OAAO;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// validators/tuple.ts
|
|
21
|
+
var tuple_exports = {};
|
|
22
|
+
__export(tuple_exports, {
|
|
23
|
+
TupleValidator: () => TupleValidator,
|
|
24
|
+
tuple: () => tuple
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(tuple_exports);
|
|
27
|
+
var import_errors = require("../errors.cjs");
|
|
28
|
+
var import_types = require("../types.cjs");
|
|
29
|
+
var import_utilities = require("../utilities.cjs");
|
|
30
|
+
var import_constant = require("./constant.cjs");
|
|
31
|
+
var TupleValidator = class extends import_types.AbstractValidator {
|
|
32
|
+
members;
|
|
33
|
+
tuple;
|
|
34
|
+
constructor(tuple2) {
|
|
35
|
+
super();
|
|
36
|
+
const members = [];
|
|
37
|
+
for (const item of tuple2) {
|
|
38
|
+
if (item === null) {
|
|
39
|
+
members.push({ single: true, validator: import_constant.nullValidator });
|
|
40
|
+
} else if (typeof item === "object" && import_types.restValidator in item) {
|
|
41
|
+
members.push({ single: false, validator: item[import_types.restValidator] });
|
|
42
|
+
} else {
|
|
43
|
+
members.push({ single: true, validator: (0, import_utilities.getValidator)(item) });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
this.members = members;
|
|
47
|
+
this.tuple = tuple2;
|
|
48
|
+
}
|
|
49
|
+
validate(value, options) {
|
|
50
|
+
(0, import_errors.assertValidation)(Array.isArray(value), 'Value is not an "array"');
|
|
51
|
+
if (this.members.length === 0) {
|
|
52
|
+
const size = value.length;
|
|
53
|
+
(0, import_errors.assertValidation)(size === 0, `Found ${size} element${size === 1 ? "" : "s"} validating empty tuple`);
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
const clone = new Array(value.length);
|
|
57
|
+
let needle = 0;
|
|
58
|
+
let haystack = 0;
|
|
59
|
+
let { single, validator } = this.members[needle];
|
|
60
|
+
while (needle < this.members.length && haystack < value.length) {
|
|
61
|
+
try {
|
|
62
|
+
clone[haystack] = validator.validate(value[haystack], options);
|
|
63
|
+
if (single)
|
|
64
|
+
({ single, validator } = this.members[++needle] || {});
|
|
65
|
+
haystack++;
|
|
66
|
+
} catch (error) {
|
|
67
|
+
if (single)
|
|
68
|
+
throw new import_errors.ValidationError(error, [haystack]);
|
|
69
|
+
else
|
|
70
|
+
({ single, validator } = this.members[++needle] || {});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
while (needle < this.members.length && this.members[needle].single === false) {
|
|
74
|
+
needle++;
|
|
75
|
+
}
|
|
76
|
+
const missing = this.members.length - needle;
|
|
77
|
+
if (missing === 1 && single) {
|
|
78
|
+
throw new import_errors.ValidationError("Tuple defines 1 missing validation");
|
|
79
|
+
} else if (missing > 1) {
|
|
80
|
+
throw new import_errors.ValidationError(`Tuple defines ${missing} missing validations`);
|
|
81
|
+
}
|
|
82
|
+
const extra = value.length - haystack;
|
|
83
|
+
(0, import_errors.assertValidation)(extra === 0, `Found ${extra} extra element${extra === 1 ? "" : "s"} in tuple`);
|
|
84
|
+
return clone;
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
function tuple(tuple2) {
|
|
88
|
+
return new TupleValidator(tuple2);
|
|
89
|
+
}
|
|
90
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
91
|
+
0 && (module.exports = {
|
|
92
|
+
TupleValidator,
|
|
93
|
+
tuple
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=tuple.cjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/validators/tuple.ts"],
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAkD;AAClD,mBAAiD;AAEjD,uBAA6B;AAC7B,sBAA8B;AAOvB,IAAM,iBAAN,cAA8C,+BAAiC;AAAA,EAC3E;AAAA,EACA;AAAA,EAET,YAAYA,QAAU;AACpB,UAAM;AAEN,UAAM,UAAyB,CAAC;AAChC,eAAW,QAAQA,QAAO;AACxB,UAAI,SAAS,MAAM;AACjB,gBAAQ,KAAK,EAAE,QAAQ,MAAM,WAAW,8BAAc,CAAC;AAAA,MACzD,WAAY,OAAO,SAAS,YAAc,8BAAiB,MAAO;AAChE,gBAAQ,KAAK,EAAE,QAAQ,OAAO,WAAiB,KAAM,0BAAa,EAAE,CAAC;AAAA,MACvE,OAAO;AACL,gBAAQ,KAAK,EAAE,QAAQ,MAAM,eAAW,+BAAa,IAAI,EAAE,CAAC;AAAA,MAC9D;AAAA,IACF;AAEA,SAAK,UAAU;AACf,SAAK,QAAQA;AAAA,EACf;AAAA,EAEA,SAAS,OAAgB,SAA4C;AACnE,wCAAiB,MAAM,QAAQ,KAAK,GAAG,yBAAyB;AAGhE,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,YAAM,OAAO,MAAM;AACnB,0CAAiB,SAAS,GAAG,SAAS,eAAe,SAAS,IAAI,KAAK,4BAA4B;AACnG,aAAO;AAAA,IACT;AAGA,UAAM,QAAQ,IAAI,MAAM,MAAM,MAAM;AACpC,QAAI,SAAS;AACb,QAAI,WAAW;AACf,QAAI,EAAE,QAAQ,UAAU,IAAI,KAAK,QAAQ,MAAM;AAE/C,WAAQ,SAAS,KAAK,QAAQ,UAAY,WAAW,MAAM,QAAS;AAClE,UAAI;AACF,cAAM,QAAQ,IAAI,UAAU,SAAS,MAAM,QAAQ,GAAG,OAAO;AAC7D,YAAI;AAAQ,WAAC,EAAE,QAAQ,UAAU,IAAI,KAAK,QAAQ,EAAG,MAAM,KAAK,CAAC;AACjE;AAAA,MACF,SAAS,OAAP;AACA,YAAI;AAAQ,gBAAM,IAAI,8BAAgB,OAAO,CAAE,QAAS,CAAC;AAAA;AACpD,WAAC,EAAE,QAAQ,UAAU,IAAI,KAAK,QAAQ,EAAG,MAAM,KAAK,CAAC;AAAA,MAC5D;AAAA,IACF;AAEA,WAAQ,SAAS,KAAK,QAAQ,UAAY,KAAK,QAAQ,MAAM,EAAE,WAAW,OAAQ;AAChF;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,QAAQ,SAAS;AACtC,QAAK,YAAY,KAAM,QAAQ;AAC7B,YAAM,IAAI,8BAAgB,oCAAoC;AAAA,IAChE,WAAW,UAAU,GAAG;AACtB,YAAM,IAAI,8BAAgB,iBAAiB,6BAA6B;AAAA,IAC1E;AAEA,UAAM,QAAQ,MAAM,SAAS;AAC7B,wCAAiB,UAAU,GAAG,SAAS,sBAAsB,UAAU,IAAI,KAAK,cAAc;AAE9F,WAAO;AAAA,EACT;AACF;AAGO,SAAS,MAAuBA,QAAoC;AACzE,SAAO,IAAI,eAAeA,MAAK;AACjC;",
|
|
5
|
+
"names": ["tuple"]
|
|
6
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AbstractValidator } from '../types';
|
|
2
|
+
import type { InferTuple, Tuple, ValidationOptions, Validator } from '../types';
|
|
3
|
+
export interface TupleMember {
|
|
4
|
+
single: boolean;
|
|
5
|
+
validator: Validator;
|
|
6
|
+
}
|
|
7
|
+
/** A `Validator` for _tuples_. */
|
|
8
|
+
export declare class TupleValidator<T extends Tuple> extends AbstractValidator<InferTuple<T>> {
|
|
9
|
+
readonly members: readonly TupleMember[];
|
|
10
|
+
readonly tuple: T;
|
|
11
|
+
constructor(tuple: T);
|
|
12
|
+
validate(value: unknown, options?: ValidationOptions): InferTuple<T>;
|
|
13
|
+
}
|
|
14
|
+
/** Validate _tuples_. */
|
|
15
|
+
export declare function tuple<T extends Tuple>(tuple: T): Validator<InferTuple<T>>;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// validators/tuple.ts
|
|
2
|
+
import { assertValidation, ValidationError } from "../errors.mjs";
|
|
3
|
+
import { AbstractValidator, restValidator } from "../types.mjs";
|
|
4
|
+
import { getValidator } from "../utilities.mjs";
|
|
5
|
+
import { nullValidator } from "./constant.mjs";
|
|
6
|
+
var TupleValidator = class extends AbstractValidator {
|
|
7
|
+
members;
|
|
8
|
+
tuple;
|
|
9
|
+
constructor(tuple2) {
|
|
10
|
+
super();
|
|
11
|
+
const members = [];
|
|
12
|
+
for (const item of tuple2) {
|
|
13
|
+
if (item === null) {
|
|
14
|
+
members.push({ single: true, validator: nullValidator });
|
|
15
|
+
} else if (typeof item === "object" && restValidator in item) {
|
|
16
|
+
members.push({ single: false, validator: item[restValidator] });
|
|
17
|
+
} else {
|
|
18
|
+
members.push({ single: true, validator: getValidator(item) });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
this.members = members;
|
|
22
|
+
this.tuple = tuple2;
|
|
23
|
+
}
|
|
24
|
+
validate(value, options) {
|
|
25
|
+
assertValidation(Array.isArray(value), 'Value is not an "array"');
|
|
26
|
+
if (this.members.length === 0) {
|
|
27
|
+
const size = value.length;
|
|
28
|
+
assertValidation(size === 0, `Found ${size} element${size === 1 ? "" : "s"} validating empty tuple`);
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
const clone = new Array(value.length);
|
|
32
|
+
let needle = 0;
|
|
33
|
+
let haystack = 0;
|
|
34
|
+
let { single, validator } = this.members[needle];
|
|
35
|
+
while (needle < this.members.length && haystack < value.length) {
|
|
36
|
+
try {
|
|
37
|
+
clone[haystack] = validator.validate(value[haystack], options);
|
|
38
|
+
if (single)
|
|
39
|
+
({ single, validator } = this.members[++needle] || {});
|
|
40
|
+
haystack++;
|
|
41
|
+
} catch (error) {
|
|
42
|
+
if (single)
|
|
43
|
+
throw new ValidationError(error, [haystack]);
|
|
44
|
+
else
|
|
45
|
+
({ single, validator } = this.members[++needle] || {});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
while (needle < this.members.length && this.members[needle].single === false) {
|
|
49
|
+
needle++;
|
|
50
|
+
}
|
|
51
|
+
const missing = this.members.length - needle;
|
|
52
|
+
if (missing === 1 && single) {
|
|
53
|
+
throw new ValidationError("Tuple defines 1 missing validation");
|
|
54
|
+
} else if (missing > 1) {
|
|
55
|
+
throw new ValidationError(`Tuple defines ${missing} missing validations`);
|
|
56
|
+
}
|
|
57
|
+
const extra = value.length - haystack;
|
|
58
|
+
assertValidation(extra === 0, `Found ${extra} extra element${extra === 1 ? "" : "s"} in tuple`);
|
|
59
|
+
return clone;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
function tuple(tuple2) {
|
|
63
|
+
return new TupleValidator(tuple2);
|
|
64
|
+
}
|
|
65
|
+
export {
|
|
66
|
+
TupleValidator,
|
|
67
|
+
tuple
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=tuple.mjs.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/validators/tuple.ts"],
|
|
4
|
+
"mappings": ";AAAA,SAAS,kBAAkB,uBAAuB;AAClD,SAAS,mBAAmB,qBAAqB;AAEjD,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAOvB,IAAM,iBAAN,cAA8C,kBAAiC;AAAA,EAC3E;AAAA,EACA;AAAA,EAET,YAAYA,QAAU;AACpB,UAAM;AAEN,UAAM,UAAyB,CAAC;AAChC,eAAW,QAAQA,QAAO;AACxB,UAAI,SAAS,MAAM;AACjB,gBAAQ,KAAK,EAAE,QAAQ,MAAM,WAAW,cAAc,CAAC;AAAA,MACzD,WAAY,OAAO,SAAS,YAAc,iBAAiB,MAAO;AAChE,gBAAQ,KAAK,EAAE,QAAQ,OAAO,WAAiB,KAAM,aAAa,EAAE,CAAC;AAAA,MACvE,OAAO;AACL,gBAAQ,KAAK,EAAE,QAAQ,MAAM,WAAW,aAAa,IAAI,EAAE,CAAC;AAAA,MAC9D;AAAA,IACF;AAEA,SAAK,UAAU;AACf,SAAK,QAAQA;AAAA,EACf;AAAA,EAEA,SAAS,OAAgB,SAA4C;AACnE,qBAAiB,MAAM,QAAQ,KAAK,GAAG,yBAAyB;AAGhE,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,YAAM,OAAO,MAAM;AACnB,uBAAiB,SAAS,GAAG,SAAS,eAAe,SAAS,IAAI,KAAK,4BAA4B;AACnG,aAAO;AAAA,IACT;AAGA,UAAM,QAAQ,IAAI,MAAM,MAAM,MAAM;AACpC,QAAI,SAAS;AACb,QAAI,WAAW;AACf,QAAI,EAAE,QAAQ,UAAU,IAAI,KAAK,QAAQ,MAAM;AAE/C,WAAQ,SAAS,KAAK,QAAQ,UAAY,WAAW,MAAM,QAAS;AAClE,UAAI;AACF,cAAM,QAAQ,IAAI,UAAU,SAAS,MAAM,QAAQ,GAAG,OAAO;AAC7D,YAAI;AAAQ,WAAC,EAAE,QAAQ,UAAU,IAAI,KAAK,QAAQ,EAAG,MAAM,KAAK,CAAC;AACjE;AAAA,MACF,SAAS,OAAP;AACA,YAAI;AAAQ,gBAAM,IAAI,gBAAgB,OAAO,CAAE,QAAS,CAAC;AAAA;AACpD,WAAC,EAAE,QAAQ,UAAU,IAAI,KAAK,QAAQ,EAAG,MAAM,KAAK,CAAC;AAAA,MAC5D;AAAA,IACF;AAEA,WAAQ,SAAS,KAAK,QAAQ,UAAY,KAAK,QAAQ,MAAM,EAAE,WAAW,OAAQ;AAChF;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,QAAQ,SAAS;AACtC,QAAK,YAAY,KAAM,QAAQ;AAC7B,YAAM,IAAI,gBAAgB,oCAAoC;AAAA,IAChE,WAAW,UAAU,GAAG;AACtB,YAAM,IAAI,gBAAgB,iBAAiB,6BAA6B;AAAA,IAC1E;AAEA,UAAM,QAAQ,MAAM,SAAS;AAC7B,qBAAiB,UAAU,GAAG,SAAS,sBAAsB,UAAU,IAAI,KAAK,cAAc;AAE9F,WAAO;AAAA,EACT;AACF;AAGO,SAAS,MAAuBA,QAAoC;AACzE,SAAO,IAAI,eAAeA,MAAK;AACjC;",
|
|
5
|
+
"names": ["tuple"]
|
|
6
|
+
}
|