import { type BinderNode } from './BinderNode.js'; import type { Validator } from './Validation.js'; export declare const _createEmptyItemValue: unique symbol; export declare const _parent: unique symbol; export declare const _key: unique symbol; export declare const _fromString: unique symbol; export declare const _validators: unique symbol; export declare const _meta: unique symbol; export declare const _getPropertyModel: unique symbol; export declare const _enum: unique symbol; export declare const _items: unique symbol; declare const _optional: unique symbol; export interface HasFromString { [_fromString](value: string): T; } export declare function hasFromString(model: AbstractModel): model is AbstractModel & HasFromString; export type Value = M extends AbstractModel ? T : never; export declare const modelDetachedParent: { $value$: undefined; }; export type ModelParent = AbstractModel | BinderNode | typeof modelDetachedParent; export interface Annotation { name: string; attributes?: Record; } export interface ModelMetadata { javaType?: string; annotations?: Annotation[]; } export interface ModelOptions { validators?: ReadonlyArray>; meta?: ModelMetadata; } export type DetachedModelConstructor = { prototype: object; new (parent: typeof modelDetachedParent, key: '$value$', optional: boolean): M; }; export declare function createDetachedModel(type: DetachedModelConstructor): M; export declare abstract class AbstractModel { static createEmptyValue(): unknown; readonly ['constructor']: typeof AbstractModel; readonly [_parent]?: ModelParent; readonly [_validators]: ReadonlyArray>; readonly [_meta]: ModelMetadata; readonly [_optional]: boolean; [_key]: keyof any; constructor(parent: ModelParent, key: keyof any, optional: boolean, options?: ModelOptions); toString(): string; valueOf(): T; } export declare abstract class PrimitiveModel extends AbstractModel { } export declare class BooleanModel extends PrimitiveModel implements HasFromString { static createEmptyValue: BooleanConstructor; [_fromString](str: string): boolean; } export declare class NumberModel extends PrimitiveModel implements HasFromString { static createEmptyValue(): number; constructor(parent: ModelParent, key: keyof any, optional: boolean, options?: ModelOptions); [_fromString](str: string): number | undefined; } export declare class StringModel extends PrimitiveModel implements HasFromString { static createEmptyValue: StringConstructor; [_fromString]: StringConstructor; } declare enum Enum { } export declare function makeEnumEmptyValueCreator(type: DetachedModelConstructor): () => Value; export declare abstract class EnumModel extends AbstractModel implements HasFromString { abstract readonly [_enum]: E; [_fromString](value: string): E[keyof E] | undefined; } export declare function getObjectModelOwnAndParentGetters(model: M): Generator, getter: () => AbstractModel]>; export declare function makeObjectEmptyValueCreator(type: DetachedModelConstructor): () => Value; type ChildModel, K extends keyof T> = AbstractModel>; export declare class ObjectModel = Record> extends AbstractModel { #private; static createEmptyValue: () => Record; protected [_getPropertyModel]>(key: K, init: (parent: this, key: K) => M): M; } export type ArrayItemModel = M extends ArrayModel ? MItem : never; export declare class ArrayModel extends AbstractModel>> { #private; static createEmptyValue(): []; [_createEmptyItemValue]: () => Value; constructor(parent: ModelParent, key: keyof any, optional: boolean, createItem: (parent: AbstractModel, key: number) => MItem, options?: ModelOptions>>); [_items](): Generator; [Symbol.iterator](): IterableIterator>; } export declare const m: { items(model: M): Generator, void, void>; }; export {};