@earendil-works/pi-schema 0.0.0-stage → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSES/typebox-LICENSE +23 -0
  3. package/README.md +295 -2
  4. package/dist/annotations.d.ts +44 -0
  5. package/dist/annotations.d.ts.map +1 -0
  6. package/dist/annotations.js +193 -0
  7. package/dist/annotations.js.map +1 -0
  8. package/dist/builders.d.ts +114 -0
  9. package/dist/builders.d.ts.map +1 -0
  10. package/dist/builders.js +98 -0
  11. package/dist/builders.js.map +1 -0
  12. package/dist/checks.d.ts +87 -0
  13. package/dist/checks.d.ts.map +1 -0
  14. package/dist/checks.js +447 -0
  15. package/dist/checks.js.map +1 -0
  16. package/dist/coerce.d.ts +53 -0
  17. package/dist/coerce.d.ts.map +1 -0
  18. package/dist/coerce.js +585 -0
  19. package/dist/coerce.js.map +1 -0
  20. package/dist/compiler.d.ts +53 -0
  21. package/dist/compiler.d.ts.map +1 -0
  22. package/dist/compiler.js +532 -0
  23. package/dist/compiler.js.map +1 -0
  24. package/dist/explain.d.ts +29 -0
  25. package/dist/explain.d.ts.map +1 -0
  26. package/dist/explain.js +381 -0
  27. package/dist/explain.js.map +1 -0
  28. package/dist/formats/index.d.ts +7 -0
  29. package/dist/formats/index.d.ts.map +1 -0
  30. package/dist/formats/index.js +51 -0
  31. package/dist/formats/index.js.map +1 -0
  32. package/dist/formats/typebox/date.d.ts +7 -0
  33. package/dist/formats/typebox/date.d.ts.map +1 -0
  34. package/dist/formats/typebox/date.js +47 -0
  35. package/dist/formats/typebox/date.js.map +1 -0
  36. package/dist/formats/typebox/date_time.d.ts +7 -0
  37. package/dist/formats/typebox/date_time.d.ts.map +1 -0
  38. package/dist/formats/typebox/date_time.js +39 -0
  39. package/dist/formats/typebox/date_time.js.map +1 -0
  40. package/dist/formats/typebox/duration.d.ts +6 -0
  41. package/dist/formats/typebox/duration.d.ts.map +1 -0
  42. package/dist/formats/typebox/duration.js +36 -0
  43. package/dist/formats/typebox/duration.js.map +1 -0
  44. package/dist/formats/typebox/email.d.ts +6 -0
  45. package/dist/formats/typebox/email.d.ts.map +1 -0
  46. package/dist/formats/typebox/email.js +36 -0
  47. package/dist/formats/typebox/email.js.map +1 -0
  48. package/dist/formats/typebox/hostname.d.ts +8 -0
  49. package/dist/formats/typebox/hostname.d.ts.map +1 -0
  50. package/dist/formats/typebox/hostname.js +38 -0
  51. package/dist/formats/typebox/hostname.js.map +1 -0
  52. package/dist/formats/typebox/idn_email.d.ts +6 -0
  53. package/dist/formats/typebox/idn_email.d.ts.map +1 -0
  54. package/dist/formats/typebox/idn_email.js +36 -0
  55. package/dist/formats/typebox/idn_email.js.map +1 -0
  56. package/dist/formats/typebox/idn_hostname.d.ts +9 -0
  57. package/dist/formats/typebox/idn_hostname.d.ts.map +1 -0
  58. package/dist/formats/typebox/idn_hostname.js +39 -0
  59. package/dist/formats/typebox/idn_hostname.js.map +1 -0
  60. package/dist/formats/typebox/idna/format/bidi.d.ts +4 -0
  61. package/dist/formats/typebox/idna/format/bidi.d.ts.map +1 -0
  62. package/dist/formats/typebox/idna/format/bidi.js +132 -0
  63. package/dist/formats/typebox/idna/format/bidi.js.map +1 -0
  64. package/dist/formats/typebox/idna/format/puny.d.ts +4 -0
  65. package/dist/formats/typebox/idna/format/puny.d.ts.map +1 -0
  66. package/dist/formats/typebox/idna/format/puny.js +172 -0
  67. package/dist/formats/typebox/idna/format/puny.js.map +1 -0
  68. package/dist/formats/typebox/idna/hostname.d.ts +2 -0
  69. package/dist/formats/typebox/idna/hostname.d.ts.map +1 -0
  70. package/dist/formats/typebox/idna/hostname.js +43 -0
  71. package/dist/formats/typebox/idna/hostname.js.map +1 -0
  72. package/dist/formats/typebox/idna/idn-hostname.d.ts +2 -0
  73. package/dist/formats/typebox/idna/idn-hostname.d.ts.map +1 -0
  74. package/dist/formats/typebox/idna/idn-hostname.js +71 -0
  75. package/dist/formats/typebox/idna/idn-hostname.js.map +1 -0
  76. package/dist/formats/typebox/idna/index.d.ts +3 -0
  77. package/dist/formats/typebox/idna/index.d.ts.map +1 -0
  78. package/dist/formats/typebox/idna/index.js +30 -0
  79. package/dist/formats/typebox/idna/index.js.map +1 -0
  80. package/dist/formats/typebox/idna/label/ascii.d.ts +2 -0
  81. package/dist/formats/typebox/idna/label/ascii.d.ts.map +1 -0
  82. package/dist/formats/typebox/idna/label/ascii.js +37 -0
  83. package/dist/formats/typebox/idna/label/ascii.js.map +1 -0
  84. package/dist/formats/typebox/idna/label/puny.d.ts +2 -0
  85. package/dist/formats/typebox/idna/label/puny.d.ts.map +1 -0
  86. package/dist/formats/typebox/idna/label/puny.js +56 -0
  87. package/dist/formats/typebox/idna/label/puny.js.map +1 -0
  88. package/dist/formats/typebox/idna/label/unicode.d.ts +2 -0
  89. package/dist/formats/typebox/idna/label/unicode.d.ts.map +1 -0
  90. package/dist/formats/typebox/idna/label/unicode.js +134 -0
  91. package/dist/formats/typebox/idna/label/unicode.js.map +1 -0
  92. package/dist/formats/typebox/idna/pattern/pattern.d.ts +31 -0
  93. package/dist/formats/typebox/idna/pattern/pattern.d.ts.map +1 -0
  94. package/dist/formats/typebox/idna/pattern/pattern.js +98 -0
  95. package/dist/formats/typebox/idna/pattern/pattern.js.map +1 -0
  96. package/dist/formats/typebox/ipv4.d.ts +6 -0
  97. package/dist/formats/typebox/ipv4.d.ts.map +1 -0
  98. package/dist/formats/typebox/ipv4.js +36 -0
  99. package/dist/formats/typebox/ipv4.js.map +1 -0
  100. package/dist/formats/typebox/ipv6.d.ts +6 -0
  101. package/dist/formats/typebox/ipv6.d.ts.map +1 -0
  102. package/dist/formats/typebox/ipv6.js +36 -0
  103. package/dist/formats/typebox/ipv6.js.map +1 -0
  104. package/dist/formats/typebox/iri.d.ts +6 -0
  105. package/dist/formats/typebox/iri.d.ts.map +1 -0
  106. package/dist/formats/typebox/iri.js +63 -0
  107. package/dist/formats/typebox/iri.js.map +1 -0
  108. package/dist/formats/typebox/iri_reference.d.ts +6 -0
  109. package/dist/formats/typebox/iri_reference.d.ts.map +1 -0
  110. package/dist/formats/typebox/iri_reference.js +40 -0
  111. package/dist/formats/typebox/iri_reference.js.map +1 -0
  112. package/dist/formats/typebox/json_pointer.d.ts +7 -0
  113. package/dist/formats/typebox/json_pointer.d.ts.map +1 -0
  114. package/dist/formats/typebox/json_pointer.js +37 -0
  115. package/dist/formats/typebox/json_pointer.js.map +1 -0
  116. package/dist/formats/typebox/json_pointer_uri_fragment.d.ts +7 -0
  117. package/dist/formats/typebox/json_pointer_uri_fragment.d.ts.map +1 -0
  118. package/dist/formats/typebox/json_pointer_uri_fragment.js +37 -0
  119. package/dist/formats/typebox/json_pointer_uri_fragment.js.map +1 -0
  120. package/dist/formats/typebox/regex.d.ts +6 -0
  121. package/dist/formats/typebox/regex.d.ts.map +1 -0
  122. package/dist/formats/typebox/regex.js +41 -0
  123. package/dist/formats/typebox/regex.js.map +1 -0
  124. package/dist/formats/typebox/relative_json_pointer.d.ts +7 -0
  125. package/dist/formats/typebox/relative_json_pointer.d.ts.map +1 -0
  126. package/dist/formats/typebox/relative_json_pointer.js +37 -0
  127. package/dist/formats/typebox/relative_json_pointer.js.map +1 -0
  128. package/dist/formats/typebox/time.d.ts +6 -0
  129. package/dist/formats/typebox/time.d.ts.map +1 -0
  130. package/dist/formats/typebox/time.js +60 -0
  131. package/dist/formats/typebox/time.js.map +1 -0
  132. package/dist/formats/typebox/uri.d.ts +6 -0
  133. package/dist/formats/typebox/uri.d.ts.map +1 -0
  134. package/dist/formats/typebox/uri.js +36 -0
  135. package/dist/formats/typebox/uri.js.map +1 -0
  136. package/dist/formats/typebox/uri_reference.d.ts +6 -0
  137. package/dist/formats/typebox/uri_reference.d.ts.map +1 -0
  138. package/dist/formats/typebox/uri_reference.js +36 -0
  139. package/dist/formats/typebox/uri_reference.js.map +1 -0
  140. package/dist/formats/typebox/uri_template.d.ts +6 -0
  141. package/dist/formats/typebox/uri_template.d.ts.map +1 -0
  142. package/dist/formats/typebox/uri_template.js +37 -0
  143. package/dist/formats/typebox/uri_template.js.map +1 -0
  144. package/dist/formats/typebox/url.d.ts +7 -0
  145. package/dist/formats/typebox/url.d.ts.map +1 -0
  146. package/dist/formats/typebox/url.js +36 -0
  147. package/dist/formats/typebox/url.js.map +1 -0
  148. package/dist/formats/typebox/uuid.d.ts +7 -0
  149. package/dist/formats/typebox/uuid.d.ts.map +1 -0
  150. package/dist/formats/typebox/uuid.js +37 -0
  151. package/dist/formats/typebox/uuid.js.map +1 -0
  152. package/dist/index.d.ts +4 -0
  153. package/dist/index.d.ts.map +1 -0
  154. package/dist/index.js +5 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/resolver.d.ts +57 -0
  157. package/dist/resolver.d.ts.map +1 -0
  158. package/dist/resolver.js +202 -0
  159. package/dist/resolver.js.map +1 -0
  160. package/dist/shared.d.ts +9 -0
  161. package/dist/shared.d.ts.map +1 -0
  162. package/dist/shared.js +33 -0
  163. package/dist/shared.js.map +1 -0
  164. package/dist/typebox-static.d.ts +48 -0
  165. package/dist/typebox-static.d.ts.map +1 -0
  166. package/dist/typebox-static.js +5 -0
  167. package/dist/typebox-static.js.map +1 -0
  168. package/dist/types.d.ts +48 -0
  169. package/dist/types.d.ts.map +1 -0
  170. package/dist/types.js +3 -0
  171. package/dist/types.js.map +1 -0
  172. package/dist/validator.d.ts +39 -0
  173. package/dist/validator.d.ts.map +1 -0
  174. package/dist/validator.js +71 -0
  175. package/dist/validator.js.map +1 -0
  176. package/package.json +59 -5
