UNPKG

yasui

Version:

Lightweight Express-based framework for REST and web APIs

129 lines 12.5 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhZ2dlci5kZWNvcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGVjb3JhdG9ycy9zd2FnZ2VyLmRlY29yYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsYUFBYSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFRbkYsT0FBTyxFQUNMLDBCQUEwQixFQUMxQixxQkFBcUIsRUFDckIsZUFBZSxFQUNmLDZCQUE2QixHQUM5QixNQUFNLHFCQUFxQixDQUFDO0FBSTdCLE1BQU0sVUFBVSxZQUFZLENBQzFCLE9BQWUsRUFDZixXQUFvQixFQUNwQixJQUFlO0lBRWYsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFHRCxTQUFTLG1CQUFtQixDQUMxQixPQUFlLEVBQ2YsV0FBb0IsRUFDcEIsSUFBZTtJQUVmLE9BQU8sVUFDTCxNQUFjLEVBQ2QsV0FBNEI7UUFFNUIsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWxHLGNBQWMsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUU7WUFDaEQsR0FBRyxlQUFlO1lBQ2xCLE9BQU87WUFDUCxXQUFXO1lBQ1gsSUFBSTtTQUNMLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFPRCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQVk7SUFDcEMsT0FBTyxVQUFVLE1BQWdCO1FBQy9CLGNBQWMsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RSxDQUFDLENBQUM7QUFDSixDQUFDO0FBTUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxHQUEyQixFQUFFLGFBQXNCLElBQUk7SUFDakYsT0FBTyxVQUFVLE1BQWMsRUFBRSxXQUE0QjtRQUczRCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDakYsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQzNDLEdBQUcsR0FBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQWdCLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2hFLENBQUM7aUJBQU0sQ0FBQztnQkFDTixHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxLQUFLLGlCQUFpQixJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNoRCxHQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyx5QkFBeUIsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0YsYUFBYSxDQUFDLFdBQXFCLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDM0MsY0FBYyxDQUFDLGVBQWUsQ0FBQyx5QkFBeUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkYsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUdELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxHQUEyQjtJQUM3RCxPQUFPLFdBQVcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQU9ELE1BQU0sVUFBVSxXQUFXLENBQ3pCLFVBQWtCLEVBQ2xCLE9BQStCLEVBQy9CLE1BQThCO0lBRTlCLE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLEdBQUcsbUJBQW1CLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pFLE9BQU8sa0JBQWtCLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBTUQsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixVQUFrQixFQUNsQixPQUFrQyxFQUNsQyxjQUFpQztJQUVqQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNqRixNQUFNLFdBQVcsR0FBRyxVQUFVO1FBQzVCLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxVQUFVLEVBQUUsVUFBOEIsQ0FBQztRQUMzRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLGtCQUFrQixDQUFDLDBCQUEwQixDQUFDLEVBQUUsRUFBRSxDQUFDO0lBRXZGLE9BQU8sa0JBQWtCLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBR0QsU0FBUyxrQkFBa0IsQ0FDekIsVUFBa0IsRUFDbEIsV0FBbUIsRUFDbkIsVUFBa0M7SUFFbEMsT0FBTyxVQUNMLE1BQWMsRUFDZCxXQUE0QjtRQUU1QixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTFFLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsRyxNQUFNLFNBQVMsR0FBcUIsZUFBZSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFDcEUsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQztRQUNoRSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsRUFBRSxDQUFDO1FBQ3JGLENBQUM7UUFFRCxjQUFjLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFO1lBQ2hELEdBQUcsZUFBZTtZQUNsQixTQUFTO1NBQ1YsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDMUIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQVFELE1BQU0sVUFBVSxPQUFPLENBQ3JCLE9BQWdDLEVBQ2hDLE1BQThCLEVBQzlCLGNBQXNCLGtCQUFrQjtJQUV4QyxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0UsT0FBTyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFHRCxTQUFTLHFCQUFxQixDQUM1QixXQUFvQixFQUNwQixVQUFrQyxFQUNsQyxjQUFzQixrQkFBa0I7SUFFeEMsT0FBTyxVQUNMLE1BQWMsRUFDZCxXQUE0QjtRQUU1QixNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzFFLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVsRyxjQUFjLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFO1lBQ2hELEdBQUcsZUFBZTtZQUNsQixXQUFXLEVBQUU7Z0JBQ1gsV0FBVyxFQUFFLFdBQVcsSUFBSSxjQUFjO2dCQUMxQyxPQUFPLEVBQUU7b0JBQ1AsQ0FBQyxXQUFXLENBQUMsRUFBRTt3QkFDYixNQUFNLEVBQUUsY0FBYyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtxQkFDN0M7aUJBQ0Y7YUFDRjtTQUNGLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFHRCxTQUFTLG1CQUFtQixDQUMxQixXQUFtQyxFQUNuQyxVQUFrQztJQUVsQyxJQUFJLE9BQU8sV0FBVyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3BDLFVBQVUsR0FBRyxXQUFXLENBQUM7UUFDekIsV0FBVyxHQUFHLFdBQVcsQ0FBQyxlQUFlLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQztlQUNoRixXQUFXLENBQUMsSUFBSSxDQUFDO0lBQ3hCLENBQUM7SUFDRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBQ3JDLENBQUM7QUFXRCxTQUFTLHFCQUFxQixDQUFDLE9BQW9DO0lBQ2pFLE9BQU8sVUFDTCxJQUFZLEVBQ1osV0FBb0IsRUFDcEIsUUFBa0IsRUFDbEIsVUFBa0M7UUFFbEMsT0FBTyxlQUFlLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzNFLENBQUMsQ0FBQztBQUNKLENBQUM7QUFHRCxTQUFTLGVBQWUsQ0FDdEIsT0FBb0MsRUFDcEMsSUFBWSxFQUNaLFdBQW9CLEVBQ3BCLFFBQWtCLEVBQ2xCLFVBQWtDO0lBRWxDLE9BQU8sVUFDTCxNQUFjLEVBQ2QsV0FBNEI7UUFFNUIsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xHLE1BQU0sVUFBVSxHQUF1QixlQUFlLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUN4RSxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTFFLFVBQVUsQ0FBQyxJQUFJLENBQUM7WUFDZCxJQUFJO1lBQ0osRUFBRSxFQUFFLE9BQU87WUFDWCxRQUFRLEVBQUUsUUFBUSxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQztZQUMxQyxXQUFXO1lBQ1gsTUFBTSxFQUFFLGNBQWMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUU7U0FDN0MsQ0FBQyxDQUFDO1FBRUgsY0FBYyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRTtZQUNoRCxHQUFHLGVBQWU7WUFDbEIsVUFBVTtTQUNYLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFLRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQTBCLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRzdFLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBMEIscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7QUFHOUUsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUEwQixxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUloRixNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDO0FBRTlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxtQkFBbUIsQ0FBQyJ9