import { assertValidName } from 'graphql' import { InterfaceFieldsFor } from '../typegenTypeHelpers' import { AbstractTypes, NexusTypes, NonNullConfig, Omit, RootTypingDef, withNexusSymbol } from './_types' import { OutputDefinitionBlock, OutputDefinitionBuilder } from './definitionBlocks' import { Implemented, FieldModificationDef, FieldModification } from './interfaceType' export interface ObjectDefinitionBuilder extends OutputDefinitionBuilder { addInterfaces(toAdd: Implemented[]): void addModification(toAdd: FieldModificationDef): void } export class ObjectDefinitionBlock extends OutputDefinitionBlock { constructor(protected typeBuilder: ObjectDefinitionBuilder) { super(typeBuilder) } /** * @param interfaceName */ implements(...interfaceName: Array) { this.typeBuilder.addInterfaces(interfaceName) } /** * Modifies a field added via an interface */ modify, string>>( field: FieldName, modifications: FieldModification ) { this.typeBuilder.addModification({ ...modifications, field }) } } export type NexusObjectTypeConfig = { name: TypeName definition(t: ObjectDefinitionBlock): void /** * Configures the nullability for the type, check the * documentation's "Getting Started" section to learn * more about GraphQL Nexus's assumptions and configuration * on nullability. */ nonNullDefaults?: NonNullConfig /** * The description to annotate the GraphQL SDL */ description?: string | null /** * Root type information for this type */ rootTyping?: RootTypingDef } & AbstractTypes.MaybeTypeDefConfigFieldIsTypeOf & NexusGenPluginTypeConfig export class NexusObjectTypeDef { constructor(readonly name: TypeName, protected config: NexusObjectTypeConfig) { assertValidName(name) } get value() { return this.config } } withNexusSymbol(NexusObjectTypeDef, NexusTypes.Object) export function objectType(config: NexusObjectTypeConfig) { return new NexusObjectTypeDef(config.name, config) } export function queryType(config: Omit, 'name'>) { return objectType({ ...config, name: 'Query' }) } export function mutationType(config: Omit, 'name'>) { return objectType({ ...config, name: 'Mutation' }) }