@contember/typesafe 1.4.0-rc.7 → 2.0.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/development/index.cjs +351 -0
- package/dist/development/index.cjs.map +1 -0
- package/dist/development/index.js +351 -0
- package/dist/development/index.js.map +1 -0
- package/dist/production/index.cjs +351 -0
- package/dist/production/index.cjs.map +1 -0
- package/dist/production/index.js +351 -0
- package/dist/production/index.js.map +1 -0
- package/dist/{src → types}/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -0
- package/package.json +21 -9
- package/src/tsconfig.json +1 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -361
- package/dist/src/index.js.map +0 -1
- package/dist/src/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
class ParseError extends Error {
|
|
4
|
+
constructor(path, reason, expected) {
|
|
5
|
+
super(`value at ${path.length ? `path /${path.join("/")}` : "root"}: ${reason}`);
|
|
6
|
+
this.path = path;
|
|
7
|
+
this.reason = reason;
|
|
8
|
+
this.expected = expected;
|
|
9
|
+
}
|
|
10
|
+
static format(input, path, expected) {
|
|
11
|
+
return new ParseError(path, `must be ${expected}, ${input === "undefined" ? "undefined" : JSON.stringify(input)} given`, expected);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const fail = (path, reason = "unknown reason") => {
|
|
15
|
+
throw new ParseError(path, reason);
|
|
16
|
+
};
|
|
17
|
+
const string = /* @__PURE__ */ (() => {
|
|
18
|
+
return (input, path = []) => {
|
|
19
|
+
if (typeof input !== "string") throw ParseError.format(input, path, "string");
|
|
20
|
+
return input;
|
|
21
|
+
};
|
|
22
|
+
})();
|
|
23
|
+
const number = /* @__PURE__ */ (() => {
|
|
24
|
+
return (input, path = []) => {
|
|
25
|
+
if (typeof input !== "number") throw ParseError.format(input, path, "number");
|
|
26
|
+
return input;
|
|
27
|
+
};
|
|
28
|
+
})();
|
|
29
|
+
const integer = /* @__PURE__ */ (() => {
|
|
30
|
+
return (input, path = []) => {
|
|
31
|
+
if (typeof input !== "number" || !Number.isInteger(input)) throw ParseError.format(input, path, "integer");
|
|
32
|
+
return input;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
const boolean = /* @__PURE__ */ (() => {
|
|
36
|
+
return (input, path = []) => {
|
|
37
|
+
if (typeof input !== "boolean") throw ParseError.format(input, path, "boolean");
|
|
38
|
+
return input;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
const scalar = /* @__PURE__ */ (() => {
|
|
42
|
+
return (input, path = []) => {
|
|
43
|
+
if (input === null) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
switch (typeof input) {
|
|
47
|
+
case "string":
|
|
48
|
+
case "boolean":
|
|
49
|
+
return input;
|
|
50
|
+
case "number":
|
|
51
|
+
if (!Number.isFinite(input)) {
|
|
52
|
+
throw new ParseError(path, "must be finite number", "number");
|
|
53
|
+
}
|
|
54
|
+
return input;
|
|
55
|
+
default:
|
|
56
|
+
throw ParseError.format(input, path, "string|boolean|number");
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
})();
|
|
60
|
+
const anyJson = /* @__PURE__ */ (() => {
|
|
61
|
+
return (input, path = []) => {
|
|
62
|
+
switch (typeof input) {
|
|
63
|
+
case "string":
|
|
64
|
+
case "boolean":
|
|
65
|
+
return input;
|
|
66
|
+
case "number":
|
|
67
|
+
if (!Number.isFinite(input)) {
|
|
68
|
+
throw new ParseError(path, "must be finite number", "number");
|
|
69
|
+
}
|
|
70
|
+
return input;
|
|
71
|
+
case "object":
|
|
72
|
+
if (input === null) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
if (Array.isArray(input)) {
|
|
76
|
+
return input.map((it, index) => anyJson(it, [...path, index]));
|
|
77
|
+
}
|
|
78
|
+
return anyJsonObject(input, path);
|
|
79
|
+
default:
|
|
80
|
+
throw ParseError.format(input, path, "string|boolean|number|object");
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
})();
|
|
84
|
+
const anyJsonObject = /* @__PURE__ */ (() => {
|
|
85
|
+
return (input, path = []) => {
|
|
86
|
+
if (input === null || typeof input !== "object") throw ParseError.format(input, path, "object");
|
|
87
|
+
return Object.fromEntries(Object.entries(input).map(([key, value]) => {
|
|
88
|
+
return [key, anyJson(value, [...path, key])];
|
|
89
|
+
}));
|
|
90
|
+
};
|
|
91
|
+
})();
|
|
92
|
+
const literal = (inner) => {
|
|
93
|
+
const type = (input, path = []) => {
|
|
94
|
+
if (input !== inner) throw ParseError.format(input, path, JSON.stringify(inner));
|
|
95
|
+
return inner;
|
|
96
|
+
};
|
|
97
|
+
type.inner = inner;
|
|
98
|
+
return type;
|
|
99
|
+
};
|
|
100
|
+
const array = (inner) => {
|
|
101
|
+
const type = (input, path = []) => {
|
|
102
|
+
if (!Array.isArray(input)) throw ParseError.format(input, path, "array");
|
|
103
|
+
return input.map((v, i) => inner(v, [...path, i]));
|
|
104
|
+
};
|
|
105
|
+
type.inner = type;
|
|
106
|
+
return type;
|
|
107
|
+
};
|
|
108
|
+
const object = (inner) => {
|
|
109
|
+
const type = (input, path = []) => {
|
|
110
|
+
if (input === null || typeof input !== "object") throw ParseError.format(input, path, "object");
|
|
111
|
+
return Object.fromEntries(
|
|
112
|
+
Object.entries(inner).map(([k, v]) => {
|
|
113
|
+
const newPath = [...path, k];
|
|
114
|
+
const result = v(input[k], newPath);
|
|
115
|
+
if (result === void 0 && !(k in input)) {
|
|
116
|
+
throw ParseError.format(void 0, newPath, "defined");
|
|
117
|
+
}
|
|
118
|
+
return [k, result];
|
|
119
|
+
})
|
|
120
|
+
);
|
|
121
|
+
};
|
|
122
|
+
type.inner = inner;
|
|
123
|
+
return type;
|
|
124
|
+
};
|
|
125
|
+
const partial = (inner) => {
|
|
126
|
+
const type = (input, path = []) => {
|
|
127
|
+
if (input === null || typeof input !== "object") throw ParseError.format(input, path, "object");
|
|
128
|
+
return Object.fromEntries(Object.entries(inner ?? {}).flatMap(([k, v]) => {
|
|
129
|
+
const newPath = [...path, k];
|
|
130
|
+
if (!(k in input) || input[k] === void 0) {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
const val = v(input[k], newPath);
|
|
134
|
+
if (val === void 0) {
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
return [[k, val]];
|
|
138
|
+
}));
|
|
139
|
+
};
|
|
140
|
+
type.inner = inner;
|
|
141
|
+
return type;
|
|
142
|
+
};
|
|
143
|
+
const noExtraProps = (inner) => {
|
|
144
|
+
const type = (input, path = []) => {
|
|
145
|
+
const result = inner(input, path);
|
|
146
|
+
if (!(typeof input === "object" && typeof input !== null && typeof result === "object" && result !== null)) {
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
const resultProps = new Set(Object.keys(result));
|
|
150
|
+
for (const key in input) {
|
|
151
|
+
if (!resultProps.has(key)) {
|
|
152
|
+
throw fail(path, `extra property ${key} found`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return result;
|
|
156
|
+
};
|
|
157
|
+
type.inner = inner;
|
|
158
|
+
return type;
|
|
159
|
+
};
|
|
160
|
+
const record = (key, value) => {
|
|
161
|
+
const type = (input, path = []) => {
|
|
162
|
+
if (input === null || typeof input !== "object") {
|
|
163
|
+
throw ParseError.format(input, path, "object");
|
|
164
|
+
}
|
|
165
|
+
return Object.fromEntries(
|
|
166
|
+
Object.entries(input).map(([k, v]) => {
|
|
167
|
+
const newPath = [...path, k];
|
|
168
|
+
return [key(k, newPath), value(v, newPath)];
|
|
169
|
+
})
|
|
170
|
+
);
|
|
171
|
+
};
|
|
172
|
+
type.inner = { key, value };
|
|
173
|
+
return type;
|
|
174
|
+
};
|
|
175
|
+
const union = (...inner) => {
|
|
176
|
+
const type = (input, path = []) => {
|
|
177
|
+
const errors = [];
|
|
178
|
+
for (const innerInner of inner) {
|
|
179
|
+
try {
|
|
180
|
+
return innerInner(input, path);
|
|
181
|
+
} catch (e) {
|
|
182
|
+
if (e instanceof ParseError) {
|
|
183
|
+
errors.push(" ".repeat("ParseError: ".length) + e.message);
|
|
184
|
+
} else {
|
|
185
|
+
throw e;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
throw new ParseError(path, "all variants of union has failed:\n" + errors.join("\n"));
|
|
190
|
+
};
|
|
191
|
+
type.inner = inner;
|
|
192
|
+
return type;
|
|
193
|
+
};
|
|
194
|
+
const isSamePath = (a, b) => {
|
|
195
|
+
if (a.length !== b.length) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
for (let i = 0; i < a.length; i++) {
|
|
199
|
+
if (a[i] !== b[i]) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
return true;
|
|
204
|
+
};
|
|
205
|
+
const partiallyDiscriminatedUnion = (field, ...inner) => {
|
|
206
|
+
const type = (input, path = []) => {
|
|
207
|
+
const errors = [];
|
|
208
|
+
for (const innerInner of inner) {
|
|
209
|
+
try {
|
|
210
|
+
return innerInner(input, path);
|
|
211
|
+
} catch (e) {
|
|
212
|
+
if (e instanceof ParseError) {
|
|
213
|
+
if (isSamePath(e.path, [...path, field])) {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
errors.push(" ".repeat("ParseError: ".length) + e.message);
|
|
217
|
+
} else {
|
|
218
|
+
throw e;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
throw new ParseError(path, "all variants of union has failed:\n" + errors.join("\n"));
|
|
223
|
+
};
|
|
224
|
+
type.inner = inner;
|
|
225
|
+
return type;
|
|
226
|
+
};
|
|
227
|
+
const discriminatedUnion = (field, inner) => {
|
|
228
|
+
const type = (input, path = []) => {
|
|
229
|
+
if (input === null || typeof input !== "object") throw ParseError.format(input, path, "object");
|
|
230
|
+
const key = input[field];
|
|
231
|
+
if (typeof key !== "string") throw ParseError.format(key, [...path, field], "string");
|
|
232
|
+
const discriminatedType = inner[key];
|
|
233
|
+
if (discriminatedType === void 0) throw ParseError.format(key, [...path, field], Object.keys(inner).join("|"));
|
|
234
|
+
const { [field]: _, ...inputWithoutDiscr } = input;
|
|
235
|
+
return { [field]: key, ...discriminatedType(inputWithoutDiscr, path) };
|
|
236
|
+
};
|
|
237
|
+
type.inner = inner;
|
|
238
|
+
return type;
|
|
239
|
+
};
|
|
240
|
+
const tuple = (...inner) => {
|
|
241
|
+
const type = (input, path = []) => {
|
|
242
|
+
if (!Array.isArray(input)) throw ParseError.format(input, path, "array");
|
|
243
|
+
if (input.length !== inner.length) throw ParseError.format(input, path, `array with length ${inner.length}`);
|
|
244
|
+
return Object.entries(inner).map(([k, v]) => {
|
|
245
|
+
const newPath = [...path, k];
|
|
246
|
+
if (!(k in input)) {
|
|
247
|
+
throw ParseError.format(void 0, newPath, "defined");
|
|
248
|
+
}
|
|
249
|
+
return v(input[k], newPath);
|
|
250
|
+
});
|
|
251
|
+
};
|
|
252
|
+
type.inner = inner;
|
|
253
|
+
return type;
|
|
254
|
+
};
|
|
255
|
+
const discriminatedTupleUnion = (inner) => {
|
|
256
|
+
const type = (input, path = []) => {
|
|
257
|
+
if (!Array.isArray(input)) throw ParseError.format(input, path, "array");
|
|
258
|
+
if (input.length === 0) throw ParseError.format(input, path, `non-empty array`);
|
|
259
|
+
const tupleType = inner[input[0]];
|
|
260
|
+
if (tupleType === void 0) throw ParseError.format(input, [...path, 0], `one of ${Object.keys(inner).join(", ")}`);
|
|
261
|
+
if (input.length !== tupleType.length + 1) throw ParseError.format(input, path, `array with length ${tupleType.length + 1}`);
|
|
262
|
+
for (let i = 0; i < tupleType.length; i++) {
|
|
263
|
+
tupleType[i](input[i + 1], [...path, i + 1]);
|
|
264
|
+
}
|
|
265
|
+
return input;
|
|
266
|
+
};
|
|
267
|
+
type.inner = inner;
|
|
268
|
+
return type;
|
|
269
|
+
};
|
|
270
|
+
const intersection = (inner1, inner2) => {
|
|
271
|
+
const type = (input, path = []) => {
|
|
272
|
+
return {
|
|
273
|
+
...inner1(input, path),
|
|
274
|
+
...inner2(input, path)
|
|
275
|
+
};
|
|
276
|
+
};
|
|
277
|
+
type.inner = [inner1, inner2];
|
|
278
|
+
return type;
|
|
279
|
+
};
|
|
280
|
+
const enumeration = (...values) => {
|
|
281
|
+
const type = (input, path = []) => {
|
|
282
|
+
if (typeof input !== "string" || !values.includes(input)) throw ParseError.format(input, path, values.join("|"));
|
|
283
|
+
return input;
|
|
284
|
+
};
|
|
285
|
+
type.inner = values;
|
|
286
|
+
return type;
|
|
287
|
+
};
|
|
288
|
+
const null_ = literal(null);
|
|
289
|
+
const true_ = literal(true);
|
|
290
|
+
const false_ = literal(false);
|
|
291
|
+
const nullable = (inner) => {
|
|
292
|
+
const type = (input, path = []) => {
|
|
293
|
+
return input === null ? input : inner(input, path);
|
|
294
|
+
};
|
|
295
|
+
type.inner = inner;
|
|
296
|
+
return type;
|
|
297
|
+
};
|
|
298
|
+
const preprocess = (inner, transform2) => (input, path = []) => {
|
|
299
|
+
return inner(transform2(input), path);
|
|
300
|
+
};
|
|
301
|
+
const transform = (inner, transform2) => (input, path = []) => {
|
|
302
|
+
return transform2(inner(input, path), input);
|
|
303
|
+
};
|
|
304
|
+
const coalesce = (inner, fallback) => {
|
|
305
|
+
const type = (input, path = []) => {
|
|
306
|
+
return inner(input ?? fallback, path);
|
|
307
|
+
};
|
|
308
|
+
type.inner = inner;
|
|
309
|
+
return type;
|
|
310
|
+
};
|
|
311
|
+
const valueAt = (input, path) => {
|
|
312
|
+
let value = input;
|
|
313
|
+
for (const key of path) {
|
|
314
|
+
if (typeof value !== "object" || value === null) {
|
|
315
|
+
return void 0;
|
|
316
|
+
}
|
|
317
|
+
value = value[key];
|
|
318
|
+
}
|
|
319
|
+
return value;
|
|
320
|
+
};
|
|
321
|
+
exports.ParseError = ParseError;
|
|
322
|
+
exports.anyJson = anyJson;
|
|
323
|
+
exports.anyJsonObject = anyJsonObject;
|
|
324
|
+
exports.array = array;
|
|
325
|
+
exports.boolean = boolean;
|
|
326
|
+
exports.coalesce = coalesce;
|
|
327
|
+
exports.discriminatedTupleUnion = discriminatedTupleUnion;
|
|
328
|
+
exports.discriminatedUnion = discriminatedUnion;
|
|
329
|
+
exports.enumeration = enumeration;
|
|
330
|
+
exports.fail = fail;
|
|
331
|
+
exports.false_ = false_;
|
|
332
|
+
exports.integer = integer;
|
|
333
|
+
exports.intersection = intersection;
|
|
334
|
+
exports.literal = literal;
|
|
335
|
+
exports.noExtraProps = noExtraProps;
|
|
336
|
+
exports.null_ = null_;
|
|
337
|
+
exports.nullable = nullable;
|
|
338
|
+
exports.number = number;
|
|
339
|
+
exports.object = object;
|
|
340
|
+
exports.partial = partial;
|
|
341
|
+
exports.partiallyDiscriminatedUnion = partiallyDiscriminatedUnion;
|
|
342
|
+
exports.preprocess = preprocess;
|
|
343
|
+
exports.record = record;
|
|
344
|
+
exports.scalar = scalar;
|
|
345
|
+
exports.string = string;
|
|
346
|
+
exports.transform = transform;
|
|
347
|
+
exports.true_ = true_;
|
|
348
|
+
exports.tuple = tuple;
|
|
349
|
+
exports.union = union;
|
|
350
|
+
exports.valueAt = valueAt;
|
|
351
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../packages/typesafe/src/index.ts"],"sourcesContent":["type Unpacked<T> = T extends readonly (infer U)[] ? U : never\n\nexport type JsonObject = {\n\treadonly [P in string]?: Json\n}\nexport type Scalar =\n\t| string\n\t| number\n\t| boolean\n\t| null\nexport type Json =\n\t| Scalar\n\t| readonly Json[]\n\t| JsonObject\n\nexport interface Type<T extends Json | {readonly [K in string]?: Json} | undefined = Json> {\n\t(input: unknown, path?: PropertyKey[]): T\n\treadonly inner?: any\n}\n\nexport class ParseError extends Error {\n\tconstructor(readonly path: PropertyKey[], readonly reason: string, readonly expected?: string) {\n\t\tsuper(`value at ${path.length ? `path /${path.join('/')}` : 'root'}: ${reason}`)\n\t}\n\n\tstatic format(input: unknown, path: PropertyKey[], expected: string) {\n\t\treturn new ParseError(path, `must be ${expected}, ${input === 'undefined' ? 'undefined' : JSON.stringify(input)} given`, expected)\n\t}\n}\n\nexport const fail = (path: PropertyKey[], reason: string = 'unknown reason'): never => {\n\tthrow new ParseError(path, reason)\n}\n\nexport const string = ((): Type<string> => {\n\treturn (input: unknown, path: PropertyKey[] = []) => {\n\t\tif (typeof input !== 'string') throw ParseError.format(input, path, 'string')\n\t\treturn input\n\t}\n})()\n\nexport const number = ((): Type<number> => {\n\treturn (input: unknown, path: PropertyKey[] = []) => {\n\t\tif (typeof input !== 'number') throw ParseError.format(input, path, 'number')\n\t\treturn input\n\t}\n})()\n\nexport const integer = ((): Type<number> => {\n\treturn (input: unknown, path: PropertyKey[] = []) => {\n\t\tif (typeof input !== 'number' || !Number.isInteger(input)) throw ParseError.format(input, path, 'integer')\n\t\treturn input\n\t}\n})()\n\nexport const boolean = ((): Type<boolean> => {\n\treturn (input: unknown, path: PropertyKey[] = []) => {\n\t\tif (typeof input !== 'boolean') throw ParseError.format(input, path, 'boolean')\n\t\treturn input\n\t}\n})()\n\n\nexport const scalar = ((): Type<Scalar> => {\n\treturn (input: unknown, path: PropertyKey[] = []): Scalar => {\n\t\tif (input === null) {\n\t\t\treturn null\n\t\t}\n\t\tswitch (typeof input) {\n\t\t\tcase 'string':\n\t\t\tcase 'boolean':\n\t\t\t\treturn input\n\t\t\tcase 'number':\n\t\t\t\tif (!Number.isFinite(input)) {\n\t\t\t\t\tthrow new ParseError(path, 'must be finite number', 'number')\n\t\t\t\t}\n\t\t\t\treturn input\n\t\t\tdefault:\n\t\t\t\tthrow ParseError.format(input, path, 'string|boolean|number')\n\t\t}\n\t}\n})()\n\nexport const anyJson = ((): Type<Json> => {\n\treturn (input: unknown, path: PropertyKey[] = []): Json => {\n\t\tswitch (typeof input) {\n\t\t\tcase 'string':\n\t\t\tcase 'boolean':\n\t\t\t\treturn input\n\t\t\tcase 'number':\n\t\t\t\tif (!Number.isFinite(input)) {\n\t\t\t\t\tthrow new ParseError(path, 'must be finite number', 'number')\n\t\t\t\t}\n\t\t\t\treturn input\n\t\t\tcase 'object':\n\t\t\t\tif (input === null) {\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t\tif (Array.isArray(input)) {\n\t\t\t\t\treturn input.map((it, index) => anyJson(it, [...path, index]))\n\t\t\t\t}\n\t\t\t\treturn anyJsonObject(input, path)\n\t\t\tdefault:\n\t\t\t\tthrow ParseError.format(input, path, 'string|boolean|number|object')\n\t\t}\n\t}\n})()\n\nexport const anyJsonObject = ((): Type<JsonObject> => {\n\treturn (input: unknown, path: PropertyKey[] = []): JsonObject => {\n\t\tif (input === null || typeof input !== 'object') throw ParseError.format(input, path, 'object')\n\t\treturn Object.fromEntries(Object.entries(input).map(([key, value]) => {\n\t\t\treturn [key, anyJson(value, [...path, key])]\n\t\t}))\n\t}\n})()\n\nexport const literal = <T extends Json>(inner: T): Type<T> => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): T => {\n\t\tif (input !== inner) throw ParseError.format(input, path, JSON.stringify(inner))\n\t\treturn inner\n\t}\n\n\ttype.inner = inner\n\n\treturn type\n}\n\nexport const array = <T extends Json>(inner: Type<T>): Type<readonly T[]> => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): readonly T[] => {\n\t\tif (!Array.isArray(input)) throw ParseError.format(input, path, 'array')\n\t\treturn input.map((v, i) => inner(v, [...path, i]))\n\t}\n\n\ttype.inner = type\n\n\treturn type\n}\n\nexport const object = <T extends Record<string, Type<Json>>>(inner: T): Type<{ readonly [P in keyof T]: ReturnType<T[P]> }> => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): { readonly [P in keyof T]: ReturnType<T[P]> } => {\n\t\tif (input === null || typeof input !== 'object') throw ParseError.format(input, path, 'object')\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(inner).map(([k, v]) => {\n\t\t\t\tconst newPath = [...path, k]\n\t\t\t\tconst result = v((input as any)[k], newPath)\n\t\t\t\tif (result === undefined && !(k in (input as object))) {\n\t\t\t\t\tthrow ParseError.format(undefined, newPath, 'defined')\n\t\t\t\t}\n\t\t\t\treturn [k, result]\n\t\t\t}),\n\t\t) as any\n\t}\n\n\ttype.inner = inner\n\n\treturn type\n}\n\nexport const partial = <T extends Record<string, Type<Json | undefined>>>(inner: T) => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): { readonly [P in keyof T]?: Exclude<ReturnType<T[P]>, undefined> } => {\n\t\tif (input === null || typeof input !== 'object') throw ParseError.format(input, path, 'object')\n\t\treturn Object.fromEntries(Object.entries(inner ?? {}).flatMap(([k, v]) => {\n\t\t\tconst newPath = [...path, k]\n\t\t\tif (!(k in (input as object)) || (input as any)[k] === undefined) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\tconst val = v((input as any)[k], newPath)\n\t\t\tif (val === undefined) {\n\t\t\t\treturn []\n\t\t\t}\n\t\t\treturn [[k, val]]\n\t\t})) as any\n\t}\n\n\ttype.inner = inner\n\n\treturn type\n}\n\nexport const noExtraProps = <T extends JsonObject>(inner: Type<T>) => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): T => {\n\t\tconst result = inner(input, path)\n\t\tif (!(typeof input === 'object' && typeof input !== null && typeof result === 'object' && result !== null)) {\n\t\t\treturn result\n\t\t}\n\t\tconst resultProps = new Set(Object.keys(result))\n\t\tfor (const key in input) {\n\t\t\tif (!resultProps.has(key)) {\n\t\t\t\tthrow fail(path, `extra property ${key} found`)\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n\n\ttype.inner = inner\n\n\treturn type\n}\n\n\nexport const record = <K extends Type<string>, T extends Type<Json>>(key: K, value: T): Type<{ readonly [P in ReturnType<K>]: ReturnType<T> }> => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): { readonly [P in ReturnType<K>]: ReturnType<T> } => {\n\t\tif (input === null || typeof input !== 'object') {\n\t\t\tthrow ParseError.format(input, path, 'object')\n\t\t}\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(input as any).map(([k, v]) => {\n\t\t\t\tconst newPath = [...path, k]\n\t\t\t\treturn [key(k, newPath), value(v, newPath)]\n\t\t\t}),\n\t\t) as any\n\t}\n\n\ttype.inner = { key, value }\n\n\treturn type\n}\n\n\nexport const union = <T extends Type<Json>[]>(...inner: T): Type<ReturnType<Unpacked<T>>> => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): ReturnType<Unpacked<T>> => {\n\t\tconst errors = []\n\t\tfor (const innerInner of inner) {\n\t\t\ttry {\n\t\t\t\treturn innerInner(input, path) as any\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof ParseError) {\n\t\t\t\t\terrors.push(' '.repeat('ParseError: '.length) + e.message)\n\t\t\t\t} else {\n\t\t\t\t\tthrow e\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthrow new ParseError(path, 'all variants of union has failed:\\n' + errors.join('\\n'))\n\t}\n\n\ttype.inner = inner\n\n\treturn type\n}\n\nconst isSamePath = (a: PropertyKey[], b: PropertyKey[]) => {\n\tif (a.length !== b.length) {\n\t\treturn false\n\t}\n\tfor (let i = 0; i < a.length; i++) {\n\t\tif (a[i] !== b[i]) {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nexport const partiallyDiscriminatedUnion = <T extends Type<JsonObject>[]>(field: string, ...inner: T): Type<ReturnType<Unpacked<T>>> => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): ReturnType<Unpacked<T>> => {\n\t\tconst errors = []\n\t\tfor (const innerInner of inner) {\n\t\t\ttry {\n\t\t\t\treturn innerInner(input, path) as any\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof ParseError) {\n\t\t\t\t\tif (isSamePath(e.path, [...path, field])) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\terrors.push(' '.repeat('ParseError: '.length) + e.message)\n\t\t\t\t} else {\n\t\t\t\t\tthrow e\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthrow new ParseError(path, 'all variants of union has failed:\\n' + errors.join('\\n'))\n\t}\n\n\ttype.inner = inner\n\n\treturn type\n}\n\nexport const discriminatedUnion = <F extends string, T extends {[key: string]: JsonObject}>(field: F, inner: {[K in keyof T]: Type<T[K]>}): Type<{ [K in keyof T]: { [X in F]: K } & T[K] }[keyof T]> => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): { [K in keyof T]: { [X in F]: K } & T[K] }[keyof T] => {\n\t\tif (input === null || typeof input !== 'object') throw ParseError.format(input, path, 'object')\n\t\tconst key = (input as any)[field]\n\t\tif (typeof key !== 'string') throw ParseError.format(key, [...path, field], 'string')\n\n\t\tconst discriminatedType = inner[key]\n\t\tif (discriminatedType === undefined) throw ParseError.format(key, [...path, field], Object.keys(inner).join('|'))\n\n\t\tconst { [field]: _, ...inputWithoutDiscr } = input\n\n\t\treturn { [field]: key, ...discriminatedType(inputWithoutDiscr, path) }\n\n\t}\n\ttype.inner = inner\n\n\treturn type\n}\n\ntype TupleFromTupledType<T extends Type<Json>[]> = T extends [Type<infer X>, ...infer Y]\n\t? (Y extends Type<Json>[] ? readonly [X, ...TupleFromTupledType<Y>] : readonly [])\n\t: readonly []\n\nexport const tuple = <T extends Type<Json>[]>(...inner: T): Type<TupleFromTupledType<T>> => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): TupleFromTupledType<T> => {\n\t\tif (!Array.isArray(input)) throw ParseError.format(input, path, 'array')\n\t\tif (input.length !== inner.length) throw ParseError.format(input, path, `array with length ${inner.length}`)\n\t\treturn Object.entries(inner).map(([k, v]) => {\n\t\t\tconst newPath = [...path, k]\n\t\t\tif (!(k in input)) {\n\t\t\t\tthrow ParseError.format(undefined, newPath, 'defined')\n\t\t\t}\n\t\t\treturn v(input[k as unknown as number], newPath)\n\t\t}) as any\n\t}\n\n\ttype.inner = inner\n\n\treturn type\n}\n\ntype DiscriminatedTupleUnionType<T extends Record<string, Type<Json>[]>> =\n\t{ [K in keyof T]: (readonly [K, ...TupleFromTupledType<T[K]>]) }[keyof T & string]\n\nexport const discriminatedTupleUnion = <T extends Record<string, Type<Json>[]>>(inner: T): Type<DiscriminatedTupleUnionType<T>> => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): DiscriminatedTupleUnionType<T> => {\n\t\tif (!Array.isArray(input)) throw ParseError.format(input, path, 'array')\n\t\tif (input.length === 0) throw ParseError.format(input, path, `non-empty array`)\n\n\t\tconst tupleType = inner[input[0]]\n\t\tif (tupleType === undefined) throw ParseError.format(input, [...path, 0], `one of ${Object.keys(inner).join(', ')}`)\n\t\tif (input.length !== tupleType.length + 1) throw ParseError.format(input, path, `array with length ${tupleType.length + 1}`)\n\n\t\tfor (let i = 0; i < tupleType.length; i++) {\n\t\t\ttupleType[i](input[i + 1], [...path, i + 1])\n\t\t}\n\n\t\treturn input as any\n\t}\n\n\ttype.inner = inner\n\n\treturn type\n}\n\nexport const intersection = <T1 extends JsonObject, T2 extends JsonObject>(inner1: Type<T1>, inner2: Type<T2>): Type<T1 & T2> => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): T1 & T2 => {\n\t\treturn {\n\t\t\t...inner1(input, path),\n\t\t\t...inner2(input, path),\n\t\t}\n\t}\n\n\ttype.inner = [inner1, inner2]\n\n\treturn type\n}\n\nexport const enumeration = <T extends string>(...values: T[]): Type<T> => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): T => {\n\t\tif (typeof input !== 'string' || !values.includes(input as T)) throw ParseError.format(input, path, values.join('|'))\n\t\treturn input as T\n\t}\n\ttype.inner = values\n\treturn type\n}\n\nexport const null_ = literal(null)\nexport const true_ = literal(true)\nexport const false_ = literal(false)\n\nexport const nullable = <T extends Json>(inner: Type<T>): Type<T | null> => {\n\tconst type = (input: unknown, path: PropertyKey[] = []) => {\n\t\treturn input === null ? input : inner(input, path)\n\t}\n\n\ttype.inner = inner\n\treturn type\n}\n\nexport const preprocess = <Input extends Json>(inner: Type<Input>, transform: (input: unknown) => unknown) => (input: unknown, path: PropertyKey[] = []): Input => {\n\treturn inner(transform(input), path)\n}\n\nexport const transform = <Input extends Json, Result extends Json>(inner: Type<Input>, transform: (value: Input, input: unknown) => Result) => (input: unknown, path: PropertyKey[] = []): Result => {\n\treturn transform(inner(input, path), input)\n}\n\nexport const coalesce = <T extends Json, F extends Json>(inner: Type<T>, fallback: F): Type<T | F> => {\n\tconst type = (input: unknown, path: PropertyKey[] = []): T | F => {\n\t\treturn inner(input ?? fallback, path)\n\t}\n\n\ttype.inner = inner\n\n\treturn type\n}\n\nexport const valueAt = (input: any, path: PropertyKey[]): unknown | undefined => {\n\tlet value = input\n\tfor (const key of path) {\n\t\tif (typeof value !== 'object' || value === null) {\n\t\t\treturn undefined\n\t\t}\n\t\tvalue = (value as any)[key]\n\t}\n\treturn value\n}\n\ntype EqualsWrapped<T> = T extends infer R & {}\n\t? {\n\t\t[P in keyof R]: R[P]\n\t}\n\t: never\n\nexport type Equals<A, B> = (<T>() => T extends EqualsWrapped<A> ? 1 : 2) extends <T>() => T extends EqualsWrapped<B> ? 1 : 2\n\t? true\n\t: false\n"],"names":["transform"],"mappings":"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"}
|