import type { DateInstanceType, MarkReadOnlyDeep } from './types'; export type ShallowPrettier = T extends object | any[] ? { [key in keyof T]: T[key]; } : T; export declare abstract class Schema { static create(this: T, value: TypeOf): TypeOf; static displayName?: string; static namespace?: string; abstract __type: unknown; } export type Primitives = NumberConstructor | StringConstructor | BooleanConstructor | DateConstructor; export type SchemaCtor = Primitives | (new () => T); export type TypeOf = T extends DateConstructor ? DateInstanceType : T extends Primitives ? ReturnType : T extends new () => { __type: infer U; } ? U : T extends Schema ? T['__type'] : never; export declare class Number extends Schema { __type: number; } export declare class String extends Schema { __type: string; } export declare class Boolean extends Schema { __type: boolean; } export declare class ID extends Schema { __type: string; } export declare class Int extends Schema { __type: number; } export declare class Float extends Schema { __type: number; } export declare class Date extends Schema { __type: DateInstanceType; } export declare abstract class ListType extends Schema { __type: TypeOf[]; abstract Item: SchemaCtor; } export declare const List: (Item: T) => { new (): { Item: ToSchemaCtor; __type: TypeOf>[]; }; create>(this: T_1, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export type SchemaField = key extends '__type' ? never : T[key] extends undefined ? never : T[key] extends SchemaCtorInput | FieldInfo | undefined ? key : never; export type TypeOfField = T extends FieldInfo ? TypeOf : T extends SchemaCtorInput ? TypeOfSchemaCtorInput : T extends undefined ? undefined : never; export declare abstract class ObjectType extends Schema { __type: { [key in keyof this as SchemaField]: TypeOfField; }; } export declare abstract class UnionType extends Schema { __type: TypeOf; abstract Items: SchemaCtor[]; } export declare const Union: (...Items: T) => { new (): { Items: ToSchemaCtors; __type: TypeOf[number]>; }; create>(this: T_1, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export type UnionToIntersection = (T extends any ? (x: T) => any : never) extends (x: infer R) => any ? R : never; export type TypeOfIntersect = UnionToIntersection>; export declare abstract class IntersectType extends Schema { __type: TypeOfIntersect; abstract Items: SchemaCtor[]; } export declare const Intersect: (...Items: T) => { new (): { Items: ToSchemaCtors; __type: UnionToIntersection[number]>>; }; create>(this: T_1, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export type Literals = number | string | boolean | null | undefined; export declare abstract class LiteralType extends Schema { __type: this['value']; abstract value: Literals; } export declare const Literal: (value: T) => { new (): { value: T; __type: T; }; create>(this: T_1, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export declare const Null: { new (): { value: null; __type: null; }; create>(this: T, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export declare const Undefined: { new (): { value: undefined; __type: undefined; }; create>(this: T, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export declare abstract class NullableType extends Schema { __type: TypeOf | null; abstract Item: SchemaCtor; } export declare const isNullableType: (input: any) => input is new () => NullableType; export declare const Nullable: (Item: T) => { new (): { Item: ToSchemaCtor; __type: TypeOf> | null; }; create>(this: T_1, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export declare abstract class OptionalType extends Schema { __type: TypeOf | undefined; abstract Item: SchemaCtor; } export declare const isOptionalType: (input: any) => input is new () => OptionalType; export declare const Optional: (Item: T) => { new (): { Item: ToSchemaCtor; __type: TypeOf> | undefined; }; create>(this: T_1, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export declare const Type: "__type"; export type FieldInfo = { __type: SchemaCtor; description?: string; deprecated?: string; }; export type FieldDescriptor = SchemaCtor | FieldInfo; export type FieldDescriptors = { [key: string]: FieldDescriptor | FieldDescriptors; }; export type TypeOfFieldDescriptor = T extends SchemaCtor ? TypeOf : T extends FieldInfo ? TypeOf : never; export type TypeOfFieldDescriptors = { [key in keyof T]: T[key] extends FieldDescriptor ? TypeOfFieldDescriptor : T[key] extends FieldDescriptors ? ShallowPrettier> : never; }; export declare abstract class StructType extends Schema { __type: ShallowPrettier>; abstract descriptors: FieldDescriptors; } export declare const Struct: (descriptors: T) => { new (): { descriptors: T; __type: ShallowPrettier>; }; create>(this: T_1, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export declare abstract class RecordType extends Schema { __type: { [key in keyof this as string]: TypeOf; }; abstract Item: SchemaCtor; } export declare const Record: (Item: T) => { new (): { Item: ToSchemaCtor; __type: { [x: string]: TypeOf>; }; }; create>(this: T_1, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export declare class Any extends Schema { __type: any; } export declare class Unknown extends Schema { __type: unknown; } export declare class Never extends Schema { __type: never; } export type JsonType = number | string | boolean | null | undefined | JsonType[] | { toJSON(): string; } | { [key: string]: JsonType; }; export declare class Json extends Schema { __type: JsonType; } export declare abstract class StrictType extends Schema { __type: TypeOf; abstract Item: SchemaCtor; } export declare const Strict: (Item: T) => { new (): { Item: ToSchemaCtor; __type: TypeOf>; }; create>(this: T_1, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export declare abstract class NonStrictType extends Schema { __type: TypeOf; abstract Item: SchemaCtor; } export declare const NonStrict: (Item: T) => { new (): { Item: ToSchemaCtor; __type: TypeOf>; }; create>(this: T_1, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export declare abstract class ReadOnlyType extends Schema { __type: Readonly>; abstract Item: SchemaCtor; } export declare const ReadOnly: (Item: T) => { new (): { Item: ToSchemaCtor; __type: Readonly>>; }; create>(this: T_1, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export declare abstract class ReadOnlyDeepType extends Schema { __type: MarkReadOnlyDeep>; abstract Item: SchemaCtor; } export declare const ReadOnlyDeep: (Item: T) => { new (): { Item: ToSchemaCtor; __type: MarkReadOnlyDeep>>; }; create>(this: T_1, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; }; export type SchemaTypeOf = T extends NumberConstructor ? Number : T extends StringConstructor ? String : T extends BooleanConstructor ? Boolean : T extends DateConstructor ? Date : T extends new () => infer S ? S : never; export declare const getSchemaCtor: >(Ctor: T) => SchemaTypeOf; export declare const isSchemaCtor: (input: any) => input is SchemaCtor; export declare const isFieldDescriptor: (input: any) => input is FieldDescriptor; export declare const isFieldDescriptors: (input: any) => input is FieldDescriptors; export type SchemaCtorInput = SchemaCtor | FieldDescriptors; export type TypeOfSchemaCtorInput = T extends SchemaCtor ? TypeOf : T extends FieldDescriptors ? ShallowPrettier> : never; export type ToSchemaCtor = T extends SchemaCtor ? T : T extends FieldDescriptors ? new () => { __type: ShallowPrettier>; } : never; export type SchemaCtorInputs = SchemaCtorInput[] | { [key: string]: SchemaCtorInput; }; export type ToSchemaCtors = { [key in keyof T]: T[key] extends SchemaCtorInput ? ToSchemaCtor : never; }; export declare const toSchemaCtor: (Item: T) => ToSchemaCtor; export declare const toSchemaCtors: (Inputs: T) => ToSchemaCtors; export type InstanceTypeOf = T extends NumberConstructor ? number : T extends StringConstructor ? string : T extends BooleanConstructor ? boolean : T extends DateConstructor ? Date : T extends new () => infer R ? R : never; export declare const getInstance: >(Ctor: T) => InstanceTypeOf; export type TypeOfTuple = T extends [] ? [] : T extends [SchemaCtor, ...infer Rest] ? [TypeOf, ...TypeOfTuple] : []; export declare abstract class TupleType extends Schema { __type: TypeOfTuple; abstract Items: SchemaCtor[]; } export declare const Tuple: (...Items: T) => { new (): { Items: ToSchemaCtors; __type: TypeOfTuple>; }; create>(this: T_1, value: TypeOf): TypeOf; displayName?: string | undefined; namespace?: string | undefined; };