UNPKG

@nestjs/graphql

Version:

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

58 lines (57 loc) 2.43 kB
import { SetMetadata } from '@nestjs/common'; import { ENTRY_PROVIDER_WATERMARK } from '@nestjs/common/constants.js'; import { isFunction, isString } from '@nestjs/common/utils/shared.utils.js'; import 'reflect-metadata'; import { LazyMetadataStorage } from '../schema-builder/storages/lazy-metadata.storage.js'; import { TypeMetadataStorage } from '../schema-builder/storages/type-metadata.storage.js'; import { addResolverMetadata, getClassName, getClassOrUndefined, getResolverTypeFn, } from './resolvers.utils.js'; /** * Extracts the name property set through the @ObjectType() decorator (if specified) * @param nameOrType type reference * * @publicApi */ function getObjectOrInterfaceTypeNameIfExists(nameOrType) { const ctor = getClassOrUndefined(nameOrType); const objectMetadata = TypeMetadataStorage.getObjectTypeMetadataByTarget(ctor); if (!objectMetadata) { const interfaceMetadata = TypeMetadataStorage.getInterfaceMetadataByTarget(ctor); if (!interfaceMetadata) { return; } return interfaceMetadata.name; } return objectMetadata.name; } /** * Object resolver decorator. * * @publicApi */ export function Resolver(nameOrTypeOrOptions, options) { return (target, key, descriptor) => { if (typeof target === 'function') { SetMetadata(ENTRY_PROVIDER_WATERMARK, true)(target); } const [nameOrType, resolverOptions] = typeof nameOrTypeOrOptions === 'object' && nameOrTypeOrOptions !== null ? [undefined, nameOrTypeOrOptions] : [nameOrTypeOrOptions, options]; let name = nameOrType && getClassName(nameOrType); if (isFunction(nameOrType)) { const objectName = getObjectOrInterfaceTypeNameIfExists(nameOrType); // eslint-disable-next-line @typescript-eslint/no-unused-expressions objectName && (name = objectName); } addResolverMetadata(undefined, name, target, key, descriptor); if (!isString(nameOrType)) { LazyMetadataStorage.store(target, () => { const typeFn = getResolverTypeFn(nameOrType, target); TypeMetadataStorage.addResolverMetadata({ target: target, typeFn: typeFn, isAbstract: (resolverOptions && resolverOptions.isAbstract) || false, }); }); } }; }