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, 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; } export {};