Socket
Socket
Sign inDemoInstall

@nestjs/swagger

Package Overview
Dependencies
Maintainers
4
Versions
206
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@nestjs/swagger - npm Package Compare versions

Comparing version 3.1.0 to 4.0.0-next.1

.circleci/config.yml

5

dist/constants.d.ts

@@ -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`
};

2

dist/decorators/api-bearer.decorator.d.ts

@@ -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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc