import { ExtendObjectDefinition, FromDefinition, FromObjectModelDefinition, ModelDefinition, ObjectModelDefinition } from '../types/definitions'; export type Assertion = (variable: T) => boolean export interface ModelError { model: Model message: string; expected: any; received: any; path: string; } export interface Model { definition: D; assertions: Assertion[]; name: string; conventionForConstant(variableName: string): boolean; conventionForPrivate(variableName: string): boolean; toString(stack?: any[]): string; as(name: string): this; test(value: any, errorCollector?: (errors: ModelError[]) => void): boolean; errorCollector(errors: ModelError[]): void; assert(assertion: Assertion, description?: string | Function): this; } export interface ModelConstructor { (definition: D): D extends ObjectModelDefinition ? ObjectModel : BasicModel; new(definition: D): D extends ObjectModelDefinition ? ObjectModel : BasicModel; CHECK_ONCE: symbol; } export interface BasicModel extends Model { (value: FromDefinition): FromDefinition new(value: FromDefinition): FromDefinition extend(...extensions: E): BasicModel; defaultTo>(defaultValue: Default): BasicModelWithDefault; } export interface BasicModelWithDefault extends BasicModel { (): Default new(): Default } export interface BasicModelConstructor { (definition: D): BasicModel new(definition: D): BasicModel; } export interface ObjectModel extends Model { (value: Partial>): FromObjectModelDefinition; new(value: Partial>): FromObjectModelDefinition; extend)[]>(...ext: Extensions) : ObjectModel>; defaultTo>>(defaultValue: Default): ObjectModelWithDefault } export interface ObjectModelWithDefault extends ObjectModel { (): FromObjectModelDefinition new(): FromObjectModelDefinition } export interface ObjectModelConstructor { (definition: D): ObjectModel; new(definition: D): ObjectModel; } export const Any: any; export const Model: ModelConstructor; export const BasicModel: BasicModelConstructor; export const ObjectModel: ObjectModelConstructor;