@contember/typesafe 2.1.0-alpha.9 → 2.1.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/development/index.cjs +19 -15
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +19 -15
- package/dist/development/index.js.map +1 -1
- package/dist/production/index.cjs +19 -15
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +19 -15
- package/dist/production/index.js.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -3
- package/src/index.ts +38 -33
|
@@ -84,9 +84,11 @@ const anyJson = /* @__PURE__ */ (() => {
|
|
|
84
84
|
const anyJsonObject = /* @__PURE__ */ (() => {
|
|
85
85
|
return (input, path = []) => {
|
|
86
86
|
if (input === null || typeof input !== "object") throw ParseError.format(input, path, "object");
|
|
87
|
-
return Object.fromEntries(
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
return Object.fromEntries(
|
|
88
|
+
Object.entries(input).map(([key, value]) => {
|
|
89
|
+
return [key, anyJson(value, [...path, key])];
|
|
90
|
+
})
|
|
91
|
+
);
|
|
90
92
|
};
|
|
91
93
|
})();
|
|
92
94
|
const literal = (inner) => {
|
|
@@ -125,17 +127,19 @@ const object = (inner) => {
|
|
|
125
127
|
const partial = (inner) => {
|
|
126
128
|
const type = (input, path = []) => {
|
|
127
129
|
if (input === null || typeof input !== "object") throw ParseError.format(input, path, "object");
|
|
128
|
-
return Object.fromEntries(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
130
|
+
return Object.fromEntries(
|
|
131
|
+
Object.entries(inner ?? {}).flatMap(([k, v]) => {
|
|
132
|
+
const newPath = [...path, k];
|
|
133
|
+
if (!(k in input) || input[k] === void 0) {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
const val = v(input[k], newPath);
|
|
137
|
+
if (val === void 0) {
|
|
138
|
+
return [];
|
|
139
|
+
}
|
|
140
|
+
return [[k, val]];
|
|
141
|
+
})
|
|
142
|
+
);
|
|
139
143
|
};
|
|
140
144
|
type.inner = inner;
|
|
141
145
|
return type;
|
|
@@ -143,7 +147,7 @@ const partial = (inner) => {
|
|
|
143
147
|
const noExtraProps = (inner) => {
|
|
144
148
|
const type = (input, path = []) => {
|
|
145
149
|
const result = inner(input, path);
|
|
146
|
-
if (!(typeof input === "object" &&
|
|
150
|
+
if (!(typeof input === "object" && input !== null && typeof result === "object" && result !== null)) {
|
|
147
151
|
return result;
|
|
148
152
|
}
|
|
149
153
|
const resultProps = new Set(Object.keys(result));
|
|
@@ -1 +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, path: PropertyKey[]) => Result) => (input: unknown, path: PropertyKey[] = []): Result => {\n\treturn transform(inner(input, path), input, path)\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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"}
|
|
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\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(\n\t\t\tObject.entries(input).map(([key, value]) => {\n\t\t\t\treturn [key, anyJson(value, [...path, key])]\n\t\t\t}),\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(\n\t\t\tObject.entries(inner ?? {}).flatMap(([k, v]) => {\n\t\t\t\tconst newPath = [...path, k]\n\t\t\t\tif (!(k in (input as object)) || (input as any)[k] === undefined) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\tconst val = v((input as any)[k], newPath)\n\t\t\t\tif (val === undefined) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\treturn [[k, val]]\n\t\t\t}),\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' && 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\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\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 }>(\n\tfield: F,\n\tinner: { [K in keyof T]: Type<T[K]> },\n): 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\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]>])\n}[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 =\n\t<Input extends Json>(inner: Type<Input>, transform: (input: unknown) => unknown) => (input: unknown, path: PropertyKey[] = []): Input => {\n\t\treturn inner(transform(input), path)\n\t}\n\nexport const transform =\n\t<Input extends Json, Result extends Json>(inner: Type<Input>, transform: (value: Input, input: unknown, path: PropertyKey[]) => Result) =>\n\t(input: unknown, path: PropertyKey[] = []): Result => {\n\t\treturn transform(inner(input, path), input, path)\n\t}\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\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 ? true\n\t: false\n"],"names":["transform"],"mappings":"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"}
|
|
@@ -82,9 +82,11 @@ const anyJson = /* @__PURE__ */ (() => {
|
|
|
82
82
|
const anyJsonObject = /* @__PURE__ */ (() => {
|
|
83
83
|
return (input, path = []) => {
|
|
84
84
|
if (input === null || typeof input !== "object") throw ParseError.format(input, path, "object");
|
|
85
|
-
return Object.fromEntries(
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
return Object.fromEntries(
|
|
86
|
+
Object.entries(input).map(([key, value]) => {
|
|
87
|
+
return [key, anyJson(value, [...path, key])];
|
|
88
|
+
})
|
|
89
|
+
);
|
|
88
90
|
};
|
|
89
91
|
})();
|
|
90
92
|
const literal = (inner) => {
|
|
@@ -123,17 +125,19 @@ const object = (inner) => {
|
|
|
123
125
|
const partial = (inner) => {
|
|
124
126
|
const type = (input, path = []) => {
|
|
125
127
|
if (input === null || typeof input !== "object") throw ParseError.format(input, path, "object");
|
|
126
|
-
return Object.fromEntries(
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
128
|
+
return Object.fromEntries(
|
|
129
|
+
Object.entries(inner ?? {}).flatMap(([k, v]) => {
|
|
130
|
+
const newPath = [...path, k];
|
|
131
|
+
if (!(k in input) || input[k] === void 0) {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
const val = v(input[k], newPath);
|
|
135
|
+
if (val === void 0) {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
return [[k, val]];
|
|
139
|
+
})
|
|
140
|
+
);
|
|
137
141
|
};
|
|
138
142
|
type.inner = inner;
|
|
139
143
|
return type;
|
|
@@ -141,7 +145,7 @@ const partial = (inner) => {
|
|
|
141
145
|
const noExtraProps = (inner) => {
|
|
142
146
|
const type = (input, path = []) => {
|
|
143
147
|
const result = inner(input, path);
|
|
144
|
-
if (!(typeof input === "object" &&
|
|
148
|
+
if (!(typeof input === "object" && input !== null && typeof result === "object" && result !== null)) {
|
|
145
149
|
return result;
|
|
146
150
|
}
|
|
147
151
|
const resultProps = new Set(Object.keys(result));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","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, path: PropertyKey[]) => Result) => (input: unknown, path: PropertyKey[] = []): Result => {\n\treturn transform(inner(input, path), input, path)\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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"}
|
|
1
|
+
{"version":3,"file":"index.js","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\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(\n\t\t\tObject.entries(input).map(([key, value]) => {\n\t\t\t\treturn [key, anyJson(value, [...path, key])]\n\t\t\t}),\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(\n\t\t\tObject.entries(inner ?? {}).flatMap(([k, v]) => {\n\t\t\t\tconst newPath = [...path, k]\n\t\t\t\tif (!(k in (input as object)) || (input as any)[k] === undefined) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\tconst val = v((input as any)[k], newPath)\n\t\t\t\tif (val === undefined) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\treturn [[k, val]]\n\t\t\t}),\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' && 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\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\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 }>(\n\tfield: F,\n\tinner: { [K in keyof T]: Type<T[K]> },\n): 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\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]>])\n}[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 =\n\t<Input extends Json>(inner: Type<Input>, transform: (input: unknown) => unknown) => (input: unknown, path: PropertyKey[] = []): Input => {\n\t\treturn inner(transform(input), path)\n\t}\n\nexport const transform =\n\t<Input extends Json, Result extends Json>(inner: Type<Input>, transform: (value: Input, input: unknown, path: PropertyKey[]) => Result) =>\n\t(input: unknown, path: PropertyKey[] = []): Result => {\n\t\treturn transform(inner(input, path), input, path)\n\t}\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\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 ? true\n\t: false\n"],"names":["transform"],"mappings":"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"}
|
|
@@ -84,9 +84,11 @@ const anyJson = /* @__PURE__ */ (() => {
|
|
|
84
84
|
const anyJsonObject = /* @__PURE__ */ (() => {
|
|
85
85
|
return (input, path = []) => {
|
|
86
86
|
if (input === null || typeof input !== "object") throw ParseError.format(input, path, "object");
|
|
87
|
-
return Object.fromEntries(
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
return Object.fromEntries(
|
|
88
|
+
Object.entries(input).map(([key, value]) => {
|
|
89
|
+
return [key, anyJson(value, [...path, key])];
|
|
90
|
+
})
|
|
91
|
+
);
|
|
90
92
|
};
|
|
91
93
|
})();
|
|
92
94
|
const literal = (inner) => {
|
|
@@ -125,17 +127,19 @@ const object = (inner) => {
|
|
|
125
127
|
const partial = (inner) => {
|
|
126
128
|
const type = (input, path = []) => {
|
|
127
129
|
if (input === null || typeof input !== "object") throw ParseError.format(input, path, "object");
|
|
128
|
-
return Object.fromEntries(
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
130
|
+
return Object.fromEntries(
|
|
131
|
+
Object.entries(inner ?? {}).flatMap(([k, v]) => {
|
|
132
|
+
const newPath = [...path, k];
|
|
133
|
+
if (!(k in input) || input[k] === void 0) {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
const val = v(input[k], newPath);
|
|
137
|
+
if (val === void 0) {
|
|
138
|
+
return [];
|
|
139
|
+
}
|
|
140
|
+
return [[k, val]];
|
|
141
|
+
})
|
|
142
|
+
);
|
|
139
143
|
};
|
|
140
144
|
type.inner = inner;
|
|
141
145
|
return type;
|
|
@@ -143,7 +147,7 @@ const partial = (inner) => {
|
|
|
143
147
|
const noExtraProps = (inner) => {
|
|
144
148
|
const type = (input, path = []) => {
|
|
145
149
|
const result = inner(input, path);
|
|
146
|
-
if (!(typeof input === "object" &&
|
|
150
|
+
if (!(typeof input === "object" && input !== null && typeof result === "object" && result !== null)) {
|
|
147
151
|
return result;
|
|
148
152
|
}
|
|
149
153
|
const resultProps = new Set(Object.keys(result));
|
|
@@ -1 +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, path: PropertyKey[]) => Result) => (input: unknown, path: PropertyKey[] = []): Result => {\n\treturn transform(inner(input, path), input, path)\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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"}
|
|
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\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(\n\t\t\tObject.entries(input).map(([key, value]) => {\n\t\t\t\treturn [key, anyJson(value, [...path, key])]\n\t\t\t}),\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(\n\t\t\tObject.entries(inner ?? {}).flatMap(([k, v]) => {\n\t\t\t\tconst newPath = [...path, k]\n\t\t\t\tif (!(k in (input as object)) || (input as any)[k] === undefined) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\tconst val = v((input as any)[k], newPath)\n\t\t\t\tif (val === undefined) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\treturn [[k, val]]\n\t\t\t}),\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' && 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\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\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 }>(\n\tfield: F,\n\tinner: { [K in keyof T]: Type<T[K]> },\n): 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\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]>])\n}[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 =\n\t<Input extends Json>(inner: Type<Input>, transform: (input: unknown) => unknown) => (input: unknown, path: PropertyKey[] = []): Input => {\n\t\treturn inner(transform(input), path)\n\t}\n\nexport const transform =\n\t<Input extends Json, Result extends Json>(inner: Type<Input>, transform: (value: Input, input: unknown, path: PropertyKey[]) => Result) =>\n\t(input: unknown, path: PropertyKey[] = []): Result => {\n\t\treturn transform(inner(input, path), input, path)\n\t}\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\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 ? true\n\t: false\n"],"names":["transform"],"mappings":"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"}
|
package/dist/production/index.js
CHANGED
|
@@ -82,9 +82,11 @@ const anyJson = /* @__PURE__ */ (() => {
|
|
|
82
82
|
const anyJsonObject = /* @__PURE__ */ (() => {
|
|
83
83
|
return (input, path = []) => {
|
|
84
84
|
if (input === null || typeof input !== "object") throw ParseError.format(input, path, "object");
|
|
85
|
-
return Object.fromEntries(
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
return Object.fromEntries(
|
|
86
|
+
Object.entries(input).map(([key, value]) => {
|
|
87
|
+
return [key, anyJson(value, [...path, key])];
|
|
88
|
+
})
|
|
89
|
+
);
|
|
88
90
|
};
|
|
89
91
|
})();
|
|
90
92
|
const literal = (inner) => {
|
|
@@ -123,17 +125,19 @@ const object = (inner) => {
|
|
|
123
125
|
const partial = (inner) => {
|
|
124
126
|
const type = (input, path = []) => {
|
|
125
127
|
if (input === null || typeof input !== "object") throw ParseError.format(input, path, "object");
|
|
126
|
-
return Object.fromEntries(
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
128
|
+
return Object.fromEntries(
|
|
129
|
+
Object.entries(inner ?? {}).flatMap(([k, v]) => {
|
|
130
|
+
const newPath = [...path, k];
|
|
131
|
+
if (!(k in input) || input[k] === void 0) {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
const val = v(input[k], newPath);
|
|
135
|
+
if (val === void 0) {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
return [[k, val]];
|
|
139
|
+
})
|
|
140
|
+
);
|
|
137
141
|
};
|
|
138
142
|
type.inner = inner;
|
|
139
143
|
return type;
|
|
@@ -141,7 +145,7 @@ const partial = (inner) => {
|
|
|
141
145
|
const noExtraProps = (inner) => {
|
|
142
146
|
const type = (input, path = []) => {
|
|
143
147
|
const result = inner(input, path);
|
|
144
|
-
if (!(typeof input === "object" &&
|
|
148
|
+
if (!(typeof input === "object" && input !== null && typeof result === "object" && result !== null)) {
|
|
145
149
|
return result;
|
|
146
150
|
}
|
|
147
151
|
const resultProps = new Set(Object.keys(result));
|