UNPKG

@nestjs/swagger

Version:

Nest - modern, fast, powerful node.js web framework (@swagger)

58 lines (57 loc) 2.08 kB
import { clone, isNil, isUndefined, negate, pickBy } from 'es-toolkit/compat'; import { DECORATORS } from '../constants.js'; import { getEnumType, getEnumValues } from '../utils/enum.utils.js'; import { createClassDecorator, createParamDecorator } from './helpers.js'; const defaultHeaderOptions = { name: '' }; export function ApiHeader(options) { const paramSchema = options.content ? undefined : { type: 'string', ...(options.example ? { example: options.example } : {}), ...(options.schema || {}) }; const param = pickBy({ name: isNil(options.name) ? defaultHeaderOptions.name : options.name, in: 'header', description: options.description, required: options.required, deprecated: options.deprecated, allowEmptyValue: options.allowEmptyValue, style: options.style, explode: options.explode, allowReserved: options.allowReserved, content: options.content, examples: options.examples, schema: paramSchema }, negate(isUndefined)); if (options.enum) { const enumValues = getEnumValues(options.enum); param.schema = { ...param.schema, enum: enumValues, type: getEnumType(enumValues) }; } const extensions = options.extensions; if (extensions && typeof extensions === 'object') { const cloned = clone(extensions); for (const [key, value] of Object.entries(cloned)) { const extKey = key.startsWith('x-') ? key : `x-${key}`; param[extKey] = value; } } return (target, key, descriptor) => { if (descriptor) { return createParamDecorator(param, defaultHeaderOptions)(target, key, descriptor); } return createClassDecorator(DECORATORS.API_HEADERS, [param])(target); }; } export const ApiHeaders = (headers) => { return (target, key, descriptor) => { headers.forEach((options) => ApiHeader(options)(target, key, descriptor)); }; };