import { Transaction, DocumentData } from "@firebase/firestore-types"; import { IStore, QueryObject } from "../interfaces"; export interface ValidatorFn { (value: T): boolean | Promise; } export interface ConvertToFn { (value: T): R | Promise; } export interface ResolveFn { (document: DocumentDataWithId, query?: QueryObject, transaction?: Transaction): R | Promise; } export interface FieldContext { store: IStore; schemaName: string; fieldName: string; } export interface FieldSpecs { validations?: ValidatorFn[]; resolve?: ResolveFn; convertTo?: ConvertToFn; data?: any; } export interface FieldArgs { readOnly?: boolean; required?: boolean; defaultValue?: any; } export interface FieldObserver { setValue(schemaField: S): void; subscribe(event: (schemaField: S) => void): any; } export interface SchemaField extends FieldContext { type: string; args: A; specs: S; } export interface SchemaFieldConstructor { new (context: FieldContext): R; prototype: R; } export interface TypeConstructor { (args?: A, references?: FieldObserver): SchemaFieldConstructor>; } export interface AnyField extends SchemaField { } export interface BooleanFieldArgs extends FieldArgs { defaultValue?: boolean; } export interface BooleanFieldSpecs extends FieldSpecs { validations: ValidatorFn[]; } export interface BooleanField extends SchemaField { } export interface NumberFieldArgs extends FieldArgs { defaultValue?: number; } export interface NumberFieldSpecs extends FieldSpecs { validations: ValidatorFn[]; } export interface NumberField extends SchemaField { } export interface StringFieldArgs extends FieldArgs { defaultValue?: string | null; } export interface StringFieldSpecs extends FieldSpecs { validations: ValidatorFn[]; } export interface StringField extends SchemaField { } export interface DateTimeFieldArgs extends FieldArgs { defaultValue?: Date | null; } export interface DateTimeFieldSpecs extends FieldSpecs { } export interface DateTimeField extends SchemaField { } export interface EnumFieldArgs extends FieldArgs { defaultValue?: string; validValues: string[]; } export interface EnumFieldSpecs extends FieldSpecs { validations: ValidatorFn[]; } export interface EnumField extends SchemaField { } export interface ListFieldArgs extends FieldArgs { defaultValue?: any[]; child: TypeConstructor | TypeConstructor | TypeConstructor; } export interface ListFieldSpecs extends FieldSpecs { validations: ValidatorFn[]; resolve: ResolveFn; data: { childConstructed: SchemaField; }; } export interface ListField extends SchemaField { } export interface LookUpFieldArgs extends FieldArgs { defaultValue?: string | null; schema: string; } export interface LookUpFieldSpecs extends FieldSpecs { validations: ValidatorFn[]; resolve: ResolveFn; } export interface LookUpField extends SchemaField { } export interface CollectionFieldArgs extends FieldArgs { defaultValue?: string[]; schema: string; } export interface CollectionFieldSpecs extends FieldSpecs { validations: ValidatorFn[]; resolve: ResolveFn; data: { lookup: SchemaField; }; } export interface CollectionField extends SchemaField { } export interface DocumentDataWithId extends DocumentData { id: string; }