diff --git a/ballerine-nestjs-typebox.tgz b/ballerine-nestjs-typebox.tgz new file mode 100644 index 0000000..48e3597 Binary files /dev/null and b/ballerine-nestjs-typebox.tgz differ diff --git a/src/decorators.ts b/src/decorators.ts index bb6c5a5..2605b48 100644 --- a/src/decorators.ts +++ b/src/decorators.ts @@ -29,9 +29,14 @@ export function isSchemaValidator(type: any): type is SchemaValidator { return type && typeof type === 'object' && typeof type.validate === 'function'; } -export function buildSchemaValidator(config: SchemaValidatorConfig): SchemaValidator { - const { type, schema, coerceTypes, stripUnknownProps, name, required } = config; - +export function buildSchemaValidator({ + type, + schema, + coerceTypes, + stripUnknownProps, + name, + required, +}: SchemaValidatorConfig): SchemaValidator { if (!type) { throw new Error('Validator missing "type".'); } @@ -44,7 +49,7 @@ export function buildSchemaValidator(config: SchemaValidatorConfig): SchemaValid throw new Error(`Validator "${name}" expects a TypeBox schema.`); } - const check = ajv.compile(schema); + const check = ajv.compile>(schema); return { schema, diff --git a/src/types.ts b/src/types.ts index dfd338b..078d7a5 100644 --- a/src/types.ts +++ b/src/types.ts @@ -16,68 +16,73 @@ export type MethodDecorator = ( ) => TypedPropertyDescriptor | void; export interface HttpEndpointDecoratorConfig< - S extends TSchema = TSchema, - ResponseConfig extends ResponseValidatorConfig = ResponseValidatorConfig, + TTSchema extends TSchema = TSchema, + ResponseConfig extends ResponseValidatorConfig = ResponseValidatorConfig, RequestConfigs extends RequestValidatorConfig[] = RequestValidatorConfig[], > extends Omit { method: 'GET' | 'POST' | 'PATCH' | 'DELETE' | 'PUT'; responseCode?: number; path?: string; - validate?: ValidatorConfig; + validate?: ValidatorConfig; } -export interface SchemaValidator { - schema: T; +export interface SchemaValidator { + schema: TTSchema; name: string; - check: ValidateFunction; - validate(data: Obj | Obj[]): Static; + check: ValidateFunction>; + validate(data: Obj | Obj[]): Static; } -export interface ValidatorConfigBase { - schema?: TSchema; +export interface ValidatorConfigBase { + schema?: TTSchema; coerceTypes?: boolean; stripUnknownProps?: boolean; name?: string; required?: boolean; pipes?: (PipeTransform | Type)[]; } -export interface ResponseValidatorConfig extends ValidatorConfigBase { - schema: T; +export interface ResponseValidatorConfig extends ValidatorConfigBase { + schema: TTSchema; type?: 'response'; responseCode?: number; required?: true; pipes?: never; } -export interface ParamValidatorConfig extends ValidatorConfigBase { - schema?: TSchema; +export interface ParamValidatorConfig extends ValidatorConfigBase { + schema?: TTSchema; type: 'param'; name: string; stripUnknownProps?: never; } -export interface QueryValidatorConfig extends ValidatorConfigBase { - schema?: TSchema; +export interface QueryValidatorConfig extends ValidatorConfigBase { + schema?: TTSchema; type: 'query'; name: string; stripUnknownProps?: never; } -export interface BodyValidatorConfig extends ValidatorConfigBase { - schema: TSchema; +export interface BodyValidatorConfig extends ValidatorConfigBase { + schema: TTSchema; type: 'body'; } -export type RequestValidatorConfig = ParamValidatorConfig | QueryValidatorConfig | BodyValidatorConfig; -export type SchemaValidatorConfig = RequestValidatorConfig | ResponseValidatorConfig; +export type RequestValidatorConfig = + | ParamValidatorConfig + | QueryValidatorConfig + | BodyValidatorConfig; +export type SchemaValidatorConfig = + | RequestValidatorConfig + | ResponseValidatorConfig; export type ValidatorType = NonNullable; export interface ValidatorConfig< - S extends TSchema, - ResponseConfig extends ResponseValidatorConfig, + TTSchema extends TSchema, + ResponseConfig extends ResponseValidatorConfig, RequestConfigs extends RequestValidatorConfig[], > { - response?: S | ResponseConfig; + response?: TTSchema | ResponseConfig; request?: [...RequestConfigs]; } @@ -91,4 +96,6 @@ export type RequestConfigsToTypes = TComposite<[TOmit, TPartial>]>; +export type TPartialSome = TComposite< + [TOmit, TPartial>] +>;