import type { PipeTransform, Type } from '@nestjs/common'; import { ApiOperationOptions } from '@nestjs/swagger'; import type { Static, StaticDecode, TComposite, TOmit, TPartial, TPick, TSchema } from '@sinclair/typebox'; import type { TypeCheck } from '@sinclair/typebox/compiler'; import { SchemaAnalysis } from './analyze-schema.js'; export type AllKeys = T extends unknown ? Exclude : never; export type Obj = Record; export interface Configure { patchSwagger?: boolean; setFormats?: boolean; } export type MethodDecorator = (target: Object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor | void; export interface HttpEndpointDecoratorConfig extends Omit { method: 'GET' | 'POST' | 'PATCH' | 'DELETE' | 'PUT'; responseCode?: number; path?: string; validate?: ValidatorConfig; } export interface SchemaValidator { schema: T; name: string; analysis: SchemaAnalysis; check: TypeCheck['Check']; validate(data: Obj | Obj[]): unknown; } export interface ValidatorConfigBase { schema?: TSchema; coerceTypes?: boolean; stripUnknownProps?: boolean; name?: string; required?: boolean; pipes?: (PipeTransform | Type)[]; } export interface ResponseValidatorConfig extends ValidatorConfigBase { schema: T; type?: 'response'; responseCode?: number; description?: string; example?: Static; required?: true; pipes?: never; } export interface ParamValidatorConfig extends ValidatorConfigBase { schema?: TSchema; type: 'param'; name: string; stripUnknownProps?: never; } export interface QueryValidatorConfig extends ValidatorConfigBase { schema?: TSchema; type: 'query'; name: string; stripUnknownProps?: never; } export interface BodyValidatorConfig extends ValidatorConfigBase { schema: TSchema; type: 'body'; } export type RequestValidatorConfig = ParamValidatorConfig | QueryValidatorConfig | BodyValidatorConfig; export type SchemaValidatorConfig = RequestValidatorConfig | ResponseValidatorConfig; export type ValidatorType = NonNullable; export interface ValidatorConfig { response?: ResponseValidatorConfig | S; request?: [...RequestConfigs]; } export type RequestConfigsToTypes = { [K in keyof RequestConfigs]: RequestConfigs[K]['required'] extends false ? RequestConfigs[K]['schema'] extends TSchema ? StaticDecode | undefined : string | undefined : RequestConfigs[K]['schema'] extends TSchema ? StaticDecode : string; }; export type TPartialSome = TComposite<[TOmit, TPartial>]>;