bookish-potato-dto
Version:
A TypeScript DTO (Data Transfer Object) parsing and validation library. Define a schema once — get runtime validation and a fully inferred TypeScript type for free.
62 lines (61 loc) • 2.58 kB
TypeScript
import { PropertyParser } from '../types/property-parser.type';
import { EnumAllowedGenericType, EnumType, PrimitiveMap } from '../_types';
import { StringFieldOptions, NumberFieldOptions, BooleanFieldOptions, EnumFieldOptions, DateFieldOptions, RegexFieldOptions, ArrayFieldOptions, ArrayDtoFieldOptions, DtoFieldOptions, CustomFieldOptions } from './field-options.type';
export interface SchemaMap {
readonly [key: string]: AnyFieldDescriptor;
}
export interface DtoDefinitionRef<TSchema extends SchemaMap = SchemaMap> {
readonly _uuid: string;
readonly fields: TSchema;
}
export interface StringFieldDescriptor {
readonly kind: 'string';
readonly options: StringFieldOptions;
}
export interface NumberFieldDescriptor {
readonly kind: 'number';
readonly options: NumberFieldOptions;
}
export interface IntegerFieldDescriptor {
readonly kind: 'integer';
readonly options: NumberFieldOptions;
}
export interface BooleanFieldDescriptor {
readonly kind: 'boolean';
readonly options: BooleanFieldOptions;
}
export interface EnumFieldDescriptor<T extends EnumAllowedGenericType = EnumAllowedGenericType> {
readonly kind: 'enum';
readonly options: EnumFieldOptions<T>;
readonly enumObj: EnumType<T>;
}
export interface DateFieldDescriptor {
readonly kind: 'date';
readonly options: DateFieldOptions;
}
export interface RegexFieldDescriptor {
readonly kind: 'regex';
readonly options: RegexFieldOptions;
readonly pattern: RegExp;
}
export interface ArrayFieldDescriptor<K extends keyof PrimitiveMap = keyof PrimitiveMap> {
readonly kind: 'array';
readonly options: ArrayFieldOptions<PrimitiveMap[K]>;
readonly itemType: K;
}
export interface ArrayDtoFieldDescriptor<S extends SchemaMap = SchemaMap> {
readonly kind: 'arrayDto';
readonly options: ArrayDtoFieldOptions<unknown>;
readonly dtoDefinition: DtoDefinitionRef<S>;
}
export interface DtoFieldDescriptor<S extends SchemaMap = SchemaMap> {
readonly kind: 'dto';
readonly options: DtoFieldOptions<unknown>;
readonly dtoDefinition: DtoDefinitionRef<S>;
}
export interface CustomFieldDescriptor<T = unknown> {
readonly kind: 'custom';
readonly options: CustomFieldOptions<T>;
readonly parser: PropertyParser<T>;
}
export type AnyFieldDescriptor = StringFieldDescriptor | NumberFieldDescriptor | IntegerFieldDescriptor | BooleanFieldDescriptor | EnumFieldDescriptor | DateFieldDescriptor | RegexFieldDescriptor | ArrayFieldDescriptor | ArrayDtoFieldDescriptor | DtoFieldDescriptor | CustomFieldDescriptor;