@nestjs/graphql
Version:
Nest - modern, fast, powerful node.js web framework (@graphql)
66 lines (65 loc) • 2.51 kB
JavaScript
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;
}
}