package/dist/checks.js ADDED
@@ -0,0 +1,447 @@
1
+ // Check factories: each returns a closure that captures only its arguments, never the compiler, so a compiled
2
+ // schema keeps no compile-time state alive. Leaf checks are module constants that object and array loops inline.
3
+ export const ALWAYS = () => true;
4
+ export const NEVER = () => false;
5
+ const IS_STRING = (v) => typeof v === "string";
6
+ const IS_NUMBER = (v) => typeof v === "number";
7
+ const IS_INTEGER = (v) => Number.isInteger(v);
8
+ const IS_BOOLEAN = (v) => typeof v === "boolean";
9
+ const IS_NULL = (v) => v === null;
10
+ export const IS_ARRAY = (v) => Array.isArray(v);
11
+ const IS_BYTES = (v) => v instanceof Uint8Array;
12
+ export const IS_OBJECT = (v) => isObject(v);
13
+ /** Whether `v` is a JSON object: not null, an array or bytes. */
14
+ export function isObject(v) {
15
+ return typeof v === "object" && v !== null && !Array.isArray(v) && !(v instanceof Uint8Array);
16
+ }
17
+ /** The check of a `type` name; `bytes` (a Uint8Array) extends JSON Schema for values that never pass through JSON. */
18
+ export const TYPE_CHECKS = new Map([
19
+ ["string", IS_STRING],
20
+ ["number", IS_NUMBER],
21
+ ["integer", IS_INTEGER],
22
+ ["boolean", IS_BOOLEAN],
23
+ ["null", IS_NULL],
24
+ ["array", IS_ARRAY],
25
+ ["object", IS_OBJECT],
26
+ ["bytes", IS_BYTES],
27
+ ]);
28
+ /** Leaf checks that object and array loops run inline by code instead of calling them. */
29
+ export const LEAF_CODES = new Map([
30
+ [IS_STRING, 1],
31
+ [IS_NUMBER, 2],
32
+ [IS_INTEGER, 3],
33
+ [IS_BOOLEAN, 4],
34
+ [IS_NULL, 5],
35
+ [ALWAYS, 6],
36
+ ]);
37
+ function leafOk(code, x) {
38
+ switch (code) {
39
+ case 1:
40
+ return typeof x === "string";
41
+ case 2:
42
+ return typeof x === "number";
43
+ case 3:
44
+ return Number.isInteger(x);
45
+ case 4:
46
+ return typeof x === "boolean";
47
+ case 5:
48
+ return x === null;
49
+ default:
50
+ return true;
51
+ }
52
+ }
53
+ /** Whether a combined object or array check also checks the type: not at all, strictly, or passing other types. */
54
+ export const GUARD_NONE = 0;
55
+ export const GUARD_STRICT = 1;
56
+ export const GUARD_LOOSE = 2;
57
+ /** Flags of a declared property in an object check's entries: its leaf code and two bits. */
58
+ export const CODE = 7;
59
+ export const REQUIRED = 8;
60
+ export const INHERITED = 16;
61
+ /** All of `parts`; two and three parts get closures without a loop. */
62
+ export function and(parts) {
63
+ switch (parts.length) {
64
+ case 0:
65
+ return ALWAYS;
66
+ case 1:
67
+ return parts[0];
68
+ case 2: {
69
+ const [a, b] = parts;
70
+ return (v) => a(v) && b(v);
71
+ }
72
+ case 3: {
73
+ const [a, b, c] = parts;
74
+ return (v) => a(v) && b(v) && c(v);
75
+ }
76
+ default:
77
+ return (v) => {
78
+ for (let i = 0; i < parts.length; i++)
79
+ if (!parts[i](v))
80
+ return false;
81
+ return true;
82
+ };
83
+ }
84
+ }
85
+ /** A check whose implementation is set later: the indirection a recursive reference goes through. */
86
+ export function indirect(slot) {
87
+ return (v) => slot.check(v);
88
+ }
89
+ /** `check` with `uri` pushed onto the dynamic scope while it runs (only for schemas with `$dynamicRef`). */
90
+ export function scopedCheck(scope, uri, check) {
91
+ return (v) => {
92
+ scope.push(uri);
93
+ const ok = check(v);
94
+ scope.pop();
95
+ return ok;
96
+ };
97
+ }
98
+ /** Any of the named types. */
99
+ export function typeCheck(types) {
100
+ const checks = types.map((t) => (typeof t === "string" ? TYPE_CHECKS.get(t) : undefined) ?? NEVER);
101
+ if (checks.length === 1)
102
+ return checks[0];
103
+ return (v) => {
104
+ for (let i = 0; i < checks.length; i++)
105
+ if (checks[i](v))
106
+ return true;
107
+ return false;
108
+ };
109
+ }
110
+ /** A Uint8Array within the length bounds. */
111
+ export function bytesCheck(min, max) {
112
+ return (v) => v instanceof Uint8Array && v.length >= min && v.length <= max;
113
+ }
114
+ /** The number of Unicode code points of `s`: JSON Schema string lengths count code points, not UTF-16 units. */
115
+ export function codePoints(s) {
116
+ let n = 0;
117
+ for (let i = 0; i < s.length; i++, n++) {
118
+ const c = s.charCodeAt(i);
119
+ // A high surrogate starts a pair only when a low surrogate follows; an unpaired one is a code point of its own.
120
+ if (c >= 0xd800 && c <= 0xdbff && i + 1 < s.length) {
121
+ const next = s.charCodeAt(i + 1);
122
+ if (next >= 0xdc00 && next <= 0xdfff)
123
+ i++;
124
+ }
125
+ }
126
+ return n;
127
+ }
128
+ // UTF-16 units bound code points from both sides (units / 2 <= points <= units), so most strings need no count.
129
+ function lengthOk(s, min, max) {
130
+ const units = s.length;
131
+ if (units < min)
132
+ return false;
133
+ if (units < 2 * min && codePoints(s) < min)
134
+ return false;
135
+ return units <= max || codePoints(s) <= max;
136
+ }
137
+ /** The string keywords: length bounds, pattern and format. */
138
+ export function stringCheck(strict, min, max, re, format) {
139
+ if (re !== undefined && min === 0 && max === Number.POSITIVE_INFINITY && format === undefined) {
140
+ return strict ? (v) => typeof v === "string" && re.test(v) : (v) => typeof v !== "string" || re.test(v);
141
+ }
142
+ if (re === undefined && format === undefined) {
143
+ return strict
144
+ ? (v) => typeof v === "string" && lengthOk(v, min, max)
145
+ : (v) => typeof v !== "string" || lengthOk(v, min, max);
146
+ }
147
+ return (v) => {
148
+ if (typeof v !== "string")
149
+ return !strict;
150
+ return lengthOk(v, min, max) && (re === undefined || re.test(v)) && (format === undefined || format(v));
151
+ };
152
+ }
153
+ /** The number keywords. `mode`: 0 passes other types, 1 requires a number, 2 an integer. */
154
+ export function numberCheck(mode, min, max, xmin, xmax, multipleOf) {
155
+ return (v) => {
156
+ if (typeof v !== "number")
157
+ return mode === 0;
158
+ if (mode === 2 && !Number.isInteger(v))
159
+ return false;
160
+ return v >= min && v <= max && v > xmin && v < xmax && (multipleOf === undefined || isMultiple(v, multipleOf));
161
+ };
162
+ }
163
+ /** Whether `v` is a multiple of `d`, exactly for decimals: 0.0075 / 0.0001 is 74.99999999999999 in floating point. */
164
+ export function isMultiple(v, d) {
165
+ const q = v / d;
166
+ if (Number.isInteger(q))
167
+ return true;
168
+ if (!Number.isFinite(q))
169
+ return v % d === 0;
170
+ const [vc, ve] = decimal(v);
171
+ const [dc, de] = decimal(d);
172
+ return ve >= de ? (vc * 10n ** BigInt(ve - de)) % dc === 0n : vc % (dc * 10n ** BigInt(de - ve)) === 0n;
173
+ }
174
+ function decimal(x) {
175
+ const [mantissa, exponent = "0"] = Math.abs(x).toString().split("e");
176
+ const point = mantissa.indexOf(".");
177
+ const fraction = point < 0 ? 0 : mantissa.length - point - 1;
178
+ return [BigInt(mantissa.replace(".", "")), Number(exponent) - fraction];
179
+ }
180
+ /** `inner` for objects; other values pass unless `strict`. */
181
+ export function guardObject(inner, strict) {
182
+ return strict ? (v) => isObject(v) && inner(v) : (v) => !isObject(v) || inner(v);
183
+ }
184
+ /** `inner` for arrays; other values pass unless `strict`. */
185
+ export function guardArray(inner, strict) {
186
+ return strict ? (v) => Array.isArray(v) && inner(v) : (v) => !Array.isArray(v) || inner(v);
187
+ }
188
+ /**
189
+ * An object with declared properties: `entries` is `[key, check, flags]` per property. The value's own keys are
190
+ * walked with for...in (whose `o[k]` V8 reads from the enum cache, unlike a load by a name from a list), each found
191
+ * among the declared names; `closed` rejects any other key. A property whose value is `undefined` counts as absent.
192
+ */
193
+ export function declaredObject(entries, requiredCount, closed, guard) {
194
+ const n = entries.length;
195
+ return (v) => {
196
+ if (guard !== GUARD_NONE && !isObject(v))
197
+ return guard === GUARD_LOOSE;
198
+ // Guarded: by the check above, or by the caller for GUARD_NONE.
199
+ const o = v;
200
+ let required = 0;
201
+ for (const k in o) {
202
+ let i = 0;
203
+ while (i < n && entries[i] !== k)
204
+ i += 3;
205
+ if (i === n) {
206
+ if (closed)
207
+ return false;
208
+ continue;
209
+ }
210
+ const x = o[k];
211
+ if (x === undefined)
212
+ continue;
213
+ const f = entries[i + 2];
214
+ const c = f & CODE;
215
+ if (c !== 0 ? !leafOk(c, x) : !entries[i + 1](x))
216
+ return false;
217
+ if (f & REQUIRED)
218
+ required++;
219
+ }
220
+ return required === requiredCount;
221
+ };
222
+ }
223
+ /** An object with declared properties, required keys not declared, pattern properties and additional properties. */
224
+ export function openObject(entries, keys, extraRequired, patterns, additional, guard) {
225
+ const known = patterns.length > 0 || additional !== undefined ? new Set(keys) : undefined;
226
+ return (v) => {
227
+ if (guard !== GUARD_NONE && !isObject(v))
228
+ return guard === GUARD_LOOSE;
229
+ const o = v;
230
+ for (let i = 0; i < entries.length; i += 3) {
231
+ const k = entries[i];
232
+ const x = o[k];
233
+ const f = entries[i + 2];
234
+ if (x === undefined || (f & INHERITED && !Object.hasOwn(o, k))) {
235
+ if (f & REQUIRED)
236
+ return false;
237
+ continue;
238
+ }
239
+ const c = f & CODE;
240
+ if (c !== 0 ? !leafOk(c, x) : !entries[i + 1](x))
241
+ return false;
242
+ }
243
+ for (let i = 0; i < extraRequired.length; i++)
244
+ if (!Object.hasOwn(o, extraRequired[i]))
245
+ return false;
246
+ if (known === undefined)
247
+ return true;
248
+ for (const k of Object.keys(o)) {
249
+ let matched = known.has(k);
250
+ for (let i = 0; i < patterns.length; i++) {
251
+ if (patterns[i][0].test(k)) {
252
+ matched = true;
253
+ if (!patterns[i][1](o[k]))
254
+ return false;
255
+ }
256
+ }
257
+ if (!matched && additional !== undefined && !additional(o[k]))
258
+ return false;
259
+ }
260
+ return true;
261
+ };
262
+ }
263
+ /** Every property name passes `check` (`v` is an object). */
264
+ export function propertyNamesCheck(check) {
265
+ return (v) => {
266
+ for (const k in v)
267
+ if (!check(k))
268
+ return false;
269
+ return true;
270
+ };
271
+ }
272
+ /** `minProperties` and `maxProperties` (`v` is an object). */
273
+ export function propertyCountCheck(min, max) {
274
+ return (v) => {
275
+ let n = 0;
276
+ for (const _ in v)
277
+ n++;
278
+ return n >= min && n <= max;
279
+ };
280
+ }
281
+ /** `dependentRequired` (`v` is an object). */
282
+ export function dependentRequiredCheck(entries) {
283
+ return (v) => {
284
+ const o = v;
285
+ for (const [k, list] of entries)
286
+ if (Object.hasOwn(o, k))
287
+ for (const r of list)
288
+ if (!Object.hasOwn(o, r))
289
+ return false;
290
+ return true;
291
+ };
292
+ }
293
+ /** `dependentSchemas` (`v` is an object). */
294
+ export function dependentSchemasCheck(entries) {
295
+ return (v) => {
296
+ for (const [k, check] of entries)
297
+ if (Object.hasOwn(v, k) && !check(v))
298
+ return false;
299
+ return true;
300
+ };
301
+ }
302
+ /** The common array: guard, length bounds, prefix items and the items after them, in one closure. */
303
+ export function listCheck(guard, min, max, prefix, rest) {
304
+ const n = prefix.length;
305
+ const code = rest === undefined ? 0 : (LEAF_CODES.get(rest) ?? 0);
306
+ return (v) => {
307
+ if (!Array.isArray(v))
308
+ return guard === GUARD_LOOSE;
309
+ const length = v.length;
310
+ if (length < min || length > max)
311
+ return false;
312
+ const m = length < n ? length : n;
313
+ for (let i = 0; i < m; i++)
314
+ if (!prefix[i](v[i]))
315
+ return false;
316
+ if (rest === undefined)
317
+ return true;
318
+ if (code !== 0) {
319
+ for (let i = n; i < length; i++)
320
+ if (!leafOk(code, v[i]))
321
+ return false;
322
+ return true;
323
+ }
324
+ for (let i = n; i < length; i++)
325
+ if (!rest(v[i]))
326
+ return false;
327
+ return true;
328
+ };
329
+ }
330
+ /** Prefix items and the items after them (`v` is an array). */
331
+ export function itemsCheck(prefix, rest) {
332
+ return listCheck(GUARD_NONE, 0, Number.POSITIVE_INFINITY, prefix, rest);
333
+ }
334
+ /** `minItems` and `maxItems` (`v` is an array). */
335
+ export function lengthCheck(min, max) {
336
+ return (v) => v.length >= min && v.length <= max;
337
+ }
338
+ /** `contains` with its bounds (`v` is an array). */
339
+ export function containsCheck(check, min, max) {
340
+ return (v) => {
341
+ const list = v;
342
+ let n = 0;
343
+ for (let i = 0; i < list.length; i++)
344
+ if (check(list[i]) && ++n > max)
345
+ return false;
346
+ return n >= min;
347
+ };
348
+ }
349
+ /** `uniqueItems` (`v` is an array). */
350
+ export function uniqueCheck(v) {
351
+ const list = v;
352
+ for (let i = 1; i < list.length; i++)
353
+ for (let j = 0; j < i; j++)
354
+ if (deepEqual(list[i], list[j]))
355
+ return false;
356
+ return true;
357
+ }
358
+ /** `enum`: up to 8 primitives by a scan, more by a Set, objects and arrays by deep equality. */
359
+ export function enumCheck(values) {
360
+ const primitives = values.filter((x) => typeof x !== "object" || x === null);
361
+ if (primitives.length === values.length && primitives.length <= 8) {
362
+ return (v) => {
363
+ for (let i = 0; i < primitives.length; i++)
364
+ if (primitives[i] === v)
365
+ return true;
366
+ return false;
367
+ };
368
+ }
369
+ const set = new Set(primitives);
370
+ const objects = values.filter((x) => typeof x === "object" && x !== null);
371
+ return (v) => set.has(v) || (typeof v === "object" && objects.some((o) => deepEqual(v, o)));
372
+ }
373
+ /** `const`. */
374
+ export function constCheck(value) {
375
+ if (typeof value !== "object" || value === null)
376
+ return (v) => v === value;
377
+ return (v) => deepEqual(v, value);
378
+ }
379
+ /** `anyOf`. */
380
+ export function anyCheck(checks) {
381
+ return (v) => {
382
+ for (let i = 0; i < checks.length; i++)
383
+ if (checks[i](v))
384
+ return true;
385
+ return false;
386
+ };
387
+ }
388
+ /** `oneOf`. */
389
+ export function oneCheck(checks) {
390
+ return (v) => {
391
+ let n = 0;
392
+ for (let i = 0; i < checks.length; i++)
393
+ if (checks[i](v) && ++n > 1)
394
+ return false;
395
+ return n === 1;
396
+ };
397
+ }
398
+ /** `not`. */
399
+ export function notCheck(check) {
400
+ return (v) => !check(v);
401
+ }
402
+ /** `if`, `then` and `else`. */
403
+ export function ifCheck(cond, then, otherwise) {
404
+ return (v) => (cond(v) ? then(v) : otherwise(v));
405
+ }
406
+ /** A union of objects tagged by a const on `key`: the tag selects the one branch that can match. */
407
+ export function taggedCheck(key, tags, checks) {
408
+ return (v) => {
409
+ if (!isObject(v))
410
+ return false;
411
+ const tag = v[key];
412
+ for (let i = 0; i < tags.length; i++)
413
+ if (tags[i] === tag)
414
+ return checks[i](v);
415
+ return false;
416
+ };
417
+ }
418
+ /** JSON equality: same primitives, arrays with equal items in order, objects with the same keys and equal values. */
419
+ export function deepEqual(a, b) {
420
+ if (a === b)
421
+ return true;
422
+ if (typeof a !== "object" || typeof b !== "object" || a === null || b === null)
423
+ return false;
424
+ const array = Array.isArray(a);
425
+ if (array !== Array.isArray(b))
426
+ return false;
427
+ if (array) {
428
+ const x = a;
429
+ const y = b;
430
+ if (x.length !== y.length)
431
+ return false;
432
+ for (let i = 0; i < x.length; i++)
433
+ if (!deepEqual(x[i], y[i]))
434
+ return false;
435
+ return true;
436
+ }
437
+ const x = a;
438
+ const y = b;
439
+ const keys = Object.keys(x);
440
+ if (keys.length !== Object.keys(y).length)
441
+ return false;
442
+ for (const k of keys)
443
+ if (!Object.hasOwn(y, k) || !deepEqual(x[k], y[k]))
444
+ return false;
445
+ return true;
446
+ }
447
+ //# sourceMappingURL=checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../src/checks.ts"],"names":[],"mappings":"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","sourcesContent":["// Check factories: each returns a closure that captures only its arguments, never the compiler, so a compiled\n// schema keeps no compile-time state alive. Leaf checks are module constants that object and array loops inline.\n\nimport type { Check } from \"./types.ts\";\n\nexport const ALWAYS: Check = () => true;\nexport const NEVER: Check = () => false;\nconst IS_STRING: Check = (v) => typeof v === \"string\";\nconst IS_NUMBER: Check = (v) => typeof v === \"number\";\nconst IS_INTEGER: Check = (v) => Number.isInteger(v);\nconst IS_BOOLEAN: Check = (v) => typeof v === \"boolean\";\nconst IS_NULL: Check = (v) => v === null;\nexport const IS_ARRAY: Check = (v) => Array.isArray(v);\nconst IS_BYTES: Check = (v) => v instanceof Uint8Array;\nexport const IS_OBJECT: Check = (v) => isObject(v);\n\n/** Whether `v` is a JSON object: not null, an array or bytes. */\nexport function isObject(v: unknown): v is Record<string, unknown> {\n\treturn typeof v === \"object\" && v !== null && !Array.isArray(v) && !(v instanceof Uint8Array);\n}\n\n/** The check of a `type` name; `bytes` (a Uint8Array) extends JSON Schema for values that never pass through JSON. */\nexport const TYPE_CHECKS: ReadonlyMap<string, Check> = new Map([\n\t[\"string\", IS_STRING],\n\t[\"number\", IS_NUMBER],\n\t[\"integer\", IS_INTEGER],\n\t[\"boolean\", IS_BOOLEAN],\n\t[\"null\", IS_NULL],\n\t[\"array\", IS_ARRAY],\n\t[\"object\", IS_OBJECT],\n\t[\"bytes\", IS_BYTES],\n]);\n\n/** Leaf checks that object and array loops run inline by code instead of calling them. */\nexport const LEAF_CODES: ReadonlyMap<Check, number> = new Map([\n\t[IS_STRING, 1],\n\t[IS_NUMBER, 2],\n\t[IS_INTEGER, 3],\n\t[IS_BOOLEAN, 4],\n\t[IS_NULL, 5],\n\t[ALWAYS, 6],\n]);\n\nfunction leafOk(code: number, x: unknown): boolean {\n\tswitch (code) {\n\t\tcase 1:\n\t\t\treturn typeof x === \"string\";\n\t\tcase 2:\n\t\t\treturn typeof x === \"number\";\n\t\tcase 3:\n\t\t\treturn Number.isInteger(x);\n\t\tcase 4:\n\t\t\treturn typeof x === \"boolean\";\n\t\tcase 5:\n\t\t\treturn x === null;\n\t\tdefault:\n\t\t\treturn true;\n\t}\n}\n\n/** Whether a combined object or array check also checks the type: not at all, strictly, or passing other types. */\nexport const GUARD_NONE = 0;\nexport const GUARD_STRICT = 1;\nexport const GUARD_LOOSE = 2;\nexport type Guard = typeof GUARD_NONE | typeof GUARD_STRICT | typeof GUARD_LOOSE;\n\n/** Flags of a declared property in an object check's entries: its leaf code and two bits. */\nexport const CODE = 7;\nexport const REQUIRED = 8;\nexport const INHERITED = 16;\n\n/** All of `parts`; two and three parts get closures without a loop. */\nexport function and(parts: readonly Check[]): Check {\n\tswitch (parts.length) {\n\t\tcase 0:\n\t\t\treturn ALWAYS;\n\t\tcase 1:\n\t\t\treturn parts[0];\n\t\tcase 2: {\n\t\t\tconst [a, b] = parts;\n\t\t\treturn (v) => a(v) && b(v);\n\t\t}\n\t\tcase 3: {\n\t\t\tconst [a, b, c] = parts;\n\t\t\treturn (v) => a(v) && b(v) && c(v);\n\t\t}\n\t\tdefault:\n\t\t\treturn (v) => {\n\t\t\t\tfor (let i = 0; i < parts.length; i++) if (!parts[i](v)) return false;\n\t\t\t\treturn true;\n\t\t\t};\n\t}\n}\n\n/** A check whose implementation is set later: the indirection a recursive reference goes through. */\nexport function indirect(slot: { check: Check | undefined }): Check {\n\treturn (v) => (slot.check as Check)(v);\n}\n\n/** `check` with `uri` pushed onto the dynamic scope while it runs (only for schemas with `$dynamicRef`). */\nexport function scopedCheck(scope: string[], uri: string, check: Check): Check {\n\treturn (v) => {\n\t\tscope.push(uri);\n\t\tconst ok = check(v);\n\t\tscope.pop();\n\t\treturn ok;\n\t};\n}\n\n/** Any of the named types. */\nexport function typeCheck(types: readonly unknown[]): Check {\n\tconst checks = types.map((t) => (typeof t === \"string\" ? TYPE_CHECKS.get(t) : undefined) ?? NEVER);\n\tif (checks.length === 1) return checks[0];\n\treturn (v) => {\n\t\tfor (let i = 0; i < checks.length; i++) if (checks[i](v)) return true;\n\t\treturn false;\n\t};\n}\n\n/** A Uint8Array within the length bounds. */\nexport function bytesCheck(min: number, max: number): Check {\n\treturn (v) => v instanceof Uint8Array && v.length >= min && v.length <= max;\n}\n\n/** The number of Unicode code points of `s`: JSON Schema string lengths count code points, not UTF-16 units. */\nexport function codePoints(s: string): number {\n\tlet n = 0;\n\tfor (let i = 0; i < s.length; i++, n++) {\n\t\tconst c = s.charCodeAt(i);\n\t\t// A high surrogate starts a pair only when a low surrogate follows; an unpaired one is a code point of its own.\n\t\tif (c >= 0xd800 && c <= 0xdbff && i + 1 < s.length) {\n\t\t\tconst next = s.charCodeAt(i + 1);\n\t\t\tif (next >= 0xdc00 && next <= 0xdfff) i++;\n\t\t}\n\t}\n\treturn n;\n}\n\n// UTF-16 units bound code points from both sides (units / 2 <= points <= units), so most strings need no count.\nfunction lengthOk(s: string, min: number, max: number): boolean {\n\tconst units = s.length;\n\tif (units < min) return false;\n\tif (units < 2 * min && codePoints(s) < min) return false;\n\treturn units <= max || codePoints(s) <= max;\n}\n\n/** The string keywords: length bounds, pattern and format. */\nexport function stringCheck(\n\tstrict: boolean,\n\tmin: number,\n\tmax: number,\n\tre: RegExp | undefined,\n\tformat: ((value: string) => boolean) | undefined,\n): Check {\n\tif (re !== undefined && min === 0 && max === Number.POSITIVE_INFINITY && format === undefined) {\n\t\treturn strict ? (v) => typeof v === \"string\" && re.test(v) : (v) => typeof v !== \"string\" || re.test(v);\n\t}\n\tif (re === undefined && format === undefined) {\n\t\treturn strict\n\t\t\t? (v) => typeof v === \"string\" && lengthOk(v, min, max)\n\t\t\t: (v) => typeof v !== \"string\" || lengthOk(v, min, max);\n\t}\n\treturn (v) => {\n\t\tif (typeof v !== \"string\") return !strict;\n\t\treturn lengthOk(v, min, max) && (re === undefined || re.test(v)) && (format === undefined || format(v));\n\t};\n}\n\n/** The number keywords. `mode`: 0 passes other types, 1 requires a number, 2 an integer. */\nexport function numberCheck(\n\tmode: 0 | 1 | 2,\n\tmin: number,\n\tmax: number,\n\txmin: number,\n\txmax: number,\n\tmultipleOf: number | undefined,\n): Check {\n\treturn (v) => {\n\t\tif (typeof v !== \"number\") return mode === 0;\n\t\tif (mode === 2 && !Number.isInteger(v)) return false;\n\t\treturn v >= min && v <= max && v > xmin && v < xmax && (multipleOf === undefined || isMultiple(v, multipleOf));\n\t};\n}\n\n/** Whether `v` is a multiple of `d`, exactly for decimals: 0.0075 / 0.0001 is 74.99999999999999 in floating point. */\nexport function isMultiple(v: number, d: number): boolean {\n\tconst q = v / d;\n\tif (Number.isInteger(q)) return true;\n\tif (!Number.isFinite(q)) return v % d === 0;\n\tconst [vc, ve] = decimal(v);\n\tconst [dc, de] = decimal(d);\n\treturn ve >= de ? (vc * 10n ** BigInt(ve - de)) % dc === 0n : vc % (dc * 10n ** BigInt(de - ve)) === 0n;\n}\n\nfunction decimal(x: number): [bigint, number] {\n\tconst [mantissa, exponent = \"0\"] = Math.abs(x).toString().split(\"e\");\n\tconst point = mantissa.indexOf(\".\");\n\tconst fraction = point < 0 ? 0 : mantissa.length - point - 1;\n\treturn [BigInt(mantissa.replace(\".\", \"\")), Number(exponent) - fraction];\n}\n\n/** `inner` for objects; other values pass unless `strict`. */\nexport function guardObject(inner: Check, strict: boolean): Check {\n\treturn strict ? (v) => isObject(v) && inner(v) : (v) => !isObject(v) || inner(v);\n}\n\n/** `inner` for arrays; other values pass unless `strict`. */\nexport function guardArray(inner: Check, strict: boolean): Check {\n\treturn strict ? (v) => Array.isArray(v) && inner(v) : (v) => !Array.isArray(v) || inner(v);\n}\n\n/**\n * An object with declared properties: `entries` is `[key, check, flags]` per property. The value's own keys are\n * walked with for...in (whose `o[k]` V8 reads from the enum cache, unlike a load by a name from a list), each found\n * among the declared names; `closed` rejects any other key. A property whose value is `undefined` counts as absent.\n */\nexport function declaredObject(\n\tentries: readonly unknown[],\n\trequiredCount: number,\n\tclosed: boolean,\n\tguard: Guard,\n): Check {\n\tconst n = entries.length;\n\treturn (v) => {\n\t\tif (guard !== GUARD_NONE && !isObject(v)) return guard === GUARD_LOOSE;\n\t\t// Guarded: by the check above, or by the caller for GUARD_NONE.\n\t\tconst o = v as Record<string, unknown>;\n\t\tlet required = 0;\n\t\tfor (const k in o) {\n\t\t\tlet i = 0;\n\t\t\twhile (i < n && entries[i] !== k) i += 3;\n\t\t\tif (i === n) {\n\t\t\t\tif (closed) return false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst x = o[k];\n\t\t\tif (x === undefined) continue;\n\t\t\tconst f = entries[i + 2] as number;\n\t\t\tconst c = f & CODE;\n\t\t\tif (c !== 0 ? !leafOk(c, x) : !(entries[i + 1] as Check)(x)) return false;\n\t\t\tif (f & REQUIRED) required++;\n\t\t}\n\t\treturn required === requiredCount;\n\t};\n}\n\n/** An object with declared properties, required keys not declared, pattern properties and additional properties. */\nexport function openObject(\n\tentries: readonly unknown[],\n\tkeys: readonly string[],\n\textraRequired: readonly string[],\n\tpatterns: readonly (readonly [RegExp, Check])[],\n\tadditional: Check | undefined,\n\tguard: Guard,\n): Check {\n\tconst known = patterns.length > 0 || additional !== undefined ? new Set(keys) : undefined;\n\treturn (v) => {\n\t\tif (guard !== GUARD_NONE && !isObject(v)) return guard === GUARD_LOOSE;\n\t\tconst o = v as Record<string, unknown>;\n\t\tfor (let i = 0; i < entries.length; i += 3) {\n\t\t\tconst k = entries[i] as string;\n\t\t\tconst x = o[k];\n\t\t\tconst f = entries[i + 2] as number;\n\t\t\tif (x === undefined || (f & INHERITED && !Object.hasOwn(o, k))) {\n\t\t\t\tif (f & REQUIRED) return false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst c = f & CODE;\n\t\t\tif (c !== 0 ? !leafOk(c, x) : !(entries[i + 1] as Check)(x)) return false;\n\t\t}\n\t\tfor (let i = 0; i < extraRequired.length; i++) if (!Object.hasOwn(o, extraRequired[i])) return false;\n\t\tif (known === undefined) return true;\n\t\tfor (const k of Object.keys(o)) {\n\t\t\tlet matched = known.has(k);\n\t\t\tfor (let i = 0; i < patterns.length; i++) {\n\t\t\t\tif (patterns[i][0].test(k)) {\n\t\t\t\t\tmatched = true;\n\t\t\t\t\tif (!patterns[i][1](o[k])) return false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!matched && additional !== undefined && !additional(o[k])) return false;\n\t\t}\n\t\treturn true;\n\t};\n}\n\n/** Every property name passes `check` (`v` is an object). */\nexport function propertyNamesCheck(check: Check): Check {\n\treturn (v) => {\n\t\tfor (const k in v as object) if (!check(k)) return false;\n\t\treturn true;\n\t};\n}\n\n/** `minProperties` and `maxProperties` (`v` is an object). */\nexport function propertyCountCheck(min: number, max: number): Check {\n\treturn (v) => {\n\t\tlet n = 0;\n\t\tfor (const _ in v as object) n++;\n\t\treturn n >= min && n <= max;\n\t};\n}\n\n/** `dependentRequired` (`v` is an object). */\nexport function dependentRequiredCheck(entries: readonly (readonly [string, readonly string[]])[]): Check {\n\treturn (v) => {\n\t\tconst o = v as object;\n\t\tfor (const [k, list] of entries)\n\t\t\tif (Object.hasOwn(o, k)) for (const r of list) if (!Object.hasOwn(o, r)) return false;\n\t\treturn true;\n\t};\n}\n\n/** `dependentSchemas` (`v` is an object). */\nexport function dependentSchemasCheck(entries: readonly (readonly [string, Check])[]): Check {\n\treturn (v) => {\n\t\tfor (const [k, check] of entries) if (Object.hasOwn(v as object, k) && !check(v)) return false;\n\t\treturn true;\n\t};\n}\n\n/** The common array: guard, length bounds, prefix items and the items after them, in one closure. */\nexport function listCheck(\n\tguard: Guard,\n\tmin: number,\n\tmax: number,\n\tprefix: readonly Check[],\n\trest: Check | undefined,\n): Check {\n\tconst n = prefix.length;\n\tconst code = rest === undefined ? 0 : (LEAF_CODES.get(rest) ?? 0);\n\treturn (v) => {\n\t\tif (!Array.isArray(v)) return guard === GUARD_LOOSE;\n\t\tconst length = v.length;\n\t\tif (length < min || length > max) return false;\n\t\tconst m = length < n ? length : n;\n\t\tfor (let i = 0; i < m; i++) if (!prefix[i](v[i])) return false;\n\t\tif (rest === undefined) return true;\n\t\tif (code !== 0) {\n\t\t\tfor (let i = n; i < length; i++) if (!leafOk(code, v[i])) return false;\n\t\t\treturn true;\n\t\t}\n\t\tfor (let i = n; i < length; i++) if (!rest(v[i])) return false;\n\t\treturn true;\n\t};\n}\n\n/** Prefix items and the items after them (`v` is an array). */\nexport function itemsCheck(prefix: readonly Check[], rest: Check | undefined): Check {\n\treturn listCheck(GUARD_NONE, 0, Number.POSITIVE_INFINITY, prefix, rest);\n}\n\n/** `minItems` and `maxItems` (`v` is an array). */\nexport function lengthCheck(min: number, max: number): Check {\n\treturn (v) => (v as unknown[]).length >= min && (v as unknown[]).length <= max;\n}\n\n/** `contains` with its bounds (`v` is an array). */\nexport function containsCheck(check: Check, min: number, max: number): Check {\n\treturn (v) => {\n\t\tconst list = v as unknown[];\n\t\tlet n = 0;\n\t\tfor (let i = 0; i < list.length; i++) if (check(list[i]) && ++n > max) return false;\n\t\treturn n >= min;\n\t};\n}\n\n/** `uniqueItems` (`v` is an array). */\nexport function uniqueCheck(v: unknown): boolean {\n\tconst list = v as unknown[];\n\tfor (let i = 1; i < list.length; i++) for (let j = 0; j < i; j++) if (deepEqual(list[i], list[j])) return false;\n\treturn true;\n}\n\n/** `enum`: up to 8 primitives by a scan, more by a Set, objects and arrays by deep equality. */\nexport function enumCheck(values: readonly unknown[]): Check {\n\tconst primitives = values.filter((x) => typeof x !== \"object\" || x === null);\n\tif (primitives.length === values.length && primitives.length <= 8) {\n\t\treturn (v) => {\n\t\t\tfor (let i = 0; i < primitives.length; i++) if (primitives[i] === v) return true;\n\t\t\treturn false;\n\t\t};\n\t}\n\tconst set = new Set(primitives);\n\tconst objects = values.filter((x) => typeof x === \"object\" && x !== null);\n\treturn (v) => set.has(v) || (typeof v === \"object\" && objects.some((o) => deepEqual(v, o)));\n}\n\n/** `const`. */\nexport function constCheck(value: unknown): Check {\n\tif (typeof value !== \"object\" || value === null) return (v) => v === value;\n\treturn (v) => deepEqual(v, value);\n}\n\n/** `anyOf`. */\nexport function anyCheck(checks: readonly Check[]): Check {\n\treturn (v) => {\n\t\tfor (let i = 0; i < checks.length; i++) if (checks[i](v)) return true;\n\t\treturn false;\n\t};\n}\n\n/** `oneOf`. */\nexport function oneCheck(checks: readonly Check[]): Check {\n\treturn (v) => {\n\t\tlet n = 0;\n\t\tfor (let i = 0; i < checks.length; i++) if (checks[i](v) && ++n > 1) return false;\n\t\treturn n === 1;\n\t};\n}\n\n/** `not`. */\nexport function notCheck(check: Check): Check {\n\treturn (v) => !check(v);\n}\n\n/** `if`, `then` and `else`. */\nexport function ifCheck(cond: Check, then: Check, otherwise: Check): Check {\n\treturn (v) => (cond(v) ? then(v) : otherwise(v));\n}\n\n/** A union of objects tagged by a const on `key`: the tag selects the one branch that can match. */\nexport function taggedCheck(key: string, tags: readonly unknown[], checks: readonly Check[]): Check {\n\treturn (v) => {\n\t\tif (!isObject(v)) return false;\n\t\tconst tag = v[key];\n\t\tfor (let i = 0; i < tags.length; i++) if (tags[i] === tag) return checks[i](v);\n\t\treturn false;\n\t};\n}\n\n/** JSON equality: same primitives, arrays with equal items in order, objects with the same keys and equal values. */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n\tif (a === b) return true;\n\tif (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false;\n\tconst array = Array.isArray(a);\n\tif (array !== Array.isArray(b)) return false;\n\tif (array) {\n\t\tconst x = a as unknown[];\n\t\tconst y = b as unknown[];\n\t\tif (x.length !== y.length) return false;\n\t\tfor (let i = 0; i < x.length; i++) if (!deepEqual(x[i], y[i])) return false;\n\t\treturn true;\n\t}\n\tconst x = a as Record<string, unknown>;\n\tconst y = b as Record<string, unknown>;\n\tconst keys = Object.keys(x);\n\tif (keys.length !== Object.keys(y).length) return false;\n\tfor (const k of keys) if (!Object.hasOwn(y, k) || !deepEqual(x[k], y[k])) return false;\n\treturn true;\n}\n"]}
@@ -0,0 +1,53 @@
1
+ import type { Compiler } from "./compiler.ts";
2
+ /** Coerces values for one compiled schema. */
3
+ export declare class Coercer {
4
+ private readonly c;
5
+ private readonly schema;
6
+ /**
7
+ * The (schema node, value) pairs pass 2 is converting through a re-entry point, as a stack. Conversion can enter
8
+ * a node again with the same value only through a `$ref` or by wrapping a single value into an array (also for
9
+ * schemas that cycle through shared JS objects): a recursive schema that meets a value no branch accepts would
10
+ * convert it without end. A pair already on the stack (primitives by value, objects by reference) leaves the value
11
+ * unchanged. Only those two points push, so schemas without references or wraps pay nothing.
12
+ */
13
+ private readonly entered;
14
+ /** How often a re-entry was cut short in this coerce() call; results computed across one are not memoized. */
15
+ private cuts;
16
+ /**
17
+ * Results of `$ref` targets by (node, value) within one coerce() call: a recursive union whose branches all
18
+ * convert the same children (and all fail) would convert them once per branch, exponentially in the depth.
19
+ */
20
+ private memo;
21
+ constructor(compiler: Compiler, schema: unknown);
22
+ /** `value` coerced: a copy along the changed paths only, or `value` itself when nothing changes. */
23
+ coerce(value: unknown): unknown;
24
+ /** Pass 2 alone, as TypeBox's `Value.Convert` (the TypeBox conformance tests run it). */
25
+ convertOnly(value: unknown): unknown;
26
+ /** `node` converted for `value` at a re-entry point: unchanged when that pair is already being converted. */
27
+ private reenter;
28
+ /** Whether `value` passes the schema `node`; undefined when `node` cannot be compiled. */
29
+ private passes;
30
+ private baseOf;
31
+ private dropOptionalNulls;
32
+ private convert;
33
+ /** One schema node's conversion: its first keyword among `const`, `enum`, the unions, `allOf` and `type`. */
34
+ private convertNode;
35
+ /** An enum is a union of its values: a member stays, else the first value the input converts to. */
36
+ private convertEnum;
37
+ /**
38
+ * A value one branch accepts stays; else the first branch's conversion that the whole union accepts. Branches are
39
+ * converted in order and only until one is accepted, so a later recursive branch is not entered needlessly. A node
40
+ * that also declares members (plain JSON Schema; TypeBox's never do) converts them into each candidate before it is
41
+ * checked, so a branch is not discarded for a sibling property that is converted after it.
42
+ */
43
+ private convertUnion;
44
+ /** The object members of a union or intersection node, when it declares any. */
45
+ private convertMembers;
46
+ private convertArray;
47
+ private convertObject;
48
+ private coerceTypes;
49
+ private coerceUnion;
50
+ private coerceProperties;
51
+ private coerceItems;
52
+ }
53
+ //# sourceMappingURL=coerce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coerce.d.ts","sourceRoot":"","sources":["../src/coerce.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAK9C,8CAA8C;AAC9C,qBAAa,OAAO;IACnB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAW;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,8GAA8G;IAC9G,OAAO,CAAC,IAAI,CAAK;IACjB;;;OAGG;IACH,OAAO,CAAC,IAAI,CAA6D;IAEzE,YAAY,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAG9C;IAED,oGAAoG;IACpG,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI9B;IAED,yFAAyF;IACzF,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAOnC;IAED,6GAA6G;IAC7G,OAAO,CAAC,OAAO;IA8Bf,0FAA0F;IAC1F,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,iBAAiB;IAqDzB,OAAO,CAAC,OAAO;IAef,6GAA6G;IAC7G,OAAO,CAAC,WAAW;IAwCnB,oGAAoG;IACpG,OAAO,CAAC,WAAW;IASnB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAUpB,gFAAgF;IAChF,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,YAAY;IAuBpB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,WAAW;CAMnB"}