UNPKG

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
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;