UNPKG

@nestjs/graphql

Version:

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

66 lines (65 loc) 2.51 kB
import 'reflect-metadata'; import { ArgsType, InputType, InterfaceType, ObjectType, } from '../../decorators/index.js'; import { ClassType } from '../../enums/class-type.enum.js'; import { CLASS_TYPE_METADATA } from '../../graphql.constants.js'; import { UnableToFindFieldsError } from '../errors/unable-to-find-fields.error.js'; import { LazyMetadataStorage } from '../storages/lazy-metadata.storage.js'; import { TypeMetadataStorage } from '../storages/type-metadata.storage.js'; export function getFieldsAndDecoratorForType(objType, options) { const classType = Reflect.getMetadata(CLASS_TYPE_METADATA, objType); if (!classType) { throw new UnableToFindFieldsError(objType.name); } LazyMetadataStorage.load([objType], { skipFieldLazyMetadata: true, }); const [classMetadata, decoratorFactory] = getClassMetadataAndFactoryByTargetAndType(classType, objType); TypeMetadataStorage.loadClassPluginMetadata([classMetadata]); TypeMetadataStorage.compileClassMetadata([classMetadata], options); let fields = classMetadata?.properties; if (!fields) { throw new UnableToFindFieldsError(objType.name); } fields = inheritClassFields(objType, fields, options); return { fields, decoratorFactory, }; } function getClassMetadataAndFactoryByTargetAndType(classType, objType) { switch (classType) { case ClassType.ARGS: return [ TypeMetadataStorage.getArgumentsMetadataByTarget(objType), ArgsType, ]; case ClassType.OBJECT: return [ TypeMetadataStorage.getObjectTypeMetadataByTarget(objType), ObjectType, ]; case ClassType.INPUT: return [ TypeMetadataStorage.getInputTypeMetadataByTarget(objType), InputType, ]; case ClassType.INTERFACE: return [ TypeMetadataStorage.getInterfaceMetadataByTarget(objType), InterfaceType, ]; } } function inheritClassFields(objType, fields, options) { try { const parentClass = Object.getPrototypeOf(objType); if (parentClass === Function) { return fields; } const { fields: parentFields } = getFieldsAndDecoratorForType(parentClass, options); return inheritClassFields(parentClass, [...parentFields, ...fields], options); } catch { return fields; } }