import * as V from './validate'; type Constructor = new (...args: any[]) => T; export { Validator, Primitive } from './validate'; export type Type = T extends V.Validator ? U : never; type OptionalKeys = { [K in keyof T]-?: T[K] & undefined extends never ? never : Required }[keyof T]; export const t = { object>(schemas?: T) { type U = { [K in keyof T]: Type }; type O = { [K in OptionalKeys]?: U[K] } & Omit>; return new V.$object<{ [K in keyof O]: O[K] }>(schemas); }, array(schema?: T) { return new V.$array(schema); }, tuple(...schemas: T) { return new V.$tuple<{ [K in keyof T]: Type }>(...schemas); }, literal(v: T) { return new V.$literal(v); }, or(...schemas: T) { return new V.$or[] ? I : unknown>(...schemas); }, symbol() { return new V.$symbol(); }, record>(schema: T) { return new V.$record>(schema); }, function() { return new V.$function(); }, boolean() { return new V.$boolean(); }, string() { return new V.$string(); }, number() { return new V.$number(); }, undefined() { return new V.$undefined(); }, null() { return new V.$null(); }, unknown() { return new V.$any(); }, any() { return new V.$any(); }, as() { return new V.$any(); }, arraybuffer() { return new V.$arraybuffer(); }, enum(...values: T) { return new V.$enum(...values); }, typedarray(ctor: Constructor) { return new V.$typedarray(ctor); } }; export function typeAsserts( validator: T, x: unknown, path = 'param' ): asserts x is Type { validator.errors = []; validator.path = path; V.setCollect(true); if (!validator.validate(x)) { const messages = validator.errors.join('\n'); validator.errors.length = 0; V.setCollect(false); throw new TypeError(messages); } }