UNPKG

swagger-route-validator

Version:

The fastest openapi validation middleware

213 lines (186 loc) 5.56 kB
type ParameterType = 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object' | 'file'; interface Spec { swagger?: string openapi?: string schemes?: string[] host?: string basePath?: string info: { title: string; version: string; description?: string; contact?: MetaURLField license?: MetaURLField [customField: string]: any } termsOfService?: string consumes?: MediaType[] produces?: MediaType[] servers?: MetaURLField[] securityDefinitions?: any externalDocs: MediaType tags: MetaURLField[] parameters?: { [parameterName: string]: Parameter; } definitions?: { [definitionName: string]: SchemaFormatConstraints; } paths: { [route: string]: PathDefinition } webhooks: { [webhookName: string]: PathDefinition } } interface MetaURLField { name?: string; url: string; [customField: string]: string } interface PathDefinition { get?: RouteDefinition put?: RouteDefinition post?: RouteDefinition delete?: RouteDefinition patch?: RouteDefinition parameters?: Parameter[] } interface RouteDefinition { summary?: string description?: string requestBody: Schema responses?: { default?: Schema | ResponseParameter; [statusCode: number]: Schema | ResponseParameter; } operationId?: string parameters?: Parameter[] security?: any tags?: string[] } interface ResponseParameter { description?: string; content?: { [mediaType: MediaType]: { schema: Schema} } } type MediaType = 'application/json' | 'binary'; type BaseParameter = { name: string; in: 'body' | 'query' | 'path' | 'header' | 'formData' | 'body'; required?: boolean | undefined; description?: string | undefined; }; type BodyParameter = BaseParameter & { in: 'body'; schema?: Schema | undefined; }; type GenericFormat = { type?: ParameterType | undefined; format?: string | undefined; }; type IntegerFormat = { type: 'integer'; format?: 'int32' | 'int64' | undefined; }; type NumberFormat = { type: 'number'; format?: 'float' | 'double' | undefined; }; type StringFormat = { type: 'string'; format?: '' | 'byte' | 'binary' | 'date' | 'date-time' | 'password' | undefined; }; type SchemaFormatConstraints = GenericFormat | IntegerFormat | NumberFormat | StringFormat; type BaseFormatContrainedParameter = BaseParameter & SchemaFormatConstraints; type ParameterCollectionFormat = 'csv' | 'ssv' | 'tsv' | 'pipes' | 'multi'; type QueryParameter = BaseFormatContrainedParameter & BaseSchema & { in: 'query'; allowEmptyValue?: boolean | undefined; collectionFormat?: ParameterCollectionFormat | undefined; }; type PathParameter = BaseFormatContrainedParameter & BaseSchema & { in: 'path'; required: true; }; type HeaderParameter = BaseFormatContrainedParameter & BaseSchema & { in: 'header'; }; type FormDataParameter = BaseFormatContrainedParameter & BaseSchema & { in: 'formData'; type: ParameterType | 'file'; allowEmptyValue?: boolean | undefined; collectionFormat?: ParameterCollectionFormat | undefined; }; type Parameter = BodyParameter | FormDataParameter | QueryParameter | PathParameter | HeaderParameter; interface Reference { $ref: string; } // ------------------------------ Schema ------------------------------------- type BaseSchema = { type?: ParameterType | undefined; format?: string | undefined; title?: string | undefined; description?: string | undefined; default?: any; multipleOf?: number | undefined; maximum?: number | undefined; exclusiveMaximum?: boolean | undefined; minimum?: number | undefined; exclusiveMinimum?: boolean | undefined; maxLength?: number | undefined; minLength?: number | undefined; pattern?: string | undefined; maxItems?: number | undefined; minItems?: number | undefined; uniqueItems?: boolean | undefined; maxProperties?: number | undefined; minProperties?: number | undefined; enum?: any[] | undefined; items?: Schema | Schema[] | undefined; }; interface Schema extends BaseSchema { $ref?: string | undefined; allOf?: Schema[] | undefined; additionalProperties?: Schema | boolean | undefined; properties?: { [propertyName: string]: Schema } | undefined; discriminator?: string | undefined; readOnly?: boolean | undefined; example?: any; required?: string[] | undefined; } interface Errors { error: string cursor: string } interface ExpressRequest { route?: { url: string } method: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE' } interface ResponseValidationOptions { behavior?: 'warn' | 'error' } interface ExpressResponse { req: ExpressRequest get: (headerName: string) => string statusCode: integer } declare module 'swagger-route-validator' { export function validateRequest(routeSpec: PathDefinition | RouteDefinition, req: Partial<ExpressRequest>, spec?: Spec): Errors[] export function validateResponse(routeSpec: PathDefinition | RouteDefinition, body: any, res: Partial<ExpressResponse>, spec?: Spec): Errors[] export function expressRequestValidation(routeSpec: PathDefinition | RouteDefinition, spec?: Spec): (req: Partial<ExpressRequest>, res: Partial<ExpressResponse>, next: Function) => any export function expressResponseValidation(routeSpec: PathDefinition | RouteDefinition, options?: ResponseValidationOptions, spec?: Spec): (req: Partial<ExpressRequest>, res: Partial<ExpressResponse>, next: Function) => any export interface OpenApiSpecification extends Spec { openapi: '3.0.0' | '3.0.1' | '3.0.2' | '3.0.3' | '3.0.4' | '3.1.0' | '3.1.1'; } export interface SwaggerSpecification extends Spec { swagger: '1.0' | '1.1' | '1.2' | '2.0'; } }