@nestjs/swagger
Advanced tools
Comparing version 3.1.0 to 4.0.0-next.1
@@ -9,7 +9,8 @@ export declare const DECORATORS_PREFIX = "swagger"; | ||
API_PARAMETERS: string; | ||
API_HEADERS: string; | ||
API_MODEL_PROPERTIES: string; | ||
API_MODEL_PROPERTIES_ARRAY: string; | ||
API_BEARER: string; | ||
API_SECURITY: string; | ||
API_EXCLUDE_ENDPOINT: string; | ||
API_OAUTH2: string; | ||
API_EXTRA_MODELS: string; | ||
}; |
@@ -11,7 +11,8 @@ "use strict"; | ||
API_PARAMETERS: `${exports.DECORATORS_PREFIX}/apiParameters`, | ||
API_HEADERS: `${exports.DECORATORS_PREFIX}/apiHeaders`, | ||
API_MODEL_PROPERTIES: `${exports.DECORATORS_PREFIX}/apiModelProperties`, | ||
API_MODEL_PROPERTIES_ARRAY: `${exports.DECORATORS_PREFIX}/apiModelPropertiesArray`, | ||
API_BEARER: `${exports.DECORATORS_PREFIX}/apiBearer`, | ||
API_SECURITY: `${exports.DECORATORS_PREFIX}/apiSecurity`, | ||
API_EXCLUDE_ENDPOINT: `${exports.DECORATORS_PREFIX}/apiExcludeEndpoint`, | ||
API_OAUTH2: `${exports.DECORATORS_PREFIX}/apiOauth2` | ||
API_EXTRA_MODELS: `${exports.DECORATORS_PREFIX}/apiExtraModels` | ||
}; |
@@ -1,1 +0,1 @@ | ||
export declare const ApiBearerAuth: () => (target: object, key?: any, descriptor?: any) => any; | ||
export declare function ApiBearerAuth(name?: string): (target: object, key?: string | symbol, descriptor?: TypedPropertyDescriptor<any>) => any; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const constants_1 = require("../constants"); | ||
const helpers_1 = require("./helpers"); | ||
exports.ApiBearerAuth = () => { | ||
return helpers_1.createMixedDecorator(constants_1.DECORATORS.API_BEARER, []); | ||
}; | ||
const api_security_decorator_1 = require("./api-security.decorator"); | ||
function ApiBearerAuth(name = 'bearer') { | ||
return api_security_decorator_1.ApiSecurity(name); | ||
} | ||
exports.ApiBearerAuth = ApiBearerAuth; |
@@ -1,1 +0,1 @@ | ||
export declare const ApiConsumes: (...mimeTypes: string[]) => (target: object, key?: any, descriptor?: any) => any; | ||
export declare function ApiConsumes(...mimeTypes: string[]): any; |
@@ -5,4 +5,5 @@ "use strict"; | ||
const helpers_1 = require("./helpers"); | ||
exports.ApiConsumes = (...mimeTypes) => { | ||
function ApiConsumes(...mimeTypes) { | ||
return helpers_1.createMixedDecorator(constants_1.DECORATORS.API_CONSUMES, mimeTypes); | ||
}; | ||
} | ||
exports.ApiConsumes = ApiConsumes; |
@@ -1,1 +0,1 @@ | ||
export declare const ApiExcludeEndpoint: () => MethodDecorator; | ||
export declare function ApiExcludeEndpoint(): MethodDecorator; |
@@ -5,4 +5,7 @@ "use strict"; | ||
const helpers_1 = require("./helpers"); | ||
exports.ApiExcludeEndpoint = () => helpers_1.createMethodDecorator(constants_1.DECORATORS.API_EXCLUDE_ENDPOINT, { | ||
disable: true | ||
}); | ||
function ApiExcludeEndpoint() { | ||
return helpers_1.createMethodDecorator(constants_1.DECORATORS.API_EXCLUDE_ENDPOINT, { | ||
disable: true | ||
}); | ||
} | ||
exports.ApiExcludeEndpoint = ApiExcludeEndpoint; |
@@ -1,7 +0,8 @@ | ||
export declare const ApiImplicitBody: (metadata: { | ||
import { Type } from '@nestjs/common'; | ||
import { RequestBodyObject } from '../interfaces/open-api-spec.interface'; | ||
export interface ApiImplicitBodyMetadata extends RequestBodyObject { | ||
name: string; | ||
type: any; | ||
description?: string; | ||
required?: boolean; | ||
type: Type<unknown> | Function | [Function] | string; | ||
isArray?: boolean; | ||
}) => MethodDecorator; | ||
} | ||
export declare const ApiImplicitBody: (metadata: ApiImplicitBodyMetadata) => MethodDecorator; |
@@ -5,3 +5,3 @@ "use strict"; | ||
const helpers_1 = require("./helpers"); | ||
const initialMetadata = { | ||
const defaultBodyMetadata = { | ||
name: '', | ||
@@ -14,3 +14,3 @@ required: true, | ||
const param = { | ||
name: lodash_1.isNil(metadata.name) ? initialMetadata.name : metadata.name, | ||
name: lodash_1.isNil(metadata.name) ? defaultBodyMetadata.name : metadata.name, | ||
in: 'body', | ||
@@ -22,3 +22,3 @@ description: metadata.description, | ||
}; | ||
return helpers_1.createParamDecorator(param, initialMetadata); | ||
return helpers_1.createParamDecorator(param, defaultBodyMetadata); | ||
}; |
@@ -1,5 +0,6 @@ | ||
export declare const ApiImplicitFile: (metadata: { | ||
export interface ApiImplicitFileMetadata { | ||
name: string; | ||
description?: string; | ||
required?: boolean; | ||
}) => MethodDecorator; | ||
} | ||
export declare const ApiImplicitFile: (metadata: ApiImplicitFileMetadata) => MethodDecorator; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const lodash_1 = require("lodash"); | ||
const helpers_1 = require("./helpers"); | ||
const lodash_1 = require("lodash"); | ||
const initialMetadata = { | ||
const defaultFileMetadata = { | ||
name: '', | ||
@@ -11,3 +11,3 @@ required: true | ||
const param = { | ||
name: lodash_1.isNil(metadata.name) ? initialMetadata.name : metadata.name, | ||
name: lodash_1.isNil(metadata.name) ? defaultFileMetadata.name : metadata.name, | ||
in: 'formData', | ||
@@ -18,3 +18,3 @@ description: metadata.description || '', | ||
}; | ||
return helpers_1.createParamDecorator(param, initialMetadata); | ||
return helpers_1.createParamDecorator(param, defaultFileMetadata); | ||
}; |
@@ -1,10 +0,9 @@ | ||
export declare const ApiImplicitHeader: (metadata: { | ||
name: string; | ||
description?: string; | ||
required?: boolean; | ||
}) => MethodDecorator; | ||
export declare const ApiImplicitHeaders: (headers: { | ||
name: string; | ||
description?: string; | ||
required?: boolean; | ||
}[]) => MethodDecorator; | ||
import { Type } from '@nestjs/common'; | ||
import { ParameterObject } from '../interfaces/open-api-spec.interface'; | ||
import { SwaggerEnumType } from '../types/swagger-enum.type'; | ||
export interface ApiImplicitHeaderMetadata extends Omit<ParameterObject, 'in'> { | ||
type?: Type<unknown> | Function | [Function] | string; | ||
enum?: SwaggerEnumType; | ||
} | ||
export declare const ApiImplicitHeader: (metadata: ApiImplicitHeaderMetadata) => MethodDecorator; | ||
export declare const ApiImplicitHeaders: (headers: ApiImplicitHeaderMetadata[]) => MethodDecorator; |
@@ -5,3 +5,3 @@ "use strict"; | ||
const helpers_1 = require("./helpers"); | ||
const initialMetadata = { | ||
const defaultHeaderMetadata = { | ||
name: '', | ||
@@ -12,3 +12,3 @@ required: true | ||
const param = { | ||
name: lodash_1.isNil(metadata.name) ? initialMetadata.name : metadata.name, | ||
name: lodash_1.isNil(metadata.name) ? defaultHeaderMetadata.name : metadata.name, | ||
in: 'header', | ||
@@ -19,7 +19,7 @@ description: metadata.description, | ||
}; | ||
return helpers_1.createParamDecorator(param, initialMetadata); | ||
return helpers_1.createParamDecorator(param, defaultHeaderMetadata); | ||
}; | ||
exports.ApiImplicitHeaders = (headers) => { | ||
const multiMetadata = headers.map(metadata => ({ | ||
name: lodash_1.isNil(metadata.name) ? initialMetadata.name : metadata.name, | ||
name: lodash_1.isNil(metadata.name) ? defaultHeaderMetadata.name : metadata.name, | ||
in: 'header', | ||
@@ -30,3 +30,3 @@ description: metadata.description, | ||
})); | ||
return helpers_1.createMultipleParamDecorator(multiMetadata, initialMetadata); | ||
return helpers_1.createMultipleParamDecorator(multiMetadata, defaultHeaderMetadata); | ||
}; |
@@ -0,8 +1,8 @@ | ||
import { Type } from '@nestjs/common'; | ||
import { ParameterObject } from '../interfaces/open-api-spec.interface'; | ||
import { SwaggerEnumType } from '../types/swagger-enum.type'; | ||
export declare const ApiImplicitParam: (metadata: { | ||
name: string; | ||
description?: string; | ||
required?: boolean; | ||
export declare type ApiImplicitParamMetadata = Omit<ParameterObject, 'in'> & { | ||
type?: Type<unknown> | Function | [Function] | string; | ||
enum?: SwaggerEnumType; | ||
type?: any; | ||
}) => MethodDecorator; | ||
}; | ||
export declare const ApiImplicitParam: (metadata: ApiImplicitParamMetadata) => MethodDecorator; |
@@ -5,3 +5,3 @@ "use strict"; | ||
const helpers_1 = require("./helpers"); | ||
const initialMetadata = { | ||
const defaultParamMetadata = { | ||
name: '', | ||
@@ -12,3 +12,3 @@ required: true | ||
const param = { | ||
name: lodash_1.isNil(metadata.name) ? initialMetadata.name : metadata.name, | ||
name: lodash_1.isNil(metadata.name) ? defaultParamMetadata.name : metadata.name, | ||
in: 'path', | ||
@@ -24,3 +24,3 @@ description: metadata.description, | ||
} | ||
return helpers_1.createParamDecorator(param, initialMetadata); | ||
return helpers_1.createParamDecorator(param, defaultParamMetadata); | ||
}; |
@@ -0,10 +1,9 @@ | ||
import { Type } from '@nestjs/common'; | ||
import { ParameterObject } from '../interfaces/open-api-spec.interface'; | ||
import { SwaggerEnumType } from '../types/swagger-enum.type'; | ||
export declare const ApiImplicitQuery: (metadata: { | ||
name: string; | ||
description?: string; | ||
required?: boolean; | ||
type?: any; | ||
export interface ApiImplicitQueryMetadata extends Omit<ParameterObject, 'in'> { | ||
type?: Type<unknown> | Function | [Function] | string; | ||
isArray?: boolean; | ||
enum?: SwaggerEnumType; | ||
collectionFormat?: "csv" | "ssv" | "tsv" | "pipes" | "multi"; | ||
}) => MethodDecorator; | ||
} | ||
export declare const ApiImplicitQuery: (metadata: ApiImplicitQueryMetadata) => MethodDecorator; |
@@ -5,10 +5,9 @@ "use strict"; | ||
const helpers_1 = require("./helpers"); | ||
const initialMetadata = { | ||
const defaultQueryMetadata = { | ||
name: '', | ||
required: true | ||
}; | ||
const getCollectionFormatOrDefault = (metadata, defaultValue) => lodash_1.isNil(metadata.collectionFormat) ? defaultValue : metadata.collectionFormat; | ||
exports.ApiImplicitQuery = (metadata) => { | ||
const param = { | ||
name: lodash_1.isNil(metadata.name) ? initialMetadata.name : metadata.name, | ||
name: lodash_1.isNil(metadata.name) ? defaultQueryMetadata.name : metadata.name, | ||
in: 'query', | ||
@@ -18,10 +17,4 @@ description: metadata.description, | ||
type: metadata.type, | ||
enum: undefined, | ||
items: undefined, | ||
collectionFormat: undefined | ||
enum: undefined | ||
}; | ||
if (metadata.enum) { | ||
param.type = String; | ||
param.enum = metadata.enum; | ||
} | ||
if (metadata.isArray) { | ||
@@ -31,9 +24,7 @@ param.type = Array; | ||
param.items = { | ||
type: 'String', | ||
type: 'string', | ||
enum: metadata.enum | ||
}; | ||
param.collectionFormat = getCollectionFormatOrDefault(metadata, 'multi'); | ||
} | ||
else { | ||
param.collectionFormat = getCollectionFormatOrDefault(metadata, 'csv'); | ||
param.items = { | ||
@@ -44,3 +35,7 @@ type: metadata.type | ||
} | ||
return helpers_1.createParamDecorator(param, initialMetadata); | ||
else if (metadata.enum) { | ||
param.type = String; | ||
param.enum = metadata.enum; | ||
} | ||
return helpers_1.createParamDecorator(param, defaultQueryMetadata); | ||
}; |
@@ -1,60 +0,5 @@ | ||
import { SwaggerEnumType } from '../types/swagger-enum.type'; | ||
export declare const ApiModelProperty: (metadata?: { | ||
description?: string; | ||
required?: boolean; | ||
type?: any; | ||
isArray?: boolean; | ||
collectionFormat?: string; | ||
default?: any; | ||
enum?: SwaggerEnumType; | ||
format?: string; | ||
in?: string; | ||
multipleOf?: number; | ||
maximum?: number; | ||
exclusiveMaximum?: boolean; | ||
minimum?: number; | ||
exclusiveMinimum?: boolean; | ||
maxLength?: number; | ||
minLength?: number; | ||
pattern?: string; | ||
maxItems?: number; | ||
minItems?: number; | ||
uniqueItems?: boolean; | ||
maxProperties?: number; | ||
minProperties?: number; | ||
readOnly?: boolean; | ||
nullable?: boolean; | ||
xml?: any; | ||
example?: any; | ||
}) => PropertyDecorator; | ||
export declare const ApiModelPropertyOptional: (metadata?: { | ||
description?: string; | ||
type?: any; | ||
isArray?: boolean; | ||
collectionFormat?: string; | ||
default?: any; | ||
enum?: SwaggerEnumType; | ||
format?: string; | ||
in?: string; | ||
multipleOf?: number; | ||
maximum?: number; | ||
exclusiveMaximum?: boolean; | ||
minimum?: number; | ||
exclusiveMinimum?: boolean; | ||
maxLength?: number; | ||
minLength?: number; | ||
pattern?: string; | ||
maxItems?: number; | ||
minItems?: number; | ||
uniqueItems?: boolean; | ||
maxProperties?: number; | ||
minProperties?: number; | ||
readOnly?: boolean; | ||
nullable?: boolean; | ||
xml?: any; | ||
example?: any; | ||
}) => PropertyDecorator; | ||
export declare const ApiResponseModelProperty: (metadata?: { | ||
type?: any; | ||
example?: any; | ||
}) => PropertyDecorator; | ||
import { SchemaObjectMetadata } from '../interfaces/schema-object-metadata.interface'; | ||
export declare type ApiModelPropertyMetadata = SchemaObjectMetadata; | ||
export declare const ApiModelProperty: (metadata?: SchemaObjectMetadata) => PropertyDecorator; | ||
export declare const ApiModelPropertyOptional: (metadata?: SchemaObjectMetadata) => PropertyDecorator; | ||
export declare const ApiResponseModelProperty: (metadata?: Pick<SchemaObjectMetadata, "type" | "example">) => PropertyDecorator; |
@@ -7,6 +7,6 @@ "use strict"; | ||
const [type, isArray] = helpers_1.getTypeIsArrayTuple(metadata.type, metadata.isArray); | ||
return helpers_1.createPropertyDecorator(constants_1.DECORATORS.API_MODEL_PROPERTIES, Object.assign({}, metadata, { type, | ||
return helpers_1.createPropertyDecorator(constants_1.DECORATORS.API_MODEL_PROPERTIES, Object.assign(Object.assign({}, metadata), { type, | ||
isArray })); | ||
}; | ||
exports.ApiModelPropertyOptional = (metadata = {}) => exports.ApiModelProperty(Object.assign({}, metadata, { required: false })); | ||
exports.ApiModelPropertyOptional = (metadata = {}) => exports.ApiModelProperty(Object.assign(Object.assign({}, metadata), { required: false })); | ||
exports.ApiResponseModelProperty = (metadata = {}) => exports.ApiModelProperty(Object.assign({}, metadata)); |
@@ -1,1 +0,1 @@ | ||
export declare const ApiOAuth2Auth: (scopes?: string[]) => (target: object, key?: any, descriptor?: any) => any; | ||
export declare function ApiOAuth2Auth(scopes: string[], name?: string): (target: object, key?: string | symbol, descriptor?: TypedPropertyDescriptor<any>) => any; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const constants_1 = require("../constants"); | ||
const helpers_1 = require("./helpers"); | ||
exports.ApiOAuth2Auth = (scopes) => { | ||
return helpers_1.createMixedDecorator(constants_1.DECORATORS.API_OAUTH2, scopes ? scopes : []); | ||
}; | ||
const api_security_decorator_1 = require("./api-security.decorator"); | ||
function ApiOAuth2Auth(scopes, name = 'oauth2') { | ||
return api_security_decorator_1.ApiSecurity(name, scopes); | ||
} | ||
exports.ApiOAuth2Auth = ApiOAuth2Auth; |
@@ -1,6 +0,3 @@ | ||
export declare const ApiOperation: (metadata: { | ||
title: string; | ||
description?: string; | ||
operationId?: string; | ||
deprecated?: boolean; | ||
}) => MethodDecorator; | ||
import { OperationObject } from '../interfaces/open-api-spec.interface'; | ||
export declare type ApiOperationOptions = Partial<OperationObject>; | ||
export declare function ApiOperation(options: ApiOperationOptions): MethodDecorator; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const lodash_1 = require("lodash"); | ||
const constants_1 = require("../constants"); | ||
const helpers_1 = require("./helpers"); | ||
const lodash_1 = require("lodash"); | ||
const initialMetadata = { | ||
const defaultOperationOptions = { | ||
summary: '' | ||
}; | ||
exports.ApiOperation = (metadata) => { | ||
return helpers_1.createMethodDecorator(constants_1.DECORATORS.API_OPERATION, lodash_1.pickBy(Object.assign({}, initialMetadata, { summary: lodash_1.isNil(metadata.title) | ||
? initialMetadata.summary | ||
: metadata.title, description: metadata.description, operationId: metadata.operationId, deprecated: metadata.deprecated }), lodash_1.negate(lodash_1.isUndefined))); | ||
}; | ||
function ApiOperation(options) { | ||
return helpers_1.createMethodDecorator(constants_1.DECORATORS.API_OPERATION, lodash_1.pickBy(Object.assign(Object.assign({}, defaultOperationOptions), options), lodash_1.negate(lodash_1.isUndefined))); | ||
} | ||
exports.ApiOperation = ApiOperation; |
@@ -1,1 +0,1 @@ | ||
export declare const ApiProduces: (...mimeTypes: string[]) => (target: object, key?: any, descriptor?: any) => any; | ||
export declare function ApiProduces(...mimeTypes: string[]): any; |
@@ -5,4 +5,5 @@ "use strict"; | ||
const helpers_1 = require("./helpers"); | ||
exports.ApiProduces = (...mimeTypes) => { | ||
function ApiProduces(...mimeTypes) { | ||
return helpers_1.createMixedDecorator(constants_1.DECORATORS.API_PRODUCES, mimeTypes); | ||
}; | ||
} | ||
exports.ApiProduces = ApiProduces; |
@@ -1,32 +0,39 @@ | ||
export interface ResponseMetadata { | ||
import { Type } from '@nestjs/common'; | ||
import { ResponseObject, SchemaObject } from '../interfaces/open-api-spec.interface'; | ||
export interface ApiResponseMetadata extends Omit<ResponseObject, 'description'> { | ||
status?: number | 'default'; | ||
type?: Type<unknown> | Function | [Function] | string; | ||
isArray?: boolean; | ||
description?: string; | ||
type?: any; | ||
isArray?: boolean; | ||
headers?: any; | ||
} | ||
export declare const ApiResponse: (metadata: { | ||
status: number; | ||
} & ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiOkResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiCreatedResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiAcceptedResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiNoContentResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiMovedPermanentlyResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiBadRequestResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiUnauthorizedResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiTooManyRequestsResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiNotFoundResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiInternalServerErrorResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiBadGatewayResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiConflictResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiForbiddenResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiGatewayTimeoutResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiGoneResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiMethodNotAllowedResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiNotAcceptableResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiNotImplementedResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiPayloadTooLargeResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiRequestTimeoutResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiServiceUnavailableResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiUnprocessableEntityResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export declare const ApiUnsupportedMediaTypeResponse: (metadata: ResponseMetadata) => (target: any, key?: any, descriptor?: PropertyDescriptor) => any; | ||
export interface ApiResponseSchemaHost extends Omit<ResponseObject, 'description'> { | ||
schema: SchemaObject; | ||
status?: number; | ||
description?: string; | ||
} | ||
export declare type ApiResponseOptions = ApiResponseMetadata | ApiResponseSchemaHost; | ||
export declare function ApiResponse(options: ApiResponseOptions): any; | ||
export declare const ApiOkResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiCreatedResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiAcceptedResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiNoContentResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiMovedPermanentlyResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiBadRequestResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiUnauthorizedResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiTooManyRequestsResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiNotFoundResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiInternalServerErrorResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiBadGatewayResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiConflictResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiForbiddenResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiGatewayTimeoutResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiGoneResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiMethodNotAllowedResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiNotAcceptableResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiNotImplementedResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiPayloadTooLargeResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiRequestTimeoutResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiServiceUnavailableResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiUnprocessableEntityResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiUnsupportedMediaTypeResponse: (options?: ApiResponseOptions) => any; | ||
export declare const ApiDefaultResponse: (options?: ApiResponseOptions) => any; |
@@ -7,41 +7,43 @@ "use strict"; | ||
const helpers_1 = require("./helpers"); | ||
exports.ApiResponse = (metadata) => { | ||
const [type, isArray] = helpers_1.getTypeIsArrayTuple(metadata.type, metadata.isArray); | ||
metadata.type = type; | ||
metadata.isArray = isArray; | ||
metadata.description = metadata.description ? metadata.description : ''; | ||
const groupedMetadata = { [metadata.status]: lodash_1.omit(metadata, 'status') }; | ||
function ApiResponse(options) { | ||
const [type, isArray] = helpers_1.getTypeIsArrayTuple(options.type, options.isArray); | ||
options.type = type; | ||
options.isArray = isArray; | ||
options.description = options.description ? options.description : ''; | ||
const groupedMetadata = { [options.status]: lodash_1.omit(options, 'status') }; | ||
return (target, key, descriptor) => { | ||
if (descriptor) { | ||
const responses = Reflect.getMetadata(constants_1.DECORATORS.API_RESPONSE, descriptor.value) || {}; | ||
Reflect.defineMetadata(constants_1.DECORATORS.API_RESPONSE, Object.assign({}, responses, groupedMetadata), descriptor.value); | ||
Reflect.defineMetadata(constants_1.DECORATORS.API_RESPONSE, Object.assign(Object.assign({}, responses), groupedMetadata), descriptor.value); | ||
return descriptor; | ||
} | ||
const responses = Reflect.getMetadata(constants_1.DECORATORS.API_RESPONSE, target) || {}; | ||
Reflect.defineMetadata(constants_1.DECORATORS.API_RESPONSE, Object.assign({}, responses, groupedMetadata), target); | ||
Reflect.defineMetadata(constants_1.DECORATORS.API_RESPONSE, Object.assign(Object.assign({}, responses), groupedMetadata), target); | ||
return target; | ||
}; | ||
}; | ||
exports.ApiOkResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.OK })); | ||
exports.ApiCreatedResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.CREATED })); | ||
exports.ApiAcceptedResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.ACCEPTED })); | ||
exports.ApiNoContentResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.NO_CONTENT })); | ||
exports.ApiMovedPermanentlyResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.MOVED_PERMANENTLY })); | ||
exports.ApiBadRequestResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.BAD_REQUEST })); | ||
exports.ApiUnauthorizedResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.UNAUTHORIZED })); | ||
exports.ApiTooManyRequestsResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.TOO_MANY_REQUESTS })); | ||
exports.ApiNotFoundResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.NOT_FOUND })); | ||
exports.ApiInternalServerErrorResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.INTERNAL_SERVER_ERROR })); | ||
exports.ApiBadGatewayResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.BAD_GATEWAY })); | ||
exports.ApiConflictResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.CONFLICT })); | ||
exports.ApiForbiddenResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.FORBIDDEN })); | ||
exports.ApiGatewayTimeoutResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.GATEWAY_TIMEOUT })); | ||
exports.ApiGoneResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.GONE })); | ||
exports.ApiMethodNotAllowedResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.METHOD_NOT_ALLOWED })); | ||
exports.ApiNotAcceptableResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.NOT_ACCEPTABLE })); | ||
exports.ApiNotImplementedResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.NOT_IMPLEMENTED })); | ||
exports.ApiPayloadTooLargeResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.PAYLOAD_TOO_LARGE })); | ||
exports.ApiRequestTimeoutResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.REQUEST_TIMEOUT })); | ||
exports.ApiServiceUnavailableResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.SERVICE_UNAVAILABLE })); | ||
exports.ApiUnprocessableEntityResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.UNPROCESSABLE_ENTITY })); | ||
exports.ApiUnsupportedMediaTypeResponse = (metadata) => exports.ApiResponse(Object.assign({}, metadata, { status: http_status_enum_1.HttpStatus.UNSUPPORTED_MEDIA_TYPE })); | ||
} | ||
exports.ApiResponse = ApiResponse; | ||
exports.ApiOkResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.OK })); | ||
exports.ApiCreatedResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.CREATED })); | ||
exports.ApiAcceptedResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.ACCEPTED })); | ||
exports.ApiNoContentResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.NO_CONTENT })); | ||
exports.ApiMovedPermanentlyResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.MOVED_PERMANENTLY })); | ||
exports.ApiBadRequestResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.BAD_REQUEST })); | ||
exports.ApiUnauthorizedResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.UNAUTHORIZED })); | ||
exports.ApiTooManyRequestsResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.TOO_MANY_REQUESTS })); | ||
exports.ApiNotFoundResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.NOT_FOUND })); | ||
exports.ApiInternalServerErrorResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.INTERNAL_SERVER_ERROR })); | ||
exports.ApiBadGatewayResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.BAD_GATEWAY })); | ||
exports.ApiConflictResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.CONFLICT })); | ||
exports.ApiForbiddenResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.FORBIDDEN })); | ||
exports.ApiGatewayTimeoutResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.GATEWAY_TIMEOUT })); | ||
exports.ApiGoneResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.GONE })); | ||
exports.ApiMethodNotAllowedResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.METHOD_NOT_ALLOWED })); | ||
exports.ApiNotAcceptableResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.NOT_ACCEPTABLE })); | ||
exports.ApiNotImplementedResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.NOT_IMPLEMENTED })); | ||
exports.ApiPayloadTooLargeResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.PAYLOAD_TOO_LARGE })); | ||
exports.ApiRequestTimeoutResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.REQUEST_TIMEOUT })); | ||
exports.ApiServiceUnavailableResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.SERVICE_UNAVAILABLE })); | ||
exports.ApiUnprocessableEntityResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.UNPROCESSABLE_ENTITY })); | ||
exports.ApiUnsupportedMediaTypeResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: http_status_enum_1.HttpStatus.UNSUPPORTED_MEDIA_TYPE })); | ||
exports.ApiDefaultResponse = (options = {}) => ApiResponse(Object.assign(Object.assign({}, options), { status: 'default' })); |
@@ -1,1 +0,1 @@ | ||
export declare const ApiUseTags: (...tags: string[]) => (target: object, key?: any, descriptor?: any) => any; | ||
export declare function ApiUseTags(...tags: string[]): any; |
@@ -5,4 +5,5 @@ "use strict"; | ||
const helpers_1 = require("./helpers"); | ||
exports.ApiUseTags = (...tags) => { | ||
function ApiUseTags(...tags) { | ||
return helpers_1.createMixedDecorator(constants_1.DECORATORS.API_USE_TAGS, tags); | ||
}; | ||
} | ||
exports.ApiUseTags = ApiUseTags; |
@@ -1,7 +0,6 @@ | ||
export declare const createMethodDecorator: (metakey: any, metadata: any) => MethodDecorator; | ||
export declare const createClassDecorator: (metakey: any, metadata: any) => ClassDecorator; | ||
export declare const createPropertyDecorator: (metakey: any, metadata: any) => PropertyDecorator; | ||
export declare const createMixedDecorator: (metakey: any, metadata: any) => (target: object, key?: any, descriptor?: any) => any; | ||
export declare const createParamDecorator: (metadata: any, initial: any) => (target: any, key: any, descriptor: PropertyDescriptor) => PropertyDescriptor; | ||
export declare const createMultipleParamDecorator: (multiMetadata: any[], initial: any) => (target: any, key: any, descriptor: PropertyDescriptor) => PropertyDescriptor; | ||
export declare const getTypeIsArrayTuple: (input: Function | [Function], isArrayFlag: boolean) => [Function, boolean]; | ||
export declare function createMethodDecorator<T = any>(metakey: string, metadata: T): MethodDecorator; | ||
export declare function createClassDecorator<T extends Array<any> = any>(metakey: string, metadata?: T): ClassDecorator; | ||
export declare function createPropertyDecorator<T extends Record<string, any> = any>(metakey: string, metadata: T): PropertyDecorator; | ||
export declare function createMixedDecorator<T = any>(metakey: string, metadata: T): any; | ||
export declare function createParamDecorator<T extends Record<string, any> = any>(metadata: T, initial: Partial<T>): MethodDecorator; | ||
export declare function getTypeIsArrayTuple(input: Function | [Function] | undefined | string, isArrayFlag: boolean): [Function | undefined, boolean]; |
@@ -5,3 +5,3 @@ "use strict"; | ||
const constants_1 = require("../constants"); | ||
exports.createMethodDecorator = (metakey, metadata) => { | ||
function createMethodDecorator(metakey, metadata) { | ||
return (target, key, descriptor) => { | ||
@@ -11,10 +11,13 @@ Reflect.defineMetadata(metakey, metadata, descriptor.value); | ||
}; | ||
}; | ||
exports.createClassDecorator = (metakey, metadata) => { | ||
} | ||
exports.createMethodDecorator = createMethodDecorator; | ||
function createClassDecorator(metakey, metadata = []) { | ||
return target => { | ||
Reflect.defineMetadata(metakey, metadata, target); | ||
const prevValue = Reflect.getMetadata(metakey, target) || []; | ||
Reflect.defineMetadata(metakey, [...prevValue, ...metadata], target); | ||
return target; | ||
}; | ||
}; | ||
exports.createPropertyDecorator = (metakey, metadata) => { | ||
} | ||
exports.createClassDecorator = createClassDecorator; | ||
function createPropertyDecorator(metakey, metadata) { | ||
return (target, propertyKey) => { | ||
@@ -25,4 +28,5 @@ const properties = Reflect.getMetadata(constants_1.DECORATORS.API_MODEL_PROPERTIES_ARRAY, target) || []; | ||
}; | ||
}; | ||
exports.createMixedDecorator = (metakey, metadata) => { | ||
} | ||
exports.createPropertyDecorator = createPropertyDecorator; | ||
function createMixedDecorator(metakey, metadata) { | ||
return (target, key, descriptor) => { | ||
@@ -36,4 +40,5 @@ if (descriptor) { | ||
}; | ||
}; | ||
exports.createParamDecorator = (metadata, initial) => { | ||
} | ||
exports.createMixedDecorator = createMixedDecorator; | ||
function createParamDecorator(metadata, initial) { | ||
return (target, key, descriptor) => { | ||
@@ -43,18 +48,9 @@ const parameters = Reflect.getMetadata(constants_1.DECORATORS.API_PARAMETERS, descriptor.value) || []; | ||
...parameters, | ||
Object.assign({}, initial, lodash_1.pickBy(metadata, lodash_1.negate(lodash_1.isUndefined))) | ||
Object.assign(Object.assign({}, initial), lodash_1.pickBy(metadata, lodash_1.negate(lodash_1.isUndefined))) | ||
], descriptor.value); | ||
return descriptor; | ||
}; | ||
}; | ||
exports.createMultipleParamDecorator = (multiMetadata, initial) => { | ||
return (target, key, descriptor) => { | ||
const parameters = Reflect.getMetadata(constants_1.DECORATORS.API_PARAMETERS, descriptor.value) || []; | ||
Reflect.defineMetadata(constants_1.DECORATORS.API_PARAMETERS, [ | ||
...parameters, | ||
...multiMetadata.map(metadata => (Object.assign({}, initial, lodash_1.pickBy(metadata, lodash_1.negate(lodash_1.isUndefined))))) | ||
], descriptor.value); | ||
return descriptor; | ||
}; | ||
}; | ||
exports.getTypeIsArrayTuple = (input, isArrayFlag) => { | ||
} | ||
exports.createParamDecorator = createParamDecorator; | ||
function getTypeIsArrayTuple(input, isArrayFlag) { | ||
if (!input) { | ||
@@ -69,2 +65,3 @@ return [input, isArrayFlag]; | ||
return [type, isInputArray]; | ||
}; | ||
} | ||
exports.getTypeIsArrayTuple = getTypeIsArrayTuple; |
@@ -0,14 +1,17 @@ | ||
export * from './api-basic.decorator'; | ||
export * from './api-bearer.decorator'; | ||
export * from './api-body.decorator'; | ||
export * from './api-consumes.decorator'; | ||
export * from './api-exclude-endpoint.decorator'; | ||
export * from './api-extra-models.decorator'; | ||
export * from './api-header.decorator'; | ||
export * from './api-hide-property.decorator'; | ||
export * from './api-oauth2.decorator'; | ||
export * from './api-operation.decorator'; | ||
export * from './api-param.decorator'; | ||
export * from './api-produces.decorator'; | ||
export * from './api-property.decorator'; | ||
export * from './api-query.decorator'; | ||
export * from './api-response.decorator'; | ||
export * from './api-produces.decorator'; | ||
export * from './api-consumes.decorator'; | ||
export * from './api-bearer.decorator'; | ||
export * from './api-implicit-body.decorator'; | ||
export * from './api-implicit-header.decorator'; | ||
export * from './api-implicit-param.decorator'; | ||
export * from './api-implicit-query.decorator'; | ||
export * from './api-model-property.decorator'; | ||
export * from './api-security.decorator'; | ||
export * from './api-use-tags.decorator'; | ||
export * from './api-oauth2.decorator'; | ||
export * from './api-exclude-endpoint.decorator'; | ||
export * from './api-implicit-file.decorator'; |
@@ -6,15 +6,18 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
__export(require("./api-basic.decorator")); | ||
__export(require("./api-bearer.decorator")); | ||
__export(require("./api-body.decorator")); | ||
__export(require("./api-consumes.decorator")); | ||
__export(require("./api-exclude-endpoint.decorator")); | ||
__export(require("./api-extra-models.decorator")); | ||
__export(require("./api-header.decorator")); | ||
__export(require("./api-hide-property.decorator")); | ||
__export(require("./api-oauth2.decorator")); | ||
__export(require("./api-operation.decorator")); | ||
__export(require("./api-param.decorator")); | ||
__export(require("./api-produces.decorator")); | ||
__export(require("./api-property.decorator")); | ||
__export(require("./api-query.decorator")); | ||
__export(require("./api-response.decorator")); | ||
__export(require("./api-produces.decorator")); | ||
__export(require("./api-consumes.decorator")); | ||
__export(require("./api-bearer.decorator")); | ||
__export(require("./api-implicit-body.decorator")); | ||
__export(require("./api-implicit-header.decorator")); | ||
__export(require("./api-implicit-param.decorator")); | ||
__export(require("./api-implicit-query.decorator")); | ||
__export(require("./api-model-property.decorator")); | ||
__export(require("./api-security.decorator")); | ||
__export(require("./api-use-tags.decorator")); | ||
__export(require("./api-oauth2.decorator")); | ||
__export(require("./api-exclude-endpoint.decorator")); | ||
__export(require("./api-implicit-file.decorator")); |
@@ -1,2 +0,3 @@ | ||
import { SwaggerBaseConfig } from './interfaces/swagger-base-config.interface'; | ||
import { OpenAPIObject } from './interfaces'; | ||
import { ExternalDocumentationObject, SecuritySchemeObject, ServerVariableObject } from './interfaces/open-api-spec.interface'; | ||
export declare class DocumentBuilder { | ||
@@ -8,12 +9,14 @@ private readonly document; | ||
setTermsOfService(termsOfService: string): this; | ||
setContactEmail(email: string): this; | ||
setContact(name: string, url: string, email: string): this; | ||
setLicense(name: string, url: string): this; | ||
setHost(host: string): this; | ||
setBasePath(basePath: string): this; | ||
addServer(url: string, description?: string, variables?: Record<string, ServerVariableObject>): this; | ||
setExternalDoc(description: string, url: string): this; | ||
setSchemes(...schemes: ('http' | 'https')[]): this; | ||
addTag(name: string, description?: string): this; | ||
addBearerAuth(name?: string, location?: 'header' | 'body' | 'query', type?: string): this; | ||
addOAuth2(flow?: 'implicit' | 'password' | 'application' | 'accessCode', authorizationUrl?: string, tokenUrl?: string, scopes?: object): this; | ||
build(): SwaggerBaseConfig; | ||
addTag(name: string, description?: string, externalDocs?: ExternalDocumentationObject): this; | ||
addSecurity(name: string, options: SecuritySchemeObject): this; | ||
addSecurityRequirements(name: string, requirements?: string[]): this; | ||
addBearerAuth(options?: SecuritySchemeObject, name?: string): this; | ||
addOAuth2(options?: SecuritySchemeObject, name?: string): this; | ||
addApiKey(options?: SecuritySchemeObject, name?: string): this; | ||
addBasicAuth(options?: SecuritySchemeObject, name?: string): this; | ||
build(): Omit<OpenAPIObject, 'components' | 'paths'>; | ||
} |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const lodash_1 = require("lodash"); | ||
const document_base_1 = require("./fixtures/document.base"); | ||
@@ -24,4 +25,4 @@ class DocumentBuilder { | ||
} | ||
setContactEmail(email) { | ||
this.document.info.contact = { email }; | ||
setContact(name, url, email) { | ||
this.document.info.contact = { name, url, email }; | ||
return this; | ||
@@ -33,12 +34,6 @@ } | ||
} | ||
setHost(host) { | ||
this.document.host = host; | ||
addServer(url, description, variables) { | ||
this.document.servers.push({ url, description, variables }); | ||
return this; | ||
} | ||
setBasePath(basePath) { | ||
this.document.basePath = basePath.startsWith('/') | ||
? basePath | ||
: '/' + basePath; | ||
return this; | ||
} | ||
setExternalDoc(description, url) { | ||
@@ -48,28 +43,44 @@ this.document.externalDocs = { description, url }; | ||
} | ||
setSchemes(...schemes) { | ||
this.document.schemes = schemes; | ||
addTag(name, description = '', externalDocs) { | ||
this.document.tags = this.document.tags.concat(lodash_1.pickBy({ | ||
name, | ||
description, | ||
externalDocs | ||
}, lodash_1.negate(lodash_1.isUndefined))); | ||
return this; | ||
} | ||
addTag(name, description = '') { | ||
this.document.tags = this.document.tags.concat({ name, description }); | ||
addSecurity(name, options) { | ||
this.document.components.securitySchemes = Object.assign(Object.assign({}, (this.document.components.securitySchemes || {})), { [name]: options }); | ||
return this; | ||
} | ||
addBearerAuth(name = 'Authorization', location = 'header', type = 'apiKey') { | ||
this.document.securityDefinitions = Object.assign({}, (this.document.securityDefinitions || {}), { bearer: { | ||
type, | ||
name, | ||
in: location | ||
} }); | ||
addSecurityRequirements(name, requirements = []) { | ||
this.document.security = (this.document.security || []).concat({ | ||
[name]: requirements | ||
}); | ||
return this; | ||
} | ||
addOAuth2(flow = 'password', authorizationUrl, tokenUrl, scopes) { | ||
this.document.securityDefinitions = Object.assign({}, (this.document.securityDefinitions || {}), { oauth2: { | ||
type: 'oauth2', | ||
flow, | ||
authorizationUrl, | ||
tokenUrl, | ||
scopes | ||
} }); | ||
addBearerAuth(options = { | ||
type: 'http' | ||
}, name = 'bearer') { | ||
this.addSecurity(name, Object.assign({ scheme: 'bearer', bearerFormat: 'JWT' }, options)); | ||
return this; | ||
} | ||
addOAuth2(options = { | ||
type: 'oauth2' | ||
}, name = 'oauth2') { | ||
this.addSecurity(name, Object.assign({ type: 'oauth2', flows: {} }, options)); | ||
return this; | ||
} | ||
addApiKey(options = { | ||
type: 'apiKey' | ||
}, name = 'api_key') { | ||
this.addSecurity(name, Object.assign({ type: 'apiKey', in: 'header', name }, options)); | ||
return this; | ||
} | ||
addBasicAuth(options = { | ||
type: 'http' | ||
}, name = 'basic') { | ||
this.addSecurity(name, Object.assign({ type: 'http', scheme: 'basic' }, options)); | ||
return this; | ||
} | ||
build() { | ||
@@ -76,0 +87,0 @@ return this.document; |
@@ -1,4 +0,5 @@ | ||
export declare const exploreGlobalApiConsumesMetadata: (metatype: any) => { | ||
import { Type } from '@nestjs/common'; | ||
export declare const exploreGlobalApiConsumesMetadata: (metatype: Type<unknown>) => { | ||
consumes: any; | ||
}; | ||
export declare const exploreApiConsumesMetadata: (instance: any, prototype: any, method: any) => any; | ||
export declare const exploreApiConsumesMetadata: (instance: object, prototype: Type<unknown>, method: object) => string[]; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const constants_1 = require("../constants"); | ||
exports.exploreGlobalApiConsumesMetadata = metatype => { | ||
exports.exploreGlobalApiConsumesMetadata = (metatype) => { | ||
const consumes = Reflect.getMetadata(constants_1.DECORATORS.API_CONSUMES, metatype); | ||
return consumes ? { consumes } : undefined; | ||
}; | ||
exports.exploreApiConsumesMetadata = (instance, prototype, method) => { | ||
return Reflect.getMetadata(constants_1.DECORATORS.API_CONSUMES, method); | ||
}; | ||
exports.exploreApiConsumesMetadata = (instance, prototype, method) => Reflect.getMetadata(constants_1.DECORATORS.API_CONSUMES, method); |
@@ -1,1 +0,2 @@ | ||
export declare const exploreApiExcludeEndpointMetadata: (instance: any, prototype: any, method: any) => any; | ||
import { Type } from '@nestjs/common'; | ||
export declare const exploreApiExcludeEndpointMetadata: (instance: object, prototype: Type<unknown>, method: object) => any; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const constants_1 = require("../constants"); | ||
exports.exploreApiExcludeEndpointMetadata = (instance, prototype, method) => { | ||
return Reflect.getMetadata(constants_1.DECORATORS.API_EXCLUDE_ENDPOINT, method); | ||
}; | ||
exports.exploreApiExcludeEndpointMetadata = (instance, prototype, method) => Reflect.getMetadata(constants_1.DECORATORS.API_EXCLUDE_ENDPOINT, method); |
@@ -1,1 +0,2 @@ | ||
export declare const exploreApiOperationMetadata: (instance: any, prototype: any, method: any) => any; | ||
import { Type } from '@nestjs/common'; | ||
export declare const exploreApiOperationMetadata: (instance: object, prototype: Type<unknown>, method: object) => any; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const constants_1 = require("../constants"); | ||
exports.exploreApiOperationMetadata = (instance, prototype, method) => { | ||
return Reflect.getMetadata(constants_1.DECORATORS.API_OPERATION, method); | ||
}; | ||
exports.exploreApiOperationMetadata = (instance, prototype, method) => Reflect.getMetadata(constants_1.DECORATORS.API_OPERATION, method); |
@@ -1,5 +0,5 @@ | ||
export declare const exploreApiParametersMetadata: (definitions: any, instance: any, prototype: any, method: any) => { | ||
import { Type } from '@nestjs/common'; | ||
import { SchemaObject } from '../interfaces/open-api-spec.interface'; | ||
export declare const exploreApiParametersMetadata: (schemas: SchemaObject[], instance: object, prototype: Type<unknown>, method: Function) => { | ||
parameters: any; | ||
}; | ||
export declare const exploreModelDefinition: (type: any, definitions: any, existingNestedModelNames?: any[]) => any; | ||
export declare const mapTypesToSwaggerTypes: (type: string) => string; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const constants_1 = require("@nestjs/common/constants"); | ||
const route_paramtypes_enum_1 = require("@nestjs/common/enums/route-paramtypes.enum"); | ||
const shared_utils_1 = require("@nestjs/common/utils/shared.utils"); | ||
const lodash_1 = require("lodash"); | ||
const constants_2 = require("../constants"); | ||
const api_consumes_explorer_1 = require("./api-consumes.explorer"); | ||
exports.exploreApiParametersMetadata = (definitions, instance, prototype, method) => { | ||
const implicitParameters = Reflect.getMetadata(constants_2.DECORATORS.API_PARAMETERS, method); | ||
const reflectedParameters = exploreApiReflectedParametersMetadata(instance, prototype, method); | ||
const noAnyImplicit = lodash_1.isNil(implicitParameters); | ||
if (noAnyImplicit && lodash_1.isNil(reflectedParameters)) { | ||
const constants_1 = require("../constants"); | ||
const model_properties_accessor_1 = require("../services/model-properties-accessor"); | ||
const parameter_metadata_accessor_1 = require("../services/parameter-metadata-accessor"); | ||
const parameters_metadata_mapper_1 = require("../services/parameters-metadata-mapper"); | ||
const schema_object_factory_1 = require("../services/schema-object-factory"); | ||
const swagger_types_mapper_1 = require("../services/swagger-types-mapper"); | ||
const parameterMetadataAccessor = new parameter_metadata_accessor_1.ParameterMetadataAccessor(); | ||
const modelPropertiesAccessor = new model_properties_accessor_1.ModelPropertiesAccessor(); | ||
const parametersMetadataMapper = new parameters_metadata_mapper_1.ParametersMetadataMapper(modelPropertiesAccessor); | ||
const swaggerTypesMapper = new swagger_types_mapper_1.SwaggerTypesMapper(); | ||
const schemaObjectFactory = new schema_object_factory_1.SchemaObjectFactory(modelPropertiesAccessor, swaggerTypesMapper); | ||
exports.exploreApiParametersMetadata = (schemas, instance, prototype, method) => { | ||
const explicitParameters = Reflect.getMetadata(constants_1.DECORATORS.API_PARAMETERS, method); | ||
const parametersMetadata = parameterMetadataAccessor.explore(instance, prototype, method); | ||
const noExplicitMetadata = lodash_1.isNil(explicitParameters); | ||
if (noExplicitMetadata && lodash_1.isNil(parametersMetadata)) { | ||
return undefined; | ||
} | ||
const allReflectedParameters = transformModelToProperties(reflectedParameters || []); | ||
const mergedParameters = noAnyImplicit | ||
? allReflectedParameters | ||
: lodash_1.map(allReflectedParameters, item => lodash_1.assign(item, lodash_1.find(implicitParameters, ['name', item.name]))); | ||
const unionParameters = noAnyImplicit | ||
? mergedParameters | ||
: lodash_1.unionWith(mergedParameters, implicitParameters, (arrVal, othVal) => { | ||
const reflectedParametersAsProperties = parametersMetadataMapper.transformModelToProperties(parametersMetadata || {}); | ||
let properties = reflectedParametersAsProperties; | ||
if (!noExplicitMetadata) { | ||
const mergeImplicitAndExplicit = (item) => lodash_1.assign(item, lodash_1.find(explicitParameters, ['name', item.name])); | ||
properties = removeBodyMetadataIfExplicitExists(properties, explicitParameters); | ||
properties = lodash_1.map(properties, mergeImplicitAndExplicit); | ||
properties = lodash_1.unionWith(properties, explicitParameters, (arrVal, othVal) => { | ||
return arrVal.name === othVal.name && arrVal.in === othVal.in; | ||
}); | ||
const paramsWithDefinitions = mapModelsToDefinitons(unionParameters, definitions); | ||
const parameters = mapParametersTypes(paramsWithDefinitions); | ||
} | ||
const paramsWithDefinitions = schemaObjectFactory.createFromModel(properties, schemas); | ||
const parameters = swaggerTypesMapper.mapParamTypes(paramsWithDefinitions); | ||
return parameters ? { parameters } : undefined; | ||
}; | ||
const DEFAULT_PARAM_TOKEN = '_'; | ||
const exploreApiReflectedParametersMetadata = (instance, prototype, method) => { | ||
const types = Reflect.getMetadata(constants_1.PARAMTYPES_METADATA, instance, method.name); | ||
const parametersMetadata = Reflect.getMetadata(constants_1.ROUTE_ARGS_METADATA, instance.constructor, method.name) || {}; | ||
const parametersWithType = lodash_1.mapValues(parametersMetadata, param => ({ | ||
type: types[param.index], | ||
name: param.data, | ||
required: true | ||
})); | ||
const consumes = api_consumes_explorer_1.exploreApiConsumesMetadata(instance, prototype, method); | ||
const parameters = lodash_1.omitBy(lodash_1.mapValues(parametersWithType, (val, key) => (Object.assign({}, val, { in: mapParamType(key, consumes) }))), val => val.in === DEFAULT_PARAM_TOKEN || (val.name && val.in === 'body')); | ||
return !lodash_1.isEmpty(parameters) ? parameters : undefined; | ||
}; | ||
const exploreModelProperties = prototype => { | ||
const props = Reflect.getMetadata(constants_2.DECORATORS.API_MODEL_PROPERTIES_ARRAY, prototype) || []; | ||
return props | ||
.filter(lodash_1.isString) | ||
.filter(prop => prop.charAt(0) === ':' && !shared_utils_1.isFunction(prototype[prop])) | ||
.map(prop => prop.slice(1)); | ||
}; | ||
const isBodyParameter = param => param.in === 'body'; | ||
const transformModelToProperties = reflectedParameters => { | ||
return lodash_1.flatMap(reflectedParameters, (param) => { | ||
if (!param || param.type === Object) { | ||
return undefined; | ||
} | ||
const { prototype } = param.type; | ||
if (param.name) { | ||
return param; | ||
} | ||
if (isBodyParameter(param)) { | ||
const name = param.type && shared_utils_1.isFunction(param.type) ? param.type.name : param.type; | ||
return Object.assign({}, param, { name }); | ||
} | ||
const modelProperties = exploreModelProperties(prototype); | ||
return modelProperties.map(key => { | ||
const reflectedParam = Reflect.getMetadata(constants_2.DECORATORS.API_MODEL_PROPERTIES, prototype, key) || | ||
{}; | ||
return Object.assign({}, param, reflectedParam, { name: key }); | ||
}); | ||
}).filter(lodash_1.identity); | ||
}; | ||
const transformToArrayModelProperty = (metadata, key, type) => { | ||
const model = Object.assign({}, metadata, { name: key, type: 'array', items: Object.assign({}, type) }); | ||
if (metadata.enum !== undefined) { | ||
delete model.enum; | ||
model.items = Object.assign({}, model.items, { enum: metadata.enum }); | ||
function removeBodyMetadataIfExplicitExists(properties, explicitParams) { | ||
const isBodyReflected = lodash_1.some(properties, p => p.in === 'body'); | ||
const isBodyDefinedExplicitly = lodash_1.some(explicitParams, p => p.in === 'body'); | ||
if (isBodyReflected && isBodyDefinedExplicitly) { | ||
return lodash_1.omitBy(properties, p => p.in === 'body'); | ||
} | ||
return model; | ||
}; | ||
exports.exploreModelDefinition = (type, definitions, existingNestedModelNames = []) => { | ||
const { prototype } = type; | ||
const modelProperties = exploreModelProperties(prototype); | ||
const propertiesWithType = modelProperties.map(key => { | ||
const metadata = Reflect.getMetadata(constants_2.DECORATORS.API_MODEL_PROPERTIES, prototype, key) || | ||
{}; | ||
const defaultTypes = [String, Boolean, Number, Object, Array]; | ||
if (metadata.enum !== undefined) { | ||
metadata.enum = getEnumValues(metadata.enum); | ||
} | ||
const isNotDefaultType = shared_utils_1.isFunction(metadata.type) && | ||
!defaultTypes.find(defaultType => defaultType === metadata.type); | ||
if (shared_utils_1.isFunction(metadata.type) && metadata.type.name == 'type') { | ||
metadata.type = metadata.type(); | ||
} | ||
if (isNotDefaultType) { | ||
let nestedModelName = metadata.type.name; | ||
if (!lodash_1.includes(existingNestedModelNames, metadata.type.name)) { | ||
existingNestedModelNames.push(metadata.type.name); | ||
nestedModelName = exports.exploreModelDefinition(metadata.type, definitions, existingNestedModelNames); | ||
} | ||
const $ref = getDefinitionPath(metadata.type.name); | ||
if (metadata.isArray) { | ||
return transformToArrayModelProperty(metadata, key, { $ref }); | ||
} | ||
const strippedMetadata = lodash_1.omit(metadata, [ | ||
'type', | ||
'isArray', | ||
'collectionFormat', | ||
'required' | ||
]); | ||
if (Object.keys(strippedMetadata).length === 0) { | ||
return { name: key, required: metadata.required, $ref }; | ||
} | ||
return { | ||
name: key, | ||
required: metadata.required, | ||
title: nestedModelName, | ||
allOf: [{ $ref }, strippedMetadata] | ||
}; | ||
} | ||
const metatype = metadata.type && shared_utils_1.isFunction(metadata.type) | ||
? metadata.type.name | ||
: metadata.type; | ||
const swaggerType = exports.mapTypesToSwaggerTypes(metatype); | ||
const itemType = metadata.enum ? getEnumType(metadata.enum) : swaggerType; | ||
if (metadata.isArray) { | ||
return transformToArrayModelProperty(metadata, key, { type: itemType }); | ||
} | ||
else if (swaggerType === 'array') { | ||
const defaultOnArray = 'string'; | ||
return transformToArrayModelProperty(metadata, key, { | ||
type: defaultOnArray | ||
}); | ||
} | ||
else { | ||
return Object.assign({}, metadata, { name: key, type: itemType }); | ||
} | ||
}); | ||
const typeDefinition = { | ||
type: 'object', | ||
properties: lodash_1.mapValues(lodash_1.keyBy(propertiesWithType, 'name'), property => lodash_1.omit(property, ['name', 'isArray', 'required'])) | ||
}; | ||
const typeDefinitionRequiredFields = propertiesWithType | ||
.filter(property => property.required != false) | ||
.map(property => property.name); | ||
if (typeDefinitionRequiredFields.length > 0) { | ||
typeDefinition['required'] = typeDefinitionRequiredFields; | ||
} | ||
definitions.push({ | ||
[type.name]: typeDefinition | ||
}); | ||
return type.name; | ||
}; | ||
const formDataModelTransformation = type => { | ||
const { prototype } = type; | ||
if (!prototype) { | ||
return {}; | ||
} | ||
const modelProperties = exploreModelProperties(prototype); | ||
const data = modelProperties.map(key => { | ||
const metadata = Reflect.getMetadata(constants_2.DECORATORS.API_MODEL_PROPERTIES, prototype, key) || | ||
{}; | ||
const defaultTypes = [String, Boolean, Number]; | ||
if (defaultTypes.indexOf(metadata.type.name)) { | ||
return { | ||
name: key, | ||
type: metadata.type.name.toLowerCase(), | ||
required: metadata.required, | ||
in: 'formData' | ||
}; | ||
} | ||
}); | ||
return data; | ||
}; | ||
const getEnumValues = (e) => { | ||
if (Array.isArray(e)) { | ||
return e; | ||
} | ||
if (typeof e !== 'object') { | ||
return []; | ||
} | ||
const values = []; | ||
const uniqueValues = {}; | ||
for (const key in e) { | ||
const value = e[key]; | ||
if (!uniqueValues.hasOwnProperty(value) && | ||
!uniqueValues.hasOwnProperty(key)) { | ||
values.push(value); | ||
uniqueValues[value] = value; | ||
} | ||
} | ||
return values; | ||
}; | ||
const getEnumType = (values) => { | ||
const hasString = values.filter(lodash_1.isString).length > 0; | ||
return hasString ? 'string' : 'number'; | ||
}; | ||
const mapParamType = (key, consumes) => { | ||
const keyPair = key.split(':'); | ||
switch (Number(keyPair[0])) { | ||
case route_paramtypes_enum_1.RouteParamtypes.BODY: { | ||
const isFormData = ['multipart/form-data', 'application/x-www-form-urlencoded'].indexOf(lodash_1.head(consumes)) > -1; | ||
if (!lodash_1.isEmpty(consumes) && isFormData) | ||
return 'formData'; | ||
return 'body'; | ||
} | ||
case route_paramtypes_enum_1.RouteParamtypes.PARAM: | ||
return 'path'; | ||
case route_paramtypes_enum_1.RouteParamtypes.QUERY: | ||
return 'query'; | ||
case route_paramtypes_enum_1.RouteParamtypes.HEADERS: | ||
return 'header'; | ||
default: | ||
return DEFAULT_PARAM_TOKEN; | ||
} | ||
}; | ||
const hasSchemaDefinition = param => param.schema; | ||
const omitParamType = param => lodash_1.omit(param, 'type'); | ||
const mapParametersTypes = parameters => parameters.map(param => { | ||
if (hasSchemaDefinition(param)) { | ||
return omitParamType(param); | ||
} | ||
const { type } = param; | ||
const paramWithStringType = lodash_1.pickBy(Object.assign({}, param, { type: type && shared_utils_1.isFunction(type) | ||
? exports.mapTypesToSwaggerTypes(type.name) | ||
: exports.mapTypesToSwaggerTypes(type) }), lodash_1.negate(shared_utils_1.isUndefined)); | ||
if (paramWithStringType.isArray) { | ||
return Object.assign({}, paramWithStringType, { type: 'array', items: { | ||
type: exports.mapTypesToSwaggerTypes(paramWithStringType.type) | ||
} }); | ||
} | ||
return paramWithStringType; | ||
}); | ||
exports.mapTypesToSwaggerTypes = (type) => { | ||
if (!(type && type.charAt)) { | ||
return ''; | ||
} | ||
return type.charAt(0).toLowerCase() + type.slice(1); | ||
}; | ||
const getDefinitionPath = modelName => `#/definitions/${modelName}`; | ||
const mapModelsToDefinitons = (parameters, definitions) => { | ||
return parameters.map(param => { | ||
if (!isBodyParameter(param)) { | ||
return param; | ||
} | ||
const isFormData = param.in === 'formData'; | ||
if (isFormData) { | ||
return formDataModelTransformation(param.type); | ||
} | ||
const defaultTypes = [String, Boolean, Number]; | ||
if (shared_utils_1.isFunction(param.type) && | ||
defaultTypes.some(defaultType => defaultType === param.type)) { | ||
return param; | ||
} | ||
const modelName = exports.exploreModelDefinition(param.type, definitions); | ||
const name = param.name ? param.name : modelName; | ||
const schema = { | ||
$ref: getDefinitionPath(modelName) | ||
}; | ||
if (param.isArray) { | ||
return Object.assign({}, param, { name, schema: { | ||
type: 'array', | ||
items: schema | ||
} }); | ||
} | ||
return Object.assign({}, param, { name, | ||
schema }); | ||
}); | ||
}; | ||
return properties; | ||
} |
@@ -1,4 +0,5 @@ | ||
export declare const exploreGlobalApiProducesMetadata: (metatype: any) => { | ||
import { Type } from '@nestjs/common'; | ||
export declare const exploreGlobalApiProducesMetadata: (metatype: Type<unknown>) => { | ||
produces: any; | ||
}; | ||
export declare const exploreApiProducesMetadata: (instance: any, prototype: any, method: any) => any; | ||
export declare const exploreApiProducesMetadata: (instance: object, prototype: Type<unknown>, method: object) => any; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const constants_1 = require("../constants"); | ||
exports.exploreGlobalApiProducesMetadata = metatype => { | ||
exports.exploreGlobalApiProducesMetadata = (metatype) => { | ||
const produces = Reflect.getMetadata(constants_1.DECORATORS.API_PRODUCES, metatype); | ||
return produces ? { produces } : undefined; | ||
}; | ||
exports.exploreApiProducesMetadata = (instance, prototype, method) => { | ||
return Reflect.getMetadata(constants_1.DECORATORS.API_PRODUCES, method); | ||
}; | ||
exports.exploreApiProducesMetadata = (instance, prototype, method) => Reflect.getMetadata(constants_1.DECORATORS.API_PRODUCES, method); |
@@ -1,6 +0,11 @@ | ||
export declare const exploreGlobalApiResponseMetadata: (definitions: any, metatype: any) => { | ||
responses: any; | ||
/// <reference types="lodash" /> | ||
import { Type } from '@nestjs/common'; | ||
import { SchemaObject } from '../interfaces/open-api-spec.interface'; | ||
export declare const exploreGlobalApiResponseMetadata: (schemas: SchemaObject[], metatype: Type<unknown>) => { | ||
responses: import("lodash").Dictionary<boolean>; | ||
}; | ||
export declare const exploreApiResponseMetadata: (definitions: any, instance: any, prototype: any, method: any) => any; | ||
export declare const toArrayResponseWithDefinition: (response: any, name: any) => any; | ||
export declare const toResponseWithDefinition: (response: any, name: any) => any; | ||
export declare const exploreApiResponseMetadata: (schemas: SchemaObject[], instance: object, prototype: Type<unknown>, method: Function) => import("lodash").Dictionary<boolean> | { | ||
[x: number]: { | ||
description: string; | ||
}; | ||
}; |
@@ -8,15 +8,21 @@ "use strict"; | ||
const constants_2 = require("../constants"); | ||
const api_parameters_explorer_1 = require("./api-parameters.explorer"); | ||
exports.exploreGlobalApiResponseMetadata = (definitions, metatype) => { | ||
const response_object_factory_1 = require("../services/response-object-factory"); | ||
const merge_and_uniq_util_1 = require("../utils/merge-and-uniq.util"); | ||
const responseObjectFactory = new response_object_factory_1.ResponseObjectFactory(); | ||
exports.exploreGlobalApiResponseMetadata = (schemas, metatype) => { | ||
const responses = Reflect.getMetadata(constants_2.DECORATORS.API_RESPONSE, metatype); | ||
const produces = Reflect.getMetadata(constants_2.DECORATORS.API_PRODUCES, metatype); | ||
return responses | ||
? { | ||
responses: mapResponsesToSwaggerResponses(responses, definitions) | ||
responses: mapResponsesToSwaggerResponses(responses, schemas, produces) | ||
} | ||
: undefined; | ||
}; | ||
exports.exploreApiResponseMetadata = (definitions, instance, prototype, method) => { | ||
exports.exploreApiResponseMetadata = (schemas, instance, prototype, method) => { | ||
const responses = Reflect.getMetadata(constants_2.DECORATORS.API_RESPONSE, method); | ||
if (responses) { | ||
return mapResponsesToSwaggerResponses(responses, definitions); | ||
const classProduces = Reflect.getMetadata(constants_2.DECORATORS.API_PRODUCES, prototype); | ||
const methodProduces = Reflect.getMetadata(constants_2.DECORATORS.API_PRODUCES, method); | ||
const produces = merge_and_uniq_util_1.mergeAndUniq(lodash_1.get(classProduces, 'produces'), methodProduces); | ||
return mapResponsesToSwaggerResponses(responses, schemas, produces); | ||
} | ||
@@ -29,3 +35,3 @@ const status = getStatusCode(method); | ||
}; | ||
const getStatusCode = method => { | ||
const getStatusCode = (method) => { | ||
const status = Reflect.getMetadata(constants_1.HTTP_CODE_METADATA, method); | ||
@@ -43,40 +49,7 @@ if (status) { | ||
}; | ||
const omitParamType = param => lodash_1.omit(param, 'type'); | ||
const mapResponsesToSwaggerResponses = (responses, definitions) => lodash_1.mapValues(lodash_1.mapValues(responses, response => { | ||
const { type, isArray } = response; | ||
response = lodash_1.omit(response, ['isArray']); | ||
if (!type) { | ||
return response; | ||
} | ||
const defaultTypes = [String, Boolean, Number, Object, Array]; | ||
if (!(shared_utils_1.isFunction(type) && | ||
!defaultTypes.some(defaultType => defaultType === type))) { | ||
const metatype = type && shared_utils_1.isFunction(type) ? type.name : type; | ||
const swaggerType = api_parameters_explorer_1.mapTypesToSwaggerTypes(metatype); | ||
if (isArray) { | ||
return Object.assign({}, response, { schema: { | ||
type: 'array', | ||
items: { | ||
type: swaggerType | ||
} | ||
} }); | ||
} | ||
return Object.assign({}, response, { schema: { | ||
type: swaggerType | ||
} }); | ||
} | ||
const name = api_parameters_explorer_1.exploreModelDefinition(type, definitions); | ||
if (isArray) { | ||
return exports.toArrayResponseWithDefinition(response, name); | ||
} | ||
return exports.toResponseWithDefinition(response, name); | ||
}), omitParamType); | ||
exports.toArrayResponseWithDefinition = (response, name) => (Object.assign({}, response, { schema: { | ||
type: 'array', | ||
items: { | ||
$ref: `#/definitions/${name}` | ||
} | ||
} })); | ||
exports.toResponseWithDefinition = (response, name) => (Object.assign({}, response, { schema: { | ||
$ref: `#/definitions/${name}` | ||
} })); | ||
const omitParamType = (param) => lodash_1.omit(param, 'type'); | ||
const mapResponsesToSwaggerResponses = (responses, schemas, produces = ['application/json']) => { | ||
produces = shared_utils_1.isEmpty(produces) ? ['application/json'] : produces; | ||
const openApiResponses = lodash_1.mapValues(responses, (response) => responseObjectFactory.create(response, produces, schemas)); | ||
return lodash_1.mapValues(openApiResponses, omitParamType); | ||
}; |
@@ -1,4 +0,5 @@ | ||
export declare const exploreGlobalApiSecurityMetadata: (metatype: any) => { | ||
security: any[]; | ||
import { Type } from '@nestjs/common'; | ||
export declare const exploreGlobalApiSecurityMetadata: (metatype: Type<unknown>) => { | ||
security: any; | ||
}; | ||
export declare const exploreApiSecurityMetadata: (instance: any, prototype: any, method: any) => any[]; | ||
export declare const exploreApiSecurityMetadata: (instance: object, prototype: Type<unknown>, method: object) => any; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const constants_1 = require("../constants"); | ||
exports.exploreGlobalApiSecurityMetadata = metatype => { | ||
const bearer = Reflect.getMetadata(constants_1.DECORATORS.API_BEARER, metatype); | ||
const oauth2 = Reflect.getMetadata(constants_1.DECORATORS.API_OAUTH2, metatype); | ||
const security = []; | ||
bearer && security.push({ bearer }); | ||
oauth2 && security.push({ oauth2 }); | ||
return security.length > 0 ? { security } : undefined; | ||
exports.exploreGlobalApiSecurityMetadata = (metatype) => { | ||
const security = Reflect.getMetadata(constants_1.DECORATORS.API_SECURITY, metatype); | ||
return security ? { security } : undefined; | ||
}; | ||
exports.exploreApiSecurityMetadata = (instance, prototype, method) => { | ||
const bearer = Reflect.getMetadata(constants_1.DECORATORS.API_BEARER, method); | ||
const oauth2 = Reflect.getMetadata(constants_1.DECORATORS.API_OAUTH2, method); | ||
const security = []; | ||
bearer && security.push({ bearer }); | ||
oauth2 && security.push({ oauth2 }); | ||
return security.length > 0 ? security : undefined; | ||
return Reflect.getMetadata(constants_1.DECORATORS.API_SECURITY, method); | ||
}; |
@@ -1,4 +0,5 @@ | ||
export declare const exploreGlobalApiUseTagsMetadata: (metatype: any) => { | ||
import { Type } from '@nestjs/common'; | ||
export declare const exploreGlobalApiUseTagsMetadata: (metatype: Type<unknown>) => { | ||
tags: any; | ||
}; | ||
export declare const exploreApiUseTagsMetadata: (instance: any, prototype: any, method: any) => any; | ||
export declare const exploreApiUseTagsMetadata: (instance: object, prototype: Type<unknown>, method: object) => any; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const constants_1 = require("../constants"); | ||
exports.exploreGlobalApiUseTagsMetadata = metatype => { | ||
exports.exploreGlobalApiUseTagsMetadata = (metatype) => { | ||
const tags = Reflect.getMetadata(constants_1.DECORATORS.API_USE_TAGS, metatype); | ||
return tags ? { tags } : undefined; | ||
}; | ||
exports.exploreApiUseTagsMetadata = (instance, prototype, method) => { | ||
return Reflect.getMetadata(constants_1.DECORATORS.API_USE_TAGS, method); | ||
}; | ||
exports.exploreApiUseTagsMetadata = (instance, prototype, method) => Reflect.getMetadata(constants_1.DECORATORS.API_USE_TAGS, method); |
@@ -1,12 +0,2 @@ | ||
import { SwaggerScheme } from '../interfaces/swagger-base-config.interface'; | ||
export declare const buildDocumentBase: () => { | ||
swagger: string; | ||
info: { | ||
description: string; | ||
version: string; | ||
title: string; | ||
}; | ||
basePath: string; | ||
tags: any[]; | ||
schemes: SwaggerScheme[]; | ||
}; | ||
import { OpenAPIObject } from '../interfaces'; | ||
export declare const buildDocumentBase: () => Pick<OpenAPIObject, "openapi" | "info" | "servers" | "components" | "security" | "tags" | "externalDocs">; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.buildDocumentBase = () => ({ | ||
swagger: '2.0', | ||
openapi: '3.0.0', | ||
info: { | ||
title: '', | ||
description: '', | ||
version: '1.0.0', | ||
title: '' | ||
contact: {} | ||
}, | ||
basePath: '/', | ||
tags: [], | ||
schemes: ['http'] | ||
servers: [], | ||
components: {} | ||
}); |
@@ -6,1 +6,2 @@ import 'reflect-metadata'; | ||
export * from './swagger-module'; | ||
export * from './utils'; |
@@ -10,1 +10,2 @@ "use strict"; | ||
__export(require("./swagger-module")); | ||
__export(require("./utils")); |
@@ -1,4 +0,3 @@ | ||
export * from './swagger-base-config.interface'; | ||
export { OpenAPIObject } from './open-api-spec.interface'; | ||
export * from './swagger-custom-options.interface'; | ||
export * from './swagger-document-options.interface'; | ||
export * from './swagger-document.interface'; |
export interface SwaggerDocumentOptions { | ||
include?: Function[]; | ||
extraModels?: Function[]; | ||
deepScanRoutes?: boolean; | ||
} |
import { Controller } from '@nestjs/common/interfaces'; | ||
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper'; | ||
import { DenormalizedDoc } from './interfaces/denormalized-doc.interface'; | ||
import { SchemaObject } from './interfaces/open-api-spec.interface'; | ||
import { SchemaObjectFactory } from './services/schema-object-factory'; | ||
export declare class SwaggerExplorer { | ||
private readonly schemaObjectFactory; | ||
private readonly mimetypeContentWrapper; | ||
private readonly metadataScanner; | ||
private readonly modelsDefinitions; | ||
exploreController({ instance, metatype }: InstanceWrapper<Controller>, modulePath: string): any[]; | ||
getModelsDefinitons(): any[]; | ||
private readonly schemas; | ||
constructor(schemaObjectFactory: SchemaObjectFactory); | ||
exploreController(wrapper: InstanceWrapper<Controller>, modulePath: string): DenormalizedDoc[]; | ||
getSchemas(): SchemaObject[]; | ||
private generateDenormalizedDocument; | ||
@@ -14,3 +20,6 @@ private exploreGlobalMetadata; | ||
private mergeMetadata; | ||
private assignDefaultMimeType; | ||
private deepMergeMetadata; | ||
private mergeValues; | ||
private migrateOperationSchema; | ||
private registerExtraModels; | ||
} |
@@ -9,35 +9,40 @@ "use strict"; | ||
const pathToRegexp = require("path-to-regexp"); | ||
const api_consumes_explorer_1 = require("./explorers/api-consumes.explorer"); | ||
const constants_2 = require("./constants"); | ||
const api_exclude_endpoint_explorer_1 = require("./explorers/api-exclude-endpoint.explorer"); | ||
const api_extra_models_explorer_1 = require("./explorers/api-extra-models.explorer"); | ||
const api_headers_explorer_1 = require("./explorers/api-headers.explorer"); | ||
const api_operation_explorer_1 = require("./explorers/api-operation.explorer"); | ||
const api_parameters_explorer_1 = require("./explorers/api-parameters.explorer"); | ||
const api_produces_explorer_1 = require("./explorers/api-produces.explorer"); | ||
const api_response_explorer_1 = require("./explorers/api-response.explorer"); | ||
const api_security_explorer_1 = require("./explorers/api-security.explorer"); | ||
const api_use_tags_explorer_1 = require("./explorers/api-use-tags.explorer"); | ||
const mimetype_content_wrapper_1 = require("./services/mimetype-content-wrapper"); | ||
const is_body_parameter_util_1 = require("./utils/is-body-parameter.util"); | ||
const merge_and_uniq_util_1 = require("./utils/merge-and-uniq.util"); | ||
class SwaggerExplorer { | ||
constructor() { | ||
constructor(schemaObjectFactory) { | ||
this.schemaObjectFactory = schemaObjectFactory; | ||
this.mimetypeContentWrapper = new mimetype_content_wrapper_1.MimetypeContentWrapper(); | ||
this.metadataScanner = new metadata_scanner_1.MetadataScanner(); | ||
this.modelsDefinitions = []; | ||
this.schemas = []; | ||
} | ||
exploreController({ instance, metatype }, modulePath) { | ||
exploreController(wrapper, modulePath) { | ||
const { instance, metatype } = wrapper; | ||
const prototype = Object.getPrototypeOf(instance); | ||
const explorersSchema = { | ||
const documentResolvers = { | ||
root: [ | ||
this.exploreRoutePathAndMethod, | ||
api_operation_explorer_1.exploreApiOperationMetadata, | ||
api_parameters_explorer_1.exploreApiParametersMetadata.bind(null, this.modelsDefinitions) | ||
api_parameters_explorer_1.exploreApiParametersMetadata.bind(null, this.schemas) | ||
], | ||
produces: [api_produces_explorer_1.exploreApiProducesMetadata], | ||
consumes: [api_consumes_explorer_1.exploreApiConsumesMetadata], | ||
security: [api_security_explorer_1.exploreApiSecurityMetadata], | ||
tags: [api_use_tags_explorer_1.exploreApiUseTagsMetadata], | ||
responses: [api_response_explorer_1.exploreApiResponseMetadata.bind(null, this.modelsDefinitions)] | ||
responses: [api_response_explorer_1.exploreApiResponseMetadata.bind(null, this.schemas)] | ||
}; | ||
return this.generateDenormalizedDocument(metatype, prototype, instance, explorersSchema, modulePath); | ||
return this.generateDenormalizedDocument(metatype, prototype, instance, documentResolvers, modulePath); | ||
} | ||
getModelsDefinitons() { | ||
return this.modelsDefinitions; | ||
getSchemas() { | ||
return this.schemas; | ||
} | ||
generateDenormalizedDocument(metatype, prototype, instance, explorersSchema, modulePath) { | ||
generateDenormalizedDocument(metatype, prototype, instance, documentResolvers, modulePath) { | ||
let path = this.validateRoutePath(this.reflectControllerPath(metatype)); | ||
@@ -49,2 +54,4 @@ if (modulePath) { | ||
const globalMetadata = this.exploreGlobalMetadata(metatype); | ||
const ctrlExtraModels = api_extra_models_explorer_1.exploreGlobalApiExtraModelsMetadata(metatype); | ||
this.registerExtraModels(ctrlExtraModels); | ||
const denormalizedPaths = this.metadataScanner.scanFromPrototype(instance, prototype, name => { | ||
@@ -56,3 +63,5 @@ const targetCallback = prototype[name]; | ||
} | ||
const methodMetadata = lodash_1.mapValues(explorersSchema, (explorers) => explorers.reduce((metadata, fn) => { | ||
const ctrlExtraModels = api_extra_models_explorer_1.exploreApiExtraModelsMetadata(instance, prototype, targetCallback); | ||
this.registerExtraModels(ctrlExtraModels); | ||
const methodMetadata = lodash_1.mapValues(documentResolvers, (explorers) => explorers.reduce((metadata, fn) => { | ||
const exploredMetadata = fn.call(self, instance, prototype, targetCallback, path); | ||
@@ -63,3 +72,3 @@ if (!exploredMetadata) { | ||
if (!lodash_1.isArray(exploredMetadata)) { | ||
return Object.assign({}, metadata, exploredMetadata); | ||
return Object.assign(Object.assign({}, metadata), exploredMetadata); | ||
} | ||
@@ -71,5 +80,3 @@ return lodash_1.isArray(metadata) | ||
const mergedMethodMetadata = this.mergeMetadata(globalMetadata, lodash_1.omitBy(methodMetadata, lodash_1.isEmpty)); | ||
this.assignDefaultMimeType(mergedMethodMetadata, 'produces'); | ||
this.assignDefaultMimeType(mergedMethodMetadata, 'consumes'); | ||
return Object.assign({ responses: {} }, globalMetadata, mergedMethodMetadata); | ||
return this.migrateOperationSchema(Object.assign(Object.assign({ responses: {} }, globalMetadata), mergedMethodMetadata), prototype, targetCallback); | ||
}); | ||
@@ -80,7 +87,6 @@ return denormalizedPaths; | ||
const globalExplorers = [ | ||
api_produces_explorer_1.exploreGlobalApiProducesMetadata, | ||
api_use_tags_explorer_1.exploreGlobalApiUseTagsMetadata, | ||
api_consumes_explorer_1.exploreGlobalApiConsumesMetadata, | ||
api_security_explorer_1.exploreGlobalApiSecurityMetadata, | ||
api_response_explorer_1.exploreGlobalApiResponseMetadata.bind(null, this.modelsDefinitions) | ||
api_response_explorer_1.exploreGlobalApiResponseMetadata.bind(null, this.schemas), | ||
api_headers_explorer_1.exploreGlobalApiHeaderMetadata | ||
]; | ||
@@ -90,3 +96,3 @@ const globalMetadata = globalExplorers | ||
.filter(val => !shared_utils_1.isUndefined(val)) | ||
.reduce((curr, next) => (Object.assign({}, curr, next)), {}); | ||
.reduce((curr, next) => (Object.assign(Object.assign({}, curr), next)), {}); | ||
return globalMetadata; | ||
@@ -103,3 +109,4 @@ } | ||
method: common_1.RequestMethod[requestMethod].toLowerCase(), | ||
path: fullPath === '' ? '/' : fullPath | ||
path: fullPath === '' ? '/' : fullPath, | ||
operationId: method.name | ||
}; | ||
@@ -114,10 +121,8 @@ } | ||
} | ||
if (Array.isArray(path)) { | ||
path = lodash_1.head(path); | ||
} | ||
let pathWithParams = ''; | ||
for (const item of pathToRegexp.parse(path)) { | ||
if (shared_utils_1.isString(item)) { | ||
pathWithParams += item; | ||
} | ||
else { | ||
pathWithParams += `${item.prefix}{${item.name}}`; | ||
} | ||
pathWithParams += shared_utils_1.isString(item) ? item : `${item.prefix}{${item.name}}`; | ||
} | ||
@@ -132,16 +137,45 @@ return pathWithParams === '/' ? '' : shared_utils_1.validatePath(pathWithParams); | ||
const globalValue = globalMetadata[key]; | ||
if (!lodash_1.isArray(globalValue)) { | ||
return Object.assign({}, globalValue, value); | ||
if (globalMetadata.depth) { | ||
return this.deepMergeMetadata(globalValue, value, globalMetadata.depth); | ||
} | ||
return [...globalValue, ...value]; | ||
return this.mergeValues(globalValue, value); | ||
}); | ||
} | ||
assignDefaultMimeType(metadata, key) { | ||
if (metadata[key]) { | ||
return undefined; | ||
deepMergeMetadata(globalValue, methodValue, maxDepth, currentDepthLevel = 0) { | ||
if (currentDepthLevel === maxDepth) { | ||
return this.mergeValues(globalValue, methodValue); | ||
} | ||
const defaultMimeType = 'application/json'; | ||
metadata[key] = [defaultMimeType]; | ||
return lodash_1.mapValues(methodValue, (value, key) => { | ||
if (key in globalValue) { | ||
return this.deepMergeMetadata(globalValue[key], methodValue[key], maxDepth, currentDepthLevel + 1); | ||
} | ||
return value; | ||
}); | ||
} | ||
mergeValues(globalValue, methodValue) { | ||
if (!lodash_1.isArray(globalValue)) { | ||
return Object.assign(Object.assign({}, globalValue), methodValue); | ||
} | ||
return [...globalValue, ...methodValue]; | ||
} | ||
migrateOperationSchema(document, prototype, method) { | ||
const parametersObject = lodash_1.get(document, 'root.parameters'); | ||
const requestBodyIndex = (parametersObject || []).findIndex(is_body_parameter_util_1.isBodyParameter); | ||
if (requestBodyIndex < 0) { | ||
return document; | ||
} | ||
const requestBody = parametersObject[requestBodyIndex]; | ||
parametersObject.splice(requestBodyIndex, 1); | ||
const classConsumes = Reflect.getMetadata(constants_2.DECORATORS.API_CONSUMES, prototype); | ||
const methodConsumes = Reflect.getMetadata(constants_2.DECORATORS.API_CONSUMES, method); | ||
let consumes = merge_and_uniq_util_1.mergeAndUniq(classConsumes, methodConsumes); | ||
consumes = lodash_1.isEmpty(consumes) ? ['application/json'] : consumes; | ||
const keysToRemove = ['schema', 'in', 'name']; | ||
document.root.requestBody = Object.assign(Object.assign({}, lodash_1.omit(requestBody, keysToRemove)), this.mimetypeContentWrapper.wrap(consumes, lodash_1.pick(requestBody, 'schema'))); | ||
return document; | ||
} | ||
registerExtraModels(extraModels) { | ||
extraModels.forEach(item => this.schemaObjectFactory.exploreModelSchema(item, this.schemas)); | ||
} | ||
} | ||
exports.SwaggerExplorer = SwaggerExplorer; |
import { INestApplication } from '@nestjs/common'; | ||
import { SwaggerBaseConfig, SwaggerCustomOptions, SwaggerDocument, SwaggerDocumentOptions } from './interfaces'; | ||
import { OpenAPIObject, SwaggerCustomOptions, SwaggerDocumentOptions } from './interfaces'; | ||
export declare class SwaggerModule { | ||
static createDocument(app: INestApplication, config: SwaggerBaseConfig, options?: SwaggerDocumentOptions): SwaggerDocument; | ||
static setup(path: string, app: INestApplication, document: SwaggerDocument, options?: SwaggerCustomOptions): void; | ||
static createDocument(app: INestApplication, config: Omit<OpenAPIObject, 'paths'>, options?: SwaggerDocumentOptions): OpenAPIObject; | ||
static setup(path: string, app: INestApplication, document: OpenAPIObject, options?: SwaggerCustomOptions): void; | ||
private static setupExpress; | ||
private static setupFastify; | ||
} |
@@ -8,10 +8,9 @@ "use strict"; | ||
const swaggerScanner = new swagger_scanner_1.SwaggerScanner(); | ||
const document = swaggerScanner.scanApplication(app, options.include || [], options.deepScanRoutes); | ||
return Object.assign({}, config, document, { swagger: '2.0' }); | ||
const document = swaggerScanner.scanApplication(app, options); | ||
document.components = Object.assign(Object.assign({}, (config.components || {})), document.components); | ||
return Object.assign(Object.assign({ openapi: '3.0.0' }, config), document); | ||
} | ||
static setup(path, app, document, options) { | ||
const httpAdapter = app.getHttpAdapter(); | ||
if (httpAdapter && | ||
httpAdapter.constructor && | ||
httpAdapter.constructor.name === 'FastifyAdapter') { | ||
if (httpAdapter && httpAdapter.getType() === 'fastify') { | ||
return this.setupFastify(path, httpAdapter, document); | ||
@@ -18,0 +17,0 @@ } |
@@ -1,8 +0,14 @@ | ||
import { SwaggerDocument } from './interfaces'; | ||
import { INestApplication } from '@nestjs/common'; | ||
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper'; | ||
import { Module } from '@nestjs/core/injector/module'; | ||
import { OpenAPIObject, SwaggerDocumentOptions } from './interfaces'; | ||
import { SchemaObject } from './interfaces/open-api-spec.interface'; | ||
export declare class SwaggerScanner { | ||
private readonly transfomer; | ||
private readonly schemaObjectFactory; | ||
private readonly explorer; | ||
private readonly transfomer; | ||
scanApplication(app: any, includedModules: Function[], deepScanRoutes?: boolean): SwaggerDocument; | ||
scanModuleRoutes(routes: any, modulePath: any): SwaggerDocument; | ||
getModules(modulesContainer: Map<any, any>, include: Function[]): any[]; | ||
scanApplication(app: INestApplication, options: SwaggerDocumentOptions): Omit<OpenAPIObject, 'openapi' | 'info'>; | ||
scanModuleRoutes(routes: Map<string, InstanceWrapper>, modulePath?: string): Omit<OpenAPIObject, 'openapi' | 'info'>; | ||
getModules(modulesContainer: Map<string, Module>, include: Function[]): Module[]; | ||
addExtraModels(schemas: SchemaObject[], extraModels: Function[]): void; | ||
} |
@@ -5,2 +5,5 @@ "use strict"; | ||
const lodash_1 = require("lodash"); | ||
const model_properties_accessor_1 = require("./services/model-properties-accessor"); | ||
const schema_object_factory_1 = require("./services/schema-object-factory"); | ||
const swagger_types_mapper_1 = require("./services/swagger-types-mapper"); | ||
const swagger_explorer_1 = require("./swagger-explorer"); | ||
@@ -10,7 +13,9 @@ const swagger_transformer_1 = require("./swagger-transformer"); | ||
constructor() { | ||
this.explorer = new swagger_explorer_1.SwaggerExplorer(); | ||
this.transfomer = new swagger_transformer_1.SwaggerTransformer(); | ||
this.schemaObjectFactory = new schema_object_factory_1.SchemaObjectFactory(new model_properties_accessor_1.ModelPropertiesAccessor(), new swagger_types_mapper_1.SwaggerTypesMapper()); | ||
this.explorer = new swagger_explorer_1.SwaggerExplorer(this.schemaObjectFactory); | ||
} | ||
scanApplication(app, includedModules, deepScanRoutes) { | ||
const { container } = app; | ||
scanApplication(app, options) { | ||
const { deepScanRoutes, include: includedModules = [], extraModels = [] } = options; | ||
const container = app.container; | ||
const modules = this.getModules(container.getModules(), includedModules); | ||
@@ -20,4 +25,5 @@ const denormalizedPaths = modules.map(({ routes, metatype, relatedModules }) => { | ||
if (deepScanRoutes) { | ||
const isGlobal = (module) => !container.isGlobalModule(module); | ||
Array.from(relatedModules.values()) | ||
.filter(relatedModule => !container.isGlobalModule(relatedModule)) | ||
.filter(isGlobal) | ||
.map(({ routes: relatedModuleRoutes }) => relatedModuleRoutes) | ||
@@ -33,3 +39,7 @@ .forEach(relatedModuleRoutes => { | ||
}); | ||
return Object.assign({}, this.transfomer.normalizePaths(lodash_1.flatten(denormalizedPaths)), { definitions: lodash_1.reduce(this.explorer.getModelsDefinitons(), lodash_1.extend) }); | ||
const schemas = this.explorer.getSchemas(); | ||
this.addExtraModels(schemas, extraModels); | ||
return Object.assign(Object.assign({}, this.transfomer.normalizePaths(lodash_1.flatten(denormalizedPaths))), { components: { | ||
schemas: lodash_1.reduce(this.explorer.getSchemas(), lodash_1.extend) | ||
} }); | ||
} | ||
@@ -46,3 +56,8 @@ scanModuleRoutes(routes, modulePath) { | ||
} | ||
addExtraModels(schemas, extraModels) { | ||
extraModels.forEach(item => { | ||
this.schemaObjectFactory.exploreModelSchema(item, schemas); | ||
}); | ||
} | ||
} | ||
exports.SwaggerScanner = SwaggerScanner; |
@@ -0,5 +1,4 @@ | ||
import { OpenAPIObject } from './interfaces'; | ||
export declare class SwaggerTransformer { | ||
normalizePaths(denormalizedDoc: any): { | ||
paths: any; | ||
}; | ||
normalizePaths(denormalizedDoc: (Partial<OpenAPIObject> & Record<'root', any>)[]): Record<'paths', OpenAPIObject['paths']>; | ||
} |
@@ -6,12 +6,12 @@ "use strict"; | ||
normalizePaths(denormalizedDoc) { | ||
const doc = lodash_1.filter(denormalizedDoc, r => r.root); | ||
const groupedByPath = lodash_1.groupBy(doc, ({ root }) => root.path); | ||
const roots = lodash_1.filter(denormalizedDoc, r => r.root); | ||
const groupedByPath = lodash_1.groupBy(roots, ({ root }) => root.path); | ||
const paths = lodash_1.mapValues(groupedByPath, routes => { | ||
const keyByMethod = lodash_1.keyBy(routes, ({ root }) => root.method); | ||
return lodash_1.mapValues(keyByMethod, (route) => { | ||
return Object.assign({}, lodash_1.omit(route.root, ['method', 'path']), lodash_1.omit(route, 'root')); | ||
return Object.assign(Object.assign({}, lodash_1.omit(route.root, ['method', 'path'])), lodash_1.omit(route, 'root')); | ||
}); | ||
}); | ||
return { | ||
paths, | ||
paths | ||
}; | ||
@@ -18,0 +18,0 @@ } |
@@ -1,2 +0,1 @@ | ||
import { SwaggerEnum } from '../interfaces/swagger-enum.interface'; | ||
export declare type SwaggerEnumType = string[] | number[] | (string | number)[] | SwaggerEnum; | ||
export declare type SwaggerEnumType = string[] | number[] | (string | number)[] | Record<number, string>; |
{ | ||
"moduleFileExtensions": ["js", "json", "ts"], | ||
"rootDir": ".", | ||
"rootDir": "test", | ||
"testEnvironment": "node", | ||
@@ -5,0 +5,0 @@ "testRegex": ".spec.ts$", |
{ | ||
"name": "@nestjs/swagger", | ||
"version": "3.1.0", | ||
"version": "4.0.0-next.1", | ||
"description": "Nest - modern, fast, powerful node.js web framework (@swagger)", | ||
@@ -10,3 +10,3 @@ "author": "Kamil Mysliwiec", | ||
"build": "tsc -p tsconfig.json", | ||
"format": "prettier lib/**/*.ts --write", | ||
"format": "prettier \"lib/**/*.ts\" --write", | ||
"prepublish:next": "npm run build", | ||
@@ -16,20 +16,28 @@ "publish:next": "npm publish --access public --tag next", | ||
"publish:npm": "npm publish --access public", | ||
"test": "jest --config jest.json" | ||
"test": "jest --config jest.json", | ||
"test:dev": "jest --config jest.json --watch", | ||
"test:e2e": "jest --config e2e/jest-e2e.json" | ||
}, | ||
"dependencies": { | ||
"lodash": "4.17.14", | ||
"path-to-regexp": "3.0.0" | ||
"lodash": "4.17.15", | ||
"path-to-regexp": "3.1.0" | ||
}, | ||
"devDependencies": { | ||
"@nestjs/common": "6.5.2", | ||
"@nestjs/core": "6.5.2", | ||
"@types/jest": "24.0.15", | ||
"@types/node": "11.13.17", | ||
"husky": "3.0.0", | ||
"jest": "24.8.0", | ||
"lint-staged": "9.2.0", | ||
"@nestjs/common": "6.8.2", | ||
"@nestjs/core": "6.8.2", | ||
"@nestjs/platform-express": "^6.8.2", | ||
"@types/jest": "24.0.18", | ||
"@types/lodash": "^4.14.141", | ||
"@types/node": "11.15.0", | ||
"express": "^4.17.1", | ||
"husky": "3.0.8", | ||
"jest": "24.9.0", | ||
"lint-staged": "9.4.1", | ||
"prettier": "1.18.2", | ||
"reflect-metadata": "0.1.13", | ||
"ts-jest": "24.0.2", | ||
"typescript": "3.5.3" | ||
"swagger-parser": "^8.0.1", | ||
"swagger-ui-express": "^4.1.1", | ||
"ts-jest": "24.1.0", | ||
"ts-morph": "^4.2.0", | ||
"typescript": "3.6.3" | ||
}, | ||
@@ -36,0 +44,0 @@ "peerDependencies": { |
@@ -5,7 +5,2 @@ <p align="center"> | ||
[travis-image]: https://api.travis-ci.org/nestjs/nest.svg?branch=master | ||
[travis-url]: https://travis-ci.org/nestjs/nest | ||
[linux-image]: https://img.shields.io/travis/nestjs/nest/master.svg?label=linux | ||
[linux-url]: https://travis-ci.org/nestjs/nest | ||
<p align="center">A progressive <a href="http://nodejs.org" target="blank">Node.js</a> framework for building efficient and scalable server-side applications, heavily inspired by <a href="https://angular.io" target="blank">Angular</a>.</p> | ||
@@ -16,4 +11,3 @@ <p align="center"> | ||
<a href="https://www.npmjs.com/~nestjscore"><img src="https://img.shields.io/npm/dm/@nestjs/core.svg" alt="NPM Downloads" /></a> | ||
<a href="https://travis-ci.org/nestjs/nest"><img src="https://api.travis-ci.org/nestjs/nest.svg?branch=master" alt="Travis" /></a> | ||
<a href="https://travis-ci.org/nestjs/nest"><img src="https://img.shields.io/travis/nestjs/nest/master.svg?label=linux" alt="Linux" /></a> | ||
<a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a> | ||
<a href="https://coveralls.io/github/nestjs/nest?branch=master"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#5" alt="Coverage" /></a> | ||
@@ -49,5 +43,5 @@ <a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a> | ||
* Author - [Kamil Myśliwiec](https://kamilmysliwiec.com) | ||
* Website - [https://nestjs.com](https://nestjs.com/) | ||
* Twitter - [@nestframework](https://twitter.com/nestframework) | ||
- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com) | ||
- Website - [https://nestjs.com](https://nestjs.com/) | ||
- Twitter - [@nestframework](https://twitter.com/nestframework) | ||
@@ -54,0 +48,0 @@ ## License |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
205847
190
4458
17
2
48
1
+ Addedlodash@4.17.15(transitive)
+ Addedpath-to-regexp@3.1.0(transitive)
- Removedlodash@4.17.14(transitive)
- Removedpath-to-regexp@3.0.0(transitive)
Updatedlodash@4.17.15
Updatedpath-to-regexp@3.1.0