UNPKG

@jsonjoy.com/json-type

Version:

High-performance JSON Pointer implementation

100 lines (99 loc) 6.02 kB
import * as schema from '../schema'; import * as classes from './classes'; import type { Type, TypeOfAlias } from './types'; type UnionToIntersection<U> = (U extends never ? never : (arg: U) => never) extends (arg: infer I) => void ? I : never; type UnionToTuple<T> = UnionToIntersection<T extends never ? never : (t: T) => T> extends (_: never) => infer W ? [...UnionToTuple<Exclude<T, W>>, W] : []; type ObjValueTuple<T, KS extends any[] = UnionToTuple<keyof T>, R extends any[] = []> = KS extends [ infer K, ...infer KT ] ? ObjValueTuple<T, KT, [...R, T[K & keyof T]]> : R; type RecordToFields<O extends Record<string, Type>> = ObjValueTuple<{ [K in keyof O]: classes.KeyType<K extends string ? K : never, O[K]>; }>; export declare class TypeBuilder { system?: classes.ModuleType | undefined; constructor(system?: classes.ModuleType | undefined); get any(): classes.AnyType; get undef(): classes.ConType<undefined>; get nil(): classes.ConType<null>; get bool(): classes.BoolType; get num(): classes.NumType; get str(): classes.StrType; get bin(): classes.BinType<classes.AnyType>; get arr(): classes.ArrType<classes.AnyType, [], []>; get obj(): classes.ObjType<[]>; get map(): classes.MapType<classes.AnyType>; get fn(): classes.FnType<classes.ConType<undefined>, classes.ConType<undefined>, unknown>; get fn$(): classes.FnRxType<classes.ConType<undefined>, classes.ConType<undefined>, unknown>; readonly or: <F extends Type[]>(...types: F) => classes.OrType<F>; readonly undefined: () => classes.ConType<undefined>; readonly null: () => classes.ConType<null>; readonly boolean: () => classes.BoolType; readonly number: () => classes.NumType; readonly string: () => classes.StrType; readonly binary: () => classes.BinType<classes.AnyType>; readonly con: <V>(value: schema.Narrow<V>, options?: schema.Optional<schema.ConSchema>) => classes.ConType<string extends V ? never : number extends V ? never : boolean extends V ? never : any[] extends V ? never : V>; readonly literal: <V>(value: schema.Narrow<V>, options?: schema.Optional<schema.ConSchema>) => classes.ConType<string extends V ? never : number extends V ? never : boolean extends V ? never : any[] extends V ? never : V>; readonly array: <T>(type?: T, options?: schema.Optional<schema.ArrSchema>) => classes.ArrType<T extends Type ? T : classes.AnyType, [], []>; readonly tuple: <F extends Type[]>(...types: F) => classes.ArrType<undefined, F, []>; /** * Creates an object type with the specified properties. This is a shorthand for * `t.Object(t.prop(key, value), ...)`. * * Importantly, this method does not allow to specify object field order, * so the order of properties in the resulting type is not guaranteed. * * Example: * * ```ts * t.object({ * id: t.str, * name: t.string(), * age: t.num, * verified: t.bool, * }); * ``` * * @param record A mapping of property names to types. * @returns An object type. */ readonly object: <R extends Record<string, Type>>(record: R) => classes.ObjType<RecordToFields<R>>; /** * Creates a type that represents a value that may be present or absent. The * value is `undefined` if absent. This is a shorthand for `t.Or(type, t.undef)`. */ readonly maybe: <T extends Type>(type: T) => classes.OrType<[T, classes.ConType<undefined>]>; /** * Creates a union type from a list of values. This is a shorthand for * `t.Or(t.Const(value1), t.Const(value2), ...)`. For example, the below * are equivalent: * * ```ts * t.enum('red', 'green', 'blue'); * t.Or(t.Const('red'), t.Const('green'), t.Const('blue')); * ``` * * @param values The values to include in the union. * @returns A union type representing the values. */ readonly enum: <const T extends (string | number | boolean | null)[]>(...values: T) => classes.OrType<{ [K in keyof T]: classes.ConType<schema.Narrow<T[K]>>; }>; Any(options?: schema.Optional<schema.AnySchema>): classes.AnyType; Const<const V>(value: schema.Narrow<V>, options?: schema.Optional<schema.ConSchema>): classes.ConType<string extends V ? never : number extends V ? never : boolean extends V ? never : any[] extends V ? never : V>; Boolean(options?: schema.Optional<schema.BoolSchema>): classes.BoolType; Number(options?: schema.Optional<schema.NumSchema>): classes.NumType; String(options?: schema.Optional<schema.StrSchema>): classes.StrType; Binary<T extends Type>(type: T, options?: schema.Optional<schema.BinSchema>): classes.BinType<T>; Array<T extends Type>(type: T, options?: schema.Optional<schema.ArrSchema>): classes.ArrType<T, [], []>; Tuple<const Head extends Type[], Item extends Type | void = undefined, const Tail extends Type[] = []>(head: Head, item?: Item, tail?: Tail, options?: schema.Optional<schema.ArrSchema>): classes.ArrType<Item, Head, Tail>; Object<F extends (classes.KeyType<any, any> | classes.KeyOptType<any, any>)[]>(...keys: F): classes.ObjType<F>; Key<K extends string, V extends Type>(key: K, value: V): classes.KeyType<K, V>; KeyOpt<K extends string, V extends Type>(key: K, value: V): classes.KeyOptType<K, V>; Map<T extends Type>(val: T, key?: Type, options?: schema.Optional<schema.MapSchema>): classes.MapType<T>; Or<F extends Type[]>(...types: F): classes.OrType<F>; Ref<T extends Type | classes.AliasType<any, any>>(ref: string): classes.RefType<TypeOfAlias<T>>; Function<Req extends Type, Res extends Type, Ctx = unknown>(req: Req, res: Res, options?: schema.Optional<schema.FnSchema>): classes.FnType<Req, Res, Ctx>; Function$<Req extends Type, Res extends Type, Ctx = unknown>(req: Req, res: Res, options?: schema.Optional<schema.FnRxSchema>): classes.FnRxType<Req, Res, Ctx>; import(node: schema.Schema): Type; from(value: unknown): Type; } export {};