justus 0.1.6 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/dist/{dts-generator.js → dts-generator.cjs} +6 -15
  2. package/dist/dts-generator.cjs.map +6 -0
  3. package/{dts-generator.d.ts → dist/dts-generator.d.ts} +1 -1
  4. package/dist/dts-generator.mjs +5 -23
  5. package/dist/dts-generator.mjs.map +2 -2
  6. package/dist/errors.cjs +113 -0
  7. package/dist/errors.cjs.map +6 -0
  8. package/dist/errors.d.ts +55 -0
  9. package/dist/errors.mjs +85 -0
  10. package/dist/errors.mjs.map +6 -0
  11. package/dist/index.cjs +133 -0
  12. package/dist/index.cjs.map +6 -0
  13. package/dist/index.d.ts +47 -0
  14. package/dist/index.mjs +23 -817
  15. package/dist/index.mjs.map +3 -3
  16. package/dist/schema.cjs +43 -0
  17. package/dist/schema.cjs.map +6 -0
  18. package/dist/schema.d.ts +16 -0
  19. package/dist/schema.mjs +17 -0
  20. package/dist/schema.mjs.map +6 -0
  21. package/dist/types.cjs +60 -0
  22. package/dist/types.cjs.map +6 -0
  23. package/dist/types.d.ts +138 -0
  24. package/dist/types.mjs +33 -0
  25. package/dist/types.mjs.map +6 -0
  26. package/dist/utilities.cjs +52 -0
  27. package/dist/utilities.cjs.map +6 -0
  28. package/dist/utilities.d.ts +7 -0
  29. package/dist/utilities.mjs +27 -0
  30. package/dist/utilities.mjs.map +6 -0
  31. package/dist/validators/any.cjs +39 -0
  32. package/dist/validators/any.cjs.map +6 -0
  33. package/dist/validators/any.d.ts +7 -0
  34. package/dist/validators/any.mjs +13 -0
  35. package/dist/validators/any.mjs.map +6 -0
  36. package/dist/validators/array.cjs +104 -0
  37. package/dist/validators/array.cjs.map +6 -0
  38. package/dist/validators/array.d.ts +32 -0
  39. package/dist/validators/array.mjs +76 -0
  40. package/dist/validators/array.mjs.map +6 -0
  41. package/dist/validators/boolean.cjs +56 -0
  42. package/dist/validators/boolean.cjs.map +6 -0
  43. package/dist/validators/boolean.d.ts +21 -0
  44. package/dist/validators/boolean.mjs +30 -0
  45. package/dist/validators/boolean.mjs.map +6 -0
  46. package/dist/validators/constant.cjs +51 -0
  47. package/dist/validators/constant.cjs.map +6 -0
  48. package/dist/validators/constant.d.ts +12 -0
  49. package/dist/validators/constant.mjs +24 -0
  50. package/dist/validators/constant.mjs.map +6 -0
  51. package/dist/validators/date.cjs +80 -0
  52. package/dist/validators/date.cjs.map +6 -0
  53. package/dist/validators/date.d.ts +22 -0
  54. package/dist/validators/date.mjs +54 -0
  55. package/dist/validators/date.mjs.map +6 -0
  56. package/dist/validators/never.cjs +44 -0
  57. package/dist/validators/never.cjs.map +6 -0
  58. package/dist/validators/never.d.ts +9 -0
  59. package/dist/validators/never.mjs +18 -0
  60. package/dist/validators/never.mjs.map +6 -0
  61. package/dist/validators/number.cjs +153 -0
  62. package/dist/validators/number.cjs.map +6 -0
  63. package/dist/validators/number.d.ts +48 -0
  64. package/dist/validators/number.mjs +126 -0
  65. package/dist/validators/number.mjs.map +6 -0
  66. package/dist/validators/object.cjs +129 -0
  67. package/dist/validators/object.cjs.map +6 -0
  68. package/dist/validators/object.d.ts +22 -0
  69. package/dist/validators/object.mjs +105 -0
  70. package/dist/validators/object.mjs.map +6 -0
  71. package/dist/validators/optional.cjs +61 -0
  72. package/dist/validators/optional.cjs.map +6 -0
  73. package/dist/validators/optional.d.ts +21 -0
  74. package/dist/validators/optional.mjs +35 -0
  75. package/dist/validators/optional.mjs.map +6 -0
  76. package/dist/validators/string.cjs +84 -0
  77. package/dist/validators/string.cjs.map +6 -0
  78. package/dist/validators/string.d.ts +35 -0
  79. package/dist/validators/string.mjs +57 -0
  80. package/dist/validators/string.mjs.map +6 -0
  81. package/dist/validators/tuple.cjs +95 -0
  82. package/dist/validators/tuple.cjs.map +6 -0
  83. package/dist/validators/tuple.d.ts +15 -0
  84. package/dist/validators/tuple.mjs +69 -0
  85. package/dist/validators/tuple.mjs.map +6 -0
  86. package/dist/validators/union.cjs +78 -0
  87. package/dist/validators/union.cjs.map +6 -0
  88. package/dist/validators/union.d.ts +22 -0
  89. package/dist/validators/union.mjs +50 -0
  90. package/dist/validators/union.mjs.map +6 -0
  91. package/dist/validators/url.cjs +117 -0
  92. package/dist/validators/url.cjs.map +6 -0
  93. package/dist/validators/url.d.ts +57 -0
  94. package/dist/validators/url.mjs +91 -0
  95. package/dist/validators/url.mjs.map +6 -0
  96. package/package.json +33 -23
  97. package/src/dts-generator.ts +6 -21
  98. package/src/index.ts +23 -23
  99. package/src/schema.ts +11 -9
  100. package/src/types.ts +42 -26
  101. package/src/utilities.ts +9 -6
  102. package/src/validators/array.ts +6 -5
  103. package/src/validators/boolean.ts +2 -2
  104. package/src/validators/constant.ts +3 -1
  105. package/src/validators/date.ts +1 -1
  106. package/src/validators/never.ts +4 -2
  107. package/src/validators/number.ts +8 -7
  108. package/src/validators/object.ts +15 -18
  109. package/src/validators/optional.ts +5 -7
  110. package/src/validators/string.ts +8 -6
  111. package/src/validators/tuple.ts +7 -5
  112. package/src/validators/union.ts +7 -5
  113. package/src/validators/url.ts +8 -7
  114. package/dist/dts-generator.js.map +0 -6
  115. package/dist/index.js +0 -948
  116. package/dist/index.js.map +0 -6
  117. package/index.d.ts +0 -618
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // validators/never.ts
21
+ var never_exports = {};
22
+ __export(never_exports, {
23
+ NeverValidator: () => NeverValidator,
24
+ never: () => never
25
+ });
26
+ module.exports = __toCommonJS(never_exports);
27
+ var import_errors = require("../errors.cjs");
28
+ var import_types = require("../types.cjs");
29
+ var NeverValidator = class extends import_types.AbstractValidator {
30
+ optional = true;
31
+ validate(value, options = import_types.defaultValidationOptions) {
32
+ const { stripForbiddenProperties } = options;
33
+ if (stripForbiddenProperties || value === void 0)
34
+ return;
35
+ throw new import_errors.ValidationError("Forbidden property");
36
+ }
37
+ };
38
+ var never = new NeverValidator();
39
+ // Annotate the CommonJS export names for ESM import in node:
40
+ 0 && (module.exports = {
41
+ NeverValidator,
42
+ never
43
+ });
44
+ //# sourceMappingURL=never.cjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/never.ts"],
4
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAgC;AAChC,mBAA4D;AAKrD,IAAM,iBAAN,cAA6B,+BAAyB;AAAA,EAC3D,WAAiB;AAAA,EAEjB,SAAS,OAAgB,UAA6B,uCAAiC;AACrF,UAAM,EAAE,yBAAyB,IAAI;AAGrC,QAAI,4BAA6B,UAAU;AAAY;AACvD,UAAM,IAAI,8BAAgB,oBAAoB;AAAA,EAChD;AACF;AAGO,IAAM,QAAQ,IAAI,eAAe;",
5
+ "names": []
6
+ }
@@ -0,0 +1,9 @@
1
+ import { AbstractValidator } from '../types';
2
+ import type { ValidationOptions } from '../types';
3
+ /** A `Validator` validating _nothing_. */
4
+ export declare class NeverValidator extends AbstractValidator<never> {
5
+ optional: true;
6
+ validate(value: unknown, options?: ValidationOptions): never;
7
+ }
8
+ /** The `Validator` validating _nothing_. */
9
+ export declare const never: NeverValidator;
@@ -0,0 +1,18 @@
1
+ // validators/never.ts
2
+ import { ValidationError } from "../errors.mjs";
3
+ import { AbstractValidator, defaultValidationOptions } from "../types.mjs";
4
+ var NeverValidator = class extends AbstractValidator {
5
+ optional = true;
6
+ validate(value, options = defaultValidationOptions) {
7
+ const { stripForbiddenProperties } = options;
8
+ if (stripForbiddenProperties || value === void 0)
9
+ return;
10
+ throw new ValidationError("Forbidden property");
11
+ }
12
+ };
13
+ var never = new NeverValidator();
14
+ export {
15
+ NeverValidator,
16
+ never
17
+ };
18
+ //# sourceMappingURL=never.mjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/never.ts"],
4
+ "mappings": ";AAAA,SAAS,uBAAuB;AAChC,SAAS,mBAAmB,gCAAgC;AAKrD,IAAM,iBAAN,cAA6B,kBAAyB;AAAA,EAC3D,WAAiB;AAAA,EAEjB,SAAS,OAAgB,UAA6B,0BAAiC;AACrF,UAAM,EAAE,yBAAyB,IAAI;AAGrC,QAAI,4BAA6B,UAAU;AAAY;AACvD,UAAM,IAAI,gBAAgB,oBAAoB;AAAA,EAChD;AACF;AAGO,IAAM,QAAQ,IAAI,eAAe;",
5
+ "names": []
6
+ }
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // validators/number.ts
21
+ var number_exports = {};
22
+ __export(number_exports, {
23
+ AnyNumberValidator: () => AnyNumberValidator,
24
+ NumberValidator: () => NumberValidator,
25
+ number: () => number
26
+ });
27
+ module.exports = __toCommonJS(number_exports);
28
+ var import_errors = require("../errors.cjs");
29
+ var import_types = require("../types.cjs");
30
+ var PRECISION = 6;
31
+ var MULTIPLIER = Math.pow(10, PRECISION);
32
+ function countDecimals(n) {
33
+ const match = n.toExponential().match(/^\d+(\.\d+)?e([+-]\d+)$/);
34
+ if (!match)
35
+ throw new RangeError(`Can't calculate digits for number "${n}"`);
36
+ const digits = (match[1] || ".").length - 1 - parseInt(match[2]);
37
+ return digits < 0 ? 0 : digits;
38
+ }
39
+ var AnyNumberValidator = class extends import_types.AbstractValidator {
40
+ validate(value) {
41
+ (0, import_errors.assertValidation)(typeof value == "number", 'Value is not a "number"');
42
+ (0, import_errors.assertValidation)(!isNaN(value), 'Number is "NaN"');
43
+ return value;
44
+ }
45
+ };
46
+ var NumberValidator = class extends import_types.AbstractValidator {
47
+ #isMultipleOf;
48
+ allowNaN;
49
+ exclusiveMaximum;
50
+ exclusiveMinimum;
51
+ fromString;
52
+ maximum;
53
+ minimum;
54
+ multipleOf;
55
+ brand;
56
+ constructor(constraints = {}) {
57
+ super();
58
+ const {
59
+ allowNaN = false,
60
+ exclusiveMaximum,
61
+ exclusiveMinimum,
62
+ fromString = false,
63
+ maximum = Number.POSITIVE_INFINITY,
64
+ minimum = Number.NEGATIVE_INFINITY,
65
+ multipleOf
66
+ } = constraints;
67
+ if ("brand" in constraints)
68
+ this.brand = constraints.brand;
69
+ (0, import_errors.assertSchema)(maximum >= minimum, `Constraint "minimum" (${minimum}) is greater than "maximum" (${maximum})`);
70
+ if (exclusiveMaximum !== void 0) {
71
+ (0, import_errors.assertSchema)(
72
+ exclusiveMaximum > minimum,
73
+ `Constraint "exclusiveMaximum" (${exclusiveMaximum}) must be greater than "minimum" (${minimum})`
74
+ );
75
+ }
76
+ if (exclusiveMinimum !== void 0) {
77
+ (0, import_errors.assertSchema)(
78
+ maximum > exclusiveMinimum,
79
+ `Constraint "maximum" (${maximum}) must be greater than "exclusiveMinimum" (${exclusiveMinimum})`
80
+ );
81
+ }
82
+ if (exclusiveMinimum != void 0 && exclusiveMaximum !== void 0) {
83
+ (0, import_errors.assertSchema)(
84
+ exclusiveMaximum > exclusiveMinimum,
85
+ `Constraint "exclusiveMaximum" (${exclusiveMaximum}) must be greater than "exclusiveMinimum" (${exclusiveMinimum})`
86
+ );
87
+ }
88
+ if (multipleOf !== void 0) {
89
+ (0, import_errors.assertSchema)(multipleOf > 0, `Constraint "multipleOf" (${multipleOf}) must be greater than zero`);
90
+ const decimals = countDecimals(multipleOf);
91
+ if (decimals === 0) {
92
+ this.#isMultipleOf = (value) => !(value % multipleOf);
93
+ } else if (decimals <= PRECISION) {
94
+ this.#isMultipleOf = (value) => {
95
+ try {
96
+ if (countDecimals(value) > PRECISION)
97
+ return false;
98
+ return !(value * MULTIPLIER % (multipleOf * MULTIPLIER));
99
+ } catch (error) {
100
+ throw new import_errors.ValidationError(error.message);
101
+ }
102
+ };
103
+ } else {
104
+ (0, import_errors.assertSchema)(false, `Constraint "multipleOf" (${multipleOf}) requires too much precision`);
105
+ }
106
+ }
107
+ this.allowNaN = allowNaN;
108
+ this.exclusiveMaximum = exclusiveMaximum;
109
+ this.exclusiveMinimum = exclusiveMinimum;
110
+ this.fromString = fromString;
111
+ this.maximum = maximum;
112
+ this.minimum = minimum;
113
+ this.multipleOf = multipleOf;
114
+ }
115
+ validate(value) {
116
+ if (typeof value == "string" && this.fromString) {
117
+ const parsed = +`${value}`;
118
+ (0, import_errors.assertValidation)(!isNaN(parsed), "Number can not be parsed from string");
119
+ value = parsed;
120
+ }
121
+ (0, import_errors.assertValidation)(typeof value == "number", 'Value is not a "number"');
122
+ if (isNaN(value)) {
123
+ (0, import_errors.assertValidation)(this.allowNaN, 'Number is "NaN"');
124
+ return value;
125
+ }
126
+ (0, import_errors.assertValidation)(value >= this.minimum, `Number is less than ${this.minimum}`);
127
+ (0, import_errors.assertValidation)(value <= this.maximum, `Number is greater than ${this.maximum}`);
128
+ (0, import_errors.assertValidation)(
129
+ this.exclusiveMinimum == void 0 || value > this.exclusiveMinimum,
130
+ `Number is less than or equal to ${this.exclusiveMinimum}`
131
+ );
132
+ (0, import_errors.assertValidation)(
133
+ this.exclusiveMaximum == void 0 || value < this.exclusiveMaximum,
134
+ `Number is greater than or equal to ${this.exclusiveMaximum}`
135
+ );
136
+ (0, import_errors.assertValidation)(
137
+ this.#isMultipleOf ? this.#isMultipleOf(value) : true,
138
+ `Number is not a multiple of ${this.multipleOf}`
139
+ );
140
+ return value;
141
+ }
142
+ };
143
+ function _number(constraints) {
144
+ return new NumberValidator(constraints);
145
+ }
146
+ var number = (0, import_types.makeValidatorFactory)(new AnyNumberValidator(), _number);
147
+ // Annotate the CommonJS export names for ESM import in node:
148
+ 0 && (module.exports = {
149
+ AnyNumberValidator,
150
+ NumberValidator,
151
+ number
152
+ });
153
+ //# sourceMappingURL=number.cjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/number.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,48 @@
1
+ import { AbstractValidator } from '../types';
2
+ import type { Branding } from '../types';
3
+ /** Constraints to validate a `number` with. */
4
+ export interface NumberConstraints {
5
+ /** The value for which a `number` must be multiple of for it to be valid */
6
+ multipleOf?: number;
7
+ /** The _inclusive_ maximum value for a valid `number`: `value <= maximum` */
8
+ maximum?: number;
9
+ /** The _inclusive_ minimum value for a valid `number`: `value >= minimum` */
10
+ minimum?: number;
11
+ /** The _exclusive_ maximum value for a valid `number`: `value < exclusiveMaximum` */
12
+ exclusiveMaximum?: number;
13
+ /** The _exclusive_ minimum value for a valid `number`: `value > exclusiveMaximum` */
14
+ exclusiveMinimum?: number;
15
+ /** Allow numbers to be parsed from strings (e.g. `123.456` or `0x0CAFE`, default: `false`) */
16
+ fromString?: boolean;
17
+ /** Whether to allow `NaN` or not (default: `false`) */
18
+ allowNaN?: boolean;
19
+ }
20
+ /** Constraints to validate a `number` with extra branding information. */
21
+ export interface BrandedNumberConstraints<B extends string> extends NumberConstraints {
22
+ /** The _brand_ of the string (will generate a `__brand_${B}` type property */
23
+ brand: B;
24
+ }
25
+ /** A `Validator` validating any `number`. */
26
+ export declare class AnyNumberValidator extends AbstractValidator<number> {
27
+ validate(value: unknown): number;
28
+ }
29
+ /** A `Validator` validating `number`s with constaints. */
30
+ export declare class NumberValidator<N extends number = number> extends AbstractValidator<N> {
31
+ #private;
32
+ readonly allowNaN: boolean;
33
+ readonly exclusiveMaximum?: number;
34
+ readonly exclusiveMinimum?: number;
35
+ readonly fromString: boolean;
36
+ readonly maximum: number;
37
+ readonly minimum: number;
38
+ readonly multipleOf?: number;
39
+ readonly brand?: string;
40
+ constructor(constraints?: NumberConstraints);
41
+ validate(value: unknown): N;
42
+ }
43
+ declare function _number(constraints: NumberConstraints): NumberValidator<number>;
44
+ declare function _number<N extends number>(constraints: NumberConstraints): NumberValidator<N>;
45
+ declare function _number<B extends string>(constraints: BrandedNumberConstraints<B>): NumberValidator<number & Branding<B>>;
46
+ /** Validate `number`s. */
47
+ export declare const number: typeof _number & AnyNumberValidator;
48
+ export {};
@@ -0,0 +1,126 @@
1
+ // validators/number.ts
2
+ import { assertSchema, assertValidation, ValidationError } from "../errors.mjs";
3
+ import { AbstractValidator, makeValidatorFactory } from "../types.mjs";
4
+ var PRECISION = 6;
5
+ var MULTIPLIER = Math.pow(10, PRECISION);
6
+ function countDecimals(n) {
7
+ const match = n.toExponential().match(/^\d+(\.\d+)?e([+-]\d+)$/);
8
+ if (!match)
9
+ throw new RangeError(`Can't calculate digits for number "${n}"`);
10
+ const digits = (match[1] || ".").length - 1 - parseInt(match[2]);
11
+ return digits < 0 ? 0 : digits;
12
+ }
13
+ var AnyNumberValidator = class extends AbstractValidator {
14
+ validate(value) {
15
+ assertValidation(typeof value == "number", 'Value is not a "number"');
16
+ assertValidation(!isNaN(value), 'Number is "NaN"');
17
+ return value;
18
+ }
19
+ };
20
+ var NumberValidator = class extends AbstractValidator {
21
+ #isMultipleOf;
22
+ allowNaN;
23
+ exclusiveMaximum;
24
+ exclusiveMinimum;
25
+ fromString;
26
+ maximum;
27
+ minimum;
28
+ multipleOf;
29
+ brand;
30
+ constructor(constraints = {}) {
31
+ super();
32
+ const {
33
+ allowNaN = false,
34
+ exclusiveMaximum,
35
+ exclusiveMinimum,
36
+ fromString = false,
37
+ maximum = Number.POSITIVE_INFINITY,
38
+ minimum = Number.NEGATIVE_INFINITY,
39
+ multipleOf
40
+ } = constraints;
41
+ if ("brand" in constraints)
42
+ this.brand = constraints.brand;
43
+ assertSchema(maximum >= minimum, `Constraint "minimum" (${minimum}) is greater than "maximum" (${maximum})`);
44
+ if (exclusiveMaximum !== void 0) {
45
+ assertSchema(
46
+ exclusiveMaximum > minimum,
47
+ `Constraint "exclusiveMaximum" (${exclusiveMaximum}) must be greater than "minimum" (${minimum})`
48
+ );
49
+ }
50
+ if (exclusiveMinimum !== void 0) {
51
+ assertSchema(
52
+ maximum > exclusiveMinimum,
53
+ `Constraint "maximum" (${maximum}) must be greater than "exclusiveMinimum" (${exclusiveMinimum})`
54
+ );
55
+ }
56
+ if (exclusiveMinimum != void 0 && exclusiveMaximum !== void 0) {
57
+ assertSchema(
58
+ exclusiveMaximum > exclusiveMinimum,
59
+ `Constraint "exclusiveMaximum" (${exclusiveMaximum}) must be greater than "exclusiveMinimum" (${exclusiveMinimum})`
60
+ );
61
+ }
62
+ if (multipleOf !== void 0) {
63
+ assertSchema(multipleOf > 0, `Constraint "multipleOf" (${multipleOf}) must be greater than zero`);
64
+ const decimals = countDecimals(multipleOf);
65
+ if (decimals === 0) {
66
+ this.#isMultipleOf = (value) => !(value % multipleOf);
67
+ } else if (decimals <= PRECISION) {
68
+ this.#isMultipleOf = (value) => {
69
+ try {
70
+ if (countDecimals(value) > PRECISION)
71
+ return false;
72
+ return !(value * MULTIPLIER % (multipleOf * MULTIPLIER));
73
+ } catch (error) {
74
+ throw new ValidationError(error.message);
75
+ }
76
+ };
77
+ } else {
78
+ assertSchema(false, `Constraint "multipleOf" (${multipleOf}) requires too much precision`);
79
+ }
80
+ }
81
+ this.allowNaN = allowNaN;
82
+ this.exclusiveMaximum = exclusiveMaximum;
83
+ this.exclusiveMinimum = exclusiveMinimum;
84
+ this.fromString = fromString;
85
+ this.maximum = maximum;
86
+ this.minimum = minimum;
87
+ this.multipleOf = multipleOf;
88
+ }
89
+ validate(value) {
90
+ if (typeof value == "string" && this.fromString) {
91
+ const parsed = +`${value}`;
92
+ assertValidation(!isNaN(parsed), "Number can not be parsed from string");
93
+ value = parsed;
94
+ }
95
+ assertValidation(typeof value == "number", 'Value is not a "number"');
96
+ if (isNaN(value)) {
97
+ assertValidation(this.allowNaN, 'Number is "NaN"');
98
+ return value;
99
+ }
100
+ assertValidation(value >= this.minimum, `Number is less than ${this.minimum}`);
101
+ assertValidation(value <= this.maximum, `Number is greater than ${this.maximum}`);
102
+ assertValidation(
103
+ this.exclusiveMinimum == void 0 || value > this.exclusiveMinimum,
104
+ `Number is less than or equal to ${this.exclusiveMinimum}`
105
+ );
106
+ assertValidation(
107
+ this.exclusiveMaximum == void 0 || value < this.exclusiveMaximum,
108
+ `Number is greater than or equal to ${this.exclusiveMaximum}`
109
+ );
110
+ assertValidation(
111
+ this.#isMultipleOf ? this.#isMultipleOf(value) : true,
112
+ `Number is not a multiple of ${this.multipleOf}`
113
+ );
114
+ return value;
115
+ }
116
+ };
117
+ function _number(constraints) {
118
+ return new NumberValidator(constraints);
119
+ }
120
+ var number = makeValidatorFactory(new AnyNumberValidator(), _number);
121
+ export {
122
+ AnyNumberValidator,
123
+ NumberValidator,
124
+ number
125
+ };
126
+ //# sourceMappingURL=number.mjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/number.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // validators/object.ts
21
+ var object_exports = {};
22
+ __export(object_exports, {
23
+ AnyObjectValidator: () => AnyObjectValidator,
24
+ ObjectValidator: () => ObjectValidator,
25
+ object: () => object,
26
+ objectOf: () => objectOf
27
+ });
28
+ module.exports = __toCommonJS(object_exports);
29
+ var import_errors = require("../errors.cjs");
30
+ var import_schema = require("../schema.cjs");
31
+ var import_types = require("../types.cjs");
32
+ var import_utilities = require("../utilities.cjs");
33
+ var AnyObjectValidator = class extends import_types.AbstractValidator {
34
+ validate(value) {
35
+ (0, import_errors.assertValidation)(typeof value == "object", 'Value is not an "object"');
36
+ (0, import_errors.assertValidation)(value !== null, 'Value is "null"');
37
+ return value;
38
+ }
39
+ };
40
+ var ObjectValidator = class extends import_types.AbstractValidator {
41
+ schema;
42
+ validators = /* @__PURE__ */ new Map();
43
+ additionalProperties;
44
+ constructor(schema) {
45
+ super();
46
+ const { [Symbol.justusAdditionalValidator]: additional, ...properties } = schema;
47
+ if (additional)
48
+ this.additionalProperties = additional;
49
+ for (const key of Object.keys(properties)) {
50
+ this.validators.set(key, (0, import_utilities.getValidator)(properties[key]));
51
+ }
52
+ this.schema = schema;
53
+ }
54
+ validate(value, options = import_types.defaultValidationOptions) {
55
+ (0, import_errors.assertValidation)(typeof value === "object", 'Value is not an "object"');
56
+ (0, import_errors.assertValidation)(value !== null, 'Value is "null"');
57
+ const { stripAdditionalProperties, stripOptionalNulls } = options;
58
+ const record = value;
59
+ const builder = new import_errors.ValidationErrorBuilder();
60
+ const clone = {};
61
+ for (const [key, validator] of this.validators.entries()) {
62
+ const optional = !!validator.optional;
63
+ const original = record[key];
64
+ if (stripOptionalNulls && optional && original === null) {
65
+ continue;
66
+ }
67
+ if (original === void 0) {
68
+ try {
69
+ const validated = validator.validate(original, options);
70
+ if (!(optional && validated == void 0))
71
+ clone[key] = validated;
72
+ } catch (error) {
73
+ if (optional)
74
+ continue;
75
+ builder.record("Required property missing", key);
76
+ }
77
+ continue;
78
+ }
79
+ try {
80
+ const validated = validator.validate(original, options);
81
+ if (!(optional && validated == void 0))
82
+ clone[key] = validated;
83
+ } catch (error) {
84
+ builder.record(error, key);
85
+ }
86
+ }
87
+ const additionalKeys = Object.keys(record).filter((k) => !this.validators.has(k));
88
+ const additional = this.additionalProperties;
89
+ if (additional) {
90
+ additionalKeys.forEach((key) => {
91
+ if (record[key] === void 0)
92
+ return;
93
+ try {
94
+ clone[key] = additional.validate(record[key], options);
95
+ } catch (error) {
96
+ builder.record(error, key);
97
+ }
98
+ });
99
+ } else if (!stripAdditionalProperties) {
100
+ additionalKeys.forEach((key) => {
101
+ if (record[key] !== void 0)
102
+ builder.record("Unknown property", key);
103
+ });
104
+ }
105
+ return builder.assert(clone);
106
+ }
107
+ };
108
+ function _object(schema) {
109
+ const validator = new ObjectValidator(schema);
110
+ function* iterator() {
111
+ yield { [Symbol.justusRestValidator]: validator };
112
+ }
113
+ return Object.defineProperties(schema, {
114
+ [Symbol.justusValidator]: { value: validator, enumerable: false },
115
+ [Symbol.iterator]: { value: iterator, enumerable: false }
116
+ });
117
+ }
118
+ var object = (0, import_types.makeValidatorFactory)(new AnyObjectValidator(), _object);
119
+ function objectOf(validation) {
120
+ return new ObjectValidator({ ...(0, import_schema.allowAdditionalProperties)(validation) });
121
+ }
122
+ // Annotate the CommonJS export names for ESM import in node:
123
+ 0 && (module.exports = {
124
+ AnyObjectValidator,
125
+ ObjectValidator,
126
+ object,
127
+ objectOf
128
+ });
129
+ //# sourceMappingURL=object.cjs.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/validators/object.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,22 @@
1
+ import { AbstractValidator } from '../types';
2
+ import type { InferSchema, InferValidation, Schema, TupleRestParameter, Validation, ValidationOptions, Validator } from '../types';
3
+ /** A `Validator` validating any `object`. */
4
+ export declare class AnyObjectValidator extends AbstractValidator<Record<string, any>> {
5
+ validate(value: unknown): Record<string, any>;
6
+ }
7
+ /** A `Validator` validating `object`s according to a `Schema`. */
8
+ export declare class ObjectValidator<S extends Schema> extends AbstractValidator<InferSchema<S>> {
9
+ readonly schema: Readonly<S>;
10
+ validators: Map<string, Validator<any>>;
11
+ additionalProperties?: Validator;
12
+ constructor(schema: S);
13
+ validate(value: unknown, options?: ValidationOptions): InferSchema<S>;
14
+ }
15
+ declare function _object<S extends Schema>(schema: S): S & {
16
+ [Symbol.iterator](): Generator<TupleRestParameter<InferSchema<S>>>;
17
+ };
18
+ /** Validate `object`s. */
19
+ export declare const object: typeof _object & AnyObjectValidator;
20
+ /** Validate `Object`s containing only the specified elements. */
21
+ export declare function objectOf<V extends Validation>(validation: V): Validator<Record<string, InferValidation<V>>>;
22
+ export {};