2282 lines
80 KiB
JavaScript
2282 lines
80 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var get = require('lodash/get.js');
|
||
|
var util = require('util');
|
||
|
var fastDeepEqual = require('fast-deep-equal/es6/index.js');
|
||
|
var uniqWith = require('lodash/uniqWith.js');
|
||
|
|
||
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
||
|
|
||
|
var get__default = /*#__PURE__*/_interopDefault(get);
|
||
|
var fastDeepEqual__default = /*#__PURE__*/_interopDefault(fastDeepEqual);
|
||
|
var uniqWith__default = /*#__PURE__*/_interopDefault(uniqWith);
|
||
|
|
||
|
var __defProp = Object.defineProperty;
|
||
|
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
||
|
|
||
|
// src/lib/configs.ts
|
||
|
var validationEnabled = true;
|
||
|
function setGlobalValidationEnabled(enabled) {
|
||
|
validationEnabled = enabled;
|
||
|
}
|
||
|
__name(setGlobalValidationEnabled, "setGlobalValidationEnabled");
|
||
|
function getGlobalValidationEnabled() {
|
||
|
return validationEnabled;
|
||
|
}
|
||
|
__name(getGlobalValidationEnabled, "getGlobalValidationEnabled");
|
||
|
|
||
|
// src/lib/Result.ts
|
||
|
var _Result = class _Result {
|
||
|
constructor(success, value, error) {
|
||
|
this.success = success;
|
||
|
if (success) {
|
||
|
this.value = value;
|
||
|
} else {
|
||
|
this.error = error;
|
||
|
}
|
||
|
}
|
||
|
isOk() {
|
||
|
return this.success;
|
||
|
}
|
||
|
isErr() {
|
||
|
return !this.success;
|
||
|
}
|
||
|
unwrap() {
|
||
|
if (this.isOk())
|
||
|
return this.value;
|
||
|
throw this.error;
|
||
|
}
|
||
|
static ok(value) {
|
||
|
return new _Result(true, value);
|
||
|
}
|
||
|
static err(error) {
|
||
|
return new _Result(false, void 0, error);
|
||
|
}
|
||
|
};
|
||
|
__name(_Result, "Result");
|
||
|
var Result = _Result;
|
||
|
|
||
|
// src/validators/util/getValue.ts
|
||
|
function getValue(valueOrFn) {
|
||
|
return typeof valueOrFn === "function" ? valueOrFn() : valueOrFn;
|
||
|
}
|
||
|
__name(getValue, "getValue");
|
||
|
|
||
|
// src/lib/errors/BaseError.ts
|
||
|
var customInspectSymbol = Symbol.for("nodejs.util.inspect.custom");
|
||
|
var customInspectSymbolStackLess = Symbol.for("nodejs.util.inspect.custom.stack-less");
|
||
|
var _BaseError = class _BaseError extends Error {
|
||
|
[customInspectSymbol](depth, options) {
|
||
|
return `${this[customInspectSymbolStackLess](depth, options)}
|
||
|
${this.stack.slice(this.stack.indexOf("\n"))}`;
|
||
|
}
|
||
|
};
|
||
|
__name(_BaseError, "BaseError");
|
||
|
var BaseError = _BaseError;
|
||
|
|
||
|
// src/lib/errors/BaseConstraintError.ts
|
||
|
var _BaseConstraintError = class _BaseConstraintError extends BaseError {
|
||
|
constructor(constraint, message, given) {
|
||
|
super(message);
|
||
|
this.constraint = constraint;
|
||
|
this.given = given;
|
||
|
}
|
||
|
};
|
||
|
__name(_BaseConstraintError, "BaseConstraintError");
|
||
|
var BaseConstraintError = _BaseConstraintError;
|
||
|
|
||
|
// src/lib/errors/ExpectedConstraintError.ts
|
||
|
var _ExpectedConstraintError = class _ExpectedConstraintError extends BaseConstraintError {
|
||
|
constructor(constraint, message, given, expected) {
|
||
|
super(constraint, message, given);
|
||
|
this.expected = expected;
|
||
|
}
|
||
|
toJSON() {
|
||
|
return {
|
||
|
name: this.name,
|
||
|
constraint: this.constraint,
|
||
|
given: this.given,
|
||
|
expected: this.expected
|
||
|
};
|
||
|
}
|
||
|
[customInspectSymbolStackLess](depth, options) {
|
||
|
const constraint = options.stylize(this.constraint, "string");
|
||
|
if (depth < 0) {
|
||
|
return options.stylize(`[ExpectedConstraintError: ${constraint}]`, "special");
|
||
|
}
|
||
|
const newOptions = { ...options, depth: options.depth === null ? null : options.depth - 1 };
|
||
|
const padding = `
|
||
|
${options.stylize("|", "undefined")} `;
|
||
|
const given = util.inspect(this.given, newOptions).replace(/\n/g, padding);
|
||
|
const header = `${options.stylize("ExpectedConstraintError", "special")} > ${constraint}`;
|
||
|
const message = options.stylize(this.message, "regexp");
|
||
|
const expectedBlock = `
|
||
|
${options.stylize("Expected: ", "string")}${options.stylize(this.expected, "boolean")}`;
|
||
|
const givenBlock = `
|
||
|
${options.stylize("Received:", "regexp")}${padding}${given}`;
|
||
|
return `${header}
|
||
|
${message}
|
||
|
${expectedBlock}
|
||
|
${givenBlock}`;
|
||
|
}
|
||
|
};
|
||
|
__name(_ExpectedConstraintError, "ExpectedConstraintError");
|
||
|
var ExpectedConstraintError = _ExpectedConstraintError;
|
||
|
|
||
|
// src/constraints/ObjectConstrains.ts
|
||
|
function whenConstraint(key, options, validator) {
|
||
|
return {
|
||
|
run(input, parent) {
|
||
|
if (!parent) {
|
||
|
return Result.err(new ExpectedConstraintError("s.object(T.when)", "Validator has no parent", parent, "Validator to have a parent"));
|
||
|
}
|
||
|
const isKeyArray = Array.isArray(key);
|
||
|
const value = isKeyArray ? key.map((k) => get__default.default(parent, k)) : get__default.default(parent, key);
|
||
|
const predicate = resolveBooleanIs(options, value, isKeyArray) ? options.then : options.otherwise;
|
||
|
if (predicate) {
|
||
|
return predicate(validator).run(input);
|
||
|
}
|
||
|
return Result.ok(input);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(whenConstraint, "whenConstraint");
|
||
|
function resolveBooleanIs(options, value, isKeyArray) {
|
||
|
if (options.is === void 0) {
|
||
|
return isKeyArray ? !value.some((val) => !val) : Boolean(value);
|
||
|
}
|
||
|
if (typeof options.is === "function") {
|
||
|
return options.is(value);
|
||
|
}
|
||
|
return value === options.is;
|
||
|
}
|
||
|
__name(resolveBooleanIs, "resolveBooleanIs");
|
||
|
|
||
|
// src/validators/BaseValidator.ts
|
||
|
var _BaseValidator = class _BaseValidator {
|
||
|
constructor(constraints = []) {
|
||
|
this.constraints = [];
|
||
|
this.isValidationEnabled = null;
|
||
|
this.constraints = constraints;
|
||
|
}
|
||
|
setParent(parent) {
|
||
|
this.parent = parent;
|
||
|
return this;
|
||
|
}
|
||
|
get optional() {
|
||
|
return new UnionValidator([new LiteralValidator(void 0), this.clone()]);
|
||
|
}
|
||
|
get nullable() {
|
||
|
return new UnionValidator([new LiteralValidator(null), this.clone()]);
|
||
|
}
|
||
|
get nullish() {
|
||
|
return new UnionValidator([new NullishValidator(), this.clone()]);
|
||
|
}
|
||
|
get array() {
|
||
|
return new ArrayValidator(this.clone());
|
||
|
}
|
||
|
get set() {
|
||
|
return new SetValidator(this.clone());
|
||
|
}
|
||
|
or(...predicates) {
|
||
|
return new UnionValidator([this.clone(), ...predicates]);
|
||
|
}
|
||
|
transform(cb) {
|
||
|
return this.addConstraint({ run: (input) => Result.ok(cb(input)) });
|
||
|
}
|
||
|
reshape(cb) {
|
||
|
return this.addConstraint({ run: cb });
|
||
|
}
|
||
|
default(value) {
|
||
|
return new DefaultValidator(this.clone(), value);
|
||
|
}
|
||
|
when(key, options) {
|
||
|
return this.addConstraint(whenConstraint(key, options, this));
|
||
|
}
|
||
|
describe(description) {
|
||
|
const clone = this.clone();
|
||
|
clone.description = description;
|
||
|
return clone;
|
||
|
}
|
||
|
run(value) {
|
||
|
let result = this.handle(value);
|
||
|
if (result.isErr())
|
||
|
return result;
|
||
|
for (const constraint of this.constraints) {
|
||
|
result = constraint.run(result.value, this.parent);
|
||
|
if (result.isErr())
|
||
|
break;
|
||
|
}
|
||
|
return result;
|
||
|
}
|
||
|
parse(value) {
|
||
|
if (!this.shouldRunConstraints) {
|
||
|
return this.handle(value).unwrap();
|
||
|
}
|
||
|
return this.constraints.reduce((v, constraint) => constraint.run(v).unwrap(), this.handle(value).unwrap());
|
||
|
}
|
||
|
is(value) {
|
||
|
return this.run(value).isOk();
|
||
|
}
|
||
|
/**
|
||
|
* Sets if the validator should also run constraints or just do basic checks.
|
||
|
* @param isValidationEnabled Whether this validator should be enabled or disabled. You can pass boolean or a function returning boolean which will be called just before parsing.
|
||
|
* Set to `null` to go off of the global configuration.
|
||
|
*/
|
||
|
setValidationEnabled(isValidationEnabled) {
|
||
|
const clone = this.clone();
|
||
|
clone.isValidationEnabled = isValidationEnabled;
|
||
|
return clone;
|
||
|
}
|
||
|
getValidationEnabled() {
|
||
|
return getValue(this.isValidationEnabled);
|
||
|
}
|
||
|
get shouldRunConstraints() {
|
||
|
return getValue(this.isValidationEnabled) ?? getGlobalValidationEnabled();
|
||
|
}
|
||
|
clone() {
|
||
|
const clone = Reflect.construct(this.constructor, [this.constraints]);
|
||
|
clone.isValidationEnabled = this.isValidationEnabled;
|
||
|
return clone;
|
||
|
}
|
||
|
addConstraint(constraint) {
|
||
|
const clone = this.clone();
|
||
|
clone.constraints = clone.constraints.concat(constraint);
|
||
|
return clone;
|
||
|
}
|
||
|
};
|
||
|
__name(_BaseValidator, "BaseValidator");
|
||
|
var BaseValidator = _BaseValidator;
|
||
|
function isUnique(input) {
|
||
|
if (input.length < 2)
|
||
|
return true;
|
||
|
const uniqueArray2 = uniqWith__default.default(input, fastDeepEqual__default.default);
|
||
|
return uniqueArray2.length === input.length;
|
||
|
}
|
||
|
__name(isUnique, "isUnique");
|
||
|
|
||
|
// src/constraints/util/operators.ts
|
||
|
function lessThan(a, b) {
|
||
|
return a < b;
|
||
|
}
|
||
|
__name(lessThan, "lessThan");
|
||
|
function lessThanOrEqual(a, b) {
|
||
|
return a <= b;
|
||
|
}
|
||
|
__name(lessThanOrEqual, "lessThanOrEqual");
|
||
|
function greaterThan(a, b) {
|
||
|
return a > b;
|
||
|
}
|
||
|
__name(greaterThan, "greaterThan");
|
||
|
function greaterThanOrEqual(a, b) {
|
||
|
return a >= b;
|
||
|
}
|
||
|
__name(greaterThanOrEqual, "greaterThanOrEqual");
|
||
|
function equal(a, b) {
|
||
|
return a === b;
|
||
|
}
|
||
|
__name(equal, "equal");
|
||
|
function notEqual(a, b) {
|
||
|
return a !== b;
|
||
|
}
|
||
|
__name(notEqual, "notEqual");
|
||
|
|
||
|
// src/constraints/ArrayConstraints.ts
|
||
|
function arrayLengthComparator(comparator, name, expected, length) {
|
||
|
return {
|
||
|
run(input) {
|
||
|
return comparator(input.length, length) ? Result.ok(input) : Result.err(new ExpectedConstraintError(name, "Invalid Array length", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(arrayLengthComparator, "arrayLengthComparator");
|
||
|
function arrayLengthLessThan(value) {
|
||
|
const expected = `expected.length < ${value}`;
|
||
|
return arrayLengthComparator(lessThan, "s.array(T).lengthLessThan", expected, value);
|
||
|
}
|
||
|
__name(arrayLengthLessThan, "arrayLengthLessThan");
|
||
|
function arrayLengthLessThanOrEqual(value) {
|
||
|
const expected = `expected.length <= ${value}`;
|
||
|
return arrayLengthComparator(lessThanOrEqual, "s.array(T).lengthLessThanOrEqual", expected, value);
|
||
|
}
|
||
|
__name(arrayLengthLessThanOrEqual, "arrayLengthLessThanOrEqual");
|
||
|
function arrayLengthGreaterThan(value) {
|
||
|
const expected = `expected.length > ${value}`;
|
||
|
return arrayLengthComparator(greaterThan, "s.array(T).lengthGreaterThan", expected, value);
|
||
|
}
|
||
|
__name(arrayLengthGreaterThan, "arrayLengthGreaterThan");
|
||
|
function arrayLengthGreaterThanOrEqual(value) {
|
||
|
const expected = `expected.length >= ${value}`;
|
||
|
return arrayLengthComparator(greaterThanOrEqual, "s.array(T).lengthGreaterThanOrEqual", expected, value);
|
||
|
}
|
||
|
__name(arrayLengthGreaterThanOrEqual, "arrayLengthGreaterThanOrEqual");
|
||
|
function arrayLengthEqual(value) {
|
||
|
const expected = `expected.length === ${value}`;
|
||
|
return arrayLengthComparator(equal, "s.array(T).lengthEqual", expected, value);
|
||
|
}
|
||
|
__name(arrayLengthEqual, "arrayLengthEqual");
|
||
|
function arrayLengthNotEqual(value) {
|
||
|
const expected = `expected.length !== ${value}`;
|
||
|
return arrayLengthComparator(notEqual, "s.array(T).lengthNotEqual", expected, value);
|
||
|
}
|
||
|
__name(arrayLengthNotEqual, "arrayLengthNotEqual");
|
||
|
function arrayLengthRange(start, endBefore) {
|
||
|
const expected = `expected.length >= ${start} && expected.length < ${endBefore}`;
|
||
|
return {
|
||
|
run(input) {
|
||
|
return input.length >= start && input.length < endBefore ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.array(T).lengthRange", "Invalid Array length", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(arrayLengthRange, "arrayLengthRange");
|
||
|
function arrayLengthRangeInclusive(start, end) {
|
||
|
const expected = `expected.length >= ${start} && expected.length <= ${end}`;
|
||
|
return {
|
||
|
run(input) {
|
||
|
return input.length >= start && input.length <= end ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.array(T).lengthRangeInclusive", "Invalid Array length", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(arrayLengthRangeInclusive, "arrayLengthRangeInclusive");
|
||
|
function arrayLengthRangeExclusive(startAfter, endBefore) {
|
||
|
const expected = `expected.length > ${startAfter} && expected.length < ${endBefore}`;
|
||
|
return {
|
||
|
run(input) {
|
||
|
return input.length > startAfter && input.length < endBefore ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.array(T).lengthRangeExclusive", "Invalid Array length", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(arrayLengthRangeExclusive, "arrayLengthRangeExclusive");
|
||
|
var uniqueArray = {
|
||
|
run(input) {
|
||
|
return isUnique(input) ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.array(T).unique", "Array values are not unique", input, "Expected all values to be unique"));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// src/lib/errors/CombinedPropertyError.ts
|
||
|
var _CombinedPropertyError = class _CombinedPropertyError extends BaseError {
|
||
|
constructor(errors) {
|
||
|
super("Received one or more errors");
|
||
|
this.errors = errors;
|
||
|
}
|
||
|
[customInspectSymbolStackLess](depth, options) {
|
||
|
if (depth < 0) {
|
||
|
return options.stylize("[CombinedPropertyError]", "special");
|
||
|
}
|
||
|
const newOptions = { ...options, depth: options.depth === null ? null : options.depth - 1, compact: true };
|
||
|
const padding = `
|
||
|
${options.stylize("|", "undefined")} `;
|
||
|
const header = `${options.stylize("CombinedPropertyError", "special")} (${options.stylize(this.errors.length.toString(), "number")})`;
|
||
|
const message = options.stylize(this.message, "regexp");
|
||
|
const errors = this.errors.map(([key, error]) => {
|
||
|
const property = _CombinedPropertyError.formatProperty(key, options);
|
||
|
const body = error[customInspectSymbolStackLess](depth - 1, newOptions).replace(/\n/g, padding);
|
||
|
return ` input${property}${padding}${body}`;
|
||
|
}).join("\n\n");
|
||
|
return `${header}
|
||
|
${message}
|
||
|
|
||
|
${errors}`;
|
||
|
}
|
||
|
static formatProperty(key, options) {
|
||
|
if (typeof key === "string")
|
||
|
return options.stylize(`.${key}`, "symbol");
|
||
|
if (typeof key === "number")
|
||
|
return `[${options.stylize(key.toString(), "number")}]`;
|
||
|
return `[${options.stylize("Symbol", "symbol")}(${key.description})]`;
|
||
|
}
|
||
|
};
|
||
|
__name(_CombinedPropertyError, "CombinedPropertyError");
|
||
|
var CombinedPropertyError = _CombinedPropertyError;
|
||
|
var _ValidationError = class _ValidationError extends BaseError {
|
||
|
constructor(validator, message, given) {
|
||
|
super(message);
|
||
|
this.validator = validator;
|
||
|
this.given = given;
|
||
|
}
|
||
|
toJSON() {
|
||
|
return {
|
||
|
name: this.name,
|
||
|
validator: this.validator,
|
||
|
given: this.given
|
||
|
};
|
||
|
}
|
||
|
[customInspectSymbolStackLess](depth, options) {
|
||
|
const validator = options.stylize(this.validator, "string");
|
||
|
if (depth < 0) {
|
||
|
return options.stylize(`[ValidationError: ${validator}]`, "special");
|
||
|
}
|
||
|
const newOptions = { ...options, depth: options.depth === null ? null : options.depth - 1, compact: true };
|
||
|
const padding = `
|
||
|
${options.stylize("|", "undefined")} `;
|
||
|
const given = util.inspect(this.given, newOptions).replace(/\n/g, padding);
|
||
|
const header = `${options.stylize("ValidationError", "special")} > ${validator}`;
|
||
|
const message = options.stylize(this.message, "regexp");
|
||
|
const givenBlock = `
|
||
|
${options.stylize("Received:", "regexp")}${padding}${given}`;
|
||
|
return `${header}
|
||
|
${message}
|
||
|
${givenBlock}`;
|
||
|
}
|
||
|
};
|
||
|
__name(_ValidationError, "ValidationError");
|
||
|
var ValidationError = _ValidationError;
|
||
|
|
||
|
// src/validators/ArrayValidator.ts
|
||
|
var _ArrayValidator = class _ArrayValidator extends BaseValidator {
|
||
|
constructor(validator, constraints = []) {
|
||
|
super(constraints);
|
||
|
this.validator = validator;
|
||
|
}
|
||
|
lengthLessThan(length) {
|
||
|
return this.addConstraint(arrayLengthLessThan(length));
|
||
|
}
|
||
|
lengthLessThanOrEqual(length) {
|
||
|
return this.addConstraint(arrayLengthLessThanOrEqual(length));
|
||
|
}
|
||
|
lengthGreaterThan(length) {
|
||
|
return this.addConstraint(arrayLengthGreaterThan(length));
|
||
|
}
|
||
|
lengthGreaterThanOrEqual(length) {
|
||
|
return this.addConstraint(arrayLengthGreaterThanOrEqual(length));
|
||
|
}
|
||
|
lengthEqual(length) {
|
||
|
return this.addConstraint(arrayLengthEqual(length));
|
||
|
}
|
||
|
lengthNotEqual(length) {
|
||
|
return this.addConstraint(arrayLengthNotEqual(length));
|
||
|
}
|
||
|
lengthRange(start, endBefore) {
|
||
|
return this.addConstraint(arrayLengthRange(start, endBefore));
|
||
|
}
|
||
|
lengthRangeInclusive(startAt, endAt) {
|
||
|
return this.addConstraint(arrayLengthRangeInclusive(startAt, endAt));
|
||
|
}
|
||
|
lengthRangeExclusive(startAfter, endBefore) {
|
||
|
return this.addConstraint(arrayLengthRangeExclusive(startAfter, endBefore));
|
||
|
}
|
||
|
get unique() {
|
||
|
return this.addConstraint(uniqueArray);
|
||
|
}
|
||
|
clone() {
|
||
|
return Reflect.construct(this.constructor, [this.validator, this.constraints]);
|
||
|
}
|
||
|
handle(values) {
|
||
|
if (!Array.isArray(values)) {
|
||
|
return Result.err(new ValidationError("s.array(T)", "Expected an array", values));
|
||
|
}
|
||
|
if (!this.shouldRunConstraints) {
|
||
|
return Result.ok(values);
|
||
|
}
|
||
|
const errors = [];
|
||
|
const transformed = [];
|
||
|
for (let i = 0; i < values.length; i++) {
|
||
|
const result = this.validator.run(values[i]);
|
||
|
if (result.isOk())
|
||
|
transformed.push(result.value);
|
||
|
else
|
||
|
errors.push([i, result.error]);
|
||
|
}
|
||
|
return errors.length === 0 ? Result.ok(transformed) : Result.err(new CombinedPropertyError(errors));
|
||
|
}
|
||
|
};
|
||
|
__name(_ArrayValidator, "ArrayValidator");
|
||
|
var ArrayValidator = _ArrayValidator;
|
||
|
|
||
|
// src/constraints/BigIntConstraints.ts
|
||
|
function bigintComparator(comparator, name, expected, number) {
|
||
|
return {
|
||
|
run(input) {
|
||
|
return comparator(input, number) ? Result.ok(input) : Result.err(new ExpectedConstraintError(name, "Invalid bigint value", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(bigintComparator, "bigintComparator");
|
||
|
function bigintLessThan(value) {
|
||
|
const expected = `expected < ${value}n`;
|
||
|
return bigintComparator(lessThan, "s.bigint.lessThan", expected, value);
|
||
|
}
|
||
|
__name(bigintLessThan, "bigintLessThan");
|
||
|
function bigintLessThanOrEqual(value) {
|
||
|
const expected = `expected <= ${value}n`;
|
||
|
return bigintComparator(lessThanOrEqual, "s.bigint.lessThanOrEqual", expected, value);
|
||
|
}
|
||
|
__name(bigintLessThanOrEqual, "bigintLessThanOrEqual");
|
||
|
function bigintGreaterThan(value) {
|
||
|
const expected = `expected > ${value}n`;
|
||
|
return bigintComparator(greaterThan, "s.bigint.greaterThan", expected, value);
|
||
|
}
|
||
|
__name(bigintGreaterThan, "bigintGreaterThan");
|
||
|
function bigintGreaterThanOrEqual(value) {
|
||
|
const expected = `expected >= ${value}n`;
|
||
|
return bigintComparator(greaterThanOrEqual, "s.bigint.greaterThanOrEqual", expected, value);
|
||
|
}
|
||
|
__name(bigintGreaterThanOrEqual, "bigintGreaterThanOrEqual");
|
||
|
function bigintEqual(value) {
|
||
|
const expected = `expected === ${value}n`;
|
||
|
return bigintComparator(equal, "s.bigint.equal", expected, value);
|
||
|
}
|
||
|
__name(bigintEqual, "bigintEqual");
|
||
|
function bigintNotEqual(value) {
|
||
|
const expected = `expected !== ${value}n`;
|
||
|
return bigintComparator(notEqual, "s.bigint.notEqual", expected, value);
|
||
|
}
|
||
|
__name(bigintNotEqual, "bigintNotEqual");
|
||
|
function bigintDivisibleBy(divider) {
|
||
|
const expected = `expected % ${divider}n === 0n`;
|
||
|
return {
|
||
|
run(input) {
|
||
|
return input % divider === 0n ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.bigint.divisibleBy", "BigInt is not divisible", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(bigintDivisibleBy, "bigintDivisibleBy");
|
||
|
|
||
|
// src/validators/BigIntValidator.ts
|
||
|
var _BigIntValidator = class _BigIntValidator extends BaseValidator {
|
||
|
lessThan(number) {
|
||
|
return this.addConstraint(bigintLessThan(number));
|
||
|
}
|
||
|
lessThanOrEqual(number) {
|
||
|
return this.addConstraint(bigintLessThanOrEqual(number));
|
||
|
}
|
||
|
greaterThan(number) {
|
||
|
return this.addConstraint(bigintGreaterThan(number));
|
||
|
}
|
||
|
greaterThanOrEqual(number) {
|
||
|
return this.addConstraint(bigintGreaterThanOrEqual(number));
|
||
|
}
|
||
|
equal(number) {
|
||
|
return this.addConstraint(bigintEqual(number));
|
||
|
}
|
||
|
notEqual(number) {
|
||
|
return this.addConstraint(bigintNotEqual(number));
|
||
|
}
|
||
|
get positive() {
|
||
|
return this.greaterThanOrEqual(0n);
|
||
|
}
|
||
|
get negative() {
|
||
|
return this.lessThan(0n);
|
||
|
}
|
||
|
divisibleBy(number) {
|
||
|
return this.addConstraint(bigintDivisibleBy(number));
|
||
|
}
|
||
|
get abs() {
|
||
|
return this.transform((value) => value < 0 ? -value : value);
|
||
|
}
|
||
|
intN(bits) {
|
||
|
return this.transform((value) => BigInt.asIntN(bits, value));
|
||
|
}
|
||
|
uintN(bits) {
|
||
|
return this.transform((value) => BigInt.asUintN(bits, value));
|
||
|
}
|
||
|
handle(value) {
|
||
|
return typeof value === "bigint" ? Result.ok(value) : Result.err(new ValidationError("s.bigint", "Expected a bigint primitive", value));
|
||
|
}
|
||
|
};
|
||
|
__name(_BigIntValidator, "BigIntValidator");
|
||
|
var BigIntValidator = _BigIntValidator;
|
||
|
|
||
|
// src/constraints/BooleanConstraints.ts
|
||
|
var booleanTrue = {
|
||
|
run(input) {
|
||
|
return input ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.boolean.true", "Invalid boolean value", input, "true"));
|
||
|
}
|
||
|
};
|
||
|
var booleanFalse = {
|
||
|
run(input) {
|
||
|
return input ? Result.err(new ExpectedConstraintError("s.boolean.false", "Invalid boolean value", input, "false")) : Result.ok(input);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// src/validators/BooleanValidator.ts
|
||
|
var _BooleanValidator = class _BooleanValidator extends BaseValidator {
|
||
|
get true() {
|
||
|
return this.addConstraint(booleanTrue);
|
||
|
}
|
||
|
get false() {
|
||
|
return this.addConstraint(booleanFalse);
|
||
|
}
|
||
|
equal(value) {
|
||
|
return value ? this.true : this.false;
|
||
|
}
|
||
|
notEqual(value) {
|
||
|
return value ? this.false : this.true;
|
||
|
}
|
||
|
handle(value) {
|
||
|
return typeof value === "boolean" ? Result.ok(value) : Result.err(new ValidationError("s.boolean", "Expected a boolean primitive", value));
|
||
|
}
|
||
|
};
|
||
|
__name(_BooleanValidator, "BooleanValidator");
|
||
|
var BooleanValidator = _BooleanValidator;
|
||
|
|
||
|
// src/constraints/DateConstraints.ts
|
||
|
function dateComparator(comparator, name, expected, number) {
|
||
|
return {
|
||
|
run(input) {
|
||
|
return comparator(input.getTime(), number) ? Result.ok(input) : Result.err(new ExpectedConstraintError(name, "Invalid Date value", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(dateComparator, "dateComparator");
|
||
|
function dateLessThan(value) {
|
||
|
const expected = `expected < ${value.toISOString()}`;
|
||
|
return dateComparator(lessThan, "s.date.lessThan", expected, value.getTime());
|
||
|
}
|
||
|
__name(dateLessThan, "dateLessThan");
|
||
|
function dateLessThanOrEqual(value) {
|
||
|
const expected = `expected <= ${value.toISOString()}`;
|
||
|
return dateComparator(lessThanOrEqual, "s.date.lessThanOrEqual", expected, value.getTime());
|
||
|
}
|
||
|
__name(dateLessThanOrEqual, "dateLessThanOrEqual");
|
||
|
function dateGreaterThan(value) {
|
||
|
const expected = `expected > ${value.toISOString()}`;
|
||
|
return dateComparator(greaterThan, "s.date.greaterThan", expected, value.getTime());
|
||
|
}
|
||
|
__name(dateGreaterThan, "dateGreaterThan");
|
||
|
function dateGreaterThanOrEqual(value) {
|
||
|
const expected = `expected >= ${value.toISOString()}`;
|
||
|
return dateComparator(greaterThanOrEqual, "s.date.greaterThanOrEqual", expected, value.getTime());
|
||
|
}
|
||
|
__name(dateGreaterThanOrEqual, "dateGreaterThanOrEqual");
|
||
|
function dateEqual(value) {
|
||
|
const expected = `expected === ${value.toISOString()}`;
|
||
|
return dateComparator(equal, "s.date.equal", expected, value.getTime());
|
||
|
}
|
||
|
__name(dateEqual, "dateEqual");
|
||
|
function dateNotEqual(value) {
|
||
|
const expected = `expected !== ${value.toISOString()}`;
|
||
|
return dateComparator(notEqual, "s.date.notEqual", expected, value.getTime());
|
||
|
}
|
||
|
__name(dateNotEqual, "dateNotEqual");
|
||
|
var dateInvalid = {
|
||
|
run(input) {
|
||
|
return Number.isNaN(input.getTime()) ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.date.invalid", "Invalid Date value", input, "expected === NaN"));
|
||
|
}
|
||
|
};
|
||
|
var dateValid = {
|
||
|
run(input) {
|
||
|
return Number.isNaN(input.getTime()) ? Result.err(new ExpectedConstraintError("s.date.valid", "Invalid Date value", input, "expected !== NaN")) : Result.ok(input);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// src/validators/DateValidator.ts
|
||
|
var _DateValidator = class _DateValidator extends BaseValidator {
|
||
|
lessThan(date) {
|
||
|
return this.addConstraint(dateLessThan(new Date(date)));
|
||
|
}
|
||
|
lessThanOrEqual(date) {
|
||
|
return this.addConstraint(dateLessThanOrEqual(new Date(date)));
|
||
|
}
|
||
|
greaterThan(date) {
|
||
|
return this.addConstraint(dateGreaterThan(new Date(date)));
|
||
|
}
|
||
|
greaterThanOrEqual(date) {
|
||
|
return this.addConstraint(dateGreaterThanOrEqual(new Date(date)));
|
||
|
}
|
||
|
equal(date) {
|
||
|
const resolved = new Date(date);
|
||
|
return Number.isNaN(resolved.getTime()) ? this.invalid : this.addConstraint(dateEqual(resolved));
|
||
|
}
|
||
|
notEqual(date) {
|
||
|
const resolved = new Date(date);
|
||
|
return Number.isNaN(resolved.getTime()) ? this.valid : this.addConstraint(dateNotEqual(resolved));
|
||
|
}
|
||
|
get valid() {
|
||
|
return this.addConstraint(dateValid);
|
||
|
}
|
||
|
get invalid() {
|
||
|
return this.addConstraint(dateInvalid);
|
||
|
}
|
||
|
handle(value) {
|
||
|
return value instanceof Date ? Result.ok(value) : Result.err(new ValidationError("s.date", "Expected a Date", value));
|
||
|
}
|
||
|
};
|
||
|
__name(_DateValidator, "DateValidator");
|
||
|
var DateValidator = _DateValidator;
|
||
|
var _ExpectedValidationError = class _ExpectedValidationError extends ValidationError {
|
||
|
constructor(validator, message, given, expected) {
|
||
|
super(validator, message, given);
|
||
|
this.expected = expected;
|
||
|
}
|
||
|
toJSON() {
|
||
|
return {
|
||
|
name: this.name,
|
||
|
validator: this.validator,
|
||
|
given: this.given,
|
||
|
expected: this.expected
|
||
|
};
|
||
|
}
|
||
|
[customInspectSymbolStackLess](depth, options) {
|
||
|
const validator = options.stylize(this.validator, "string");
|
||
|
if (depth < 0) {
|
||
|
return options.stylize(`[ExpectedValidationError: ${validator}]`, "special");
|
||
|
}
|
||
|
const newOptions = { ...options, depth: options.depth === null ? null : options.depth - 1 };
|
||
|
const padding = `
|
||
|
${options.stylize("|", "undefined")} `;
|
||
|
const expected = util.inspect(this.expected, newOptions).replace(/\n/g, padding);
|
||
|
const given = util.inspect(this.given, newOptions).replace(/\n/g, padding);
|
||
|
const header = `${options.stylize("ExpectedValidationError", "special")} > ${validator}`;
|
||
|
const message = options.stylize(this.message, "regexp");
|
||
|
const expectedBlock = `
|
||
|
${options.stylize("Expected:", "string")}${padding}${expected}`;
|
||
|
const givenBlock = `
|
||
|
${options.stylize("Received:", "regexp")}${padding}${given}`;
|
||
|
return `${header}
|
||
|
${message}
|
||
|
${expectedBlock}
|
||
|
${givenBlock}`;
|
||
|
}
|
||
|
};
|
||
|
__name(_ExpectedValidationError, "ExpectedValidationError");
|
||
|
var ExpectedValidationError = _ExpectedValidationError;
|
||
|
|
||
|
// src/validators/InstanceValidator.ts
|
||
|
var _InstanceValidator = class _InstanceValidator extends BaseValidator {
|
||
|
constructor(expected, constraints = []) {
|
||
|
super(constraints);
|
||
|
this.expected = expected;
|
||
|
}
|
||
|
handle(value) {
|
||
|
return value instanceof this.expected ? Result.ok(value) : Result.err(new ExpectedValidationError("s.instance(V)", "Expected", value, this.expected));
|
||
|
}
|
||
|
clone() {
|
||
|
return Reflect.construct(this.constructor, [this.expected, this.constraints]);
|
||
|
}
|
||
|
};
|
||
|
__name(_InstanceValidator, "InstanceValidator");
|
||
|
var InstanceValidator = _InstanceValidator;
|
||
|
|
||
|
// src/validators/LiteralValidator.ts
|
||
|
var _LiteralValidator = class _LiteralValidator extends BaseValidator {
|
||
|
constructor(literal, constraints = []) {
|
||
|
super(constraints);
|
||
|
this.expected = literal;
|
||
|
}
|
||
|
handle(value) {
|
||
|
return Object.is(value, this.expected) ? Result.ok(value) : Result.err(new ExpectedValidationError("s.literal(V)", "Expected values to be equals", value, this.expected));
|
||
|
}
|
||
|
clone() {
|
||
|
return Reflect.construct(this.constructor, [this.expected, this.constraints]);
|
||
|
}
|
||
|
};
|
||
|
__name(_LiteralValidator, "LiteralValidator");
|
||
|
var LiteralValidator = _LiteralValidator;
|
||
|
|
||
|
// src/validators/NeverValidator.ts
|
||
|
var _NeverValidator = class _NeverValidator extends BaseValidator {
|
||
|
handle(value) {
|
||
|
return Result.err(new ValidationError("s.never", "Expected a value to not be passed", value));
|
||
|
}
|
||
|
};
|
||
|
__name(_NeverValidator, "NeverValidator");
|
||
|
var NeverValidator = _NeverValidator;
|
||
|
|
||
|
// src/validators/NullishValidator.ts
|
||
|
var _NullishValidator = class _NullishValidator extends BaseValidator {
|
||
|
handle(value) {
|
||
|
return value === void 0 || value === null ? Result.ok(value) : Result.err(new ValidationError("s.nullish", "Expected undefined or null", value));
|
||
|
}
|
||
|
};
|
||
|
__name(_NullishValidator, "NullishValidator");
|
||
|
var NullishValidator = _NullishValidator;
|
||
|
|
||
|
// src/constraints/NumberConstraints.ts
|
||
|
function numberComparator(comparator, name, expected, number) {
|
||
|
return {
|
||
|
run(input) {
|
||
|
return comparator(input, number) ? Result.ok(input) : Result.err(new ExpectedConstraintError(name, "Invalid number value", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(numberComparator, "numberComparator");
|
||
|
function numberLessThan(value) {
|
||
|
const expected = `expected < ${value}`;
|
||
|
return numberComparator(lessThan, "s.number.lessThan", expected, value);
|
||
|
}
|
||
|
__name(numberLessThan, "numberLessThan");
|
||
|
function numberLessThanOrEqual(value) {
|
||
|
const expected = `expected <= ${value}`;
|
||
|
return numberComparator(lessThanOrEqual, "s.number.lessThanOrEqual", expected, value);
|
||
|
}
|
||
|
__name(numberLessThanOrEqual, "numberLessThanOrEqual");
|
||
|
function numberGreaterThan(value) {
|
||
|
const expected = `expected > ${value}`;
|
||
|
return numberComparator(greaterThan, "s.number.greaterThan", expected, value);
|
||
|
}
|
||
|
__name(numberGreaterThan, "numberGreaterThan");
|
||
|
function numberGreaterThanOrEqual(value) {
|
||
|
const expected = `expected >= ${value}`;
|
||
|
return numberComparator(greaterThanOrEqual, "s.number.greaterThanOrEqual", expected, value);
|
||
|
}
|
||
|
__name(numberGreaterThanOrEqual, "numberGreaterThanOrEqual");
|
||
|
function numberEqual(value) {
|
||
|
const expected = `expected === ${value}`;
|
||
|
return numberComparator(equal, "s.number.equal", expected, value);
|
||
|
}
|
||
|
__name(numberEqual, "numberEqual");
|
||
|
function numberNotEqual(value) {
|
||
|
const expected = `expected !== ${value}`;
|
||
|
return numberComparator(notEqual, "s.number.notEqual", expected, value);
|
||
|
}
|
||
|
__name(numberNotEqual, "numberNotEqual");
|
||
|
var numberInt = {
|
||
|
run(input) {
|
||
|
return Number.isInteger(input) ? Result.ok(input) : Result.err(
|
||
|
new ExpectedConstraintError("s.number.int", "Given value is not an integer", input, "Number.isInteger(expected) to be true")
|
||
|
);
|
||
|
}
|
||
|
};
|
||
|
var numberSafeInt = {
|
||
|
run(input) {
|
||
|
return Number.isSafeInteger(input) ? Result.ok(input) : Result.err(
|
||
|
new ExpectedConstraintError(
|
||
|
"s.number.safeInt",
|
||
|
"Given value is not a safe integer",
|
||
|
input,
|
||
|
"Number.isSafeInteger(expected) to be true"
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
};
|
||
|
var numberFinite = {
|
||
|
run(input) {
|
||
|
return Number.isFinite(input) ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.number.finite", "Given value is not finite", input, "Number.isFinite(expected) to be true"));
|
||
|
}
|
||
|
};
|
||
|
var numberNaN = {
|
||
|
run(input) {
|
||
|
return Number.isNaN(input) ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.number.equal(NaN)", "Invalid number value", input, "expected === NaN"));
|
||
|
}
|
||
|
};
|
||
|
var numberNotNaN = {
|
||
|
run(input) {
|
||
|
return Number.isNaN(input) ? Result.err(new ExpectedConstraintError("s.number.notEqual(NaN)", "Invalid number value", input, "expected !== NaN")) : Result.ok(input);
|
||
|
}
|
||
|
};
|
||
|
function numberDivisibleBy(divider) {
|
||
|
const expected = `expected % ${divider} === 0`;
|
||
|
return {
|
||
|
run(input) {
|
||
|
return input % divider === 0 ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.number.divisibleBy", "Number is not divisible", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(numberDivisibleBy, "numberDivisibleBy");
|
||
|
|
||
|
// src/validators/NumberValidator.ts
|
||
|
var _NumberValidator = class _NumberValidator extends BaseValidator {
|
||
|
lessThan(number) {
|
||
|
return this.addConstraint(numberLessThan(number));
|
||
|
}
|
||
|
lessThanOrEqual(number) {
|
||
|
return this.addConstraint(numberLessThanOrEqual(number));
|
||
|
}
|
||
|
greaterThan(number) {
|
||
|
return this.addConstraint(numberGreaterThan(number));
|
||
|
}
|
||
|
greaterThanOrEqual(number) {
|
||
|
return this.addConstraint(numberGreaterThanOrEqual(number));
|
||
|
}
|
||
|
equal(number) {
|
||
|
return Number.isNaN(number) ? this.addConstraint(numberNaN) : this.addConstraint(numberEqual(number));
|
||
|
}
|
||
|
notEqual(number) {
|
||
|
return Number.isNaN(number) ? this.addConstraint(numberNotNaN) : this.addConstraint(numberNotEqual(number));
|
||
|
}
|
||
|
get int() {
|
||
|
return this.addConstraint(numberInt);
|
||
|
}
|
||
|
get safeInt() {
|
||
|
return this.addConstraint(numberSafeInt);
|
||
|
}
|
||
|
get finite() {
|
||
|
return this.addConstraint(numberFinite);
|
||
|
}
|
||
|
get positive() {
|
||
|
return this.greaterThanOrEqual(0);
|
||
|
}
|
||
|
get negative() {
|
||
|
return this.lessThan(0);
|
||
|
}
|
||
|
divisibleBy(divider) {
|
||
|
return this.addConstraint(numberDivisibleBy(divider));
|
||
|
}
|
||
|
get abs() {
|
||
|
return this.transform(Math.abs);
|
||
|
}
|
||
|
get sign() {
|
||
|
return this.transform(Math.sign);
|
||
|
}
|
||
|
get trunc() {
|
||
|
return this.transform(Math.trunc);
|
||
|
}
|
||
|
get floor() {
|
||
|
return this.transform(Math.floor);
|
||
|
}
|
||
|
get fround() {
|
||
|
return this.transform(Math.fround);
|
||
|
}
|
||
|
get round() {
|
||
|
return this.transform(Math.round);
|
||
|
}
|
||
|
get ceil() {
|
||
|
return this.transform(Math.ceil);
|
||
|
}
|
||
|
handle(value) {
|
||
|
return typeof value === "number" ? Result.ok(value) : Result.err(new ValidationError("s.number", "Expected a number primitive", value));
|
||
|
}
|
||
|
};
|
||
|
__name(_NumberValidator, "NumberValidator");
|
||
|
var NumberValidator = _NumberValidator;
|
||
|
|
||
|
// src/lib/errors/MissingPropertyError.ts
|
||
|
var _MissingPropertyError = class _MissingPropertyError extends BaseError {
|
||
|
constructor(property) {
|
||
|
super("A required property is missing");
|
||
|
this.property = property;
|
||
|
}
|
||
|
toJSON() {
|
||
|
return {
|
||
|
name: this.name,
|
||
|
property: this.property
|
||
|
};
|
||
|
}
|
||
|
[customInspectSymbolStackLess](depth, options) {
|
||
|
const property = options.stylize(this.property.toString(), "string");
|
||
|
if (depth < 0) {
|
||
|
return options.stylize(`[MissingPropertyError: ${property}]`, "special");
|
||
|
}
|
||
|
const header = `${options.stylize("MissingPropertyError", "special")} > ${property}`;
|
||
|
const message = options.stylize(this.message, "regexp");
|
||
|
return `${header}
|
||
|
${message}`;
|
||
|
}
|
||
|
};
|
||
|
__name(_MissingPropertyError, "MissingPropertyError");
|
||
|
var MissingPropertyError = _MissingPropertyError;
|
||
|
var _UnknownPropertyError = class _UnknownPropertyError extends BaseError {
|
||
|
constructor(property, value) {
|
||
|
super("Received unexpected property");
|
||
|
this.property = property;
|
||
|
this.value = value;
|
||
|
}
|
||
|
toJSON() {
|
||
|
return {
|
||
|
name: this.name,
|
||
|
property: this.property,
|
||
|
value: this.value
|
||
|
};
|
||
|
}
|
||
|
[customInspectSymbolStackLess](depth, options) {
|
||
|
const property = options.stylize(this.property.toString(), "string");
|
||
|
if (depth < 0) {
|
||
|
return options.stylize(`[UnknownPropertyError: ${property}]`, "special");
|
||
|
}
|
||
|
const newOptions = { ...options, depth: options.depth === null ? null : options.depth - 1, compact: true };
|
||
|
const padding = `
|
||
|
${options.stylize("|", "undefined")} `;
|
||
|
const given = util.inspect(this.value, newOptions).replace(/\n/g, padding);
|
||
|
const header = `${options.stylize("UnknownPropertyError", "special")} > ${property}`;
|
||
|
const message = options.stylize(this.message, "regexp");
|
||
|
const givenBlock = `
|
||
|
${options.stylize("Received:", "regexp")}${padding}${given}`;
|
||
|
return `${header}
|
||
|
${message}
|
||
|
${givenBlock}`;
|
||
|
}
|
||
|
};
|
||
|
__name(_UnknownPropertyError, "UnknownPropertyError");
|
||
|
var UnknownPropertyError = _UnknownPropertyError;
|
||
|
|
||
|
// src/validators/DefaultValidator.ts
|
||
|
var _DefaultValidator = class _DefaultValidator extends BaseValidator {
|
||
|
constructor(validator, value, constraints = []) {
|
||
|
super(constraints);
|
||
|
this.validator = validator;
|
||
|
this.defaultValue = value;
|
||
|
}
|
||
|
default(value) {
|
||
|
const clone = this.clone();
|
||
|
clone.defaultValue = value;
|
||
|
return clone;
|
||
|
}
|
||
|
handle(value) {
|
||
|
return typeof value === "undefined" ? Result.ok(getValue(this.defaultValue)) : this.validator["handle"](value);
|
||
|
}
|
||
|
clone() {
|
||
|
return Reflect.construct(this.constructor, [this.validator, this.defaultValue, this.constraints]);
|
||
|
}
|
||
|
};
|
||
|
__name(_DefaultValidator, "DefaultValidator");
|
||
|
var DefaultValidator = _DefaultValidator;
|
||
|
|
||
|
// src/lib/errors/CombinedError.ts
|
||
|
var _CombinedError = class _CombinedError extends BaseError {
|
||
|
constructor(errors) {
|
||
|
super("Received one or more errors");
|
||
|
this.errors = errors;
|
||
|
}
|
||
|
[customInspectSymbolStackLess](depth, options) {
|
||
|
if (depth < 0) {
|
||
|
return options.stylize("[CombinedError]", "special");
|
||
|
}
|
||
|
const newOptions = { ...options, depth: options.depth === null ? null : options.depth - 1, compact: true };
|
||
|
const padding = `
|
||
|
${options.stylize("|", "undefined")} `;
|
||
|
const header = `${options.stylize("CombinedError", "special")} (${options.stylize(this.errors.length.toString(), "number")})`;
|
||
|
const message = options.stylize(this.message, "regexp");
|
||
|
const errors = this.errors.map((error, i) => {
|
||
|
const index = options.stylize((i + 1).toString(), "number");
|
||
|
const body = error[customInspectSymbolStackLess](depth - 1, newOptions).replace(/\n/g, padding);
|
||
|
return ` ${index} ${body}`;
|
||
|
}).join("\n\n");
|
||
|
return `${header}
|
||
|
${message}
|
||
|
|
||
|
${errors}`;
|
||
|
}
|
||
|
};
|
||
|
__name(_CombinedError, "CombinedError");
|
||
|
var CombinedError = _CombinedError;
|
||
|
|
||
|
// src/validators/UnionValidator.ts
|
||
|
var _UnionValidator = class _UnionValidator extends BaseValidator {
|
||
|
constructor(validators, constraints = []) {
|
||
|
super(constraints);
|
||
|
this.validators = validators;
|
||
|
}
|
||
|
get optional() {
|
||
|
if (this.validators.length === 0)
|
||
|
return new _UnionValidator([new LiteralValidator(void 0)], this.constraints);
|
||
|
const [validator] = this.validators;
|
||
|
if (validator instanceof LiteralValidator) {
|
||
|
if (validator.expected === void 0)
|
||
|
return this.clone();
|
||
|
if (validator.expected === null) {
|
||
|
return new _UnionValidator(
|
||
|
[new NullishValidator(), ...this.validators.slice(1)],
|
||
|
this.constraints
|
||
|
);
|
||
|
}
|
||
|
} else if (validator instanceof NullishValidator) {
|
||
|
return this.clone();
|
||
|
}
|
||
|
return new _UnionValidator([new LiteralValidator(void 0), ...this.validators]);
|
||
|
}
|
||
|
get required() {
|
||
|
if (this.validators.length === 0)
|
||
|
return this.clone();
|
||
|
const [validator] = this.validators;
|
||
|
if (validator instanceof LiteralValidator) {
|
||
|
if (validator.expected === void 0)
|
||
|
return new _UnionValidator(this.validators.slice(1), this.constraints);
|
||
|
} else if (validator instanceof NullishValidator) {
|
||
|
return new _UnionValidator([new LiteralValidator(null), ...this.validators.slice(1)], this.constraints);
|
||
|
}
|
||
|
return this.clone();
|
||
|
}
|
||
|
get nullable() {
|
||
|
if (this.validators.length === 0)
|
||
|
return new _UnionValidator([new LiteralValidator(null)], this.constraints);
|
||
|
const [validator] = this.validators;
|
||
|
if (validator instanceof LiteralValidator) {
|
||
|
if (validator.expected === null)
|
||
|
return this.clone();
|
||
|
if (validator.expected === void 0) {
|
||
|
return new _UnionValidator(
|
||
|
[new NullishValidator(), ...this.validators.slice(1)],
|
||
|
this.constraints
|
||
|
);
|
||
|
}
|
||
|
} else if (validator instanceof NullishValidator) {
|
||
|
return this.clone();
|
||
|
}
|
||
|
return new _UnionValidator([new LiteralValidator(null), ...this.validators]);
|
||
|
}
|
||
|
get nullish() {
|
||
|
if (this.validators.length === 0)
|
||
|
return new _UnionValidator([new NullishValidator()], this.constraints);
|
||
|
const [validator] = this.validators;
|
||
|
if (validator instanceof LiteralValidator) {
|
||
|
if (validator.expected === null || validator.expected === void 0) {
|
||
|
return new _UnionValidator([new NullishValidator(), ...this.validators.slice(1)], this.constraints);
|
||
|
}
|
||
|
} else if (validator instanceof NullishValidator) {
|
||
|
return this.clone();
|
||
|
}
|
||
|
return new _UnionValidator([new NullishValidator(), ...this.validators]);
|
||
|
}
|
||
|
or(...predicates) {
|
||
|
return new _UnionValidator([...this.validators, ...predicates]);
|
||
|
}
|
||
|
clone() {
|
||
|
return Reflect.construct(this.constructor, [this.validators, this.constraints]);
|
||
|
}
|
||
|
handle(value) {
|
||
|
const errors = [];
|
||
|
for (const validator of this.validators) {
|
||
|
const result = validator.run(value);
|
||
|
if (result.isOk())
|
||
|
return result;
|
||
|
errors.push(result.error);
|
||
|
}
|
||
|
return Result.err(new CombinedError(errors));
|
||
|
}
|
||
|
};
|
||
|
__name(_UnionValidator, "UnionValidator");
|
||
|
var UnionValidator = _UnionValidator;
|
||
|
|
||
|
// src/validators/ObjectValidator.ts
|
||
|
var _ObjectValidator = class _ObjectValidator extends BaseValidator {
|
||
|
constructor(shape, strategy = 0 /* Ignore */, constraints = []) {
|
||
|
super(constraints);
|
||
|
this.keys = [];
|
||
|
this.requiredKeys = /* @__PURE__ */ new Map();
|
||
|
this.possiblyUndefinedKeys = /* @__PURE__ */ new Map();
|
||
|
this.possiblyUndefinedKeysWithDefaults = /* @__PURE__ */ new Map();
|
||
|
this.shape = shape;
|
||
|
this.strategy = strategy;
|
||
|
switch (this.strategy) {
|
||
|
case 0 /* Ignore */:
|
||
|
this.handleStrategy = (value) => this.handleIgnoreStrategy(value);
|
||
|
break;
|
||
|
case 1 /* Strict */: {
|
||
|
this.handleStrategy = (value) => this.handleStrictStrategy(value);
|
||
|
break;
|
||
|
}
|
||
|
case 2 /* Passthrough */:
|
||
|
this.handleStrategy = (value) => this.handlePassthroughStrategy(value);
|
||
|
break;
|
||
|
}
|
||
|
const shapeEntries = Object.entries(shape);
|
||
|
this.keys = shapeEntries.map(([key]) => key);
|
||
|
for (const [key, validator] of shapeEntries) {
|
||
|
if (validator instanceof UnionValidator) {
|
||
|
const [possiblyLiteralOrNullishPredicate] = validator["validators"];
|
||
|
if (possiblyLiteralOrNullishPredicate instanceof NullishValidator) {
|
||
|
this.possiblyUndefinedKeys.set(key, validator);
|
||
|
} else if (possiblyLiteralOrNullishPredicate instanceof LiteralValidator) {
|
||
|
if (possiblyLiteralOrNullishPredicate.expected === void 0) {
|
||
|
this.possiblyUndefinedKeys.set(key, validator);
|
||
|
} else {
|
||
|
this.requiredKeys.set(key, validator);
|
||
|
}
|
||
|
} else if (validator instanceof DefaultValidator) {
|
||
|
this.possiblyUndefinedKeysWithDefaults.set(key, validator);
|
||
|
} else {
|
||
|
this.requiredKeys.set(key, validator);
|
||
|
}
|
||
|
} else if (validator instanceof NullishValidator) {
|
||
|
this.possiblyUndefinedKeys.set(key, validator);
|
||
|
} else if (validator instanceof LiteralValidator) {
|
||
|
if (validator.expected === void 0) {
|
||
|
this.possiblyUndefinedKeys.set(key, validator);
|
||
|
} else {
|
||
|
this.requiredKeys.set(key, validator);
|
||
|
}
|
||
|
} else if (validator instanceof DefaultValidator) {
|
||
|
this.possiblyUndefinedKeysWithDefaults.set(key, validator);
|
||
|
} else {
|
||
|
this.requiredKeys.set(key, validator);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
get strict() {
|
||
|
return Reflect.construct(this.constructor, [this.shape, 1 /* Strict */, this.constraints]);
|
||
|
}
|
||
|
get ignore() {
|
||
|
return Reflect.construct(this.constructor, [this.shape, 0 /* Ignore */, this.constraints]);
|
||
|
}
|
||
|
get passthrough() {
|
||
|
return Reflect.construct(this.constructor, [this.shape, 2 /* Passthrough */, this.constraints]);
|
||
|
}
|
||
|
get partial() {
|
||
|
const shape = Object.fromEntries(this.keys.map((key) => [key, this.shape[key].optional]));
|
||
|
return Reflect.construct(this.constructor, [shape, this.strategy, this.constraints]);
|
||
|
}
|
||
|
get required() {
|
||
|
const shape = Object.fromEntries(
|
||
|
this.keys.map((key) => {
|
||
|
let validator = this.shape[key];
|
||
|
if (validator instanceof UnionValidator)
|
||
|
validator = validator.required;
|
||
|
return [key, validator];
|
||
|
})
|
||
|
);
|
||
|
return Reflect.construct(this.constructor, [shape, this.strategy, this.constraints]);
|
||
|
}
|
||
|
extend(schema) {
|
||
|
const shape = { ...this.shape, ...schema instanceof _ObjectValidator ? schema.shape : schema };
|
||
|
return Reflect.construct(this.constructor, [shape, this.strategy, this.constraints]);
|
||
|
}
|
||
|
pick(keys) {
|
||
|
const shape = Object.fromEntries(
|
||
|
keys.filter((key) => this.keys.includes(key)).map((key) => [key, this.shape[key]])
|
||
|
);
|
||
|
return Reflect.construct(this.constructor, [shape, this.strategy, this.constraints]);
|
||
|
}
|
||
|
omit(keys) {
|
||
|
const shape = Object.fromEntries(
|
||
|
this.keys.filter((key) => !keys.includes(key)).map((key) => [key, this.shape[key]])
|
||
|
);
|
||
|
return Reflect.construct(this.constructor, [shape, this.strategy, this.constraints]);
|
||
|
}
|
||
|
handle(value) {
|
||
|
const typeOfValue = typeof value;
|
||
|
if (typeOfValue !== "object") {
|
||
|
return Result.err(new ValidationError("s.object(T)", `Expected the value to be an object, but received ${typeOfValue} instead`, value));
|
||
|
}
|
||
|
if (value === null) {
|
||
|
return Result.err(new ValidationError("s.object(T)", "Expected the value to not be null", value));
|
||
|
}
|
||
|
if (Array.isArray(value)) {
|
||
|
return Result.err(new ValidationError("s.object(T)", "Expected the value to not be an array", value));
|
||
|
}
|
||
|
if (!this.shouldRunConstraints) {
|
||
|
return Result.ok(value);
|
||
|
}
|
||
|
for (const predicate of Object.values(this.shape)) {
|
||
|
predicate.setParent(this.parent ?? value);
|
||
|
}
|
||
|
return this.handleStrategy(value);
|
||
|
}
|
||
|
clone() {
|
||
|
return Reflect.construct(this.constructor, [this.shape, this.strategy, this.constraints]);
|
||
|
}
|
||
|
handleIgnoreStrategy(value) {
|
||
|
const errors = [];
|
||
|
const finalObject = {};
|
||
|
const inputEntries = new Map(Object.entries(value));
|
||
|
const runPredicate = /* @__PURE__ */ __name((key, predicate) => {
|
||
|
const result = predicate.run(value[key]);
|
||
|
if (result.isOk()) {
|
||
|
finalObject[key] = result.value;
|
||
|
} else {
|
||
|
const error = result.error;
|
||
|
errors.push([key, error]);
|
||
|
}
|
||
|
}, "runPredicate");
|
||
|
for (const [key, predicate] of this.requiredKeys) {
|
||
|
if (inputEntries.delete(key)) {
|
||
|
runPredicate(key, predicate);
|
||
|
} else {
|
||
|
errors.push([key, new MissingPropertyError(key)]);
|
||
|
}
|
||
|
}
|
||
|
for (const [key, validator] of this.possiblyUndefinedKeysWithDefaults) {
|
||
|
inputEntries.delete(key);
|
||
|
runPredicate(key, validator);
|
||
|
}
|
||
|
if (inputEntries.size === 0) {
|
||
|
return errors.length === 0 ? Result.ok(finalObject) : Result.err(new CombinedPropertyError(errors));
|
||
|
}
|
||
|
const checkInputEntriesInsteadOfSchemaKeys = this.possiblyUndefinedKeys.size > inputEntries.size;
|
||
|
if (checkInputEntriesInsteadOfSchemaKeys) {
|
||
|
for (const [key] of inputEntries) {
|
||
|
const predicate = this.possiblyUndefinedKeys.get(key);
|
||
|
if (predicate) {
|
||
|
runPredicate(key, predicate);
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
for (const [key, predicate] of this.possiblyUndefinedKeys) {
|
||
|
if (inputEntries.delete(key)) {
|
||
|
runPredicate(key, predicate);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return errors.length === 0 ? Result.ok(finalObject) : Result.err(new CombinedPropertyError(errors));
|
||
|
}
|
||
|
handleStrictStrategy(value) {
|
||
|
const errors = [];
|
||
|
const finalResult = {};
|
||
|
const inputEntries = new Map(Object.entries(value));
|
||
|
const runPredicate = /* @__PURE__ */ __name((key, predicate) => {
|
||
|
const result = predicate.run(value[key]);
|
||
|
if (result.isOk()) {
|
||
|
finalResult[key] = result.value;
|
||
|
} else {
|
||
|
const error = result.error;
|
||
|
errors.push([key, error]);
|
||
|
}
|
||
|
}, "runPredicate");
|
||
|
for (const [key, predicate] of this.requiredKeys) {
|
||
|
if (inputEntries.delete(key)) {
|
||
|
runPredicate(key, predicate);
|
||
|
} else {
|
||
|
errors.push([key, new MissingPropertyError(key)]);
|
||
|
}
|
||
|
}
|
||
|
for (const [key, validator] of this.possiblyUndefinedKeysWithDefaults) {
|
||
|
inputEntries.delete(key);
|
||
|
runPredicate(key, validator);
|
||
|
}
|
||
|
for (const [key, predicate] of this.possiblyUndefinedKeys) {
|
||
|
if (inputEntries.size === 0) {
|
||
|
break;
|
||
|
}
|
||
|
if (inputEntries.delete(key)) {
|
||
|
runPredicate(key, predicate);
|
||
|
}
|
||
|
}
|
||
|
if (inputEntries.size !== 0) {
|
||
|
for (const [key, value2] of inputEntries.entries()) {
|
||
|
errors.push([key, new UnknownPropertyError(key, value2)]);
|
||
|
}
|
||
|
}
|
||
|
return errors.length === 0 ? Result.ok(finalResult) : Result.err(new CombinedPropertyError(errors));
|
||
|
}
|
||
|
handlePassthroughStrategy(value) {
|
||
|
const result = this.handleIgnoreStrategy(value);
|
||
|
return result.isErr() ? result : Result.ok({ ...value, ...result.value });
|
||
|
}
|
||
|
};
|
||
|
__name(_ObjectValidator, "ObjectValidator");
|
||
|
var ObjectValidator = _ObjectValidator;
|
||
|
|
||
|
// src/validators/PassthroughValidator.ts
|
||
|
var _PassthroughValidator = class _PassthroughValidator extends BaseValidator {
|
||
|
handle(value) {
|
||
|
return Result.ok(value);
|
||
|
}
|
||
|
};
|
||
|
__name(_PassthroughValidator, "PassthroughValidator");
|
||
|
var PassthroughValidator = _PassthroughValidator;
|
||
|
|
||
|
// src/validators/RecordValidator.ts
|
||
|
var _RecordValidator = class _RecordValidator extends BaseValidator {
|
||
|
constructor(validator, constraints = []) {
|
||
|
super(constraints);
|
||
|
this.validator = validator;
|
||
|
}
|
||
|
clone() {
|
||
|
return Reflect.construct(this.constructor, [this.validator, this.constraints]);
|
||
|
}
|
||
|
handle(value) {
|
||
|
if (typeof value !== "object") {
|
||
|
return Result.err(new ValidationError("s.record(T)", "Expected an object", value));
|
||
|
}
|
||
|
if (value === null) {
|
||
|
return Result.err(new ValidationError("s.record(T)", "Expected the value to not be null", value));
|
||
|
}
|
||
|
if (Array.isArray(value)) {
|
||
|
return Result.err(new ValidationError("s.record(T)", "Expected the value to not be an array", value));
|
||
|
}
|
||
|
if (!this.shouldRunConstraints) {
|
||
|
return Result.ok(value);
|
||
|
}
|
||
|
const errors = [];
|
||
|
const transformed = {};
|
||
|
for (const [key, val] of Object.entries(value)) {
|
||
|
const result = this.validator.run(val);
|
||
|
if (result.isOk())
|
||
|
transformed[key] = result.value;
|
||
|
else
|
||
|
errors.push([key, result.error]);
|
||
|
}
|
||
|
return errors.length === 0 ? Result.ok(transformed) : Result.err(new CombinedPropertyError(errors));
|
||
|
}
|
||
|
};
|
||
|
__name(_RecordValidator, "RecordValidator");
|
||
|
var RecordValidator = _RecordValidator;
|
||
|
|
||
|
// src/validators/SetValidator.ts
|
||
|
var _SetValidator = class _SetValidator extends BaseValidator {
|
||
|
constructor(validator, constraints = []) {
|
||
|
super(constraints);
|
||
|
this.validator = validator;
|
||
|
}
|
||
|
clone() {
|
||
|
return Reflect.construct(this.constructor, [this.validator, this.constraints]);
|
||
|
}
|
||
|
handle(values) {
|
||
|
if (!(values instanceof Set)) {
|
||
|
return Result.err(new ValidationError("s.set(T)", "Expected a set", values));
|
||
|
}
|
||
|
if (!this.shouldRunConstraints) {
|
||
|
return Result.ok(values);
|
||
|
}
|
||
|
const errors = [];
|
||
|
const transformed = /* @__PURE__ */ new Set();
|
||
|
for (const value of values) {
|
||
|
const result = this.validator.run(value);
|
||
|
if (result.isOk())
|
||
|
transformed.add(result.value);
|
||
|
else
|
||
|
errors.push(result.error);
|
||
|
}
|
||
|
return errors.length === 0 ? Result.ok(transformed) : Result.err(new CombinedError(errors));
|
||
|
}
|
||
|
};
|
||
|
__name(_SetValidator, "SetValidator");
|
||
|
var SetValidator = _SetValidator;
|
||
|
|
||
|
// src/constraints/util/emailValidator.ts
|
||
|
var accountRegex = /^(?!\.)(?!.*\.\.)([A-Z0-9_+-\.]*)[A-Z0-9_+-]$/i;
|
||
|
function validateEmail(email) {
|
||
|
if (!email)
|
||
|
return false;
|
||
|
const atIndex = email.indexOf("@");
|
||
|
if (atIndex === -1)
|
||
|
return false;
|
||
|
if (atIndex > 64)
|
||
|
return false;
|
||
|
const domainIndex = atIndex + 1;
|
||
|
if (email.includes("@", domainIndex))
|
||
|
return false;
|
||
|
if (email.length - domainIndex > 255)
|
||
|
return false;
|
||
|
let dotIndex = email.indexOf(".", domainIndex);
|
||
|
if (dotIndex === -1)
|
||
|
return false;
|
||
|
let lastDotIndex = domainIndex;
|
||
|
do {
|
||
|
if (dotIndex - lastDotIndex > 63)
|
||
|
return false;
|
||
|
lastDotIndex = dotIndex + 1;
|
||
|
} while ((dotIndex = email.indexOf(".", lastDotIndex)) !== -1);
|
||
|
if (email.length - lastDotIndex > 63)
|
||
|
return false;
|
||
|
return accountRegex.test(email.slice(0, atIndex)) && validateEmailDomain(email.slice(domainIndex));
|
||
|
}
|
||
|
__name(validateEmail, "validateEmail");
|
||
|
function validateEmailDomain(domain) {
|
||
|
try {
|
||
|
return new URL(`http://${domain}`).hostname === domain;
|
||
|
} catch {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
__name(validateEmailDomain, "validateEmailDomain");
|
||
|
|
||
|
// src/constraints/util/net.ts
|
||
|
var v4Seg = "(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])";
|
||
|
var v4Str = `(${v4Seg}[.]){3}${v4Seg}`;
|
||
|
var IPv4Reg = new RegExp(`^${v4Str}$`);
|
||
|
var v6Seg = "(?:[0-9a-fA-F]{1,4})";
|
||
|
var IPv6Reg = new RegExp(
|
||
|
`^((?:${v6Seg}:){7}(?:${v6Seg}|:)|(?:${v6Seg}:){6}(?:${v4Str}|:${v6Seg}|:)|(?:${v6Seg}:){5}(?::${v4Str}|(:${v6Seg}){1,2}|:)|(?:${v6Seg}:){4}(?:(:${v6Seg}){0,1}:${v4Str}|(:${v6Seg}){1,3}|:)|(?:${v6Seg}:){3}(?:(:${v6Seg}){0,2}:${v4Str}|(:${v6Seg}){1,4}|:)|(?:${v6Seg}:){2}(?:(:${v6Seg}){0,3}:${v4Str}|(:${v6Seg}){1,5}|:)|(?:${v6Seg}:){1}(?:(:${v6Seg}){0,4}:${v4Str}|(:${v6Seg}){1,6}|:)|(?::((?::${v6Seg}){0,5}:${v4Str}|(?::${v6Seg}){1,7}|:)))(%[0-9a-zA-Z-.:]{1,})?$`
|
||
|
);
|
||
|
function isIPv4(s2) {
|
||
|
return IPv4Reg.test(s2);
|
||
|
}
|
||
|
__name(isIPv4, "isIPv4");
|
||
|
function isIPv6(s2) {
|
||
|
return IPv6Reg.test(s2);
|
||
|
}
|
||
|
__name(isIPv6, "isIPv6");
|
||
|
function isIP(s2) {
|
||
|
if (isIPv4(s2))
|
||
|
return 4;
|
||
|
if (isIPv6(s2))
|
||
|
return 6;
|
||
|
return 0;
|
||
|
}
|
||
|
__name(isIP, "isIP");
|
||
|
|
||
|
// src/constraints/util/phoneValidator.ts
|
||
|
var phoneNumberRegex = /^((?:\+|0{0,2})\d{1,2}\s?)?\(?\d{3}\)?[\s.-]?\d{3}[\s.-]?\d{4}$/;
|
||
|
function validatePhoneNumber(input) {
|
||
|
return phoneNumberRegex.test(input);
|
||
|
}
|
||
|
__name(validatePhoneNumber, "validatePhoneNumber");
|
||
|
var _MultiplePossibilitiesConstraintError = class _MultiplePossibilitiesConstraintError extends BaseConstraintError {
|
||
|
constructor(constraint, message, given, expected) {
|
||
|
super(constraint, message, given);
|
||
|
this.expected = expected;
|
||
|
}
|
||
|
toJSON() {
|
||
|
return {
|
||
|
name: this.name,
|
||
|
constraint: this.constraint,
|
||
|
given: this.given,
|
||
|
expected: this.expected
|
||
|
};
|
||
|
}
|
||
|
[customInspectSymbolStackLess](depth, options) {
|
||
|
const constraint = options.stylize(this.constraint, "string");
|
||
|
if (depth < 0) {
|
||
|
return options.stylize(`[MultiplePossibilitiesConstraintError: ${constraint}]`, "special");
|
||
|
}
|
||
|
const newOptions = { ...options, depth: options.depth === null ? null : options.depth - 1 };
|
||
|
const verticalLine = options.stylize("|", "undefined");
|
||
|
const padding = `
|
||
|
${verticalLine} `;
|
||
|
const given = util.inspect(this.given, newOptions).replace(/\n/g, padding);
|
||
|
const header = `${options.stylize("MultiplePossibilitiesConstraintError", "special")} > ${constraint}`;
|
||
|
const message = options.stylize(this.message, "regexp");
|
||
|
const expectedPadding = `
|
||
|
${verticalLine} - `;
|
||
|
const expectedBlock = `
|
||
|
${options.stylize("Expected any of the following:", "string")}${expectedPadding}${this.expected.map((possible) => options.stylize(possible, "boolean")).join(expectedPadding)}`;
|
||
|
const givenBlock = `
|
||
|
${options.stylize("Received:", "regexp")}${padding}${given}`;
|
||
|
return `${header}
|
||
|
${message}
|
||
|
${expectedBlock}
|
||
|
${givenBlock}`;
|
||
|
}
|
||
|
};
|
||
|
__name(_MultiplePossibilitiesConstraintError, "MultiplePossibilitiesConstraintError");
|
||
|
var MultiplePossibilitiesConstraintError = _MultiplePossibilitiesConstraintError;
|
||
|
|
||
|
// src/constraints/util/common/combinedResultFn.ts
|
||
|
function combinedErrorFn(...fns) {
|
||
|
switch (fns.length) {
|
||
|
case 0:
|
||
|
return () => null;
|
||
|
case 1:
|
||
|
return fns[0];
|
||
|
case 2: {
|
||
|
const [fn0, fn1] = fns;
|
||
|
return (...params) => fn0(...params) || fn1(...params);
|
||
|
}
|
||
|
default: {
|
||
|
return (...params) => {
|
||
|
for (const fn of fns) {
|
||
|
const result = fn(...params);
|
||
|
if (result)
|
||
|
return result;
|
||
|
}
|
||
|
return null;
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
__name(combinedErrorFn, "combinedErrorFn");
|
||
|
|
||
|
// src/constraints/util/urlValidators.ts
|
||
|
function createUrlValidators(options) {
|
||
|
const fns = [];
|
||
|
if (options?.allowedProtocols?.length)
|
||
|
fns.push(allowedProtocolsFn(options.allowedProtocols));
|
||
|
if (options?.allowedDomains?.length)
|
||
|
fns.push(allowedDomainsFn(options.allowedDomains));
|
||
|
return combinedErrorFn(...fns);
|
||
|
}
|
||
|
__name(createUrlValidators, "createUrlValidators");
|
||
|
function allowedProtocolsFn(allowedProtocols) {
|
||
|
return (input, url) => allowedProtocols.includes(url.protocol) ? null : new MultiplePossibilitiesConstraintError("s.string.url", "Invalid URL protocol", input, allowedProtocols);
|
||
|
}
|
||
|
__name(allowedProtocolsFn, "allowedProtocolsFn");
|
||
|
function allowedDomainsFn(allowedDomains) {
|
||
|
return (input, url) => allowedDomains.includes(url.hostname) ? null : new MultiplePossibilitiesConstraintError("s.string.url", "Invalid URL domain", input, allowedDomains);
|
||
|
}
|
||
|
__name(allowedDomainsFn, "allowedDomainsFn");
|
||
|
|
||
|
// src/constraints/StringConstraints.ts
|
||
|
function stringLengthComparator(comparator, name, expected, length) {
|
||
|
return {
|
||
|
run(input) {
|
||
|
return comparator(input.length, length) ? Result.ok(input) : Result.err(new ExpectedConstraintError(name, "Invalid string length", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(stringLengthComparator, "stringLengthComparator");
|
||
|
function stringLengthLessThan(length) {
|
||
|
const expected = `expected.length < ${length}`;
|
||
|
return stringLengthComparator(lessThan, "s.string.lengthLessThan", expected, length);
|
||
|
}
|
||
|
__name(stringLengthLessThan, "stringLengthLessThan");
|
||
|
function stringLengthLessThanOrEqual(length) {
|
||
|
const expected = `expected.length <= ${length}`;
|
||
|
return stringLengthComparator(lessThanOrEqual, "s.string.lengthLessThanOrEqual", expected, length);
|
||
|
}
|
||
|
__name(stringLengthLessThanOrEqual, "stringLengthLessThanOrEqual");
|
||
|
function stringLengthGreaterThan(length) {
|
||
|
const expected = `expected.length > ${length}`;
|
||
|
return stringLengthComparator(greaterThan, "s.string.lengthGreaterThan", expected, length);
|
||
|
}
|
||
|
__name(stringLengthGreaterThan, "stringLengthGreaterThan");
|
||
|
function stringLengthGreaterThanOrEqual(length) {
|
||
|
const expected = `expected.length >= ${length}`;
|
||
|
return stringLengthComparator(greaterThanOrEqual, "s.string.lengthGreaterThanOrEqual", expected, length);
|
||
|
}
|
||
|
__name(stringLengthGreaterThanOrEqual, "stringLengthGreaterThanOrEqual");
|
||
|
function stringLengthEqual(length) {
|
||
|
const expected = `expected.length === ${length}`;
|
||
|
return stringLengthComparator(equal, "s.string.lengthEqual", expected, length);
|
||
|
}
|
||
|
__name(stringLengthEqual, "stringLengthEqual");
|
||
|
function stringLengthNotEqual(length) {
|
||
|
const expected = `expected.length !== ${length}`;
|
||
|
return stringLengthComparator(notEqual, "s.string.lengthNotEqual", expected, length);
|
||
|
}
|
||
|
__name(stringLengthNotEqual, "stringLengthNotEqual");
|
||
|
function stringEmail() {
|
||
|
return {
|
||
|
run(input) {
|
||
|
return validateEmail(input) ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.string.email", "Invalid email address", input, "expected to be an email address"));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(stringEmail, "stringEmail");
|
||
|
function stringRegexValidator(type, expected, regex) {
|
||
|
return {
|
||
|
run(input) {
|
||
|
return regex.test(input) ? Result.ok(input) : Result.err(new ExpectedConstraintError(type, "Invalid string format", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(stringRegexValidator, "stringRegexValidator");
|
||
|
function stringUrl(options) {
|
||
|
const validatorFn = createUrlValidators(options);
|
||
|
return {
|
||
|
run(input) {
|
||
|
let url;
|
||
|
try {
|
||
|
url = new URL(input);
|
||
|
} catch {
|
||
|
return Result.err(new ExpectedConstraintError("s.string.url", "Invalid URL", input, "expected to match a URL"));
|
||
|
}
|
||
|
const validatorFnResult = validatorFn(input, url);
|
||
|
if (validatorFnResult === null)
|
||
|
return Result.ok(input);
|
||
|
return Result.err(validatorFnResult);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(stringUrl, "stringUrl");
|
||
|
function stringIp(version) {
|
||
|
const ipVersion = version ? `v${version}` : "";
|
||
|
const validatorFn = version === 4 ? isIPv4 : version === 6 ? isIPv6 : isIP;
|
||
|
const name = `s.string.ip${ipVersion}`;
|
||
|
const message = `Invalid IP${ipVersion} address`;
|
||
|
const expected = `expected to be an IP${ipVersion} address`;
|
||
|
return {
|
||
|
run(input) {
|
||
|
return validatorFn(input) ? Result.ok(input) : Result.err(new ExpectedConstraintError(name, message, input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(stringIp, "stringIp");
|
||
|
function stringRegex(regex) {
|
||
|
return stringRegexValidator("s.string.regex", `expected ${regex}.test(expected) to be true`, regex);
|
||
|
}
|
||
|
__name(stringRegex, "stringRegex");
|
||
|
function stringUuid({ version = 4, nullable = false } = {}) {
|
||
|
version ?? (version = "1-5");
|
||
|
const regex = new RegExp(
|
||
|
`^(?:[0-9A-F]{8}-[0-9A-F]{4}-[${version}][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}${nullable ? "|00000000-0000-0000-0000-000000000000" : ""})$`,
|
||
|
"i"
|
||
|
);
|
||
|
const expected = `expected to match UUID${typeof version === "number" ? `v${version}` : ` in range of ${version}`}`;
|
||
|
return stringRegexValidator("s.string.uuid", expected, regex);
|
||
|
}
|
||
|
__name(stringUuid, "stringUuid");
|
||
|
function stringDate() {
|
||
|
return {
|
||
|
run(input) {
|
||
|
const time = Date.parse(input);
|
||
|
return Number.isNaN(time) ? Result.err(
|
||
|
new ExpectedConstraintError(
|
||
|
"s.string.date",
|
||
|
"Invalid date string",
|
||
|
input,
|
||
|
"expected to be a valid date string (in the ISO 8601 or ECMA-262 format)"
|
||
|
)
|
||
|
) : Result.ok(input);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(stringDate, "stringDate");
|
||
|
function stringPhone() {
|
||
|
return {
|
||
|
run(input) {
|
||
|
return validatePhoneNumber(input) ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.string.phone", "Invalid phone number", input, "expected to be a phone number"));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(stringPhone, "stringPhone");
|
||
|
|
||
|
// src/validators/StringValidator.ts
|
||
|
var _StringValidator = class _StringValidator extends BaseValidator {
|
||
|
lengthLessThan(length) {
|
||
|
return this.addConstraint(stringLengthLessThan(length));
|
||
|
}
|
||
|
lengthLessThanOrEqual(length) {
|
||
|
return this.addConstraint(stringLengthLessThanOrEqual(length));
|
||
|
}
|
||
|
lengthGreaterThan(length) {
|
||
|
return this.addConstraint(stringLengthGreaterThan(length));
|
||
|
}
|
||
|
lengthGreaterThanOrEqual(length) {
|
||
|
return this.addConstraint(stringLengthGreaterThanOrEqual(length));
|
||
|
}
|
||
|
lengthEqual(length) {
|
||
|
return this.addConstraint(stringLengthEqual(length));
|
||
|
}
|
||
|
lengthNotEqual(length) {
|
||
|
return this.addConstraint(stringLengthNotEqual(length));
|
||
|
}
|
||
|
get email() {
|
||
|
return this.addConstraint(stringEmail());
|
||
|
}
|
||
|
url(options) {
|
||
|
return this.addConstraint(stringUrl(options));
|
||
|
}
|
||
|
uuid(options) {
|
||
|
return this.addConstraint(stringUuid(options));
|
||
|
}
|
||
|
regex(regex) {
|
||
|
return this.addConstraint(stringRegex(regex));
|
||
|
}
|
||
|
get date() {
|
||
|
return this.addConstraint(stringDate());
|
||
|
}
|
||
|
get ipv4() {
|
||
|
return this.ip(4);
|
||
|
}
|
||
|
get ipv6() {
|
||
|
return this.ip(6);
|
||
|
}
|
||
|
ip(version) {
|
||
|
return this.addConstraint(stringIp(version));
|
||
|
}
|
||
|
phone() {
|
||
|
return this.addConstraint(stringPhone());
|
||
|
}
|
||
|
handle(value) {
|
||
|
return typeof value === "string" ? Result.ok(value) : Result.err(new ValidationError("s.string", "Expected a string primitive", value));
|
||
|
}
|
||
|
};
|
||
|
__name(_StringValidator, "StringValidator");
|
||
|
var StringValidator = _StringValidator;
|
||
|
|
||
|
// src/validators/TupleValidator.ts
|
||
|
var _TupleValidator = class _TupleValidator extends BaseValidator {
|
||
|
constructor(validators, constraints = []) {
|
||
|
super(constraints);
|
||
|
this.validators = [];
|
||
|
this.validators = validators;
|
||
|
}
|
||
|
clone() {
|
||
|
return Reflect.construct(this.constructor, [this.validators, this.constraints]);
|
||
|
}
|
||
|
handle(values) {
|
||
|
if (!Array.isArray(values)) {
|
||
|
return Result.err(new ValidationError("s.tuple(T)", "Expected an array", values));
|
||
|
}
|
||
|
if (values.length !== this.validators.length) {
|
||
|
return Result.err(new ValidationError("s.tuple(T)", `Expected an array of length ${this.validators.length}`, values));
|
||
|
}
|
||
|
if (!this.shouldRunConstraints) {
|
||
|
return Result.ok(values);
|
||
|
}
|
||
|
const errors = [];
|
||
|
const transformed = [];
|
||
|
for (let i = 0; i < values.length; i++) {
|
||
|
const result = this.validators[i].run(values[i]);
|
||
|
if (result.isOk())
|
||
|
transformed.push(result.value);
|
||
|
else
|
||
|
errors.push([i, result.error]);
|
||
|
}
|
||
|
return errors.length === 0 ? Result.ok(transformed) : Result.err(new CombinedPropertyError(errors));
|
||
|
}
|
||
|
};
|
||
|
__name(_TupleValidator, "TupleValidator");
|
||
|
var TupleValidator = _TupleValidator;
|
||
|
|
||
|
// src/validators/MapValidator.ts
|
||
|
var _MapValidator = class _MapValidator extends BaseValidator {
|
||
|
constructor(keyValidator, valueValidator, constraints = []) {
|
||
|
super(constraints);
|
||
|
this.keyValidator = keyValidator;
|
||
|
this.valueValidator = valueValidator;
|
||
|
}
|
||
|
clone() {
|
||
|
return Reflect.construct(this.constructor, [this.keyValidator, this.valueValidator, this.constraints]);
|
||
|
}
|
||
|
handle(value) {
|
||
|
if (!(value instanceof Map)) {
|
||
|
return Result.err(new ValidationError("s.map(K, V)", "Expected a map", value));
|
||
|
}
|
||
|
if (!this.shouldRunConstraints) {
|
||
|
return Result.ok(value);
|
||
|
}
|
||
|
const errors = [];
|
||
|
const transformed = /* @__PURE__ */ new Map();
|
||
|
for (const [key, val] of value.entries()) {
|
||
|
const keyResult = this.keyValidator.run(key);
|
||
|
const valueResult = this.valueValidator.run(val);
|
||
|
const { length } = errors;
|
||
|
if (keyResult.isErr())
|
||
|
errors.push([key, keyResult.error]);
|
||
|
if (valueResult.isErr())
|
||
|
errors.push([key, valueResult.error]);
|
||
|
if (errors.length === length)
|
||
|
transformed.set(keyResult.value, valueResult.value);
|
||
|
}
|
||
|
return errors.length === 0 ? Result.ok(transformed) : Result.err(new CombinedPropertyError(errors));
|
||
|
}
|
||
|
};
|
||
|
__name(_MapValidator, "MapValidator");
|
||
|
var MapValidator = _MapValidator;
|
||
|
|
||
|
// src/validators/LazyValidator.ts
|
||
|
var _LazyValidator = class _LazyValidator extends BaseValidator {
|
||
|
constructor(validator, constraints = []) {
|
||
|
super(constraints);
|
||
|
this.validator = validator;
|
||
|
}
|
||
|
clone() {
|
||
|
return Reflect.construct(this.constructor, [this.validator, this.constraints]);
|
||
|
}
|
||
|
handle(values) {
|
||
|
return this.validator(values).run(values);
|
||
|
}
|
||
|
};
|
||
|
__name(_LazyValidator, "LazyValidator");
|
||
|
var LazyValidator = _LazyValidator;
|
||
|
|
||
|
// src/lib/errors/UnknownEnumValueError.ts
|
||
|
var _UnknownEnumValueError = class _UnknownEnumValueError extends BaseError {
|
||
|
constructor(value, keys, enumMappings) {
|
||
|
super("Expected the value to be one of the following enum values:");
|
||
|
this.value = value;
|
||
|
this.enumKeys = keys;
|
||
|
this.enumMappings = enumMappings;
|
||
|
}
|
||
|
toJSON() {
|
||
|
return {
|
||
|
name: this.name,
|
||
|
value: this.value,
|
||
|
enumKeys: this.enumKeys,
|
||
|
enumMappings: [...this.enumMappings.entries()]
|
||
|
};
|
||
|
}
|
||
|
[customInspectSymbolStackLess](depth, options) {
|
||
|
const value = options.stylize(this.value.toString(), "string");
|
||
|
if (depth < 0) {
|
||
|
return options.stylize(`[UnknownEnumValueError: ${value}]`, "special");
|
||
|
}
|
||
|
const padding = `
|
||
|
${options.stylize("|", "undefined")} `;
|
||
|
const pairs = this.enumKeys.map((key) => {
|
||
|
const enumValue = this.enumMappings.get(key);
|
||
|
return `${options.stylize(key, "string")} or ${options.stylize(
|
||
|
enumValue.toString(),
|
||
|
typeof enumValue === "number" ? "number" : "string"
|
||
|
)}`;
|
||
|
}).join(padding);
|
||
|
const header = `${options.stylize("UnknownEnumValueError", "special")} > ${value}`;
|
||
|
const message = options.stylize(this.message, "regexp");
|
||
|
const pairsBlock = `${padding}${pairs}`;
|
||
|
return `${header}
|
||
|
${message}
|
||
|
${pairsBlock}`;
|
||
|
}
|
||
|
};
|
||
|
__name(_UnknownEnumValueError, "UnknownEnumValueError");
|
||
|
var UnknownEnumValueError = _UnknownEnumValueError;
|
||
|
|
||
|
// src/validators/NativeEnumValidator.ts
|
||
|
var _NativeEnumValidator = class _NativeEnumValidator extends BaseValidator {
|
||
|
constructor(enumShape) {
|
||
|
super();
|
||
|
this.hasNumericElements = false;
|
||
|
this.enumMapping = /* @__PURE__ */ new Map();
|
||
|
this.enumShape = enumShape;
|
||
|
this.enumKeys = Object.keys(enumShape).filter((key) => {
|
||
|
return typeof enumShape[enumShape[key]] !== "number";
|
||
|
});
|
||
|
for (const key of this.enumKeys) {
|
||
|
const enumValue = enumShape[key];
|
||
|
this.enumMapping.set(key, enumValue);
|
||
|
this.enumMapping.set(enumValue, enumValue);
|
||
|
if (typeof enumValue === "number") {
|
||
|
this.hasNumericElements = true;
|
||
|
this.enumMapping.set(`${enumValue}`, enumValue);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
handle(value) {
|
||
|
const typeOfValue = typeof value;
|
||
|
if (typeOfValue === "number") {
|
||
|
if (!this.hasNumericElements) {
|
||
|
return Result.err(new ValidationError("s.nativeEnum(T)", "Expected the value to be a string", value));
|
||
|
}
|
||
|
} else if (typeOfValue !== "string") {
|
||
|
return Result.err(new ValidationError("s.nativeEnum(T)", "Expected the value to be a string or number", value));
|
||
|
}
|
||
|
const casted = value;
|
||
|
const possibleEnumValue = this.enumMapping.get(casted);
|
||
|
return typeof possibleEnumValue === "undefined" ? Result.err(new UnknownEnumValueError(casted, this.enumKeys, this.enumMapping)) : Result.ok(possibleEnumValue);
|
||
|
}
|
||
|
clone() {
|
||
|
return Reflect.construct(this.constructor, [this.enumShape]);
|
||
|
}
|
||
|
};
|
||
|
__name(_NativeEnumValidator, "NativeEnumValidator");
|
||
|
var NativeEnumValidator = _NativeEnumValidator;
|
||
|
|
||
|
// src/constraints/TypedArrayLengthConstraints.ts
|
||
|
function typedArrayByteLengthComparator(comparator, name, expected, length) {
|
||
|
return {
|
||
|
run(input) {
|
||
|
return comparator(input.byteLength, length) ? Result.ok(input) : Result.err(new ExpectedConstraintError(name, "Invalid Typed Array byte length", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(typedArrayByteLengthComparator, "typedArrayByteLengthComparator");
|
||
|
function typedArrayByteLengthLessThan(value) {
|
||
|
const expected = `expected.byteLength < ${value}`;
|
||
|
return typedArrayByteLengthComparator(lessThan, "s.typedArray(T).byteLengthLessThan", expected, value);
|
||
|
}
|
||
|
__name(typedArrayByteLengthLessThan, "typedArrayByteLengthLessThan");
|
||
|
function typedArrayByteLengthLessThanOrEqual(value) {
|
||
|
const expected = `expected.byteLength <= ${value}`;
|
||
|
return typedArrayByteLengthComparator(lessThanOrEqual, "s.typedArray(T).byteLengthLessThanOrEqual", expected, value);
|
||
|
}
|
||
|
__name(typedArrayByteLengthLessThanOrEqual, "typedArrayByteLengthLessThanOrEqual");
|
||
|
function typedArrayByteLengthGreaterThan(value) {
|
||
|
const expected = `expected.byteLength > ${value}`;
|
||
|
return typedArrayByteLengthComparator(greaterThan, "s.typedArray(T).byteLengthGreaterThan", expected, value);
|
||
|
}
|
||
|
__name(typedArrayByteLengthGreaterThan, "typedArrayByteLengthGreaterThan");
|
||
|
function typedArrayByteLengthGreaterThanOrEqual(value) {
|
||
|
const expected = `expected.byteLength >= ${value}`;
|
||
|
return typedArrayByteLengthComparator(greaterThanOrEqual, "s.typedArray(T).byteLengthGreaterThanOrEqual", expected, value);
|
||
|
}
|
||
|
__name(typedArrayByteLengthGreaterThanOrEqual, "typedArrayByteLengthGreaterThanOrEqual");
|
||
|
function typedArrayByteLengthEqual(value) {
|
||
|
const expected = `expected.byteLength === ${value}`;
|
||
|
return typedArrayByteLengthComparator(equal, "s.typedArray(T).byteLengthEqual", expected, value);
|
||
|
}
|
||
|
__name(typedArrayByteLengthEqual, "typedArrayByteLengthEqual");
|
||
|
function typedArrayByteLengthNotEqual(value) {
|
||
|
const expected = `expected.byteLength !== ${value}`;
|
||
|
return typedArrayByteLengthComparator(notEqual, "s.typedArray(T).byteLengthNotEqual", expected, value);
|
||
|
}
|
||
|
__name(typedArrayByteLengthNotEqual, "typedArrayByteLengthNotEqual");
|
||
|
function typedArrayByteLengthRange(start, endBefore) {
|
||
|
const expected = `expected.byteLength >= ${start} && expected.byteLength < ${endBefore}`;
|
||
|
return {
|
||
|
run(input) {
|
||
|
return input.byteLength >= start && input.byteLength < endBefore ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.typedArray(T).byteLengthRange", "Invalid Typed Array byte length", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(typedArrayByteLengthRange, "typedArrayByteLengthRange");
|
||
|
function typedArrayByteLengthRangeInclusive(start, end) {
|
||
|
const expected = `expected.byteLength >= ${start} && expected.byteLength <= ${end}`;
|
||
|
return {
|
||
|
run(input) {
|
||
|
return input.byteLength >= start && input.byteLength <= end ? Result.ok(input) : Result.err(
|
||
|
new ExpectedConstraintError("s.typedArray(T).byteLengthRangeInclusive", "Invalid Typed Array byte length", input, expected)
|
||
|
);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(typedArrayByteLengthRangeInclusive, "typedArrayByteLengthRangeInclusive");
|
||
|
function typedArrayByteLengthRangeExclusive(startAfter, endBefore) {
|
||
|
const expected = `expected.byteLength > ${startAfter} && expected.byteLength < ${endBefore}`;
|
||
|
return {
|
||
|
run(input) {
|
||
|
return input.byteLength > startAfter && input.byteLength < endBefore ? Result.ok(input) : Result.err(
|
||
|
new ExpectedConstraintError("s.typedArray(T).byteLengthRangeExclusive", "Invalid Typed Array byte length", input, expected)
|
||
|
);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(typedArrayByteLengthRangeExclusive, "typedArrayByteLengthRangeExclusive");
|
||
|
function typedArrayLengthComparator(comparator, name, expected, length) {
|
||
|
return {
|
||
|
run(input) {
|
||
|
return comparator(input.length, length) ? Result.ok(input) : Result.err(new ExpectedConstraintError(name, "Invalid Typed Array length", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(typedArrayLengthComparator, "typedArrayLengthComparator");
|
||
|
function typedArrayLengthLessThan(value) {
|
||
|
const expected = `expected.length < ${value}`;
|
||
|
return typedArrayLengthComparator(lessThan, "s.typedArray(T).lengthLessThan", expected, value);
|
||
|
}
|
||
|
__name(typedArrayLengthLessThan, "typedArrayLengthLessThan");
|
||
|
function typedArrayLengthLessThanOrEqual(value) {
|
||
|
const expected = `expected.length <= ${value}`;
|
||
|
return typedArrayLengthComparator(lessThanOrEqual, "s.typedArray(T).lengthLessThanOrEqual", expected, value);
|
||
|
}
|
||
|
__name(typedArrayLengthLessThanOrEqual, "typedArrayLengthLessThanOrEqual");
|
||
|
function typedArrayLengthGreaterThan(value) {
|
||
|
const expected = `expected.length > ${value}`;
|
||
|
return typedArrayLengthComparator(greaterThan, "s.typedArray(T).lengthGreaterThan", expected, value);
|
||
|
}
|
||
|
__name(typedArrayLengthGreaterThan, "typedArrayLengthGreaterThan");
|
||
|
function typedArrayLengthGreaterThanOrEqual(value) {
|
||
|
const expected = `expected.length >= ${value}`;
|
||
|
return typedArrayLengthComparator(greaterThanOrEqual, "s.typedArray(T).lengthGreaterThanOrEqual", expected, value);
|
||
|
}
|
||
|
__name(typedArrayLengthGreaterThanOrEqual, "typedArrayLengthGreaterThanOrEqual");
|
||
|
function typedArrayLengthEqual(value) {
|
||
|
const expected = `expected.length === ${value}`;
|
||
|
return typedArrayLengthComparator(equal, "s.typedArray(T).lengthEqual", expected, value);
|
||
|
}
|
||
|
__name(typedArrayLengthEqual, "typedArrayLengthEqual");
|
||
|
function typedArrayLengthNotEqual(value) {
|
||
|
const expected = `expected.length !== ${value}`;
|
||
|
return typedArrayLengthComparator(notEqual, "s.typedArray(T).lengthNotEqual", expected, value);
|
||
|
}
|
||
|
__name(typedArrayLengthNotEqual, "typedArrayLengthNotEqual");
|
||
|
function typedArrayLengthRange(start, endBefore) {
|
||
|
const expected = `expected.length >= ${start} && expected.length < ${endBefore}`;
|
||
|
return {
|
||
|
run(input) {
|
||
|
return input.length >= start && input.length < endBefore ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.typedArray(T).lengthRange", "Invalid Typed Array length", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(typedArrayLengthRange, "typedArrayLengthRange");
|
||
|
function typedArrayLengthRangeInclusive(start, end) {
|
||
|
const expected = `expected.length >= ${start} && expected.length <= ${end}`;
|
||
|
return {
|
||
|
run(input) {
|
||
|
return input.length >= start && input.length <= end ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.typedArray(T).lengthRangeInclusive", "Invalid Typed Array length", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(typedArrayLengthRangeInclusive, "typedArrayLengthRangeInclusive");
|
||
|
function typedArrayLengthRangeExclusive(startAfter, endBefore) {
|
||
|
const expected = `expected.length > ${startAfter} && expected.length < ${endBefore}`;
|
||
|
return {
|
||
|
run(input) {
|
||
|
return input.length > startAfter && input.length < endBefore ? Result.ok(input) : Result.err(new ExpectedConstraintError("s.typedArray(T).lengthRangeExclusive", "Invalid Typed Array length", input, expected));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
__name(typedArrayLengthRangeExclusive, "typedArrayLengthRangeExclusive");
|
||
|
|
||
|
// src/constraints/util/common/vowels.ts
|
||
|
var vowels = ["a", "e", "i", "o", "u"];
|
||
|
var aOrAn = /* @__PURE__ */ __name((word) => {
|
||
|
return `${vowels.includes(word[0].toLowerCase()) ? "an" : "a"} ${word}`;
|
||
|
}, "aOrAn");
|
||
|
|
||
|
// src/constraints/util/typedArray.ts
|
||
|
var TypedArrays = {
|
||
|
Int8Array: (x) => x instanceof Int8Array,
|
||
|
Uint8Array: (x) => x instanceof Uint8Array,
|
||
|
Uint8ClampedArray: (x) => x instanceof Uint8ClampedArray,
|
||
|
Int16Array: (x) => x instanceof Int16Array,
|
||
|
Uint16Array: (x) => x instanceof Uint16Array,
|
||
|
Int32Array: (x) => x instanceof Int32Array,
|
||
|
Uint32Array: (x) => x instanceof Uint32Array,
|
||
|
Float32Array: (x) => x instanceof Float32Array,
|
||
|
Float64Array: (x) => x instanceof Float64Array,
|
||
|
BigInt64Array: (x) => x instanceof BigInt64Array,
|
||
|
BigUint64Array: (x) => x instanceof BigUint64Array,
|
||
|
TypedArray: (x) => ArrayBuffer.isView(x) && !(x instanceof DataView)
|
||
|
};
|
||
|
|
||
|
// src/validators/TypedArrayValidator.ts
|
||
|
var _TypedArrayValidator = class _TypedArrayValidator extends BaseValidator {
|
||
|
constructor(type, constraints = []) {
|
||
|
super(constraints);
|
||
|
this.type = type;
|
||
|
}
|
||
|
byteLengthLessThan(length) {
|
||
|
return this.addConstraint(typedArrayByteLengthLessThan(length));
|
||
|
}
|
||
|
byteLengthLessThanOrEqual(length) {
|
||
|
return this.addConstraint(typedArrayByteLengthLessThanOrEqual(length));
|
||
|
}
|
||
|
byteLengthGreaterThan(length) {
|
||
|
return this.addConstraint(typedArrayByteLengthGreaterThan(length));
|
||
|
}
|
||
|
byteLengthGreaterThanOrEqual(length) {
|
||
|
return this.addConstraint(typedArrayByteLengthGreaterThanOrEqual(length));
|
||
|
}
|
||
|
byteLengthEqual(length) {
|
||
|
return this.addConstraint(typedArrayByteLengthEqual(length));
|
||
|
}
|
||
|
byteLengthNotEqual(length) {
|
||
|
return this.addConstraint(typedArrayByteLengthNotEqual(length));
|
||
|
}
|
||
|
byteLengthRange(start, endBefore) {
|
||
|
return this.addConstraint(typedArrayByteLengthRange(start, endBefore));
|
||
|
}
|
||
|
byteLengthRangeInclusive(startAt, endAt) {
|
||
|
return this.addConstraint(typedArrayByteLengthRangeInclusive(startAt, endAt));
|
||
|
}
|
||
|
byteLengthRangeExclusive(startAfter, endBefore) {
|
||
|
return this.addConstraint(typedArrayByteLengthRangeExclusive(startAfter, endBefore));
|
||
|
}
|
||
|
lengthLessThan(length) {
|
||
|
return this.addConstraint(typedArrayLengthLessThan(length));
|
||
|
}
|
||
|
lengthLessThanOrEqual(length) {
|
||
|
return this.addConstraint(typedArrayLengthLessThanOrEqual(length));
|
||
|
}
|
||
|
lengthGreaterThan(length) {
|
||
|
return this.addConstraint(typedArrayLengthGreaterThan(length));
|
||
|
}
|
||
|
lengthGreaterThanOrEqual(length) {
|
||
|
return this.addConstraint(typedArrayLengthGreaterThanOrEqual(length));
|
||
|
}
|
||
|
lengthEqual(length) {
|
||
|
return this.addConstraint(typedArrayLengthEqual(length));
|
||
|
}
|
||
|
lengthNotEqual(length) {
|
||
|
return this.addConstraint(typedArrayLengthNotEqual(length));
|
||
|
}
|
||
|
lengthRange(start, endBefore) {
|
||
|
return this.addConstraint(typedArrayLengthRange(start, endBefore));
|
||
|
}
|
||
|
lengthRangeInclusive(startAt, endAt) {
|
||
|
return this.addConstraint(typedArrayLengthRangeInclusive(startAt, endAt));
|
||
|
}
|
||
|
lengthRangeExclusive(startAfter, endBefore) {
|
||
|
return this.addConstraint(typedArrayLengthRangeExclusive(startAfter, endBefore));
|
||
|
}
|
||
|
clone() {
|
||
|
return Reflect.construct(this.constructor, [this.type, this.constraints]);
|
||
|
}
|
||
|
handle(value) {
|
||
|
return TypedArrays[this.type](value) ? Result.ok(value) : Result.err(new ValidationError("s.typedArray", `Expected ${aOrAn(this.type)}`, value));
|
||
|
}
|
||
|
};
|
||
|
__name(_TypedArrayValidator, "TypedArrayValidator");
|
||
|
var TypedArrayValidator = _TypedArrayValidator;
|
||
|
|
||
|
// src/lib/Shapes.ts
|
||
|
var _Shapes = class _Shapes {
|
||
|
get string() {
|
||
|
return new StringValidator();
|
||
|
}
|
||
|
get number() {
|
||
|
return new NumberValidator();
|
||
|
}
|
||
|
get bigint() {
|
||
|
return new BigIntValidator();
|
||
|
}
|
||
|
get boolean() {
|
||
|
return new BooleanValidator();
|
||
|
}
|
||
|
get date() {
|
||
|
return new DateValidator();
|
||
|
}
|
||
|
object(shape) {
|
||
|
return new ObjectValidator(shape);
|
||
|
}
|
||
|
get undefined() {
|
||
|
return this.literal(void 0);
|
||
|
}
|
||
|
get null() {
|
||
|
return this.literal(null);
|
||
|
}
|
||
|
get nullish() {
|
||
|
return new NullishValidator();
|
||
|
}
|
||
|
get any() {
|
||
|
return new PassthroughValidator();
|
||
|
}
|
||
|
get unknown() {
|
||
|
return new PassthroughValidator();
|
||
|
}
|
||
|
get never() {
|
||
|
return new NeverValidator();
|
||
|
}
|
||
|
enum(...values) {
|
||
|
return this.union(...values.map((value) => this.literal(value)));
|
||
|
}
|
||
|
nativeEnum(enumShape) {
|
||
|
return new NativeEnumValidator(enumShape);
|
||
|
}
|
||
|
literal(value) {
|
||
|
if (value instanceof Date)
|
||
|
return this.date.equal(value);
|
||
|
return new LiteralValidator(value);
|
||
|
}
|
||
|
instance(expected) {
|
||
|
return new InstanceValidator(expected);
|
||
|
}
|
||
|
union(...validators) {
|
||
|
return new UnionValidator(validators);
|
||
|
}
|
||
|
array(validator) {
|
||
|
return new ArrayValidator(validator);
|
||
|
}
|
||
|
typedArray(type = "TypedArray") {
|
||
|
return new TypedArrayValidator(type);
|
||
|
}
|
||
|
get int8Array() {
|
||
|
return this.typedArray("Int8Array");
|
||
|
}
|
||
|
get uint8Array() {
|
||
|
return this.typedArray("Uint8Array");
|
||
|
}
|
||
|
get uint8ClampedArray() {
|
||
|
return this.typedArray("Uint8ClampedArray");
|
||
|
}
|
||
|
get int16Array() {
|
||
|
return this.typedArray("Int16Array");
|
||
|
}
|
||
|
get uint16Array() {
|
||
|
return this.typedArray("Uint16Array");
|
||
|
}
|
||
|
get int32Array() {
|
||
|
return this.typedArray("Int32Array");
|
||
|
}
|
||
|
get uint32Array() {
|
||
|
return this.typedArray("Uint32Array");
|
||
|
}
|
||
|
get float32Array() {
|
||
|
return this.typedArray("Float32Array");
|
||
|
}
|
||
|
get float64Array() {
|
||
|
return this.typedArray("Float64Array");
|
||
|
}
|
||
|
get bigInt64Array() {
|
||
|
return this.typedArray("BigInt64Array");
|
||
|
}
|
||
|
get bigUint64Array() {
|
||
|
return this.typedArray("BigUint64Array");
|
||
|
}
|
||
|
tuple(validators) {
|
||
|
return new TupleValidator(validators);
|
||
|
}
|
||
|
set(validator) {
|
||
|
return new SetValidator(validator);
|
||
|
}
|
||
|
record(validator) {
|
||
|
return new RecordValidator(validator);
|
||
|
}
|
||
|
map(keyValidator, valueValidator) {
|
||
|
return new MapValidator(keyValidator, valueValidator);
|
||
|
}
|
||
|
lazy(validator) {
|
||
|
return new LazyValidator(validator);
|
||
|
}
|
||
|
};
|
||
|
__name(_Shapes, "Shapes");
|
||
|
var Shapes = _Shapes;
|
||
|
|
||
|
// src/index.ts
|
||
|
var s = new Shapes();
|
||
|
/**
|
||
|
* @license MIT
|
||
|
* @copyright 2020 Colin McDonnell
|
||
|
* @see https://github.com/colinhacks/zod/blob/master/LICENSE
|
||
|
*/
|
||
|
|
||
|
exports.BaseError = BaseError;
|
||
|
exports.CombinedError = CombinedError;
|
||
|
exports.CombinedPropertyError = CombinedPropertyError;
|
||
|
exports.ExpectedConstraintError = ExpectedConstraintError;
|
||
|
exports.ExpectedValidationError = ExpectedValidationError;
|
||
|
exports.MissingPropertyError = MissingPropertyError;
|
||
|
exports.MultiplePossibilitiesConstraintError = MultiplePossibilitiesConstraintError;
|
||
|
exports.Result = Result;
|
||
|
exports.UnknownEnumValueError = UnknownEnumValueError;
|
||
|
exports.UnknownPropertyError = UnknownPropertyError;
|
||
|
exports.ValidationError = ValidationError;
|
||
|
exports.customInspectSymbol = customInspectSymbol;
|
||
|
exports.customInspectSymbolStackLess = customInspectSymbolStackLess;
|
||
|
exports.getGlobalValidationEnabled = getGlobalValidationEnabled;
|
||
|
exports.s = s;
|
||
|
exports.setGlobalValidationEnabled = setGlobalValidationEnabled;
|
||
|
//# sourceMappingURL=out.js.map
|
||
|
//# sourceMappingURL=index.cjs.map
|