UNPKG

@nestjs/swagger

Version:

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

40 lines (39 loc) 1.93 kB
import { inheritPropertyInitializers, inheritTransformationMetadata, inheritValidationMetadata } from '@nestjs/mapped-types'; import { DECORATORS } from '../constants.js'; import { ApiProperty } from '../decorators/index.js'; import { MetadataLoader } from '../plugin/metadata-loader.js'; import { ModelPropertiesAccessor } from '../services/model-properties-accessor.js'; import { clonePluginMetadataFactory } from './mapped-types.utils.js'; const modelPropertiesAccessor = new ModelPropertiesAccessor(); export function IntersectionType(...classRefs) { class IntersectionClassType { constructor() { classRefs.forEach((classRef) => { inheritPropertyInitializers(this, classRef); }); } } classRefs.forEach((classRef) => { const fields = modelPropertiesAccessor.getModelProperties(classRef.prototype); inheritValidationMetadata(classRef, IntersectionClassType); inheritTransformationMetadata(classRef, IntersectionClassType); function applyFields(fields) { clonePluginMetadataFactory(IntersectionClassType, classRef.prototype); fields.forEach((propertyKey) => { const metadata = Reflect.getMetadata(DECORATORS.API_MODEL_PROPERTIES, classRef.prototype, propertyKey); const decoratorFactory = ApiProperty(metadata); decoratorFactory(IntersectionClassType.prototype, propertyKey); }); } applyFields(fields); MetadataLoader.addRefreshHook(() => { const fields = modelPropertiesAccessor.getModelProperties(classRef.prototype); applyFields(fields); }); }); const intersectedNames = classRefs.reduce((prev, ref) => prev + ref.name, ''); Object.defineProperty(IntersectionClassType, 'name', { value: `Intersection${intersectedNames}` }); return IntersectionClassType; }