yasui
Version:
Lightweight Express-based framework for REST and web APIs
129 lines • 12.5 kB
JavaScript
import { resolveSchema } from '../utils/index.js';
import { ReflectMetadata, getMetadata, defineMetadata } from '../utils/reflect.js';
import { ERROR_RESOURCE_SCHEMA_NAME, extractDecoratorUsage, mapTypeToSchema, overloadCustomErrorDefinition, } from '../utils/swagger.js';
export function ApiOperation(summary, description, tags) {
return addSwaggerOperation(summary, description, tags);
}
function addSwaggerOperation(summary, description, tags) {
return function (target, propertyKey) {
const swaggerMetadata = getMetadata(ReflectMetadata.SWAGGER_OPERATION, target, propertyKey) || {};
defineMetadata(ReflectMetadata.SWAGGER_OPERATION, {
...swaggerMetadata,
summary,
description,
tags,
}, target, propertyKey);
};
}
export function ApiSchema(name) {
return function (target) {
defineMetadata(ReflectMetadata.SWAGGER_SCHEMA_NAME, name, target.prototype);
};
}
export function ApiProperty(def, isRequired = true) {
return function (target, propertyKey) {
if (!def) {
const designType = getMetadata(ReflectMetadata.DESIGN_TYPE, target, propertyKey);
if (designType) {
const schema = mapTypeToSchema(designType);
def = ('$ref' in schema) ? designType : schema;
}
else {
def = { type: 'object' };
}
}
if (extractDecoratorUsage(def) === 'PrimitiveSchema' && !('required' in def)) {
def.required = isRequired;
}
const existingProps = getMetadata(ReflectMetadata.SWAGGER_SCHEMA_DEFINITION, target) || {};
existingProps[propertyKey] = def;
defineMetadata(ReflectMetadata.SWAGGER_SCHEMA_DEFINITION, existingProps, target);
};
}
export function ApiPropertyOptional(def) {
return ApiProperty(def, false);
}
export function ApiResponse(statusCode, descArg, defArg) {
const { description, definition } = extractDescArgUsage(descArg, defArg);
return addSwaggerResponse(statusCode, description, definition);
}
export function ApiErrorResponse(statusCode, descArg, ErrorDataClass) {
const { description, definition } = extractDescArgUsage(descArg, ErrorDataClass);
const errorSchema = definition
? overloadCustomErrorDefinition(statusCode, definition)
: { $ref: `#/components/schemas/${encodeURIComponent(ERROR_RESOURCE_SCHEMA_NAME)}` };
return addSwaggerResponse(statusCode, description, errorSchema);
}
function addSwaggerResponse(statusCode, description, definition) {
return function (target, propertyKey) {
const resolvedSchema = definition ? resolveSchema(definition) : undefined;
const swaggerMetadata = getMetadata(ReflectMetadata.SWAGGER_OPERATION, target, propertyKey) || {};
const responses = swaggerMetadata.responses || {};
responses[statusCode] = { description, schema: resolvedSchema };
if (resolvedSchema) {
responses[statusCode].content = { 'application/json': { schema: resolvedSchema } };
}
defineMetadata(ReflectMetadata.SWAGGER_OPERATION, {
...swaggerMetadata,
responses,
}, target, propertyKey);
};
}
export function ApiBody(descArg, defArg, contentType = 'application/json') {
const { description, definition } = extractDescArgUsage(descArg || '', defArg);
return addSwaggerRequestBody(description, definition, contentType);
}
function addSwaggerRequestBody(description, definition, contentType = 'application/json') {
return function (target, propertyKey) {
const resolvedSchema = definition ? resolveSchema(definition) : undefined;
const swaggerMetadata = getMetadata(ReflectMetadata.SWAGGER_OPERATION, target, propertyKey) || {};
defineMetadata(ReflectMetadata.SWAGGER_OPERATION, {
...swaggerMetadata,
requestBody: {
description: description || 'Request body',
content: {
[contentType]: {
schema: resolvedSchema || { type: 'object' }
}
}
}
}, target, propertyKey);
};
}
function extractDescArgUsage(description, definition) {
if (typeof description !== 'string') {
definition = description;
description = getMetadata(ReflectMetadata.SWAGGER_SCHEMA_NAME, description.prototype)
|| description.name;
}
return { description, definition };
}
function swaggerParamDecorator(paramIn) {
return function (name, description, required, definition) {
return addSwaggerParam(paramIn, name, description, required, definition);
};
}
function addSwaggerParam(paramIn, name, description, required, definition) {
return function (target, propertyKey) {
const swaggerMetadata = getMetadata(ReflectMetadata.SWAGGER_OPERATION, target, propertyKey) || {};
const parameters = swaggerMetadata.parameters || [];
const resolvedSchema = definition ? resolveSchema(definition) : undefined;
parameters.push({
name,
in: paramIn,
required: required ?? (paramIn === 'path'),
description,
schema: resolvedSchema || { type: 'string' },
});
defineMetadata(ReflectMetadata.SWAGGER_OPERATION, {
...swaggerMetadata,
parameters
}, target, propertyKey);
};
}
export const ApiParam = swaggerParamDecorator('path');
export const ApiQuery = swaggerParamDecorator('query');
export const ApiHeader = swaggerParamDecorator('header');
export const AP = ApiProperty;
export const APO = ApiPropertyOptional;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhZ2dlci5kZWNvcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGVjb3JhdG9ycy9zd2FnZ2VyLmRlY29yYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFRbkYsT0FBTyxFQUNMLDBCQUEwQixFQUMxQixxQkFBcUIsRUFDckIsZUFBZSxFQUNmLDZCQUE2QixHQUM5QixNQUFNLHFCQUFxQixDQUFDO0FBSTdCLE1BQU0sVUFBVSxZQUFZLENBQzFCLE9BQWUsRUFDZixXQUFvQixFQUNwQixJQUFlO0lBRWYsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFHRCxTQUFTLG1CQUFtQixDQUMxQixPQUFlLEVBQ2YsV0FBb0IsRUFDcEIsSUFBZTtJQUVmLE9BQU8sVUFDTCxNQUFjLEVBQ2QsV0FBNEI7UUFFNUIsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWxHLGNBQWMsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUU7WUFDaEQsR0FBRyxlQUFlO1lBQ2xCLE9BQU87WUFDUCxXQUFXO1lBQ1gsSUFBSTtTQUNMLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFPRCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQVk7SUFDcEMsT0FBTyxVQUFVLE1BQWdCO1FBQy9CLGNBQWMsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RSxDQUFDLENB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