import { JSONSchema7, JSONSchema7Definition } from 'json-schema' import { EnumType } from '../core/create-enum' import { FormatName } from 'ajv-formats' export type NoUndefinedField = { [P in keyof T]-?: NoUndefinedField> } type Default = string | number | boolean | null | Date | ModelType interface BaseProperty { type: string | ModelNotGeneric | { enum: EnumType } isArray?: boolean isRequired?: boolean default?: Default | Default[] } interface StringProperty extends BaseProperty { type: 'string' default?: IsArray extends true ? string[] : string isArray?: IsArray format?: FormatName minLength?: number maxLength?: number /** * Regex expression as string */ pattern?: string } interface NumberProperty extends BaseProperty { type: 'number' default?: IsArray extends true ? number[] : number isArray?: IsArray maximum?: number minimum?: number } interface EnumProperty extends BaseProperty { type: { enum: EnumType } isArray?: IsArray } interface BooleanProperty extends BaseProperty { type: 'boolean' default?: IsArray extends true ? boolean[] : boolean isArray?: IsArray } interface DateTimeProperty extends BaseProperty { type: 'datetime' | 'date' | 'time' default?: IsArray extends true ? string[] : string isArray?: IsArray } interface ModelChildrenProperty extends BaseProperty { type: ModelNotGeneric isArray?: IsArray default?: IsArray extends true ? ModelType[] : ModelType } export type ModelProperty = | StringProperty | StringProperty | NumberProperty | NumberProperty | EnumProperty | EnumProperty | BooleanProperty | BooleanProperty | DateTimeProperty | DateTimeProperty | ModelChildrenProperty | ModelChildrenProperty export type ModelDefault = Record export type GenerateAtomType = T extends 'string' ? string : T extends 'boolean' ? boolean : T extends 'number' ? number : T extends 'datetime' ? Date : T extends 'date' ? Date : T extends 'time' ? string : T extends { enum: EnumType } ? T['enum'] : T extends { model: ModelType } ? T['model'] : T type GetArray = T['isArray'] extends true ? Array> : GenerateAtomType type GetRequiredKeys = { [K in keyof T]: T[K]['isRequired'] extends true ? K : never }[keyof T] type GetNonRequiredKeys = { [K in keyof T]: T[K]['isRequired'] extends true ? never : K }[keyof T] type ConvertRequiredNonRequired = Pick< ModelTypeBase, GetRequiredKeys > & Partial, GetNonRequiredKeys>> type ModelTypeBase = { [P in keyof T]: GetArray } export type ModelType = ConvertRequiredNonRequired export interface ModelNotGeneric { new (data?: any): ModelType model: ModelType getSchema: (options?: { returnFullSchema?: boolean }) => JSONSchema7 getBody: (parameterName: string) => string properties: Record usedReferences: string[] } export interface Model { new >(data?: D): ModelType model: ModelType getSchema: (options?: { returnFullSchema?: boolean }) => JSONSchema7 getBody: (parameterName: string) => string properties: T usedReferences: string[] } export type GetString = (propertyName?: string) => string export interface Property { schema: JSONSchema7Definition getString: GetString }