UNPKG

graphql-compose

Version:

GraphQL schema builder from different data sources with middleware extensions.

93 lines (77 loc) 3.37 kB
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /* eslint-disable no-use-before-define, prefer-template */ import { GraphQLInputObjectType, GraphQLObjectType, isInputType, isAbstractType, GraphQLList, GraphQLNonNull } from 'graphql'; import util from 'util'; import TypeComposer from './typeComposer'; import InputTypeComposer from './inputTypeComposer'; import GenericType from './type/generic'; import { upperFirst } from './utils/misc'; export function removeWrongFields(fields) { var result = {}; Object.keys(fields).forEach(function (key) { var field = fields[key]; if (!isAbstractType(field.type) // skip interface fields && !field._gqcResolver // skip fields that obtained via Resolver ) { result[key] = field; } }); return result; } export function toInputObjectType(typeComposer) { var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var cache = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new Map(); if (typeComposer.hasInputTypeComposer()) { return typeComposer.getInputTypeComposer(); } var prefix = opts.prefix || ''; var postfix = opts.postfix || 'Input'; var inputTypeName = '' + prefix + typeComposer.getTypeName() + postfix; if (cache.has(typeComposer.getType())) { // $FlowFixMe return cache.get(typeComposer.getType()); } var inputTypeComposer = new InputTypeComposer(new GraphQLInputObjectType({ name: inputTypeName, fields: {} })); cache.set(typeComposer.getType(), inputTypeComposer); var outputFields = removeWrongFields(typeComposer.getFields()); var inputFields = {}; Object.keys(outputFields).forEach(function (key) { var fieldOpts = _extends({}, opts, { fieldName: key, outputTypeName: typeComposer.getTypeName() }); inputFields[key] = convertInputObjectField(outputFields[key], fieldOpts, cache); }); inputTypeComposer.addFields(inputFields); return inputTypeComposer; } export function convertInputObjectField(field, opts, cache) { var fieldType = field.type; var wrappers = []; while (fieldType instanceof GraphQLList || fieldType instanceof GraphQLNonNull) { wrappers.unshift(fieldType.constructor); fieldType = fieldType.ofType; } if (!isInputType(fieldType)) { if (fieldType instanceof GraphQLObjectType) { var typeOpts = { prefix: '' + (opts.prefix || '') + upperFirst(opts.outputTypeName || ''), postfix: opts.postfix || 'Input' }; var typeComposer = new TypeComposer(fieldType); fieldType = toInputObjectType(typeComposer, typeOpts, cache).getType(); } else { // eslint-disable-next-line console.error('GQC: can not convert field \'' + (opts.outputTypeName || '') + '.' + (opts.fieldName || '') + '\' to InputType' + '\nIt should be GraphQLObjectType, but got \n' + util.inspect(fieldType, { depth: 2, colors: true })); fieldType = GenericType; } } // $FlowFixMe var inputFieldType = wrappers.reduce(function (type, Wrapper) { return new Wrapper(type); }, fieldType); return { type: inputFieldType, description: field.description }; }