UNPKG

@nestjs/graphql

Version:

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

74 lines (73 loc) 3.81 kB
import { __decorate, __metadata } from "tslib"; import { Injectable } from '@nestjs/common'; import { isUndefined } from '@nestjs/common/utils/shared.utils.js'; import { CannotDetermineArgTypeError } from '../errors/cannot-determine-arg-type.error.js'; import { getDefaultValue } from '../helpers/get-default-value.helper.js'; import { normalizeEnumDefaultValue } from '../helpers/normalize-enum-default-value.helper.js'; import { TypeMetadataStorage } from '../storages/type-metadata.storage.js'; import { InputTypeFactory } from './input-type.factory.js'; import { AstDefinitionNodeFactory } from './ast-definition-node.factory.js'; let ArgsFactory = class ArgsFactory { constructor(inputTypeFactory, astDefinitionNodeFactory) { this.inputTypeFactory = inputTypeFactory; this.astDefinitionNodeFactory = astDefinitionNodeFactory; } create(args, options) { const fieldConfigMap = {}; args.forEach((param) => { if (param.kind === 'arg') { const typeRef = param.typeFn(); fieldConfigMap[param.name] = { description: param.description, deprecationReason: param.deprecationReason, type: this.inputTypeFactory.create(param.name, typeRef, options, param.options), defaultValue: normalizeEnumDefaultValue(param.options.defaultValue, typeRef, TypeMetadataStorage.getEnumsMetadata()), }; } else if (param.kind === 'args') { const argumentTypes = TypeMetadataStorage.getArgumentsMetadata(); const hostType = param.typeFn(); const argumentType = argumentTypes.find((item) => item.target === hostType); if (!argumentType) { throw new CannotDetermineArgTypeError(hostType.name || hostType, param); } let parent = Object.getPrototypeOf(argumentType.target); while (!isUndefined(parent.prototype)) { const parentArgType = argumentTypes.find((item) => item.target === parent); if (parentArgType) { this.inheritParentArgs(parentArgType, options, fieldConfigMap); } parent = Object.getPrototypeOf(parent); } this.inheritParentArgs(argumentType, options, fieldConfigMap); } }); return fieldConfigMap; } inheritParentArgs(argType, options, fieldConfigMap = {}) { const argumentInstance = new argType.target(); argType.properties.forEach((field) => { field.options.defaultValue = getDefaultValue(argumentInstance, field.options, field.name, argType.name); const { schemaName } = field; const typeRef = field.typeFn(); const type = this.inputTypeFactory.create(field.name, typeRef, options, field.options); fieldConfigMap[schemaName] = { description: field.description, deprecationReason: field.deprecationReason, type, defaultValue: normalizeEnumDefaultValue(field.options.defaultValue, typeRef, TypeMetadataStorage.getEnumsMetadata()), /** * AST node has to be manually created in order to define directives * (more on this topic here: https://github.com/graphql/graphql-js/issues/1343) */ astNode: this.astDefinitionNodeFactory.createArgNode(field.name, type, field.directives), }; }); } }; ArgsFactory = __decorate([ Injectable(), __metadata("design:paramtypes", [InputTypeFactory, AstDefinitionNodeFactory]) ], ArgsFactory); export { ArgsFactory };