/* @flow strict */ /* eslint-disable no-use-before-define */ import { isFunction, isObject } from './is'; import type { SchemaComposer } from '../SchemaComposer'; import type { GraphQLFieldConfig, GraphQLArgumentConfig, GraphQLFieldConfigArgumentMap, GraphQLFieldConfigMap, GraphQLInputFieldConfig, GraphQLInputFieldConfigMap, GraphQLObjectType, GraphQLInterfaceType, } from '../graphql'; import type { ComposeInputFieldConfig, ComposeInputFieldConfigMap } from '../InputTypeComposer'; import type { ComposeFieldConfig, ComposeFieldConfigMap, ComposeArgumentConfig, ComposeFieldConfigArgumentMap, ComposeObjectType, } from '../ObjectTypeComposer'; import type { ComposeInterfaceType } from '../InterfaceTypeComposer'; import type { Thunk } from './definitions'; export function resolveOutputConfigAsThunk( schema: SchemaComposer, fc: ComposeFieldConfig, name: string, typeName?: string = '' ): GraphQLFieldConfig { const fieldConfig = schema.typeMapper.convertOutputFieldConfig( isFunction(fc) ? fc() : fc, name, typeName ); if (isFunction(fieldConfig.type)) { fieldConfig.type = schema.typeMapper.convertOutputFieldConfig( fieldConfig.type(), name, typeName ).type; } if (isObject(fieldConfig.args)) { fieldConfig.args = resolveArgConfigMapAsThunk(schema, (fieldConfig.args: any), name, typeName); } return fieldConfig; } export function resolveOutputConfigMapAsThunk( schema: SchemaComposer, fieldMap: ComposeFieldConfigMap, typeName?: string = '' ): GraphQLFieldConfigMap { const fields = {}; if (isObject(fieldMap)) { Object.keys(fieldMap).forEach(name => { fields[name] = resolveOutputConfigAsThunk(schema, fieldMap[name], name, typeName); }); } return fields; } export function resolveInputConfigAsThunk( schema: SchemaComposer, fc: ComposeInputFieldConfig, name: string, typeName?: string ): GraphQLInputFieldConfig { const fieldConfig = schema.typeMapper.convertInputFieldConfig( isFunction(fc) ? fc() : fc, name, typeName ); if (isFunction(fieldConfig.type)) { fieldConfig.type = schema.typeMapper.convertInputFieldConfig( fieldConfig.type(), name, typeName ).type; } return fieldConfig; } export function resolveInputConfigMapAsThunk( schema: SchemaComposer, fieldMap: ComposeInputFieldConfigMap, typeName?: string ): GraphQLInputFieldConfigMap { const fields = {}; if (isObject(fieldMap)) { Object.keys(fieldMap).forEach(name => { fields[name] = resolveInputConfigAsThunk(schema, fieldMap[name], name, typeName); }); } return fields; } export function resolveArgConfigAsThunk( schema: SchemaComposer, ac: ComposeArgumentConfig, name: string, fieldName?: string, typeName?: string ): GraphQLArgumentConfig { const argConfig = schema.typeMapper.convertArgConfig( isFunction(ac) ? ac() : ac, name, fieldName, typeName ); if (isFunction(argConfig.type)) { argConfig.type = schema.typeMapper.convertArgConfig(argConfig.type(), name, typeName).type; } return argConfig; } export function resolveArgConfigMapAsThunk( schema: SchemaComposer, argMap: ComposeFieldConfigArgumentMap, fieldName?: string, typeName?: string ): GraphQLFieldConfigArgumentMap { const args = {}; if (isObject(argMap)) { Object.keys(argMap).forEach(name => { args[name] = resolveArgConfigAsThunk(schema, argMap[name], name, fieldName, typeName); }); } return args; } export function resolveTypeArrayAsThunk( schema: SchemaComposer, types: Thunk<$ReadOnlyArray>, typeName?: string ): Array { try { const t = isFunction(types) ? types() : types; return t.map((type: ComposeObjectType) => schema.typeMapper.convertOutputType(type)); } catch (e) { throw new Error(`Cannot resolve types for ${typeName || ''}`); } } export function resolveInterfaceArrayAsThunk( schema: SchemaComposer, types: Thunk<$ReadOnlyArray>, typeName?: string ): Array { try { const t = isFunction(types) ? types() : types; return t.map((type: ComposeInterfaceType) => schema.typeMapper.convertInterfaceType(type)); } catch (e) { throw new Error(`Cannot resolve types for ${typeName || ''}`); } }