UNPKG

@nestjs/graphql

Version:

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

70 lines (69 loc) 3.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getFieldsAndDecoratorForType = void 0; require("reflect-metadata"); const decorators_1 = require("../../decorators"); const class_type_enum_1 = require("../../enums/class-type.enum"); const graphql_constants_1 = require("../../graphql.constants"); const unable_to_find_fields_error_1 = require("../errors/unable-to-find-fields.error"); const lazy_metadata_storage_1 = require("../storages/lazy-metadata.storage"); const type_metadata_storage_1 = require("../storages/type-metadata.storage"); function getFieldsAndDecoratorForType(objType, options) { const classType = Reflect.getMetadata(graphql_constants_1.CLASS_TYPE_METADATA, objType); if (!classType) { throw new unable_to_find_fields_error_1.UnableToFindFieldsError(objType.name); } lazy_metadata_storage_1.LazyMetadataStorage.load([objType], { skipFieldLazyMetadata: true, }); const [classMetadata, decoratorFactory] = getClassMetadataAndFactoryByTargetAndType(classType, objType); type_metadata_storage_1.TypeMetadataStorage.loadClassPluginMetadata([classMetadata]); type_metadata_storage_1.TypeMetadataStorage.compileClassMetadata([classMetadata], options); let fields = classMetadata?.properties; if (!fields) { throw new unable_to_find_fields_error_1.UnableToFindFieldsError(objType.name); } fields = inheritClassFields(objType, fields, options); return { fields, decoratorFactory, }; } exports.getFieldsAndDecoratorForType = getFieldsAndDecoratorForType; function getClassMetadataAndFactoryByTargetAndType(classType, objType) { switch (classType) { case class_type_enum_1.ClassType.ARGS: return [ type_metadata_storage_1.TypeMetadataStorage.getArgumentsMetadataByTarget(objType), decorators_1.ArgsType, ]; case class_type_enum_1.ClassType.OBJECT: return [ type_metadata_storage_1.TypeMetadataStorage.getObjectTypeMetadataByTarget(objType), decorators_1.ObjectType, ]; case class_type_enum_1.ClassType.INPUT: return [ type_metadata_storage_1.TypeMetadataStorage.getInputTypeMetadataByTarget(objType), decorators_1.InputType, ]; case class_type_enum_1.ClassType.INTERFACE: return [ type_metadata_storage_1.TypeMetadataStorage.getInterfaceMetadataByTarget(objType), decorators_1.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 (err) { return fields; } }