@serum-enterprises/schema 3.0.0-beta.1 → 3.0.0-beta.2
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/build/index.js +51 -42
- package/build/index.js.map +4 -4
- package/package.json +1 -1
- package/types/Validator.d.ts +0 -1
- package/types/index.d.ts +3 -1
- package/types/lib/fromJSON.d.ts +2 -0
- package/test.ts +0 -13
package/build/index.js
CHANGED
|
@@ -181,6 +181,28 @@ __export(index_exports, {
|
|
|
181
181
|
});
|
|
182
182
|
module.exports = __toCommonJS(index_exports);
|
|
183
183
|
|
|
184
|
+
// src/Validator.ts
|
|
185
|
+
var Validator = class {
|
|
186
|
+
validate(data, path = "data") {
|
|
187
|
+
this.assert(data, path);
|
|
188
|
+
return data;
|
|
189
|
+
}
|
|
190
|
+
is(data, path = "data") {
|
|
191
|
+
try {
|
|
192
|
+
this.assert(data, path);
|
|
193
|
+
return true;
|
|
194
|
+
} catch (e) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
// src/lib/fromJSON.ts
|
|
201
|
+
var import_json7 = __toESM(require_build());
|
|
202
|
+
|
|
203
|
+
// src/validators/JSON.ts
|
|
204
|
+
var import_json = __toESM(require_build());
|
|
205
|
+
|
|
184
206
|
// src/lib/util.ts
|
|
185
207
|
var AssertError = class extends Error {
|
|
186
208
|
};
|
|
@@ -188,7 +210,6 @@ var DefinitionError = class extends Error {
|
|
|
188
210
|
};
|
|
189
211
|
|
|
190
212
|
// src/validators/JSON.ts
|
|
191
|
-
var import_json = __toESM(require_build());
|
|
192
213
|
var JSONValidator = class _JSONValidator extends Validator {
|
|
193
214
|
static fromJSON(_definition, _path = "definition") {
|
|
194
215
|
return new _JSONValidator();
|
|
@@ -551,7 +572,7 @@ var ArrayValidator = class _ArrayValidator extends Validator {
|
|
|
551
572
|
if (!import_json5.JSON.isObject(definition["every"]))
|
|
552
573
|
throw new DefinitionError(`Expected ${path}.every to be an Object`);
|
|
553
574
|
validatorInstance.every(
|
|
554
|
-
|
|
575
|
+
fromJSON(definition["every"], `${path}.every`)
|
|
555
576
|
);
|
|
556
577
|
}
|
|
557
578
|
if ("tuple" in definition) {
|
|
@@ -561,7 +582,7 @@ var ArrayValidator = class _ArrayValidator extends Validator {
|
|
|
561
582
|
const errors = [];
|
|
562
583
|
definition["tuple"].forEach((tupleDef, index) => {
|
|
563
584
|
try {
|
|
564
|
-
tupleSchemas.push(
|
|
585
|
+
tupleSchemas.push(fromJSON(tupleDef, `${path}.tuple[${index}]`));
|
|
565
586
|
} catch (e) {
|
|
566
587
|
if (!(e instanceof DefinitionError))
|
|
567
588
|
throw new DefinitionError(`Fatal Error: Undefined Error thrown by Domain.fromJSON at ${path}`);
|
|
@@ -741,7 +762,7 @@ var ObjectValidator = class _ObjectValidator extends Validator {
|
|
|
741
762
|
validatorInstance.max(definition["max"], `${path}.max`);
|
|
742
763
|
}
|
|
743
764
|
if ("every" in definition) {
|
|
744
|
-
validatorInstance.every(
|
|
765
|
+
validatorInstance.every(fromJSON(definition["every"], `${path}.every`));
|
|
745
766
|
}
|
|
746
767
|
if ("shape" in definition) {
|
|
747
768
|
if (!import_json6.JSON.isShallowObject(definition["shape"]))
|
|
@@ -750,7 +771,7 @@ var ObjectValidator = class _ObjectValidator extends Validator {
|
|
|
750
771
|
const errors = [];
|
|
751
772
|
for (const [key, value] of Object.entries(definition["shape"])) {
|
|
752
773
|
try {
|
|
753
|
-
shape[key] =
|
|
774
|
+
shape[key] = fromJSON(value, `${path}.shape.${key}`);
|
|
754
775
|
} catch (e) {
|
|
755
776
|
if (!(e instanceof DefinitionError))
|
|
756
777
|
throw new DefinitionError(`Fatal Error: Undefined Error thrown by Domain.fromJSON at ${path}.shape.${key}`);
|
|
@@ -954,44 +975,29 @@ var ObjectValidator = class _ObjectValidator extends Validator {
|
|
|
954
975
|
}
|
|
955
976
|
};
|
|
956
977
|
|
|
957
|
-
// src/
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
default:
|
|
979
|
-
throw new DefinitionError(`Expected ${path}.type to be a registered Validator`);
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
validate(data, path = "data") {
|
|
983
|
-
this.assert(data, path);
|
|
984
|
-
return data;
|
|
985
|
-
}
|
|
986
|
-
is(data, path = "data") {
|
|
987
|
-
try {
|
|
988
|
-
this.assert(data, path);
|
|
989
|
-
return true;
|
|
990
|
-
} catch (e) {
|
|
991
|
-
return false;
|
|
992
|
-
}
|
|
978
|
+
// src/lib/fromJSON.ts
|
|
979
|
+
function fromJSON(definition, path) {
|
|
980
|
+
if (!import_json7.JSON.isShallowObject(definition))
|
|
981
|
+
throw new DefinitionError(`Expected ${path} to be an Object`);
|
|
982
|
+
if (!import_json7.JSON.isString(definition["type"]))
|
|
983
|
+
throw new DefinitionError(`Expected ${path}.type to be a String`);
|
|
984
|
+
switch (definition["type"]) {
|
|
985
|
+
case "json":
|
|
986
|
+
return JSONValidator.fromJSON(definition, path);
|
|
987
|
+
case "boolean":
|
|
988
|
+
return BooleanValidator.fromJSON(definition, path);
|
|
989
|
+
case "number":
|
|
990
|
+
return NumberValidator.fromJSON(definition, path);
|
|
991
|
+
case "string":
|
|
992
|
+
return StringValidator.fromJSON(definition, path);
|
|
993
|
+
case "array":
|
|
994
|
+
return ArrayValidator.fromJSON(definition, path);
|
|
995
|
+
case "object":
|
|
996
|
+
return ObjectValidator.fromJSON(definition, path);
|
|
997
|
+
default:
|
|
998
|
+
throw new DefinitionError(`Expected ${path}.type to be a registered Validator`);
|
|
993
999
|
}
|
|
994
|
-
}
|
|
1000
|
+
}
|
|
995
1001
|
|
|
996
1002
|
// src/index.ts
|
|
997
1003
|
var Schema = class {
|
|
@@ -1013,6 +1019,9 @@ var Schema = class {
|
|
|
1013
1019
|
static get Object() {
|
|
1014
1020
|
return new ObjectValidator();
|
|
1015
1021
|
}
|
|
1022
|
+
static fromJSON(definition, path = "definition") {
|
|
1023
|
+
return fromJSON(definition, path);
|
|
1024
|
+
}
|
|
1016
1025
|
};
|
|
1017
1026
|
var Validators = {
|
|
1018
1027
|
JSON: JSONValidator,
|
package/build/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../node_modules/@serum-enterprises/json/build/index.js", "../node_modules/@serum-enterprises/option/build/Option.js", "../src/index.ts", "../src/lib/
|
|
4
|
-
"sourcesContent": ["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.JSON = void 0;\nvar JSON;\n(function (JSON) {\n function isNull(value) {\n return value === null;\n }\n JSON.isNull = isNull;\n function isBoolean(value) {\n return typeof value === 'boolean';\n }\n JSON.isBoolean = isBoolean;\n function isNumber(value) {\n // Using Number.isFinite here as NaN, Infinity and -Infinity are not valid JSON Numbers\n return Number.isFinite(value);\n }\n JSON.isNumber = isNumber;\n function isInteger(value) {\n // Using Number.isSafeInteger here as JS Numbers are 64-bit floating point numbers and not all integers can be represented accurately\n return Number.isSafeInteger(value);\n }\n JSON.isInteger = isInteger;\n function isString(value) {\n return typeof value === 'string';\n }\n JSON.isString = isString;\n function isShallowArray(value) {\n return Array.isArray(value);\n }\n JSON.isShallowArray = isShallowArray;\n function isArray(value) {\n return isShallowArray(value) && value.every((v) => isJSON(v));\n }\n JSON.isArray = isArray;\n function isShallowObject(value) {\n // Using Object.prototype.toString.call here as it is the most reliable way to check if something is an Object\n return (Object.prototype.toString.call(value) === '[object Object]');\n }\n JSON.isShallowObject = isShallowObject;\n function isObject(value) {\n return isShallowObject(value) && Object.values(value).every((v) => isJSON(v));\n }\n JSON.isObject = isObject;\n function isPrimitive(value) {\n return isBoolean(value) || isNumber(value) || isString(value);\n }\n JSON.isPrimitive = isPrimitive;\n function isShallowContainer(value) {\n return isShallowArray(value) || isShallowObject(value);\n }\n JSON.isShallowContainer = isShallowContainer;\n function isContainer(value) {\n return isArray(value) || isObject(value);\n }\n JSON.isContainer = isContainer;\n function isShallowJSON(value) {\n return isNull(value) || isPrimitive(value) || isShallowArray(value) || isShallowObject(value);\n }\n JSON.isShallowJSON = isShallowJSON;\n function isJSON(value) {\n return isNull(value) || isPrimitive(value) || isContainer(value);\n }\n JSON.isJSON = isJSON;\n function clone(value) {\n // Using Shallow Checks here as it is expected that value is JSON anyway, and this function is recursive anyway\n if (isShallowObject(value))\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, clone(v)]));\n else if (isShallowArray(value))\n return value.map((v) => clone(v));\n else\n return value;\n }\n JSON.clone = clone;\n // Compatibility Method for the native JSON.parse\n function parse(value) {\n return globalThis.JSON.parse(value);\n }\n JSON.parse = parse;\n // Compatibility Method for the native JSON.stringify\n function stringify(value) {\n return globalThis.JSON.stringify(value);\n }\n JSON.stringify = stringify;\n})(JSON || (exports.JSON = JSON = {}));\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.None = exports.Some = exports.Option = void 0;\nclass Option {\n static Some(value) {\n return new Some(value);\n }\n static None() {\n return new None();\n }\n isSome() {\n return this instanceof Some;\n }\n isNone() {\n return this instanceof None;\n }\n onSome(fn) {\n if (this.isSome())\n fn(this.value);\n return this;\n }\n onNone(fn) {\n if (this.isNone())\n fn();\n return this;\n }\n map(fn) {\n return this.match(value => Option.Some(fn(value)), () => Option.None());\n }\n match(onSome, onNone) {\n if (this.isSome())\n return onSome(this.value);\n else\n return onNone();\n }\n}\nexports.Option = Option;\nclass Some extends Option {\n _value;\n constructor(value) {\n super();\n this._value = value;\n }\n get value() {\n return this._value;\n }\n}\nexports.Some = Some;\nclass None extends Option {\n}\nexports.None = None;\n", "export {Validator} from './Validator';\n\nimport {JSONValidator, JSONValidatorDefinition} from './validators/JSON';\nimport {BooleanValidator, BooleanValidatorDefinition} from './validators/Boolean';\nimport {NumberValidator, NumberValidatorDefinition} from './validators/Number';\nimport {StringValidator, StringValidatorDefinition} from './validators/String';\nimport {ArrayValidator, ArrayValidatorDefinition} from './validators/Array';\nimport {ObjectValidator, ObjectValidatorDefinition} from './validators/Object';\n\nexport class Schema {\n\tstatic get JSON(): JSONValidator {\n\t\treturn new JSONValidator();\n\t}\n\n\tstatic get Boolean(): BooleanValidator {\n\t\treturn new BooleanValidator();\n\t}\n\n\tstatic get Number(): NumberValidator {\n\t\treturn new NumberValidator();\n\t}\n\n\tstatic get String(): StringValidator {\n\t\treturn new StringValidator();\n\t}\n\n\tstatic get Array(): ArrayValidator {\n\t\treturn new ArrayValidator();\n\t}\n\n\tstatic get Object(): ObjectValidator {\n\t\treturn new ObjectValidator();\n\t}\n}\n\nexport const Validators = {\n\tJSON: JSONValidator,\n\tBoolean: BooleanValidator,\n\tNumber: NumberValidator,\n\tString: StringValidator,\n\tArray: ArrayValidator,\n\tObject: ObjectValidator\n} as const;\n\nexport type Definition =\n\tJSONValidatorDefinition |\n\tBooleanValidatorDefinition |\n\tNumberValidatorDefinition |\n\tStringValidatorDefinition |\n\tArrayValidatorDefinition |\n\tObjectValidatorDefinition;\n\nexport namespace Definitions {\n\texport type JSON = JSONValidatorDefinition;\n\texport type Boolean = BooleanValidatorDefinition;\n\texport type Number = NumberValidatorDefinition;\n\texport type String = StringValidatorDefinition;\n\texport type Array = ArrayValidatorDefinition;\n\texport type Object = ObjectValidatorDefinition;\n}\n\nexport {InferDefinitionType, InferValidatorReturnType} from './lib/util';", "import type {Validator} from '../Validator';\n\nexport type ApplyNullability<T, N extends boolean> =\n\tN extends true ? T | null : Exclude<T, null>;\n\nexport interface Definition {\n\ttype: string;\n}\n\nexport type InferDefinitionType<V> = V extends { toJSON(): infer D } ? D : never;\nexport type InferValidatorReturnType<V> = V extends Validator<infer T> ? T : unknown;\n\nexport type InferListDefinitionType<T extends readonly Validator[]> = {\n\t[K in keyof T]: InferDefinitionType<T[K]>;\n};\nexport type InferListReturnType<T> = T extends readonly Validator[] ?\n\t{ [K in keyof T]: InferValidatorReturnType<T[K]> } :\n\tunknown;\n\nexport type InferObjectDefinitionType<T extends { [key: string]: Validator }> = {\n\t[K in keyof T]: InferDefinitionType<T[K]>\n}\nexport type InferObjectReturnType<T> = T extends { [key: string]: Validator } ?\n\t{ [K in keyof T]: InferValidatorReturnType<T[K]> } :\n\tunknown;\n\nexport class AssertError extends Error {}\n\nexport class DefinitionError extends Error {}", "import {JSON} from '@serum-enterprises/json';\nimport {Validator} from '../Validator';\nimport {Definition, AssertError} from '../lib/util';\n\nexport interface JSONValidatorDefinition extends Definition {\n\ttype: 'json';\n}\n\nexport class JSONValidator<T extends JSON.JSON = JSON.JSON> extends Validator<T> {\n\tpublic static override fromJSON(\n\t\t_definition: Definition & { [key: string]: unknown },\n\t\t_path: string = 'definition'\n\t): Validator {\n\t\treturn new JSONValidator();\n\t}\n\n\tpublic assert(data: unknown, path: string = 'data'): asserts data is JSON.JSON {\n\t\tif (!JSON.isJSON(data))\n\t\t\tthrow new AssertError(`Expected ${path} to be valid JSON`);\n\t}\n\n\tpublic isSubset(other: Validator): boolean {\n\t\treturn other instanceof JSONValidator;\n\t}\n\n\tpublic toJSON(): JSONValidatorDefinition {\n\t\treturn {\n\t\t\ttype: 'json'\n\t\t};\n\t}\n}", "import {JSON} from '@serum-enterprises/json';\nimport {Option} from '@serum-enterprises/option';\nimport {Validator} from '../Validator';\nimport {Definition, ApplyNullability, AssertError, DefinitionError} from '../lib/util';\nimport {JSONValidator} from './JSON';\n\nexport interface BooleanValidatorDefinition extends Definition {\n\ttype: 'boolean';\n\tnullable?: boolean;\n\tequals?: boolean;\n}\n\nexport class BooleanValidator<\n\tT extends JSON.Boolean = JSON.Boolean,\n\tN extends boolean = false\n> extends Validator<ApplyNullability<T, N>> {\n\tpublic static override fromJSON(\n\t\tdefinition: Definition & { [key: string]: unknown },\n\t\tpath: string = 'definition'\n\t): Validator {\n\t\tconst validatorInstance = new BooleanValidator();\n\n\t\tif ('nullable' in definition) {\n\t\t\tif (!JSON.isBoolean(definition['nullable']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.nullable to be a Boolean`);\n\n\t\t\tvalidatorInstance.nullable(definition['nullable']);\n\t\t}\n\n\t\tif ('equals' in definition) {\n\t\t\tif (!JSON.isBoolean(definition['equals']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.equals to be a Boolean`);\n\n\t\t\tvalidatorInstance.equals(definition['equals']);\n\t\t}\n\n\t\treturn validatorInstance;\n\t}\n\n\tprotected _nullable: Option<null> = Option.None();\n\tprotected _equals: Option<boolean> = Option.None();\n\n\tpublic nullable<const F extends boolean = true>(flag?: F): BooleanValidator<T, F> {\n\t\tthis._nullable = flag ?? true ? Option.Some(null) : Option.None();\n\n\t\treturn this as unknown as BooleanValidator<T, F>;\n\t}\n\n\tpublic equals<const V extends boolean>(value: V): BooleanValidator<V, N> {\n\t\tthis._equals = Option.Some(value);\n\n\t\treturn this as unknown as BooleanValidator<V, N>;\n\t}\n\n\tpublic assert(data: unknown, path: string = 'data'): asserts data is ApplyNullability<T, N> {\n\t\tif (JSON.isBoolean(data)) {\n\t\t\tif (this._equals.isSome() && this._equals.value !== data)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be ${this._equals.value}${this._nullable.isSome() ? '' : ' or Null'}`);\n\t\t}\n\t\telse if(JSON.isNull(data)) {\n\t\t\tif(!this._nullable.isSome())\n\t\t\t\tthrow new AssertError(`Expected ${path} to be a Boolean${this._nullable.isSome() ? ' or Null' : ''}`);\n\t\t}\n\t\telse\n\t\t\tthrow new AssertError(`Expected ${path} to be a Boolean${this._nullable.isSome() ? ' or Null' : ''}`);\n\t}\n\n\tpublic isSubset(other: Validator): boolean {\n\t\tif (other instanceof JSONValidator)\n\t\t\treturn true;\n\n\t\tif (!(other instanceof BooleanValidator))\n\t\t\treturn false;\n\n\t\tif (this._nullable.isSome() && !other._nullable.isSome())\n\t\t\treturn false;\n\n\t\tif (other._equals.isSome()) {\n\t\t\tif (this._equals.isSome())\n\t\t\t\treturn this._equals.value === other._equals.value;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic toJSON(): BooleanValidatorDefinition {\n\t\tconst definition: BooleanValidatorDefinition = {\n\t\t\ttype: 'boolean'\n\t\t};\n\n\t\tif (this._nullable.isSome())\n\t\t\tdefinition['nullable'] = true;\n\n\t\tif (this._equals.isSome())\n\t\t\tdefinition['equals'] = this._equals.value;\n\n\t\treturn definition;\n\t}\n}", "import {JSON} from '@serum-enterprises/json';\nimport {Option} from '@serum-enterprises/option';\nimport {Validator} from '../Validator';\nimport {Definition, ApplyNullability, AssertError, DefinitionError} from '../lib/util';\nimport {JSONValidator} from './JSON';\n\nexport interface NumberValidatorDefinition extends Definition {\n\ttype: 'number';\n\tnullable?: boolean;\n\tequals?: JSON.Number;\n\tinteger?: boolean;\n\tmin?: number;\n\tmax?: number;\n}\n\nexport class NumberValidator<\n\tT extends JSON.Number = JSON.Number,\n\tN extends boolean = false\n> extends Validator<ApplyNullability<T, N>> {\n\tpublic static override fromJSON(\n\t\tdefinition: Definition & { [key: string]: unknown },\n\t\tpath: string = 'definition'\n\t): Validator {\n\t\tconst validatorInstance = new NumberValidator();\n\n\t\tif ('nullable' in definition) {\n\t\t\tif (!JSON.isBoolean(definition['nullable']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.nullable to be a Boolean`);\n\n\t\t\tvalidatorInstance.nullable(definition['nullable']);\n\t\t}\n\n\t\tif ('equals' in definition) {\n\t\t\tif (!JSON.isNumber(definition['equals']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.equals to be a Number`);\n\n\t\t\tvalidatorInstance.equals(definition['equals'], `${path}.equals`);\n\t\t}\n\n\t\tif ('integer' in definition) {\n\t\t\tif (!JSON.isBoolean(definition['integer']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.integer to be a Boolean`);\n\n\t\t\tvalidatorInstance.integer(definition['integer'], `${path}.integer`);\n\t\t}\n\n\t\tif ('min' in definition) {\n\t\t\tif (!JSON.isNumber(definition['min']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.min to be a Number`);\n\n\t\t\tvalidatorInstance.min(definition['min'], `${path}.min`);\n\t\t}\n\n\t\tif ('max' in definition) {\n\t\t\tif (!JSON.isNumber(definition['max']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.max to be a Number`);\n\n\t\t\tvalidatorInstance.max(definition['max'], `${path}.max`);\n\t\t}\n\n\t\treturn validatorInstance;\n\t}\n\n\tprotected _nullable: Option<null> = Option.None();\n\tprotected _equals: Option<JSON.Number> = Option.None();\n\tprotected _integer: Option<null> = Option.None();\n\tprotected _min: Option<number> = Option.None();\n\tprotected _max: Option<number> = Option.None();\n\n\tpublic nullable<const F extends boolean = true>(flag?: F): NumberValidator<T, F> {\n\t\tthis._nullable = (flag ?? true) ? Option.Some(null) : Option.None();\n\n\t\treturn this as unknown as NumberValidator<T, F>;\n\t}\n\n\tpublic equals<const V extends number>(value: V, path: string = 'equals'): NumberValidator<V, N> {\n\t\tif (this._integer.isSome() && !Number.isSafeInteger(value))\n\t\t\tthrow new DefinitionError(`Expected Equals Rule to be an Integer according to the Integer Rule at Path ${path}`);\n\n\t\tif (this._min.isSome() && this._min.value > value)\n\t\t\tthrow new DefinitionError(`Expected Equals Rule to be larger than or equal to the Minimum Rule at Path ${path}`);\n\n\t\tif (this._max.isSome() && this._max.value < value)\n\t\t\tthrow new DefinitionError(`Expected Equals Rule to be smaller than or equal to the Maximum Rule at Path ${path}`);\n\n\t\tthis._equals = Option.Some(value);\n\n\t\treturn this as unknown as NumberValidator<V, N>;\n\t}\n\n\tpublic integer(flag: boolean = true, path: string = 'integer'): this {\n\t\tif (flag && this._equals.isSome() && !Number.isSafeInteger(this._equals.value))\n\t\t\tthrow new DefinitionError(`Expected Integer Rule to be a false due to the Equals Rule being a Float at Path ${path}`);\n\n\t\tthis._integer = flag ? Option.Some(null) : Option.None();\n\n\t\treturn this;\n\t}\n\n\tpublic min(value: number, path: string = 'min'): this {\n\t\tif (this._max.isSome() && this._max.value < value)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to Maximum Rule at Path ${path}`);\n\n\t\tif (this._equals.isSome() && this._equals.value < value)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to the Equals Rule at Path ${path}`);\n\n\t\tthis._min = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic max(value: number, path: string = 'max'): this {\n\t\tif (this._min.isSome() && this._min.value > value)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to Minimum Rule at Path ${path}`);\n\n\t\tif (this._equals.isSome() && this._equals.value > value)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to the Equals Rule at Path ${path}`);\n\n\t\tthis._max = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic assert(data: unknown, path: string = 'data'): asserts data is ApplyNullability<T, N> {\n\t\tif (JSON.isNumber(data)) {\n\t\t\tif (this._equals.isSome() && this._equals.value !== data)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be ${this._equals.value}`);\n\n\t\t\tif (this._integer.isSome() && !Number.isInteger(data))\n\t\t\t\tthrow new AssertError(`Expected ${path} to be an Integer`);\n\n\t\t\tif (this._min.isSome() && this._min.value > data)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be at least ${this._min.value}`);\n\n\t\t\tif (this._max.isSome() && this._max.value < data)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be at most ${this._max.value}`);\n\t\t}\n\t\telse if(JSON.isNull(data)) {\n\t\t\tif(!this._nullable.isSome())\n\t\t\t\tthrow new AssertError(`Expected ${path} to be a Number${this._nullable.isSome() ? ' or Null' : ''}`);\n\t\t}\n\t\telse\n\t\t\tthrow new AssertError(`Expected ${path} to be a Number${this._nullable.isSome() ? ' or Null' : ''}`);\n\t}\n\n\tpublic isSubset(other: Validator): boolean {\n\t\tif (other instanceof JSONValidator)\n\t\t\treturn true;\n\n\t\tif (!(other instanceof NumberValidator))\n\t\t\treturn false;\n\n\t\tif (this._nullable.isSome() && !other._nullable.isSome())\n\t\t\treturn false;\n\n\t\tif (this._equals.isSome()) {\n\t\t\tif (other._equals.isSome() && other._equals.value !== this._equals.value)\n\t\t\t\treturn false;\n\n\t\t\tif (other._integer.isSome() && !Number.isInteger(this._equals.value))\n\t\t\t\treturn false;\n\n\t\t\tif (other._min.isSome() && other._min.value > this._equals.value)\n\t\t\t\treturn false;\n\n\t\t\tif (other._max.isSome() && other._max.value < this._equals.value)\n\t\t\t\treturn false;\n\n\t\t\treturn true;\n\t\t}\n\n\t\tif (other._equals.isSome())\n\t\t\treturn false;\n\n\t\tif (!this._integer.isSome() && other._integer.isSome())\n\t\t\treturn false;\n\n\t\tif (other._min.isSome() && (!this._min.isSome() || this._min.value < other._min.value))\n\t\t\treturn false;\n\n\t\tif (other._max.isSome() && (!this._max.isSome() || this._max.value > other._max.value))\n\t\t\treturn false;\n\n\t\treturn true;\n\t}\n\n\tpublic toJSON(): NumberValidatorDefinition {\n\t\tconst definition: NumberValidatorDefinition = {\n\t\t\ttype: 'number'\n\t\t};\n\n\t\tif (this._nullable.isSome())\n\t\t\tdefinition['nullable'] = true;\n\n\t\tif (this._equals.isSome())\n\t\t\tdefinition['equals'] = this._equals.value;\n\n\t\tif (this._integer.isSome())\n\t\t\tdefinition['integer'] = true;\n\n\t\tif (this._min.isSome())\n\t\t\tdefinition['min'] = this._min.value;\n\n\t\tif (this._max.isSome())\n\t\t\tdefinition['max'] = this._max.value;\n\n\t\treturn definition;\n\t}\n}", "import {JSON} from '@serum-enterprises/json';\nimport {Option} from '@serum-enterprises/option';\nimport {Validator} from '../Validator';\nimport {Definition, ApplyNullability, AssertError, DefinitionError} from '../lib/util';\nimport {JSONValidator} from './JSON';\n\nexport interface StringValidatorDefinition extends Definition {\n\ttype: 'string';\n\tnullable?: boolean;\n\tequals?: JSON.String;\n\tmin?: number;\n\tmax?: number;\n}\n\nexport class StringValidator<\n\tT extends JSON.String = JSON.String,\n\tN extends boolean = false\n> extends Validator<ApplyNullability<T, N>> {\n\tpublic static override fromJSON(\n\t\tdefinition: Definition & { [key: string]: unknown },\n\t\tpath: string = 'schema'\n\t): Validator {\n\t\tconst validatorInstance = new StringValidator();\n\n\t\tif ('nullable' in definition) {\n\t\t\tif (!JSON.isBoolean(definition['nullable']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.nullable to be a Boolean`);\n\n\t\t\tvalidatorInstance.nullable(definition['nullable']);\n\t\t}\n\n\t\tif ('equals' in definition) {\n\t\t\tif (!JSON.isString(definition['equals']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.equals to be a String`);\n\n\t\t\tvalidatorInstance.equals(definition['equals'], `${path}.equals`);\n\t\t}\n\n\t\tif ('min' in definition) {\n\t\t\tif (!JSON.isNumber(definition['min']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.min to be a positive Integer`);\n\n\t\t\tvalidatorInstance.min(definition['min'], `${path}.min`);\n\t\t}\n\n\t\tif ('max' in definition) {\n\t\t\tif (!JSON.isNumber(definition['max']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.max to be a positive Integer`);\n\n\t\t\tvalidatorInstance.max(definition['max'], `${path}.max`);\n\t\t}\n\n\t\treturn validatorInstance;\n\t}\n\n\tprotected _nullable: Option<null> = Option.None();\n\tprotected _equals: Option<JSON.String> = Option.None();\n\tprotected _min: Option<number> = Option.None();\n\tprotected _max: Option<number> = Option.None();\n\n\tpublic nullable<const F extends boolean = true>(flag?: F): StringValidator<T, F> {\n\t\tthis._nullable = (flag ?? true) ? Option.Some(null) : Option.None();\n\n\t\treturn this as unknown as StringValidator<T, F>;\n\t}\n\n\tpublic equals<const V extends string>(value: V, path: string = 'equals'): StringValidator<V, N> {\n\t\tif (this._min.isSome() && this._min.value > value.length)\n\t\t\tthrow new DefinitionError(`Expected the Equals Rules Length to be larger than or equal to the Minimum Rule at Path ${path}`);\n\n\t\tif (this._max.isSome() && this._max.value < value.length)\n\t\t\tthrow new DefinitionError(`Expected the Equals Rules Length to be smaller than or equal to the Maximum Rule at Path ${path}`);\n\n\n\t\tthis._equals = Option.Some(value);\n\n\t\treturn this as unknown as StringValidator<V, N>;\n\t}\n\n\tpublic min(value: number, path: string = 'min'): this {\n\t\tif (!Number.isSafeInteger(value) || value < 0)\n\t\t\tthrow new DefinitionError(`Expected ${path}.min to be a positive Integer`);\n\n\t\tif (this._max.isSome() && this._max.value < value)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to Maximum Rule at Path ${path}`);\n\n\t\tif (this._equals.isSome() && this._equals.value.length < value)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to the Equals Rules Length at Path ${path}`);\n\n\t\tthis._min = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic max(value: number, path: string = 'max'): this {\n\t\tif (!Number.isSafeInteger(value) || value < 0)\n\t\t\tthrow new DefinitionError(`Expected ${path}.max to be a positive Integer`);\n\n\t\tif (this._min.isSome() && this._min.value > value)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to Minimum Rule at Path ${path}`);\n\n\t\tif (this._equals.isSome() && this._equals.value.length > value)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to the Equals Rules Length at Path ${path}`);\n\n\t\tthis._max = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic assert(data: unknown, path: string = 'data'): asserts data is ApplyNullability<T, N> {\n\t\tif (JSON.isString(data)) {\n\t\t\tif (this._equals.isSome() && this._equals.value !== data)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be ${this._equals.value}`);\n\n\t\t\tif (this._min.isSome() && this._min.value > data.length)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be at least ${this._min.value} characters long`);\n\n\t\t\tif (this._max.isSome() && this._max.value < data.length)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be at most ${this._max.value} characters long`);\n\t\t}\n\t\telse if(JSON.isNull(data)) {\n\t\t\tif(!this._nullable.isSome())\n\t\t\t\tthrow new AssertError(`Expected ${path} to be a String${this._nullable.isSome() ? ' or Null' : ''}`);\n\t\t}\n\t\telse\n\t\t\tthrow new AssertError(`Expected ${path} to be a String${this._nullable.isSome() ? ' or Null' : ''}`);\n\t}\n\n\tpublic isSubset(other: Validator): boolean {\n\t\tif (other instanceof JSONValidator)\n\t\t\treturn true;\n\n\t\tif (!(other instanceof StringValidator))\n\t\t\treturn false;\n\n\t\tif (this._nullable.isSome() && !other._nullable.isSome())\n\t\t\treturn false;\n\n\t\tif (this._equals.isSome()) {\n\t\t\tif (other._equals.isSome() && other._equals.value !== this._equals.value)\n\t\t\t\treturn false;\n\n\t\t\tif (other._min.isSome() && other._min.value > this._equals.value.length)\n\t\t\t\treturn false;\n\n\t\t\tif (other._max.isSome() && other._max.value < this._equals.value.length)\n\t\t\t\treturn false;\n\n\t\t\treturn true;\n\t\t}\n\n\t\tif (other._equals.isSome())\n\t\t\treturn false;\n\n\t\tif (other._min.isSome() && (!this._min.isSome() || this._min.value < other._min.value))\n\t\t\treturn false;\n\n\t\tif (other._max.isSome() && (!this._max.isSome() || this._max.value > other._max.value))\n\t\t\treturn false;\n\n\t\treturn true;\n\t}\n\n\tpublic toJSON(): StringValidatorDefinition {\n\t\tconst definition: StringValidatorDefinition = {\n\t\t\ttype: 'string'\n\t\t};\n\n\t\tif (this._nullable.isSome())\n\t\t\tdefinition['nullable'] = true;\n\n\t\tif (this._equals.isSome())\n\t\t\tdefinition['equals'] = this._equals.value;\n\n\t\tif (this._min.isSome())\n\t\t\tdefinition['min'] = this._min.value;\n\n\t\tif (this._max.isSome())\n\t\t\tdefinition['max'] = this._max.value;\n\n\t\treturn definition;\n\t}\n}", "import {JSON} from '@serum-enterprises/json';\nimport {Option} from '@serum-enterprises/option';\nimport {Validator} from '../Validator';\nimport {\n\tDefinition, ApplyNullability,\n\tInferDefinitionType, InferValidatorReturnType,\n\tInferListDefinitionType, InferListReturnType,\n\tAssertError, DefinitionError\n} from '../lib/util';\nimport {JSONValidator} from './JSON';\n\ntype ArrayResult<E, T> =\n\tT extends readonly unknown[]\n\t\t? [...{ [K in keyof T]: T[K] & E }, ...E[]]\n\t\t: E[];\n\nexport interface ArrayValidatorDefinition<\n\tE extends Definition = Definition,\n\tT extends readonly Definition[] = readonly Definition[]\n> extends Definition {\n\ttype: 'array';\n\tnullable?: boolean;\n\tmin?: number;\n\tmax?: number;\n\tevery?: E;\n\ttuple?: T;\n}\n\nexport class ArrayValidator<\n\t// E & T are the Every and Tuple Return Types\n\tE = unknown,\n\tT = unknown,\n\t// EV & TV are the Every and Tuple Definitions\n\tED extends Definition = Definition,\n\tTD extends readonly Definition[] = readonly Definition[],\n\t// N is the Nullable Flag\n\tN extends boolean = false\n> extends Validator<ApplyNullability<ArrayResult<E, T>, N>> {\n\tpublic static override fromJSON(\n\t\tdefinition: Definition & { [key: string]: unknown },\n\t\tpath: string = 'definition'\n\t): Validator {\n\t\tconst validatorInstance = new ArrayValidator();\n\n\t\tif ('nullable' in definition) {\n\t\t\tif (!JSON.isBoolean(definition['nullable']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.nullable to be a Boolean`);\n\n\t\t\tvalidatorInstance.nullable(definition['nullable']);\n\t\t}\n\n\t\tif ('min' in definition) {\n\t\t\tif (!JSON.isNumber(definition['min']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.min to be a Number`);\n\n\t\t\tvalidatorInstance.min(definition['min'], `${path}.min`);\n\t\t}\n\n\t\tif ('max' in definition) {\n\t\t\tif (!JSON.isNumber(definition['max']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.max to be a Number`);\n\n\t\t\tvalidatorInstance.max(definition['max'], `${path}.max`);\n\t\t}\n\n\t\tif ('every' in definition) {\n\t\t\tif (!JSON.isObject(definition['every']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.every to be an Object`);\n\n\t\t\tvalidatorInstance.every(\n\t\t\t\tsuper.fromJSON(definition['every'], `${path}.every`) as Validator\n\t\t\t);\n\t\t}\n\n\t\tif ('tuple' in definition) {\n\t\t\tif (!JSON.isShallowArray(definition['tuple']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.tuple to be an Array`);\n\n\t\t\tconst tupleSchemas: Validator[] = [];\n\t\t\tconst errors: DefinitionError[] = [];\n\n\t\t\tdefinition['tuple'].forEach((tupleDef, index) => {\n\t\t\t\ttry {\n\t\t\t\t\ttupleSchemas.push(super.fromJSON(tupleDef, `${path}.tuple[${index}]`));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (!(e instanceof DefinitionError))\n\t\t\t\t\t\tthrow new DefinitionError(`Fatal Error: Undefined Error thrown by Domain.fromJSON at ${path}`);\n\n\t\t\t\t\terrors.push(e);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (errors.length > 0)\n\t\t\t\tthrow new DefinitionError(`Multiple Definition Errors detected at ${path} (see cause)`, {cause: errors});\n\n\t\t\tvalidatorInstance.tuple(tupleSchemas, `${path}.tuple`);\n\t\t}\n\n\t\treturn validatorInstance;\n\t}\n\n\tprotected _nullable: Option<null> = Option.None();\n\tprotected _every: Option<Validator> = Option.None();\n\tprotected _tuple: Option<readonly Validator[]> = Option.None();\n\tprotected _min: Option<number> = Option.None();\n\tprotected _max: Option<number> = Option.None();\n\n\tpublic nullable<const F extends boolean = true>(flag?: F): ArrayValidator<E, T, ED, TD, F> {\n\t\tthis._nullable = (flag ?? true) ? Option.Some(null) : Option.None();\n\n\t\treturn this as unknown as ArrayValidator<E, T, ED, TD, F>;\n\t}\n\n\tpublic min(value: number, path: string = 'min'): this {\n\t\tif (this._max.isSome() && this._max.value < value)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to Maximum Rule at Path ${path}`);\n\n\t\tif (this._tuple.isSome() && value < this._tuple.value.length)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be larger than or equal to Tuple Length at Path ${path}`);\n\n\t\tthis._min = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic max(value: number, path: string = 'max'): this {\n\t\tif (this._min.isSome() && this._min.value > value)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to Minimum Rule at Path ${path}`);\n\n\t\tif (this._tuple.isSome() && value < this._tuple.value.length)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to Tuple Length at Path ${path}`);\n\n\t\tthis._max = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic every<const V extends Validator>(validator: V): ArrayValidator<\n\t\tInferValidatorReturnType<V>,\n\t\tT,\n\t\tInferDefinitionType<V>,\n\t\tTD,\n\t\tN\n\t> {\n\t\tthis._every = Option.Some(validator);\n\n\t\treturn this as unknown as ArrayValidator<InferValidatorReturnType<V>, T, InferDefinitionType<V>, TD, N>;\n\t}\n\n\t/**\n\t * Applies ONLY to prefix indices [0..validators.length - 1]\n\t * If every() is set, prefix elements are effectively `T[i] & E`.\n\t */\n\tpublic tuple<const V extends readonly Validator[]>(\n\t\tvalidators: V,\n\t\tpath: string = 'tuple'\n\t): ArrayValidator<\n\t\tE,\n\t\tInferListReturnType<V>,\n\t\tED,\n\t\tInferListDefinitionType<V>,\n\t\tN\n\t> {\n\t\tif (this._min.isSome() && this._min.value < validators.length)\n\t\t\tthrow new DefinitionError(`Expected Tuple Length to be smaller than or equal to Minimum Rule at Path ${path}`);\n\n\t\tif (this._max.isSome() && this._max.value < validators.length)\n\t\t\tthrow new DefinitionError(`Expected Tuple Length to be smaller than or equal to Maximum Rule at Path ${path}`);\n\n\t\tthis._tuple = Option.Some(validators);\n\n\t\treturn this as unknown as ArrayValidator<E, InferListReturnType<V>, ED, InferListDefinitionType<V>, N>;\n\t}\n\n\tpublic assert(\n\t\tdata: unknown,\n\t\tpath: string = 'data'\n\t): asserts data is ApplyNullability<ArrayResult<E, T>, N> {\n\t\tif (JSON.isShallowArray(data)) {\n\t\t\tif (this._min.isSome() && this._min.value > data.length)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be at least ${this._min.value} Elements long`);\n\n\t\t\tif (this._max.isSome() && this._max.value < data.length)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be at most ${this._max.value} Elements long`);\n\n\t\t\tconst errors: AssertError[] = [];\n\n\t\t\tif (this._every.isSome()) {\n\t\t\t\tconst validator: Validator = this._every.value;\n\n\t\t\t\tdata.forEach((value, index) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvalidator.assert(value, `${path}[${index}]`);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (!(e instanceof AssertError))\n\t\t\t\t\t\t\tthrow new AssertError(`Fatal Error: Undefined Error thrown by an Assert Method at ${path}[${index}]`);\n\n\t\t\t\t\t\terrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this._tuple.isSome()) {\n\t\t\t\tif (data.length < this._tuple.value.length)\n\t\t\t\t\tthrow new AssertError(`Expected ${path} to be at least ${this._tuple.value.length} Elements long (Tuple Constraint)`);\n\n\t\t\t\tthis._tuple.value.forEach((validator: Validator, index) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvalidator.assert(data[index], `${path}[${index}]`);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (!(e instanceof AssertError))\n\t\t\t\t\t\t\tthrow new AssertError(`Fatal Error: Undefined Error thrown by an Assert Method at ${path}[${index}]`);\n\n\t\t\t\t\t\terrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (errors.length > 0)\n\t\t\t\tthrow new AssertError(`Multiple Errors while asserting ${path} (see cause)`, {cause: errors});\n\t\t}\n\t\telse if(JSON.isNull(data)) {\n\t\t\tif(!this._nullable.isSome())\n\t\t\t\tthrow new AssertError(`Expected ${path} to be an Array${this._nullable.isSome() ? ' or Null' : ''}`);\n\t\t}\n\t\telse\n\t\t\tthrow new AssertError(`Expected ${path} to be an Array${this._nullable.isSome() ? ' or Null' : ''}`);\n\t}\n\n\tpublic isSubset(other: Validator): boolean {\n\t\tif(other instanceof JSONValidator)\n\t\t\treturn true;\n\n\t\tif (!(other instanceof ArrayValidator))\n\t\t\treturn false;\n\n\t\tif (this._nullable.isSome() && !other._nullable.isSome())\n\t\t\treturn false;\n\n\t\tconst thisTupleLen = this._tuple.isSome() ? this._tuple.value.length : 0;\n\t\tconst otherTupleLen = other._tuple.isSome() ? other._tuple.value.length : 0;\n\n\t\tconst thisMin = this._min.isSome() ? this._min.value : 0;\n\t\tconst otherMin = other._min.isSome() ? other._min.value : 0;\n\n\t\tconst thisMax = this._max.isSome() ? this._max.value : Infinity;\n\t\tconst otherMax = other._max.isSome() ? other._max.value : Infinity;\n\n\t\tconst thisEffectiveMin = Math.max(thisMin, thisTupleLen);\n\t\tconst otherEffectiveMin = Math.max(otherMin, otherTupleLen);\n\n\t\tif (thisEffectiveMin < otherEffectiveMin)\n\t\t\treturn false;\n\n\t\tif (thisMax > otherMax)\n\t\t\treturn false;\n\n\t\t// Helper: this index constraints are the intersection of (every, tuple[i])\n\t\t// To soundly prove (A_every \u2229 A_tuple[i]) \u2286 Target, it's sufficient that\n\t\t// at least one conjunct is itself a subset of Target (false negatives allowed).\n\t\tconst indexConjuncts = (i: number): Validator[] => {\n\t\t\tconst conjuncts: Validator[] = [];\n\n\t\t\tif (this._every.isSome())\n\t\t\t\tconjuncts.push(this._every.value);\n\n\t\t\tif (this._tuple.isSome() && i < this._tuple.value.length)\n\t\t\t\tconjuncts.push(this._tuple.value[i]!);\n\n\t\t\treturn conjuncts;\n\t\t};\n\n\t\tconst conjunctsSubset = (conjuncts: Validator[], target: Validator): boolean => {\n\t\t\t// If we have no constraint at all, we accept \"anything\" at that position,\n\t\t\t// so we can only be a subset if the target also accepts anything \u2014 we\n\t\t\t// cannot prove that here, so be conservative.\n\t\t\tif (conjuncts.length === 0)\n\t\t\t\treturn false;\n\n\t\t\treturn conjuncts.some(c => c.isSubset(target));\n\t\t};\n\n\t\tif (other._tuple.isSome()) {\n\t\t\tfor (let i = 0; i < other._tuple.value.length; i++) {\n\t\t\t\tconst aConj = indexConjuncts(i);\n\n\t\t\t\tif (!conjunctsSubset(aConj, other._tuple.value[i]!))\n\t\t\t\t\treturn false;\n\n\t\t\t\tif (other._every.isSome() && !conjunctsSubset(aConj, other._every.value))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn !(other._every.isSome() && (thisMax === Infinity ? true : thisMax > Math.max(thisTupleLen, otherTupleLen)) && (!this._every.isSome() || !this._every.value.isSubset(other._every.value)));\n\t}\n\n\tpublic toJSON(): ArrayValidatorDefinition<ED, TD> {\n\t\tconst definition: ArrayValidatorDefinition = {type: 'array'};\n\n\t\tif (this._nullable.isSome())\n\t\t\tdefinition.nullable = true;\n\n\t\tif (this._min.isSome())\n\t\t\tdefinition.min = this._min.value;\n\n\t\tif (this._max.isSome())\n\t\t\tdefinition.max = this._max.value;\n\n\t\tif (this._every.isSome())\n\t\t\tdefinition.every = this._every.value.toJSON();\n\n\t\tif (this._tuple.isSome())\n\t\t\tdefinition.tuple = this._tuple.value.map(validator => validator.toJSON());\n\n\t\treturn definition as ArrayValidatorDefinition<ED, TD>;\n\t}\n}", "import {JSON} from '@serum-enterprises/json';\nimport {Option} from '@serum-enterprises/option';\nimport {Validator} from '../Validator';\nimport {\n\tDefinition, ApplyNullability,\n\tInferDefinitionType, InferValidatorReturnType,\n\tInferObjectDefinitionType, InferObjectReturnType,\n\tAssertError, DefinitionError\n} from '../lib/util';\nimport {JSONValidator} from './JSON';\n\ntype ObjectResult<T, S, E extends boolean> =\n\tS extends { [key: string]: unknown }\n\t\t? E extends true\n\t\t\t? { [K in keyof S]: S[K] & T }\n\t\t\t: { [K in keyof S]: S[K] & T } & { [key: string]: T }\n\t\t: { [key: string]: T };\n\nexport interface ObjectValidatorDefinition<\n\tTD extends Definition = Definition,\n\tSD extends { [key: string]: Definition } = { [key: string]: Definition }\n> extends Definition {\n\ttype: 'object';\n\tnullable?: boolean;\n\texact?: boolean;\n\tmin?: number;\n\tmax?: number;\n\tevery?: TD;\n\tshape?: SD;\n}\n\nexport class ObjectValidator<\n\t// T & S are the Every (Type) and Shape return types\n\tT = unknown,\n\tS = unknown,\n\t// TD & SD are the Every (Type) and Shape definitions\n\tTD extends Definition = Definition,\n\tSD extends { [key: string]: Definition } = { [key: string]: Definition },\n\t// N is nullable\n\tN extends boolean = false,\n\t// E is exact (no extra props when shape is set)\n\tE extends boolean = false\n> extends Validator<ObjectResult<T, S, E>> {\n\tpublic static override fromJSON(\n\t\tdefinition: Definition & { [key: string]: unknown },\n\t\tpath: string = \"definition\"\n\t): Validator {\n\t\tconst validatorInstance = new ObjectValidator();\n\n\t\tif (\"nullable\" in definition) {\n\t\t\tif (!JSON.isBoolean(definition[\"nullable\"]))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.nullable to be a Boolean`);\n\n\t\t\tvalidatorInstance.nullable(definition[\"nullable\"]);\n\t\t}\n\n\t\tif (\"exact\" in definition) {\n\t\t\tif (!JSON.isBoolean(definition[\"exact\"]))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.exact to be a Boolean`);\n\n\t\t\tvalidatorInstance.exact(definition[\"exact\"], `${path}.exact`);\n\t\t}\n\n\t\tif (\"min\" in definition) {\n\t\t\tif (!JSON.isNumber(definition[\"min\"]))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.min to be a Number`);\n\n\t\t\tvalidatorInstance.min(definition[\"min\"], `${path}.min`);\n\t\t}\n\n\t\tif (\"max\" in definition) {\n\t\t\tif (!JSON.isNumber(definition[\"max\"]))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.max to be a Number`);\n\n\t\t\tvalidatorInstance.max(definition[\"max\"], `${path}.max`);\n\t\t}\n\n\t\tif (\"every\" in definition) {\n\t\t\tvalidatorInstance.every(super.fromJSON(definition['every'], `${path}.every`));\n\t\t}\n\n\t\tif (\"shape\" in definition) {\n\t\t\tif (!JSON.isShallowObject(definition[\"shape\"]))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.shape to be an Object`);\n\n\t\t\tconst shape: { [key: string]: Validator } = {};\n\t\t\tconst errors: DefinitionError[] = [];\n\n\t\t\tfor (const [key, value] of Object.entries(definition[\"shape\"])) {\n\t\t\t\ttry {\n\t\t\t\t\tshape[key] = super.fromJSON(value, `${path}.shape.${key}`);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (!(e instanceof DefinitionError))\n\t\t\t\t\t\tthrow new DefinitionError(`Fatal Error: Undefined Error thrown by Domain.fromJSON at ${path}.shape.${key}`);\n\n\t\t\t\t\terrors.push(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\tthrow new DefinitionError(`Multiple Definition Errors detected at ${path}.shape (see cause)`, {cause: errors});\n\t\t\t}\n\n\t\t\tvalidatorInstance.shape(shape, `${path}.shape`);\n\t\t}\n\n\t\treturn validatorInstance;\n\t}\n\n\tprotected _nullable: Option<null> = Option.None();\n\tprotected _min: Option<number> = Option.None();\n\tprotected _max: Option<number> = Option.None();\n\tprotected _every: Option<Validator> = Option.None();\n\tprotected _shape: Option<{ [key: string]: Validator }> = Option.None();\n\tprotected _exact: Option<null> = Option.None();\n\n\n\tpublic nullable<const F extends boolean = true>(flag?: F): ObjectValidator<T, S, TD, SD, F, E> {\n\t\tthis._nullable = (flag ?? true) ? Option.Some(null) : Option.None();\n\n\t\treturn this as unknown as ObjectValidator<T, S, TD, SD, F, E>;\n\t}\n\n\tpublic min(value: number, path: string = 'min'): this {\n\t\tif (this._max.isSome() && this._max.value < value)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to Maximum Rule at Path ${path}`);\n\n\t\tif (this._shape.isSome() && value < Object.keys(this._shape.value).length)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be larger than or equal to Shape Key Count at Path ${path}`);\n\n\t\tif (this._exact.isSome() && this._shape.isSome() && value > Object.keys(this._shape.value).length)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to Shape Key Count due to Exact Rule at Path ${path}`);\n\n\t\tthis._min = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic max(value: number, path: string = 'max'): this {\n\t\tif (this._min.isSome() && this._min.value > value)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to Minimum Rule at Path ${path}`);\n\n\t\tif (this._shape.isSome() && value < Object.keys(this._shape.value).length)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to Shape Key Count at Path ${path}`);\n\n\t\tthis._max = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic every<V extends Validator>(validator: V): ObjectValidator<\n\t\tInferValidatorReturnType<V>,\n\t\tS,\n\t\tInferDefinitionType<V>,\n\t\tSD,\n\t\tN,\n\t\tE\n\t> {\n\t\tthis._every = Option.Some(validator);\n\n\t\treturn this as unknown as ObjectValidator<InferValidatorReturnType<V>, S, InferDefinitionType<V>, SD, N, E>;\n\t}\n\n\tpublic shape<S extends { [key: string]: Validator }>(value: S, path: string = 'shape'): ObjectValidator<\n\t\tT,\n\t\tInferObjectReturnType<S>,\n\t\tTD,\n\t\tInferObjectDefinitionType<S>,\n\t\tN,\n\t\tE\n\t> {\n\t\tconst shapeKeyCount = Object.keys(value).length;\n\n\t\tif (this._min.isSome() && this._min.value < shapeKeyCount)\n\t\t\tthrow new DefinitionError(`Expected Shape Key Count to be smaller than or equal to Minimum Rule at Path ${path}`);\n\n\t\tif (this._max.isSome() && this._max.value < shapeKeyCount)\n\t\t\tthrow new DefinitionError(`Expected Shape Key Count to be smaller than or equal to Maximum Rule at Path ${path}`);\n\n\t\tif (this._exact.isSome() && this._min.isSome() && this._min.value > shapeKeyCount)\n\t\t\tthrow new DefinitionError(`Expected Shape Key Count to be larger than or equal to Minimum Rule due to Exact Rule at Path ${path}`);\n\n\t\tif (this._exact.isSome() && this._max.isSome() && this._max.value < shapeKeyCount)\n\t\t\tthrow new DefinitionError(`Expected Shape Key Count to be smaller than or equal to Maximum Rule due to Exact Rule at Path ${path}`);\n\n\t\tthis._shape = Option.Some(value);\n\n\t\treturn this as unknown as ObjectValidator<T, InferObjectReturnType<S>, TD, InferObjectDefinitionType<S>, N, E>;\n\t}\n\n\tpublic exact<const F extends boolean = true>(flag?: F, path: string = 'exact'): ObjectValidator<T, S, TD, SD, N, F> {\n\t\tif ((flag ?? true) && this._shape.isSome()) {\n\t\t\tconst shapeKeyCount = Object.keys(this._shape.value).length;\n\n\t\t\tif (this._min.isSome() && this._min.value > shapeKeyCount)\n\t\t\t\tthrow new DefinitionError(`Expected Exact Rule to be false due to Minimum Rule requiring more Properties than Shape defines at Path ${path}`);\n\n\t\t\tif (this._max.isSome() && this._max.value < shapeKeyCount)\n\t\t\t\tthrow new DefinitionError(`Expected Exact Rule to be false due to Maximum Rule allowing fewer Properties than Shape defines at Path ${path}`);\n\t\t}\n\n\t\tthis._exact = (flag ?? true) ? Option.Some(null) : Option.None();\n\n\t\treturn this as unknown as ObjectValidator<T, S, TD, SD, N, F>;\n\t}\n\n\tpublic assert(data: unknown, path: string = \"data\"): asserts data is ApplyNullability<ObjectResult<T, S, E>, N> {\n\t\tif(JSON.isShallowObject(data)) {\n\t\t\tconst keys = Object.keys(data);\n\n\t\t\tif (this._min.isSome() && keys.length < this._min.value)\n\t\t\t\tthrow new AssertError(`Expected ${path} to have at least ${this._min.value} Properties`);\n\n\t\t\tif (this._max.isSome() && keys.length > this._max.value)\n\t\t\t\tthrow new AssertError(`Expected ${path} to have at most ${this._max.value} Properties`);\n\n\t\t\tconst errors: AssertError[] = [];\n\n\t\t\tif (this._shape.isSome()) {\n\t\t\t\tfor (const key of Object.keys(this._shape.value)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst validator: Validator = this._shape.value[key]!;\n\n\t\t\t\t\t\tvalidator.assert(data[key], `${path}.${key}`);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (!(e instanceof AssertError))\n\t\t\t\t\t\t\tthrow new AssertError(`Fatal Error: Undefined Error thrown by an Assert Method at ${path}.${key}`);\n\n\t\t\t\t\t\terrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._exact.isSome()) {\n\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\tif (!(key in this._shape.value)) {\n\t\t\t\t\t\t\terrors.push(new AssertError(`Unexpected property ${path}.${key}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this._every.isSome()) {\n\t\t\t\tconst validator: Validator = this._every.value;\n\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvalidator.assert(data[key], `${path}.${key}`);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (!(e instanceof AssertError))\n\t\t\t\t\t\t\tthrow new AssertError(`Fatal Error: Undefined Error thrown by an Assert Method at ${path}.${key}`);\n\n\t\t\t\t\t\terrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (errors.length > 0)\n\t\t\t\tthrow new AssertError(`Multiple Errors while asserting ${path} (see cause)`, {cause: errors});\n\t\t}\n\t\telse if(JSON.isNull(data)) {\n\t\t\tif(!this._nullable.isSome())\n\t\t\t\tthrow new AssertError(`Expected ${path} to be an Object${this._nullable.isSome() ? ' or Null' : ''}`);\n\t\t}\n\t\telse\n\t\t\tthrow new AssertError(`Expected ${path} to be an Object${this._nullable.isSome() ? ' or Null' : ''}`);\n\t}\n\n\tpublic isSubset(other: Validator): boolean {\n\t\tif(other instanceof JSONValidator)\n\t\t\treturn true;\n\n\t\t// Must be the same validator type\n\t\tif (!(other instanceof ObjectValidator))\n\t\t\treturn false;\n\n\t\t// ---- 1) Nullability ----\n\t\t// If this allows null, the other must allow null as well\n\t\tif (this._nullable.isSome() && !other._nullable.isSome())\n\t\t\treturn false;\n\n\t\t// ---- 2) Min / Max (property count) ----\n\t\t// For subset: this must be at least as strict as other.\n\t\tconst thisMin = this._min.isSome() ? this._min.value : 0;\n\t\tconst otherMin = other._min.isSome() ? other._min.value : 0;\n\t\tif (thisMin < otherMin)\n\t\t\treturn false;\n\n\t\tconst thisMax = this._max.isSome() ? this._max.value : Number.POSITIVE_INFINITY;\n\t\tconst otherMax = other._max.isSome() ? other._max.value : Number.POSITIVE_INFINITY;\n\t\tif (thisMax > otherMax)\n\t\t\treturn false;\n\n\t\t// ---- 3) Shape requirements ----\n\t\t// If other requires certain keys (shape), this must also require them, and be compatible per key.\n\t\tif (other._shape.isSome()) {\n\t\t\tif (!this._shape.isSome())\n\t\t\t\treturn false;\n\n\t\t\tconst thisShape = this._shape.value;\n\t\t\tconst otherShape = other._shape.value;\n\n\t\t\tfor (const key of Object.keys(otherShape)) {\n\t\t\t\tif (!(key in thisShape))\n\t\t\t\t\treturn false;\n\n\t\t\t\tconst a = thisShape[key]!;\n\t\t\t\tconst b = otherShape[key]!;\n\t\t\t\tif (!a.isSubset(b))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// ---- 4) Exactness ----\n\t\t// If other is exact, then this must be exact AND must have the exact same key set as other.shape.\n\t\tif (other._exact.isSome()) {\n\t\t\tif (!this._exact.isSome())\n\t\t\t\treturn false;\n\n\t\t\tif (!other._shape.isSome() || !this._shape.isSome())\n\t\t\t\treturn false;\n\n\t\t\tconst aKeys = Object.keys(this._shape.value).sort();\n\t\t\tconst bKeys = Object.keys(other._shape.value).sort();\n\n\t\t\tif (aKeys.length !== bKeys.length)\n\t\t\t\treturn false;\n\n\t\t\tfor (let i = 0; i < aKeys.length; i++) {\n\t\t\t\tif (aKeys[i] !== bKeys[i])\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// ---- 5) \"every\" constraint ----\n\t\t// If other has an \"every\" constraint, all values in any object accepted by this must satisfy it.\n\t\tif (other._every.isSome()) {\n\t\t\tconst bEvery = other._every.value;\n\n\t\t\t// All *possible* properties accepted by this must be constrained to bEvery.\n\t\t\t// If this can accept arbitrary keys (not exact), then we need this.every \u2286 bEvery.\n\t\t\tif (!this._exact.isSome()) {\n\t\t\t\tif (!this._every.isSome())\n\t\t\t\t\treturn false;\n\n\t\t\t\tif (!this._every.value.isSubset(bEvery))\n\t\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Additionally, any explicitly shaped properties must also imply bEvery.\n\t\t\t// (Even if this.every exists, shape validators might allow values outside bEvery.)\n\t\t\tif (this._shape.isSome()) {\n\t\t\t\tfor (const [_, v] of Object.entries(this._shape.value)) {\n\t\t\t\t\tif (!v.isSubset(bEvery))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If this is exact and has a shape, then there are no unknown keys;\n\t\t\t// the per-shape check above is sufficient (and this.every is optional).\n\t\t\tif (this._exact.isSome() && !this._shape.isSome()) {\n\t\t\t\t// Exact without shape is effectively meaningless for bounding keys,\n\t\t\t\t// so conservatively require this.every in that case.\n\t\t\t\tif (!this._every.isSome())\n\t\t\t\t\treturn false;\n\n\t\t\t\tif (!this._every.value.isSubset(bEvery))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// If other has no \"every\", this can be stricter or looser on value-types freely (as long as above holds).\n\n\t\treturn true;\n\t}\n\n\tpublic toJSON(): ObjectValidatorDefinition<TD, SD> {\n\t\tconst schema: ObjectValidatorDefinition = {type: \"object\"};\n\n\t\tif (this._nullable.isSome())\n\t\t\tschema.nullable = true;\n\n\t\tif (this._exact.isSome())\n\t\t\tschema.exact = true;\n\n\t\tif (this._min.isSome())\n\t\t\tschema.min = this._min.value;\n\n\t\tif (this._max.isSome())\n\t\t\tschema.max = this._max.value;\n\n\t\tif (this._every.isSome())\n\t\t\tschema.every = this._every.value.toJSON();\n\n\t\tif (this._shape.isSome()) {\n\t\t\tschema.shape = Object.fromEntries(\n\t\t\t\tObject.entries(this._shape.value).map(([k, s]) => [k, s.toJSON()])\n\t\t\t) as any;\n\t\t}\n\n\t\treturn schema as ObjectValidatorDefinition<TD, SD>;\n\t}\n}", "import {Definition, DefinitionError} from './lib/util';\nimport {JSONValidator} from './validators/JSON';\nimport {BooleanValidator} from './validators/Boolean';\nimport {NumberValidator} from './validators/Number';\nimport {StringValidator} from './validators/String';\nimport {ArrayValidator} from './validators/Array';\nimport {ObjectValidator} from './validators/Object';\nimport {JSON} from '@serum-enterprises/json';\n\nexport abstract class Validator<T = unknown> {\n\tpublic static fromJSON(\n\t\tdefinition: unknown,\n\t\tpath: string\n\t): Validator {\n\t\tif (!JSON.isShallowObject(definition))\n\t\t\tthrow new DefinitionError(`Expected ${path} to be an Object`);\n\n\t\tif (!JSON.isString(definition['type']))\n\t\t\tthrow new DefinitionError(`Expected ${path}.type to be a String`);\n\n\t\tswitch(definition['type']) {\n\t\t\tcase 'json':\n\t\t\t\treturn JSONValidator.fromJSON(definition as Definition & {[key: string]: unknown}, path);\n\t\t\tcase 'boolean':\n\t\t\t\treturn BooleanValidator.fromJSON(definition as Definition & {[key: string]: unknown}, path);\n\t\t\tcase 'number':\n\t\t\t\treturn NumberValidator.fromJSON(definition as Definition & {[key: string]: unknown}, path);\n\t\t\tcase 'string':\n\t\t\t\treturn StringValidator.fromJSON(definition as Definition & {[key: string]: unknown}, path);\n\t\t\tcase 'array':\n\t\t\t\treturn ArrayValidator.fromJSON(definition as Definition & {[key: string]: unknown}, path);\n\t\t\tcase 'object':\n\t\t\t\treturn ObjectValidator.fromJSON(definition as Definition & {[key: string]: unknown}, path);\n\t\t\tdefault:\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.type to be a registered Validator`);\n\t\t}\n\t}\n\n\tpublic abstract assert(data: unknown, path: string): asserts data is T;\n\tpublic abstract isSubset(other: Validator): boolean;\n\n\tpublic validate(data: unknown, path: string = 'data'): T {\n\t\tthis.assert(data, path);\n\n\t\treturn data;\n\t}\n\n\tpublic is(data: unknown, path: string = 'data'): data is T {\n\t\ttry {\n\t\t\tthis.assert(data, path);\n\t\t\treturn true;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tpublic abstract toJSON(): Definition;\n}"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["exports", "JSON", "exports", "Option", "import_json", "import_json", "import_option", "import_json", "import_option", "import_json", "import_option", "import_json", "import_option"
|
|
3
|
+
"sources": ["../node_modules/@serum-enterprises/json/build/index.js", "../node_modules/@serum-enterprises/option/build/Option.js", "../src/index.ts", "../src/Validator.ts", "../src/lib/fromJSON.ts", "../src/validators/JSON.ts", "../src/lib/util.ts", "../src/validators/Boolean.ts", "../src/validators/Number.ts", "../src/validators/String.ts", "../src/validators/Array.ts", "../src/validators/Object.ts"],
|
|
4
|
+
"sourcesContent": ["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.JSON = void 0;\nvar JSON;\n(function (JSON) {\n function isNull(value) {\n return value === null;\n }\n JSON.isNull = isNull;\n function isBoolean(value) {\n return typeof value === 'boolean';\n }\n JSON.isBoolean = isBoolean;\n function isNumber(value) {\n // Using Number.isFinite here as NaN, Infinity and -Infinity are not valid JSON Numbers\n return Number.isFinite(value);\n }\n JSON.isNumber = isNumber;\n function isInteger(value) {\n // Using Number.isSafeInteger here as JS Numbers are 64-bit floating point numbers and not all integers can be represented accurately\n return Number.isSafeInteger(value);\n }\n JSON.isInteger = isInteger;\n function isString(value) {\n return typeof value === 'string';\n }\n JSON.isString = isString;\n function isShallowArray(value) {\n return Array.isArray(value);\n }\n JSON.isShallowArray = isShallowArray;\n function isArray(value) {\n return isShallowArray(value) && value.every((v) => isJSON(v));\n }\n JSON.isArray = isArray;\n function isShallowObject(value) {\n // Using Object.prototype.toString.call here as it is the most reliable way to check if something is an Object\n return (Object.prototype.toString.call(value) === '[object Object]');\n }\n JSON.isShallowObject = isShallowObject;\n function isObject(value) {\n return isShallowObject(value) && Object.values(value).every((v) => isJSON(v));\n }\n JSON.isObject = isObject;\n function isPrimitive(value) {\n return isBoolean(value) || isNumber(value) || isString(value);\n }\n JSON.isPrimitive = isPrimitive;\n function isShallowContainer(value) {\n return isShallowArray(value) || isShallowObject(value);\n }\n JSON.isShallowContainer = isShallowContainer;\n function isContainer(value) {\n return isArray(value) || isObject(value);\n }\n JSON.isContainer = isContainer;\n function isShallowJSON(value) {\n return isNull(value) || isPrimitive(value) || isShallowArray(value) || isShallowObject(value);\n }\n JSON.isShallowJSON = isShallowJSON;\n function isJSON(value) {\n return isNull(value) || isPrimitive(value) || isContainer(value);\n }\n JSON.isJSON = isJSON;\n function clone(value) {\n // Using Shallow Checks here as it is expected that value is JSON anyway, and this function is recursive anyway\n if (isShallowObject(value))\n return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, clone(v)]));\n else if (isShallowArray(value))\n return value.map((v) => clone(v));\n else\n return value;\n }\n JSON.clone = clone;\n // Compatibility Method for the native JSON.parse\n function parse(value) {\n return globalThis.JSON.parse(value);\n }\n JSON.parse = parse;\n // Compatibility Method for the native JSON.stringify\n function stringify(value) {\n return globalThis.JSON.stringify(value);\n }\n JSON.stringify = stringify;\n})(JSON || (exports.JSON = JSON = {}));\n", "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.None = exports.Some = exports.Option = void 0;\nclass Option {\n static Some(value) {\n return new Some(value);\n }\n static None() {\n return new None();\n }\n isSome() {\n return this instanceof Some;\n }\n isNone() {\n return this instanceof None;\n }\n onSome(fn) {\n if (this.isSome())\n fn(this.value);\n return this;\n }\n onNone(fn) {\n if (this.isNone())\n fn();\n return this;\n }\n map(fn) {\n return this.match(value => Option.Some(fn(value)), () => Option.None());\n }\n match(onSome, onNone) {\n if (this.isSome())\n return onSome(this.value);\n else\n return onNone();\n }\n}\nexports.Option = Option;\nclass Some extends Option {\n _value;\n constructor(value) {\n super();\n this._value = value;\n }\n get value() {\n return this._value;\n }\n}\nexports.Some = Some;\nclass None extends Option {\n}\nexports.None = None;\n", "import {Validator} from './Validator';\nimport {fromJSON} from './lib/fromJSON';\n\nexport {Validator};\n\nimport {JSONValidator, JSONValidatorDefinition} from './validators/JSON';\nimport {BooleanValidator, BooleanValidatorDefinition} from './validators/Boolean';\nimport {NumberValidator, NumberValidatorDefinition} from './validators/Number';\nimport {StringValidator, StringValidatorDefinition} from './validators/String';\nimport {ArrayValidator, ArrayValidatorDefinition} from './validators/Array';\nimport {ObjectValidator, ObjectValidatorDefinition} from './validators/Object';\n\nexport class Schema {\n\tstatic get JSON(): JSONValidator {\n\t\treturn new JSONValidator();\n\t}\n\n\tstatic get Boolean(): BooleanValidator {\n\t\treturn new BooleanValidator();\n\t}\n\n\tstatic get Number(): NumberValidator {\n\t\treturn new NumberValidator();\n\t}\n\n\tstatic get String(): StringValidator {\n\t\treturn new StringValidator();\n\t}\n\n\tstatic get Array(): ArrayValidator {\n\t\treturn new ArrayValidator();\n\t}\n\n\tstatic get Object(): ObjectValidator {\n\t\treturn new ObjectValidator();\n\t}\n\n\tstatic fromJSON(definition: unknown, path: string = 'definition'): Validator {\n\t\treturn fromJSON(definition, path);\n\t}\n}\n\nexport const Validators = {\n\tJSON: JSONValidator,\n\tBoolean: BooleanValidator,\n\tNumber: NumberValidator,\n\tString: StringValidator,\n\tArray: ArrayValidator,\n\tObject: ObjectValidator\n} as const;\n\nexport type Definition =\n\tJSONValidatorDefinition |\n\tBooleanValidatorDefinition |\n\tNumberValidatorDefinition |\n\tStringValidatorDefinition |\n\tArrayValidatorDefinition |\n\tObjectValidatorDefinition;\n\nexport namespace Definitions {\n\texport type JSON = JSONValidatorDefinition;\n\texport type Boolean = BooleanValidatorDefinition;\n\texport type Number = NumberValidatorDefinition;\n\texport type String = StringValidatorDefinition;\n\texport type Array = ArrayValidatorDefinition;\n\texport type Object = ObjectValidatorDefinition;\n}\n\nexport {InferDefinitionType, InferValidatorReturnType} from './lib/util';", "import {Definition} from './lib/util';\n\nexport abstract class Validator<T = unknown> {\n\tpublic abstract assert(data: unknown, path: string): asserts data is T;\n\tpublic abstract isSubset(other: Validator): boolean;\n\n\tpublic validate(data: unknown, path: string = 'data'): T {\n\t\tthis.assert(data, path);\n\n\t\treturn data;\n\t}\n\n\tpublic is(data: unknown, path: string = 'data'): data is T {\n\t\ttry {\n\t\t\tthis.assert(data, path);\n\t\t\treturn true;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tpublic abstract toJSON(): Definition;\n}", "import {JSON} from '@serum-enterprises/json';\nimport type {Validator} from '../Validator';\nimport {JSONValidator} from '../validators/JSON';\nimport {BooleanValidator} from '../validators/Boolean';\nimport {NumberValidator} from '../validators/Number';\nimport {StringValidator} from '../validators/String';\nimport {ArrayValidator} from '../validators/Array';\nimport {ObjectValidator} from '../validators/Object';\nimport {Definition, DefinitionError} from './util';\n\nexport function fromJSON(\n\tdefinition: unknown,\n\tpath: string\n): Validator {\n\tif (!JSON.isShallowObject(definition))\n\t\tthrow new DefinitionError(`Expected ${path} to be an Object`);\n\n\tif (!JSON.isString(definition['type']))\n\t\tthrow new DefinitionError(`Expected ${path}.type to be a String`);\n\n\tswitch(definition['type']) {\n\t\tcase 'json':\n\t\t\treturn JSONValidator.fromJSON(definition as Definition & {[key: string]: unknown}, path);\n\t\tcase 'boolean':\n\t\t\treturn BooleanValidator.fromJSON(definition as Definition & {[key: string]: unknown}, path);\n\t\tcase 'number':\n\t\t\treturn NumberValidator.fromJSON(definition as Definition & {[key: string]: unknown}, path);\n\t\tcase 'string':\n\t\t\treturn StringValidator.fromJSON(definition as Definition & {[key: string]: unknown}, path);\n\t\tcase 'array':\n\t\t\treturn ArrayValidator.fromJSON(definition as Definition & {[key: string]: unknown}, path);\n\t\tcase 'object':\n\t\t\treturn ObjectValidator.fromJSON(definition as Definition & {[key: string]: unknown}, path);\n\t\tdefault:\n\t\t\tthrow new DefinitionError(`Expected ${path}.type to be a registered Validator`);\n\t}\n}", "import {JSON} from '@serum-enterprises/json';\nimport {Validator} from '../Validator';\nimport {Definition, AssertError} from '../lib/util';\n\nexport interface JSONValidatorDefinition extends Definition {\n\ttype: 'json';\n}\n\nexport class JSONValidator<T extends JSON.JSON = JSON.JSON> extends Validator<T> {\n\tpublic static fromJSON(\n\t\t_definition: Definition & { [key: string]: unknown },\n\t\t_path: string = 'definition'\n\t): Validator {\n\t\treturn new JSONValidator();\n\t}\n\n\tpublic assert(data: unknown, path: string = 'data'): asserts data is JSON.JSON {\n\t\tif (!JSON.isJSON(data))\n\t\t\tthrow new AssertError(`Expected ${path} to be valid JSON`);\n\t}\n\n\tpublic isSubset(other: Validator): boolean {\n\t\treturn other instanceof JSONValidator;\n\t}\n\n\tpublic toJSON(): JSONValidatorDefinition {\n\t\treturn {\n\t\t\ttype: 'json'\n\t\t};\n\t}\n}", "import type {Validator} from '../Validator';\n\nexport type ApplyNullability<T, N extends boolean> =\n\tN extends true ? T | null : Exclude<T, null>;\n\nexport interface Definition {\n\ttype: string;\n}\n\nexport type InferDefinitionType<V> = V extends { toJSON(): infer D } ? D : never;\nexport type InferValidatorReturnType<V> = V extends Validator<infer T> ? T : unknown;\n\nexport type InferListDefinitionType<T extends readonly Validator[]> = {\n\t[K in keyof T]: InferDefinitionType<T[K]>;\n};\nexport type InferListReturnType<T> = T extends readonly Validator[] ?\n\t{ [K in keyof T]: InferValidatorReturnType<T[K]> } :\n\tunknown;\n\nexport type InferObjectDefinitionType<T extends { [key: string]: Validator }> = {\n\t[K in keyof T]: InferDefinitionType<T[K]>\n}\nexport type InferObjectReturnType<T> = T extends { [key: string]: Validator } ?\n\t{ [K in keyof T]: InferValidatorReturnType<T[K]> } :\n\tunknown;\n\nexport class AssertError extends Error {}\n\nexport class DefinitionError extends Error {}", "import {JSON} from '@serum-enterprises/json';\nimport {Option} from '@serum-enterprises/option';\nimport {Validator} from '../Validator';\nimport {Definition, ApplyNullability, AssertError, DefinitionError} from '../lib/util';\nimport {JSONValidator} from './JSON';\n\nexport interface BooleanValidatorDefinition extends Definition {\n\ttype: 'boolean';\n\tnullable?: boolean;\n\tequals?: boolean;\n}\n\nexport class BooleanValidator<\n\tT extends JSON.Boolean = JSON.Boolean,\n\tN extends boolean = false\n> extends Validator<ApplyNullability<T, N>> {\n\tpublic static fromJSON(\n\t\tdefinition: Definition & { [key: string]: unknown },\n\t\tpath: string = 'definition'\n\t): Validator {\n\t\tconst validatorInstance = new BooleanValidator();\n\n\t\tif ('nullable' in definition) {\n\t\t\tif (!JSON.isBoolean(definition['nullable']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.nullable to be a Boolean`);\n\n\t\t\tvalidatorInstance.nullable(definition['nullable']);\n\t\t}\n\n\t\tif ('equals' in definition) {\n\t\t\tif (!JSON.isBoolean(definition['equals']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.equals to be a Boolean`);\n\n\t\t\tvalidatorInstance.equals(definition['equals']);\n\t\t}\n\n\t\treturn validatorInstance;\n\t}\n\n\tprotected _nullable: Option<null> = Option.None();\n\tprotected _equals: Option<boolean> = Option.None();\n\n\tpublic nullable<const F extends boolean = true>(flag?: F): BooleanValidator<T, F> {\n\t\tthis._nullable = flag ?? true ? Option.Some(null) : Option.None();\n\n\t\treturn this as unknown as BooleanValidator<T, F>;\n\t}\n\n\tpublic equals<const V extends boolean>(value: V): BooleanValidator<V, N> {\n\t\tthis._equals = Option.Some(value);\n\n\t\treturn this as unknown as BooleanValidator<V, N>;\n\t}\n\n\tpublic assert(data: unknown, path: string = 'data'): asserts data is ApplyNullability<T, N> {\n\t\tif (JSON.isBoolean(data)) {\n\t\t\tif (this._equals.isSome() && this._equals.value !== data)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be ${this._equals.value}${this._nullable.isSome() ? '' : ' or Null'}`);\n\t\t}\n\t\telse if(JSON.isNull(data)) {\n\t\t\tif(!this._nullable.isSome())\n\t\t\t\tthrow new AssertError(`Expected ${path} to be a Boolean${this._nullable.isSome() ? ' or Null' : ''}`);\n\t\t}\n\t\telse\n\t\t\tthrow new AssertError(`Expected ${path} to be a Boolean${this._nullable.isSome() ? ' or Null' : ''}`);\n\t}\n\n\tpublic isSubset(other: Validator): boolean {\n\t\tif (other instanceof JSONValidator)\n\t\t\treturn true;\n\n\t\tif (!(other instanceof BooleanValidator))\n\t\t\treturn false;\n\n\t\tif (this._nullable.isSome() && !other._nullable.isSome())\n\t\t\treturn false;\n\n\t\tif (other._equals.isSome()) {\n\t\t\tif (this._equals.isSome())\n\t\t\t\treturn this._equals.value === other._equals.value;\n\t\t\telse\n\t\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic toJSON(): BooleanValidatorDefinition {\n\t\tconst definition: BooleanValidatorDefinition = {\n\t\t\ttype: 'boolean'\n\t\t};\n\n\t\tif (this._nullable.isSome())\n\t\t\tdefinition['nullable'] = true;\n\n\t\tif (this._equals.isSome())\n\t\t\tdefinition['equals'] = this._equals.value;\n\n\t\treturn definition;\n\t}\n}", "import {JSON} from '@serum-enterprises/json';\nimport {Option} from '@serum-enterprises/option';\nimport {Validator} from '../Validator';\nimport {Definition, ApplyNullability, AssertError, DefinitionError} from '../lib/util';\nimport {JSONValidator} from './JSON';\n\nexport interface NumberValidatorDefinition extends Definition {\n\ttype: 'number';\n\tnullable?: boolean;\n\tequals?: JSON.Number;\n\tinteger?: boolean;\n\tmin?: number;\n\tmax?: number;\n}\n\nexport class NumberValidator<\n\tT extends JSON.Number = JSON.Number,\n\tN extends boolean = false\n> extends Validator<ApplyNullability<T, N>> {\n\tpublic static fromJSON(\n\t\tdefinition: Definition & { [key: string]: unknown },\n\t\tpath: string = 'definition'\n\t): Validator {\n\t\tconst validatorInstance = new NumberValidator();\n\n\t\tif ('nullable' in definition) {\n\t\t\tif (!JSON.isBoolean(definition['nullable']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.nullable to be a Boolean`);\n\n\t\t\tvalidatorInstance.nullable(definition['nullable']);\n\t\t}\n\n\t\tif ('equals' in definition) {\n\t\t\tif (!JSON.isNumber(definition['equals']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.equals to be a Number`);\n\n\t\t\tvalidatorInstance.equals(definition['equals'], `${path}.equals`);\n\t\t}\n\n\t\tif ('integer' in definition) {\n\t\t\tif (!JSON.isBoolean(definition['integer']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.integer to be a Boolean`);\n\n\t\t\tvalidatorInstance.integer(definition['integer'], `${path}.integer`);\n\t\t}\n\n\t\tif ('min' in definition) {\n\t\t\tif (!JSON.isNumber(definition['min']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.min to be a Number`);\n\n\t\t\tvalidatorInstance.min(definition['min'], `${path}.min`);\n\t\t}\n\n\t\tif ('max' in definition) {\n\t\t\tif (!JSON.isNumber(definition['max']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.max to be a Number`);\n\n\t\t\tvalidatorInstance.max(definition['max'], `${path}.max`);\n\t\t}\n\n\t\treturn validatorInstance;\n\t}\n\n\tprotected _nullable: Option<null> = Option.None();\n\tprotected _equals: Option<JSON.Number> = Option.None();\n\tprotected _integer: Option<null> = Option.None();\n\tprotected _min: Option<number> = Option.None();\n\tprotected _max: Option<number> = Option.None();\n\n\tpublic nullable<const F extends boolean = true>(flag?: F): NumberValidator<T, F> {\n\t\tthis._nullable = (flag ?? true) ? Option.Some(null) : Option.None();\n\n\t\treturn this as unknown as NumberValidator<T, F>;\n\t}\n\n\tpublic equals<const V extends number>(value: V, path: string = 'equals'): NumberValidator<V, N> {\n\t\tif (this._integer.isSome() && !Number.isSafeInteger(value))\n\t\t\tthrow new DefinitionError(`Expected Equals Rule to be an Integer according to the Integer Rule at Path ${path}`);\n\n\t\tif (this._min.isSome() && this._min.value > value)\n\t\t\tthrow new DefinitionError(`Expected Equals Rule to be larger than or equal to the Minimum Rule at Path ${path}`);\n\n\t\tif (this._max.isSome() && this._max.value < value)\n\t\t\tthrow new DefinitionError(`Expected Equals Rule to be smaller than or equal to the Maximum Rule at Path ${path}`);\n\n\t\tthis._equals = Option.Some(value);\n\n\t\treturn this as unknown as NumberValidator<V, N>;\n\t}\n\n\tpublic integer(flag: boolean = true, path: string = 'integer'): this {\n\t\tif (flag && this._equals.isSome() && !Number.isSafeInteger(this._equals.value))\n\t\t\tthrow new DefinitionError(`Expected Integer Rule to be a false due to the Equals Rule being a Float at Path ${path}`);\n\n\t\tthis._integer = flag ? Option.Some(null) : Option.None();\n\n\t\treturn this;\n\t}\n\n\tpublic min(value: number, path: string = 'min'): this {\n\t\tif (this._max.isSome() && this._max.value < value)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to Maximum Rule at Path ${path}`);\n\n\t\tif (this._equals.isSome() && this._equals.value < value)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to the Equals Rule at Path ${path}`);\n\n\t\tthis._min = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic max(value: number, path: string = 'max'): this {\n\t\tif (this._min.isSome() && this._min.value > value)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to Minimum Rule at Path ${path}`);\n\n\t\tif (this._equals.isSome() && this._equals.value > value)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to the Equals Rule at Path ${path}`);\n\n\t\tthis._max = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic assert(data: unknown, path: string = 'data'): asserts data is ApplyNullability<T, N> {\n\t\tif (JSON.isNumber(data)) {\n\t\t\tif (this._equals.isSome() && this._equals.value !== data)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be ${this._equals.value}`);\n\n\t\t\tif (this._integer.isSome() && !Number.isInteger(data))\n\t\t\t\tthrow new AssertError(`Expected ${path} to be an Integer`);\n\n\t\t\tif (this._min.isSome() && this._min.value > data)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be at least ${this._min.value}`);\n\n\t\t\tif (this._max.isSome() && this._max.value < data)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be at most ${this._max.value}`);\n\t\t}\n\t\telse if(JSON.isNull(data)) {\n\t\t\tif(!this._nullable.isSome())\n\t\t\t\tthrow new AssertError(`Expected ${path} to be a Number${this._nullable.isSome() ? ' or Null' : ''}`);\n\t\t}\n\t\telse\n\t\t\tthrow new AssertError(`Expected ${path} to be a Number${this._nullable.isSome() ? ' or Null' : ''}`);\n\t}\n\n\tpublic isSubset(other: Validator): boolean {\n\t\tif (other instanceof JSONValidator)\n\t\t\treturn true;\n\n\t\tif (!(other instanceof NumberValidator))\n\t\t\treturn false;\n\n\t\tif (this._nullable.isSome() && !other._nullable.isSome())\n\t\t\treturn false;\n\n\t\tif (this._equals.isSome()) {\n\t\t\tif (other._equals.isSome() && other._equals.value !== this._equals.value)\n\t\t\t\treturn false;\n\n\t\t\tif (other._integer.isSome() && !Number.isInteger(this._equals.value))\n\t\t\t\treturn false;\n\n\t\t\tif (other._min.isSome() && other._min.value > this._equals.value)\n\t\t\t\treturn false;\n\n\t\t\tif (other._max.isSome() && other._max.value < this._equals.value)\n\t\t\t\treturn false;\n\n\t\t\treturn true;\n\t\t}\n\n\t\tif (other._equals.isSome())\n\t\t\treturn false;\n\n\t\tif (!this._integer.isSome() && other._integer.isSome())\n\t\t\treturn false;\n\n\t\tif (other._min.isSome() && (!this._min.isSome() || this._min.value < other._min.value))\n\t\t\treturn false;\n\n\t\tif (other._max.isSome() && (!this._max.isSome() || this._max.value > other._max.value))\n\t\t\treturn false;\n\n\t\treturn true;\n\t}\n\n\tpublic toJSON(): NumberValidatorDefinition {\n\t\tconst definition: NumberValidatorDefinition = {\n\t\t\ttype: 'number'\n\t\t};\n\n\t\tif (this._nullable.isSome())\n\t\t\tdefinition['nullable'] = true;\n\n\t\tif (this._equals.isSome())\n\t\t\tdefinition['equals'] = this._equals.value;\n\n\t\tif (this._integer.isSome())\n\t\t\tdefinition['integer'] = true;\n\n\t\tif (this._min.isSome())\n\t\t\tdefinition['min'] = this._min.value;\n\n\t\tif (this._max.isSome())\n\t\t\tdefinition['max'] = this._max.value;\n\n\t\treturn definition;\n\t}\n}", "import {JSON} from '@serum-enterprises/json';\nimport {Option} from '@serum-enterprises/option';\nimport {Validator} from '../Validator';\nimport {Definition, ApplyNullability, AssertError, DefinitionError} from '../lib/util';\nimport {JSONValidator} from './JSON';\n\nexport interface StringValidatorDefinition extends Definition {\n\ttype: 'string';\n\tnullable?: boolean;\n\tequals?: JSON.String;\n\tmin?: number;\n\tmax?: number;\n}\n\nexport class StringValidator<\n\tT extends JSON.String = JSON.String,\n\tN extends boolean = false\n> extends Validator<ApplyNullability<T, N>> {\n\tpublic static fromJSON(\n\t\tdefinition: Definition & { [key: string]: unknown },\n\t\tpath: string = 'schema'\n\t): Validator {\n\t\tconst validatorInstance = new StringValidator();\n\n\t\tif ('nullable' in definition) {\n\t\t\tif (!JSON.isBoolean(definition['nullable']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.nullable to be a Boolean`);\n\n\t\t\tvalidatorInstance.nullable(definition['nullable']);\n\t\t}\n\n\t\tif ('equals' in definition) {\n\t\t\tif (!JSON.isString(definition['equals']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.equals to be a String`);\n\n\t\t\tvalidatorInstance.equals(definition['equals'], `${path}.equals`);\n\t\t}\n\n\t\tif ('min' in definition) {\n\t\t\tif (!JSON.isNumber(definition['min']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.min to be a positive Integer`);\n\n\t\t\tvalidatorInstance.min(definition['min'], `${path}.min`);\n\t\t}\n\n\t\tif ('max' in definition) {\n\t\t\tif (!JSON.isNumber(definition['max']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.max to be a positive Integer`);\n\n\t\t\tvalidatorInstance.max(definition['max'], `${path}.max`);\n\t\t}\n\n\t\treturn validatorInstance;\n\t}\n\n\tprotected _nullable: Option<null> = Option.None();\n\tprotected _equals: Option<JSON.String> = Option.None();\n\tprotected _min: Option<number> = Option.None();\n\tprotected _max: Option<number> = Option.None();\n\n\tpublic nullable<const F extends boolean = true>(flag?: F): StringValidator<T, F> {\n\t\tthis._nullable = (flag ?? true) ? Option.Some(null) : Option.None();\n\n\t\treturn this as unknown as StringValidator<T, F>;\n\t}\n\n\tpublic equals<const V extends string>(value: V, path: string = 'equals'): StringValidator<V, N> {\n\t\tif (this._min.isSome() && this._min.value > value.length)\n\t\t\tthrow new DefinitionError(`Expected the Equals Rules Length to be larger than or equal to the Minimum Rule at Path ${path}`);\n\n\t\tif (this._max.isSome() && this._max.value < value.length)\n\t\t\tthrow new DefinitionError(`Expected the Equals Rules Length to be smaller than or equal to the Maximum Rule at Path ${path}`);\n\n\n\t\tthis._equals = Option.Some(value);\n\n\t\treturn this as unknown as StringValidator<V, N>;\n\t}\n\n\tpublic min(value: number, path: string = 'min'): this {\n\t\tif (!Number.isSafeInteger(value) || value < 0)\n\t\t\tthrow new DefinitionError(`Expected ${path}.min to be a positive Integer`);\n\n\t\tif (this._max.isSome() && this._max.value < value)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to Maximum Rule at Path ${path}`);\n\n\t\tif (this._equals.isSome() && this._equals.value.length < value)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to the Equals Rules Length at Path ${path}`);\n\n\t\tthis._min = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic max(value: number, path: string = 'max'): this {\n\t\tif (!Number.isSafeInteger(value) || value < 0)\n\t\t\tthrow new DefinitionError(`Expected ${path}.max to be a positive Integer`);\n\n\t\tif (this._min.isSome() && this._min.value > value)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to Minimum Rule at Path ${path}`);\n\n\t\tif (this._equals.isSome() && this._equals.value.length > value)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to the Equals Rules Length at Path ${path}`);\n\n\t\tthis._max = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic assert(data: unknown, path: string = 'data'): asserts data is ApplyNullability<T, N> {\n\t\tif (JSON.isString(data)) {\n\t\t\tif (this._equals.isSome() && this._equals.value !== data)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be ${this._equals.value}`);\n\n\t\t\tif (this._min.isSome() && this._min.value > data.length)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be at least ${this._min.value} characters long`);\n\n\t\t\tif (this._max.isSome() && this._max.value < data.length)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be at most ${this._max.value} characters long`);\n\t\t}\n\t\telse if(JSON.isNull(data)) {\n\t\t\tif(!this._nullable.isSome())\n\t\t\t\tthrow new AssertError(`Expected ${path} to be a String${this._nullable.isSome() ? ' or Null' : ''}`);\n\t\t}\n\t\telse\n\t\t\tthrow new AssertError(`Expected ${path} to be a String${this._nullable.isSome() ? ' or Null' : ''}`);\n\t}\n\n\tpublic isSubset(other: Validator): boolean {\n\t\tif (other instanceof JSONValidator)\n\t\t\treturn true;\n\n\t\tif (!(other instanceof StringValidator))\n\t\t\treturn false;\n\n\t\tif (this._nullable.isSome() && !other._nullable.isSome())\n\t\t\treturn false;\n\n\t\tif (this._equals.isSome()) {\n\t\t\tif (other._equals.isSome() && other._equals.value !== this._equals.value)\n\t\t\t\treturn false;\n\n\t\t\tif (other._min.isSome() && other._min.value > this._equals.value.length)\n\t\t\t\treturn false;\n\n\t\t\tif (other._max.isSome() && other._max.value < this._equals.value.length)\n\t\t\t\treturn false;\n\n\t\t\treturn true;\n\t\t}\n\n\t\tif (other._equals.isSome())\n\t\t\treturn false;\n\n\t\tif (other._min.isSome() && (!this._min.isSome() || this._min.value < other._min.value))\n\t\t\treturn false;\n\n\t\tif (other._max.isSome() && (!this._max.isSome() || this._max.value > other._max.value))\n\t\t\treturn false;\n\n\t\treturn true;\n\t}\n\n\tpublic toJSON(): StringValidatorDefinition {\n\t\tconst definition: StringValidatorDefinition = {\n\t\t\ttype: 'string'\n\t\t};\n\n\t\tif (this._nullable.isSome())\n\t\t\tdefinition['nullable'] = true;\n\n\t\tif (this._equals.isSome())\n\t\t\tdefinition['equals'] = this._equals.value;\n\n\t\tif (this._min.isSome())\n\t\t\tdefinition['min'] = this._min.value;\n\n\t\tif (this._max.isSome())\n\t\t\tdefinition['max'] = this._max.value;\n\n\t\treturn definition;\n\t}\n}", "import {JSON} from '@serum-enterprises/json';\nimport {Option} from '@serum-enterprises/option';\nimport {Validator} from '../Validator';\nimport {fromJSON} from '../lib/fromJSON';\nimport {\n\tDefinition, ApplyNullability,\n\tInferDefinitionType, InferValidatorReturnType,\n\tInferListDefinitionType, InferListReturnType,\n\tAssertError, DefinitionError\n} from '../lib/util';\nimport {JSONValidator} from './JSON';\n\ntype ArrayResult<E, T> =\n\tT extends readonly unknown[]\n\t\t? [...{ [K in keyof T]: T[K] & E }, ...E[]]\n\t\t: E[];\n\nexport interface ArrayValidatorDefinition<\n\tE extends Definition = Definition,\n\tT extends readonly Definition[] = readonly Definition[]\n> extends Definition {\n\ttype: 'array';\n\tnullable?: boolean;\n\tmin?: number;\n\tmax?: number;\n\tevery?: E;\n\ttuple?: T;\n}\n\nexport class ArrayValidator<\n\t// E & T are the Every and Tuple Return Types\n\tE = unknown,\n\tT = unknown,\n\t// EV & TV are the Every and Tuple Definitions\n\tED extends Definition = Definition,\n\tTD extends readonly Definition[] = readonly Definition[],\n\t// N is the Nullable Flag\n\tN extends boolean = false\n> extends Validator<ApplyNullability<ArrayResult<E, T>, N>> {\n\tpublic static fromJSON(\n\t\tdefinition: Definition & { [key: string]: unknown },\n\t\tpath: string = 'definition'\n\t): Validator {\n\t\tconst validatorInstance = new ArrayValidator();\n\n\t\tif ('nullable' in definition) {\n\t\t\tif (!JSON.isBoolean(definition['nullable']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.nullable to be a Boolean`);\n\n\t\t\tvalidatorInstance.nullable(definition['nullable']);\n\t\t}\n\n\t\tif ('min' in definition) {\n\t\t\tif (!JSON.isNumber(definition['min']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.min to be a Number`);\n\n\t\t\tvalidatorInstance.min(definition['min'], `${path}.min`);\n\t\t}\n\n\t\tif ('max' in definition) {\n\t\t\tif (!JSON.isNumber(definition['max']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.max to be a Number`);\n\n\t\t\tvalidatorInstance.max(definition['max'], `${path}.max`);\n\t\t}\n\n\t\tif ('every' in definition) {\n\t\t\tif (!JSON.isObject(definition['every']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.every to be an Object`);\n\n\t\t\tvalidatorInstance.every(\n\t\t\t\tfromJSON(definition['every'], `${path}.every`) as Validator\n\t\t\t);\n\t\t}\n\n\t\tif ('tuple' in definition) {\n\t\t\tif (!JSON.isShallowArray(definition['tuple']))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.tuple to be an Array`);\n\n\t\t\tconst tupleSchemas: Validator[] = [];\n\t\t\tconst errors: DefinitionError[] = [];\n\n\t\t\tdefinition['tuple'].forEach((tupleDef, index) => {\n\t\t\t\ttry {\n\t\t\t\t\ttupleSchemas.push(fromJSON(tupleDef, `${path}.tuple[${index}]`));\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (!(e instanceof DefinitionError))\n\t\t\t\t\t\tthrow new DefinitionError(`Fatal Error: Undefined Error thrown by Domain.fromJSON at ${path}`);\n\n\t\t\t\t\terrors.push(e);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (errors.length > 0)\n\t\t\t\tthrow new DefinitionError(`Multiple Definition Errors detected at ${path} (see cause)`, {cause: errors});\n\n\t\t\tvalidatorInstance.tuple(tupleSchemas, `${path}.tuple`);\n\t\t}\n\n\t\treturn validatorInstance;\n\t}\n\n\tprotected _nullable: Option<null> = Option.None();\n\tprotected _every: Option<Validator> = Option.None();\n\tprotected _tuple: Option<readonly Validator[]> = Option.None();\n\tprotected _min: Option<number> = Option.None();\n\tprotected _max: Option<number> = Option.None();\n\n\tpublic nullable<const F extends boolean = true>(flag?: F): ArrayValidator<E, T, ED, TD, F> {\n\t\tthis._nullable = (flag ?? true) ? Option.Some(null) : Option.None();\n\n\t\treturn this as unknown as ArrayValidator<E, T, ED, TD, F>;\n\t}\n\n\tpublic min(value: number, path: string = 'min'): this {\n\t\tif (this._max.isSome() && this._max.value < value)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to Maximum Rule at Path ${path}`);\n\n\t\tif (this._tuple.isSome() && value < this._tuple.value.length)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be larger than or equal to Tuple Length at Path ${path}`);\n\n\t\tthis._min = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic max(value: number, path: string = 'max'): this {\n\t\tif (this._min.isSome() && this._min.value > value)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to Minimum Rule at Path ${path}`);\n\n\t\tif (this._tuple.isSome() && value < this._tuple.value.length)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to Tuple Length at Path ${path}`);\n\n\t\tthis._max = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic every<const V extends Validator>(validator: V): ArrayValidator<\n\t\tInferValidatorReturnType<V>,\n\t\tT,\n\t\tInferDefinitionType<V>,\n\t\tTD,\n\t\tN\n\t> {\n\t\tthis._every = Option.Some(validator);\n\n\t\treturn this as unknown as ArrayValidator<InferValidatorReturnType<V>, T, InferDefinitionType<V>, TD, N>;\n\t}\n\n\t/**\n\t * Applies ONLY to prefix indices [0..validators.length - 1]\n\t * If every() is set, prefix elements are effectively `T[i] & E`.\n\t */\n\tpublic tuple<const V extends readonly Validator[]>(\n\t\tvalidators: V,\n\t\tpath: string = 'tuple'\n\t): ArrayValidator<\n\t\tE,\n\t\tInferListReturnType<V>,\n\t\tED,\n\t\tInferListDefinitionType<V>,\n\t\tN\n\t> {\n\t\tif (this._min.isSome() && this._min.value < validators.length)\n\t\t\tthrow new DefinitionError(`Expected Tuple Length to be smaller than or equal to Minimum Rule at Path ${path}`);\n\n\t\tif (this._max.isSome() && this._max.value < validators.length)\n\t\t\tthrow new DefinitionError(`Expected Tuple Length to be smaller than or equal to Maximum Rule at Path ${path}`);\n\n\t\tthis._tuple = Option.Some(validators);\n\n\t\treturn this as unknown as ArrayValidator<E, InferListReturnType<V>, ED, InferListDefinitionType<V>, N>;\n\t}\n\n\tpublic assert(\n\t\tdata: unknown,\n\t\tpath: string = 'data'\n\t): asserts data is ApplyNullability<ArrayResult<E, T>, N> {\n\t\tif (JSON.isShallowArray(data)) {\n\t\t\tif (this._min.isSome() && this._min.value > data.length)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be at least ${this._min.value} Elements long`);\n\n\t\t\tif (this._max.isSome() && this._max.value < data.length)\n\t\t\t\tthrow new AssertError(`Expected ${path} to be at most ${this._max.value} Elements long`);\n\n\t\t\tconst errors: AssertError[] = [];\n\n\t\t\tif (this._every.isSome()) {\n\t\t\t\tconst validator: Validator = this._every.value;\n\n\t\t\t\tdata.forEach((value, index) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvalidator.assert(value, `${path}[${index}]`);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (!(e instanceof AssertError))\n\t\t\t\t\t\t\tthrow new AssertError(`Fatal Error: Undefined Error thrown by an Assert Method at ${path}[${index}]`);\n\n\t\t\t\t\t\terrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (this._tuple.isSome()) {\n\t\t\t\tif (data.length < this._tuple.value.length)\n\t\t\t\t\tthrow new AssertError(`Expected ${path} to be at least ${this._tuple.value.length} Elements long (Tuple Constraint)`);\n\n\t\t\t\tthis._tuple.value.forEach((validator: Validator, index) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvalidator.assert(data[index], `${path}[${index}]`);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (!(e instanceof AssertError))\n\t\t\t\t\t\t\tthrow new AssertError(`Fatal Error: Undefined Error thrown by an Assert Method at ${path}[${index}]`);\n\n\t\t\t\t\t\terrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (errors.length > 0)\n\t\t\t\tthrow new AssertError(`Multiple Errors while asserting ${path} (see cause)`, {cause: errors});\n\t\t}\n\t\telse if(JSON.isNull(data)) {\n\t\t\tif(!this._nullable.isSome())\n\t\t\t\tthrow new AssertError(`Expected ${path} to be an Array${this._nullable.isSome() ? ' or Null' : ''}`);\n\t\t}\n\t\telse\n\t\t\tthrow new AssertError(`Expected ${path} to be an Array${this._nullable.isSome() ? ' or Null' : ''}`);\n\t}\n\n\tpublic isSubset(other: Validator): boolean {\n\t\tif(other instanceof JSONValidator)\n\t\t\treturn true;\n\n\t\tif (!(other instanceof ArrayValidator))\n\t\t\treturn false;\n\n\t\tif (this._nullable.isSome() && !other._nullable.isSome())\n\t\t\treturn false;\n\n\t\tconst thisTupleLen = this._tuple.isSome() ? this._tuple.value.length : 0;\n\t\tconst otherTupleLen = other._tuple.isSome() ? other._tuple.value.length : 0;\n\n\t\tconst thisMin = this._min.isSome() ? this._min.value : 0;\n\t\tconst otherMin = other._min.isSome() ? other._min.value : 0;\n\n\t\tconst thisMax = this._max.isSome() ? this._max.value : Infinity;\n\t\tconst otherMax = other._max.isSome() ? other._max.value : Infinity;\n\n\t\tconst thisEffectiveMin = Math.max(thisMin, thisTupleLen);\n\t\tconst otherEffectiveMin = Math.max(otherMin, otherTupleLen);\n\n\t\tif (thisEffectiveMin < otherEffectiveMin)\n\t\t\treturn false;\n\n\t\tif (thisMax > otherMax)\n\t\t\treturn false;\n\n\t\t// Helper: this index constraints are the intersection of (every, tuple[i])\n\t\t// To soundly prove (A_every \u2229 A_tuple[i]) \u2286 Target, it's sufficient that\n\t\t// at least one conjunct is itself a subset of Target (false negatives allowed).\n\t\tconst indexConjuncts = (i: number): Validator[] => {\n\t\t\tconst conjuncts: Validator[] = [];\n\n\t\t\tif (this._every.isSome())\n\t\t\t\tconjuncts.push(this._every.value);\n\n\t\t\tif (this._tuple.isSome() && i < this._tuple.value.length)\n\t\t\t\tconjuncts.push(this._tuple.value[i]!);\n\n\t\t\treturn conjuncts;\n\t\t};\n\n\t\tconst conjunctsSubset = (conjuncts: Validator[], target: Validator): boolean => {\n\t\t\t// If we have no constraint at all, we accept \"anything\" at that position,\n\t\t\t// so we can only be a subset if the target also accepts anything \u2014 we\n\t\t\t// cannot prove that here, so be conservative.\n\t\t\tif (conjuncts.length === 0)\n\t\t\t\treturn false;\n\n\t\t\treturn conjuncts.some(c => c.isSubset(target));\n\t\t};\n\n\t\tif (other._tuple.isSome()) {\n\t\t\tfor (let i = 0; i < other._tuple.value.length; i++) {\n\t\t\t\tconst aConj = indexConjuncts(i);\n\n\t\t\t\tif (!conjunctsSubset(aConj, other._tuple.value[i]!))\n\t\t\t\t\treturn false;\n\n\t\t\t\tif (other._every.isSome() && !conjunctsSubset(aConj, other._every.value))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn !(other._every.isSome() && (thisMax === Infinity ? true : thisMax > Math.max(thisTupleLen, otherTupleLen)) && (!this._every.isSome() || !this._every.value.isSubset(other._every.value)));\n\t}\n\n\tpublic toJSON(): ArrayValidatorDefinition<ED, TD> {\n\t\tconst definition: ArrayValidatorDefinition = {type: 'array'};\n\n\t\tif (this._nullable.isSome())\n\t\t\tdefinition.nullable = true;\n\n\t\tif (this._min.isSome())\n\t\t\tdefinition.min = this._min.value;\n\n\t\tif (this._max.isSome())\n\t\t\tdefinition.max = this._max.value;\n\n\t\tif (this._every.isSome())\n\t\t\tdefinition.every = this._every.value.toJSON();\n\n\t\tif (this._tuple.isSome())\n\t\t\tdefinition.tuple = this._tuple.value.map(validator => validator.toJSON());\n\n\t\treturn definition as ArrayValidatorDefinition<ED, TD>;\n\t}\n}", "import {JSON} from '@serum-enterprises/json';\nimport {Option} from '@serum-enterprises/option';\nimport {Validator} from '../Validator';\nimport {fromJSON} from '../lib/fromJSON';\nimport {\n\tDefinition, ApplyNullability,\n\tInferDefinitionType, InferValidatorReturnType,\n\tInferObjectDefinitionType, InferObjectReturnType,\n\tAssertError, DefinitionError\n} from '../lib/util';\nimport {JSONValidator} from './JSON';\n\ntype ObjectResult<T, S, E extends boolean> =\n\tS extends { [key: string]: unknown }\n\t\t? E extends true\n\t\t\t? { [K in keyof S]: S[K] & T }\n\t\t\t: { [K in keyof S]: S[K] & T } & { [key: string]: T }\n\t\t: { [key: string]: T };\n\nexport interface ObjectValidatorDefinition<\n\tTD extends Definition = Definition,\n\tSD extends { [key: string]: Definition } = { [key: string]: Definition }\n> extends Definition {\n\ttype: 'object';\n\tnullable?: boolean;\n\texact?: boolean;\n\tmin?: number;\n\tmax?: number;\n\tevery?: TD;\n\tshape?: SD;\n}\n\nexport class ObjectValidator<\n\t// T & S are the Every (Type) and Shape return types\n\tT = unknown,\n\tS = unknown,\n\t// TD & SD are the Every (Type) and Shape definitions\n\tTD extends Definition = Definition,\n\tSD extends { [key: string]: Definition } = { [key: string]: Definition },\n\t// N is nullable\n\tN extends boolean = false,\n\t// E is exact (no extra props when shape is set)\n\tE extends boolean = false\n> extends Validator<ObjectResult<T, S, E>> {\n\tpublic static fromJSON(\n\t\tdefinition: Definition & { [key: string]: unknown },\n\t\tpath: string = \"definition\"\n\t): Validator {\n\t\tconst validatorInstance = new ObjectValidator();\n\n\t\tif (\"nullable\" in definition) {\n\t\t\tif (!JSON.isBoolean(definition[\"nullable\"]))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.nullable to be a Boolean`);\n\n\t\t\tvalidatorInstance.nullable(definition[\"nullable\"]);\n\t\t}\n\n\t\tif (\"exact\" in definition) {\n\t\t\tif (!JSON.isBoolean(definition[\"exact\"]))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.exact to be a Boolean`);\n\n\t\t\tvalidatorInstance.exact(definition[\"exact\"], `${path}.exact`);\n\t\t}\n\n\t\tif (\"min\" in definition) {\n\t\t\tif (!JSON.isNumber(definition[\"min\"]))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.min to be a Number`);\n\n\t\t\tvalidatorInstance.min(definition[\"min\"], `${path}.min`);\n\t\t}\n\n\t\tif (\"max\" in definition) {\n\t\t\tif (!JSON.isNumber(definition[\"max\"]))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.max to be a Number`);\n\n\t\t\tvalidatorInstance.max(definition[\"max\"], `${path}.max`);\n\t\t}\n\n\t\tif (\"every\" in definition) {\n\t\t\tvalidatorInstance.every(fromJSON(definition['every'], `${path}.every`));\n\t\t}\n\n\t\tif (\"shape\" in definition) {\n\t\t\tif (!JSON.isShallowObject(definition[\"shape\"]))\n\t\t\t\tthrow new DefinitionError(`Expected ${path}.shape to be an Object`);\n\n\t\t\tconst shape: { [key: string]: Validator } = {};\n\t\t\tconst errors: DefinitionError[] = [];\n\n\t\t\tfor (const [key, value] of Object.entries(definition[\"shape\"])) {\n\t\t\t\ttry {\n\t\t\t\t\tshape[key] = fromJSON(value, `${path}.shape.${key}`);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tif (!(e instanceof DefinitionError))\n\t\t\t\t\t\tthrow new DefinitionError(`Fatal Error: Undefined Error thrown by Domain.fromJSON at ${path}.shape.${key}`);\n\n\t\t\t\t\terrors.push(e);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\tthrow new DefinitionError(`Multiple Definition Errors detected at ${path}.shape (see cause)`, {cause: errors});\n\t\t\t}\n\n\t\t\tvalidatorInstance.shape(shape, `${path}.shape`);\n\t\t}\n\n\t\treturn validatorInstance;\n\t}\n\n\tprotected _nullable: Option<null> = Option.None();\n\tprotected _min: Option<number> = Option.None();\n\tprotected _max: Option<number> = Option.None();\n\tprotected _every: Option<Validator> = Option.None();\n\tprotected _shape: Option<{ [key: string]: Validator }> = Option.None();\n\tprotected _exact: Option<null> = Option.None();\n\n\n\tpublic nullable<const F extends boolean = true>(flag?: F): ObjectValidator<T, S, TD, SD, F, E> {\n\t\tthis._nullable = (flag ?? true) ? Option.Some(null) : Option.None();\n\n\t\treturn this as unknown as ObjectValidator<T, S, TD, SD, F, E>;\n\t}\n\n\tpublic min(value: number, path: string = 'min'): this {\n\t\tif (this._max.isSome() && this._max.value < value)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to Maximum Rule at Path ${path}`);\n\n\t\tif (this._shape.isSome() && value < Object.keys(this._shape.value).length)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be larger than or equal to Shape Key Count at Path ${path}`);\n\n\t\tif (this._exact.isSome() && this._shape.isSome() && value > Object.keys(this._shape.value).length)\n\t\t\tthrow new DefinitionError(`Expected Minimum Rule to be smaller than or equal to Shape Key Count due to Exact Rule at Path ${path}`);\n\n\t\tthis._min = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic max(value: number, path: string = 'max'): this {\n\t\tif (this._min.isSome() && this._min.value > value)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to Minimum Rule at Path ${path}`);\n\n\t\tif (this._shape.isSome() && value < Object.keys(this._shape.value).length)\n\t\t\tthrow new DefinitionError(`Expected Maximum Rule to be larger than or equal to Shape Key Count at Path ${path}`);\n\n\t\tthis._max = Option.Some(value);\n\n\t\treturn this;\n\t}\n\n\tpublic every<V extends Validator>(validator: V): ObjectValidator<\n\t\tInferValidatorReturnType<V>,\n\t\tS,\n\t\tInferDefinitionType<V>,\n\t\tSD,\n\t\tN,\n\t\tE\n\t> {\n\t\tthis._every = Option.Some(validator);\n\n\t\treturn this as unknown as ObjectValidator<InferValidatorReturnType<V>, S, InferDefinitionType<V>, SD, N, E>;\n\t}\n\n\tpublic shape<S extends { [key: string]: Validator }>(value: S, path: string = 'shape'): ObjectValidator<\n\t\tT,\n\t\tInferObjectReturnType<S>,\n\t\tTD,\n\t\tInferObjectDefinitionType<S>,\n\t\tN,\n\t\tE\n\t> {\n\t\tconst shapeKeyCount = Object.keys(value).length;\n\n\t\tif (this._min.isSome() && this._min.value < shapeKeyCount)\n\t\t\tthrow new DefinitionError(`Expected Shape Key Count to be smaller than or equal to Minimum Rule at Path ${path}`);\n\n\t\tif (this._max.isSome() && this._max.value < shapeKeyCount)\n\t\t\tthrow new DefinitionError(`Expected Shape Key Count to be smaller than or equal to Maximum Rule at Path ${path}`);\n\n\t\tif (this._exact.isSome() && this._min.isSome() && this._min.value > shapeKeyCount)\n\t\t\tthrow new DefinitionError(`Expected Shape Key Count to be larger than or equal to Minimum Rule due to Exact Rule at Path ${path}`);\n\n\t\tif (this._exact.isSome() && this._max.isSome() && this._max.value < shapeKeyCount)\n\t\t\tthrow new DefinitionError(`Expected Shape Key Count to be smaller than or equal to Maximum Rule due to Exact Rule at Path ${path}`);\n\n\t\tthis._shape = Option.Some(value);\n\n\t\treturn this as unknown as ObjectValidator<T, InferObjectReturnType<S>, TD, InferObjectDefinitionType<S>, N, E>;\n\t}\n\n\tpublic exact<const F extends boolean = true>(flag?: F, path: string = 'exact'): ObjectValidator<T, S, TD, SD, N, F> {\n\t\tif ((flag ?? true) && this._shape.isSome()) {\n\t\t\tconst shapeKeyCount = Object.keys(this._shape.value).length;\n\n\t\t\tif (this._min.isSome() && this._min.value > shapeKeyCount)\n\t\t\t\tthrow new DefinitionError(`Expected Exact Rule to be false due to Minimum Rule requiring more Properties than Shape defines at Path ${path}`);\n\n\t\t\tif (this._max.isSome() && this._max.value < shapeKeyCount)\n\t\t\t\tthrow new DefinitionError(`Expected Exact Rule to be false due to Maximum Rule allowing fewer Properties than Shape defines at Path ${path}`);\n\t\t}\n\n\t\tthis._exact = (flag ?? true) ? Option.Some(null) : Option.None();\n\n\t\treturn this as unknown as ObjectValidator<T, S, TD, SD, N, F>;\n\t}\n\n\tpublic assert(data: unknown, path: string = \"data\"): asserts data is ApplyNullability<ObjectResult<T, S, E>, N> {\n\t\tif(JSON.isShallowObject(data)) {\n\t\t\tconst keys = Object.keys(data);\n\n\t\t\tif (this._min.isSome() && keys.length < this._min.value)\n\t\t\t\tthrow new AssertError(`Expected ${path} to have at least ${this._min.value} Properties`);\n\n\t\t\tif (this._max.isSome() && keys.length > this._max.value)\n\t\t\t\tthrow new AssertError(`Expected ${path} to have at most ${this._max.value} Properties`);\n\n\t\t\tconst errors: AssertError[] = [];\n\n\t\t\tif (this._shape.isSome()) {\n\t\t\t\tfor (const key of Object.keys(this._shape.value)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst validator: Validator = this._shape.value[key]!;\n\n\t\t\t\t\t\tvalidator.assert(data[key], `${path}.${key}`);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (!(e instanceof AssertError))\n\t\t\t\t\t\t\tthrow new AssertError(`Fatal Error: Undefined Error thrown by an Assert Method at ${path}.${key}`);\n\n\t\t\t\t\t\terrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._exact.isSome()) {\n\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\tif (!(key in this._shape.value)) {\n\t\t\t\t\t\t\terrors.push(new AssertError(`Unexpected property ${path}.${key}`));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this._every.isSome()) {\n\t\t\t\tconst validator: Validator = this._every.value;\n\n\t\t\t\tfor (const key of keys) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvalidator.assert(data[key], `${path}.${key}`);\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tif (!(e instanceof AssertError))\n\t\t\t\t\t\t\tthrow new AssertError(`Fatal Error: Undefined Error thrown by an Assert Method at ${path}.${key}`);\n\n\t\t\t\t\t\terrors.push(e);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (errors.length > 0)\n\t\t\t\tthrow new AssertError(`Multiple Errors while asserting ${path} (see cause)`, {cause: errors});\n\t\t}\n\t\telse if(JSON.isNull(data)) {\n\t\t\tif(!this._nullable.isSome())\n\t\t\t\tthrow new AssertError(`Expected ${path} to be an Object${this._nullable.isSome() ? ' or Null' : ''}`);\n\t\t}\n\t\telse\n\t\t\tthrow new AssertError(`Expected ${path} to be an Object${this._nullable.isSome() ? ' or Null' : ''}`);\n\t}\n\n\tpublic isSubset(other: Validator): boolean {\n\t\tif(other instanceof JSONValidator)\n\t\t\treturn true;\n\n\t\t// Must be the same validator type\n\t\tif (!(other instanceof ObjectValidator))\n\t\t\treturn false;\n\n\t\t// ---- 1) Nullability ----\n\t\t// If this allows null, the other must allow null as well\n\t\tif (this._nullable.isSome() && !other._nullable.isSome())\n\t\t\treturn false;\n\n\t\t// ---- 2) Min / Max (property count) ----\n\t\t// For subset: this must be at least as strict as other.\n\t\tconst thisMin = this._min.isSome() ? this._min.value : 0;\n\t\tconst otherMin = other._min.isSome() ? other._min.value : 0;\n\t\tif (thisMin < otherMin)\n\t\t\treturn false;\n\n\t\tconst thisMax = this._max.isSome() ? this._max.value : Number.POSITIVE_INFINITY;\n\t\tconst otherMax = other._max.isSome() ? other._max.value : Number.POSITIVE_INFINITY;\n\t\tif (thisMax > otherMax)\n\t\t\treturn false;\n\n\t\t// ---- 3) Shape requirements ----\n\t\t// If other requires certain keys (shape), this must also require them, and be compatible per key.\n\t\tif (other._shape.isSome()) {\n\t\t\tif (!this._shape.isSome())\n\t\t\t\treturn false;\n\n\t\t\tconst thisShape = this._shape.value;\n\t\t\tconst otherShape = other._shape.value;\n\n\t\t\tfor (const key of Object.keys(otherShape)) {\n\t\t\t\tif (!(key in thisShape))\n\t\t\t\t\treturn false;\n\n\t\t\t\tconst a = thisShape[key]!;\n\t\t\t\tconst b = otherShape[key]!;\n\t\t\t\tif (!a.isSubset(b))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// ---- 4) Exactness ----\n\t\t// If other is exact, then this must be exact AND must have the exact same key set as other.shape.\n\t\tif (other._exact.isSome()) {\n\t\t\tif (!this._exact.isSome())\n\t\t\t\treturn false;\n\n\t\t\tif (!other._shape.isSome() || !this._shape.isSome())\n\t\t\t\treturn false;\n\n\t\t\tconst aKeys = Object.keys(this._shape.value).sort();\n\t\t\tconst bKeys = Object.keys(other._shape.value).sort();\n\n\t\t\tif (aKeys.length !== bKeys.length)\n\t\t\t\treturn false;\n\n\t\t\tfor (let i = 0; i < aKeys.length; i++) {\n\t\t\t\tif (aKeys[i] !== bKeys[i])\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// ---- 5) \"every\" constraint ----\n\t\t// If other has an \"every\" constraint, all values in any object accepted by this must satisfy it.\n\t\tif (other._every.isSome()) {\n\t\t\tconst bEvery = other._every.value;\n\n\t\t\t// All *possible* properties accepted by this must be constrained to bEvery.\n\t\t\t// If this can accept arbitrary keys (not exact), then we need this.every \u2286 bEvery.\n\t\t\tif (!this._exact.isSome()) {\n\t\t\t\tif (!this._every.isSome())\n\t\t\t\t\treturn false;\n\n\t\t\t\tif (!this._every.value.isSubset(bEvery))\n\t\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Additionally, any explicitly shaped properties must also imply bEvery.\n\t\t\t// (Even if this.every exists, shape validators might allow values outside bEvery.)\n\t\t\tif (this._shape.isSome()) {\n\t\t\t\tfor (const [_, v] of Object.entries(this._shape.value)) {\n\t\t\t\t\tif (!v.isSubset(bEvery))\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If this is exact and has a shape, then there are no unknown keys;\n\t\t\t// the per-shape check above is sufficient (and this.every is optional).\n\t\t\tif (this._exact.isSome() && !this._shape.isSome()) {\n\t\t\t\t// Exact without shape is effectively meaningless for bounding keys,\n\t\t\t\t// so conservatively require this.every in that case.\n\t\t\t\tif (!this._every.isSome())\n\t\t\t\t\treturn false;\n\n\t\t\t\tif (!this._every.value.isSubset(bEvery))\n\t\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\t// If other has no \"every\", this can be stricter or looser on value-types freely (as long as above holds).\n\n\t\treturn true;\n\t}\n\n\tpublic toJSON(): ObjectValidatorDefinition<TD, SD> {\n\t\tconst schema: ObjectValidatorDefinition = {type: \"object\"};\n\n\t\tif (this._nullable.isSome())\n\t\t\tschema.nullable = true;\n\n\t\tif (this._exact.isSome())\n\t\t\tschema.exact = true;\n\n\t\tif (this._min.isSome())\n\t\t\tschema.min = this._min.value;\n\n\t\tif (this._max.isSome())\n\t\t\tschema.max = this._max.value;\n\n\t\tif (this._every.isSome())\n\t\t\tschema.every = this._every.value.toJSON();\n\n\t\tif (this._shape.isSome()) {\n\t\t\tschema.shape = Object.fromEntries(\n\t\t\t\tObject.entries(this._shape.value).map(([k, s]) => [k, s.toJSON()])\n\t\t\t) as any;\n\t\t}\n\n\t\treturn schema as ObjectValidatorDefinition<TD, SD>;\n\t}\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["exports", "JSON", "exports", "Option", "import_json", "import_json", "import_json", "import_option", "import_json", "import_option", "import_json", "import_option", "import_json", "import_option"]
|
|
7
7
|
}
|
package/package.json
CHANGED
package/types/Validator.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Definition } from './lib/util';
|
|
2
2
|
export declare abstract class Validator<T = unknown> {
|
|
3
|
-
static fromJSON(definition: unknown, path: string): Validator;
|
|
4
3
|
abstract assert(data: unknown, path: string): asserts data is T;
|
|
5
4
|
abstract isSubset(other: Validator): boolean;
|
|
6
5
|
validate(data: unknown, path?: string): T;
|
package/types/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { Validator } from './Validator';
|
|
2
|
+
export { Validator };
|
|
2
3
|
import { JSONValidator, JSONValidatorDefinition } from './validators/JSON';
|
|
3
4
|
import { BooleanValidator, BooleanValidatorDefinition } from './validators/Boolean';
|
|
4
5
|
import { NumberValidator, NumberValidatorDefinition } from './validators/Number';
|
|
@@ -12,6 +13,7 @@ export declare class Schema {
|
|
|
12
13
|
static get String(): StringValidator;
|
|
13
14
|
static get Array(): ArrayValidator;
|
|
14
15
|
static get Object(): ObjectValidator;
|
|
16
|
+
static fromJSON(definition: unknown, path?: string): Validator;
|
|
15
17
|
}
|
|
16
18
|
export declare const Validators: {
|
|
17
19
|
readonly JSON: typeof JSONValidator;
|
package/test.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import {Schema} from './src';
|
|
2
|
-
|
|
3
|
-
const schema = Schema.Object.nullable().shape({
|
|
4
|
-
name: Schema.String,
|
|
5
|
-
age: Schema.Number.integer().min(18).max(99),
|
|
6
|
-
friends: Schema.Array.every(Schema.String)
|
|
7
|
-
}).exact();
|
|
8
|
-
|
|
9
|
-
const person = schema.validate({name: 'John', age: 20, friends: ["Jane", "Mary"]});
|
|
10
|
-
|
|
11
|
-
console.log(person.name);
|
|
12
|
-
console.log(person.age);
|
|
13
|
-
console.log(person.friends.join(', '));
|