/** This file was generated by Nexus Schema Do not make changes to this file directly */

import { UnusedInterfaceTypeDef } from './kitchen-sink-definitions'
import { core, connectionPluginCore } from 'nexus'
import { QueryComplexity } from 'nexus/dist/plugins/queryComplexityPlugin'
import { FieldAuthorizeResolver } from 'nexus/dist/plugins/fieldAuthorizePlugin'
declare global {
  interface NexusGenCustomInputMethods<TypeName extends string> {
    date<FieldName extends string>(
      fieldName: FieldName,
      opts?: core.CommonInputFieldConfig<TypeName, FieldName>
    ): void // "Date";
  }
}
declare global {
  interface NexusGenCustomOutputMethods<TypeName extends string> {
    date<FieldName extends string>(
      fieldName: FieldName,
      ...opts: core.ScalarOutSpread<TypeName, FieldName>
    ): void // "Date";
    /**
     * Adds a Relay-style connection to the type, with numerous options for configuration
     *
     * @see https://nexusjs.org/docs/plugins/connection
     */
    connectionField<FieldName extends string>(
      fieldName: FieldName,
      config: connectionPluginCore.ConnectionFieldConfig<TypeName, FieldName>
    ): void
  }
}

declare global {
  interface NexusGen extends NexusGenTypes {}
}

export interface NexusGenInputs {
  InputType: {
    // input type
    answer?: number | null // Int
    key: string // String!
    nestedInput?: NexusGenInputs['InputType2'] | null // InputType2
  }
  InputType2: {
    // input type
    answer?: number | null // Int
    key: string // String!
    someDate: NexusGenScalars['Date'] // Date!
  }
  NestedType: {
    // input type
    veryNested?: string | null // String
  }
  SomeArg: {
    // input type
    arg?: NexusGenInputs['NestedType'] | null // NestedType
    someField?: string | null // String
  }
}

export interface NexusGenEnums {}

export interface NexusGenScalars {
  String: string
  Int: number
  Float: number
  Boolean: boolean
  ID: string
  Date: Date
}

export interface NexusGenObjects {
  BooleanConnection: {
    // root type
    edges?: Array<NexusGenRootTypes['BooleanEdge'] | null> | null // [BooleanEdge]
    pageInfo: NexusGenRootTypes['PageInfo'] // PageInfo!
  }
  BooleanEdge: {
    // root type
    cursor: string // String!
    node?: boolean | null // Boolean
  }
  ComplexObject: {
    // root type
    id?: string | null // ID
  }
  DateConnection: {
    // root type
    edges?: Array<NexusGenRootTypes['DateEdge'] | null> | null // [DateEdge]
    pageInfo: NexusGenRootTypes['PageInfo'] // PageInfo!
  }
  DateEdge: {
    // root type
    cursor: string // String!
    node?: NexusGenScalars['Date'] | null // Date
  }
  Foo: {
    // root type
    name?: string | null // String
    ok?: boolean | null // Boolean
  }
  Mutation: {}
  PageInfo: {
    // root type
    endCursor?: string | null // String
    hasNextPage: boolean // Boolean!
    hasPreviousPage: boolean // Boolean!
    startCursor?: string | null // String
  }
  Query: {}
  SomeItem: {
    // root type
    id?: string | null // ID
  }
  SomeNode: {
    // root type
    data?: NexusGenRootTypes['SomeNode'] | null // SomeNode
    id?: string | null // ID
  }
  TestObj: {
    // root type
    a?: NexusGenRootTypes['Bar'] | null // Bar
    data?: NexusGenRootTypes['Node'] | null // Node
    item?: string | null // String
    ok?: boolean | null // Boolean
  }
  User: {
    // root type
    id?: string | null // ID
    name?: string | null // String
  }
  UserConnection: {
    // root type
    edges?: Array<NexusGenRootTypes['UserEdge'] | null> | null // [UserEdge]
    pageInfo: NexusGenRootTypes['PageInfo'] // PageInfo!
  }
  UserEdge: {
    // root type
    cursor: string // String!
    node?: NexusGenRootTypes['User'] | null // User
  }
}

export interface NexusGenInterfaces {
  Bar: core.Discriminate<'Foo', 'optional'> | core.Discriminate<'TestObj', 'optional'>
  Baz: core.Discriminate<'TestObj', 'optional'>
  Node: core.Discriminate<'SomeNode', 'required'> | core.Discriminate<'TestObj', 'required'>
  UnusedInterface: UnusedInterfaceTypeDef
}

export interface NexusGenUnions {
  TestUnion: core.Discriminate<'Foo', 'optional'>
}

export type NexusGenRootTypes = NexusGenInterfaces & NexusGenObjects & NexusGenUnions

export type NexusGenAllTypes = NexusGenRootTypes & NexusGenScalars

export interface NexusGenFieldTypes {
  BooleanConnection: {
    // field return type
    edges: Array<NexusGenRootTypes['BooleanEdge'] | null> | null // [BooleanEdge]
    pageInfo: NexusGenRootTypes['PageInfo'] // PageInfo!
  }
  BooleanEdge: {
    // field return type
    cursor: string // String!
    node: boolean | null // Boolean
  }
  ComplexObject: {
    // field return type
    id: string | null // ID
  }
  DateConnection: {
    // field return type
    edges: Array<NexusGenRootTypes['DateEdge'] | null> | null // [DateEdge]
    pageInfo: NexusGenRootTypes['PageInfo'] // PageInfo!
  }
  DateEdge: {
    // field return type
    cursor: string // String!
    node: NexusGenScalars['Date'] | null // Date
  }
  Foo: {
    // field return type
    argsTest: boolean | null // Boolean
    name: string | null // String
    ok: boolean | null // Boolean
  }
  Mutation: {
    // field return type
    ok: boolean | null // Boolean
    someMutationField: NexusGenRootTypes['Foo'] | null // Foo
  }
  PageInfo: {
    // field return type
    endCursor: string | null // String
    hasNextPage: boolean // Boolean!
    hasPreviousPage: boolean // Boolean!
    startCursor: string | null // String
  }
  Query: {
    // field return type
    asArgExample: string | null // String
    bar: NexusGenRootTypes['TestObj'] | null // TestObj
    booleanConnection: NexusGenRootTypes['BooleanConnection'] | null // BooleanConnection
    complexQuery: Array<NexusGenRootTypes['ComplexObject'] | null> | null // [ComplexObject]
    dateAsList: Array<NexusGenScalars['Date'] | null> | null // [Date]
    deprecatedConnection: NexusGenRootTypes['BooleanConnection'] // BooleanConnection!
    extended: NexusGenRootTypes['SomeItem'] | null // SomeItem
    getNumberOrNull: number | null // Int
    guardedConnection: NexusGenRootTypes['DateConnection'] | null // DateConnection
    inlineArgs: string | null // String
    inputAsArgExample: string | null // String
    protectedField: number | null // Int
    userConnectionAdditionalArgs: NexusGenRootTypes['UserConnection'] | null // UserConnection
    userConnectionBackwardOnly: NexusGenRootTypes['UserConnection'] | null // UserConnection
    userConnectionForwardOnly: NexusGenRootTypes['UserConnection'] | null // UserConnection
    usersConnectionNodes: NexusGenRootTypes['UserConnection'] | null // UserConnection
    usersConnectionResolve: NexusGenRootTypes['UserConnection'] | null // UserConnection
  }
  SomeItem: {
    // field return type
    id: string | null // ID
  }
  SomeNode: {
    // field return type
    data: NexusGenRootTypes['SomeNode'] | null // SomeNode
    id: string | null // ID
  }
  TestObj: {
    // field return type
    a: NexusGenRootTypes['Bar'] | null // Bar
    argsTest: boolean | null // Boolean
    data: NexusGenRootTypes['Node'] | null // Node
    id: string // ID!
    item: string | null // String
    ok: boolean | null // Boolean
  }
  User: {
    // field return type
    id: string | null // ID
    name: string | null // String
  }
  UserConnection: {
    // field return type
    edges: Array<NexusGenRootTypes['UserEdge'] | null> | null // [UserEdge]
    pageInfo: NexusGenRootTypes['PageInfo'] // PageInfo!
  }
  UserEdge: {
    // field return type
    cursor: string // String!
    node: NexusGenRootTypes['User'] | null // User
  }
  Bar: {
    // field return type
    argsTest: boolean | null // Boolean
    ok: boolean | null // Boolean
  }
  Baz: {
    // field return type
    a: NexusGenRootTypes['Bar'] | null // Bar
    ok: boolean | null // Boolean
  }
  Node: {
    // field return type
    data: NexusGenRootTypes['Node'] | null // Node
    id: string | null // ID
  }
  UnusedInterface: {
    // field return type
    ok: boolean | null // Boolean
  }
}

export interface NexusGenFieldTypeNames {
  BooleanConnection: {
    // field return type name
    edges: 'BooleanEdge'
    pageInfo: 'PageInfo'
  }
  BooleanEdge: {
    // field return type name
    cursor: 'String'
    node: 'Boolean'
  }
  ComplexObject: {
    // field return type name
    id: 'ID'
  }
  DateConnection: {
    // field return type name
    edges: 'DateEdge'
    pageInfo: 'PageInfo'
  }
  DateEdge: {
    // field return type name
    cursor: 'String'
    node: 'Date'
  }
  Foo: {
    // field return type name
    argsTest: 'Boolean'
    name: 'String'
    ok: 'Boolean'
  }
  Mutation: {
    // field return type name
    ok: 'Boolean'
    someMutationField: 'Foo'
  }
  PageInfo: {
    // field return type name
    endCursor: 'String'
    hasNextPage: 'Boolean'
    hasPreviousPage: 'Boolean'
    startCursor: 'String'
  }
  Query: {
    // field return type name
    asArgExample: 'String'
    bar: 'TestObj'
    booleanConnection: 'BooleanConnection'
    complexQuery: 'ComplexObject'
    dateAsList: 'Date'
    deprecatedConnection: 'BooleanConnection'
    extended: 'SomeItem'
    getNumberOrNull: 'Int'
    guardedConnection: 'DateConnection'
    inlineArgs: 'String'
    inputAsArgExample: 'String'
    protectedField: 'Int'
    userConnectionAdditionalArgs: 'UserConnection'
    userConnectionBackwardOnly: 'UserConnection'
    userConnectionForwardOnly: 'UserConnection'
    usersConnectionNodes: 'UserConnection'
    usersConnectionResolve: 'UserConnection'
  }
  SomeItem: {
    // field return type name
    id: 'ID'
  }
  SomeNode: {
    // field return type name
    data: 'SomeNode'
    id: 'ID'
  }
  TestObj: {
    // field return type name
    a: 'Bar'
    argsTest: 'Boolean'
    data: 'Node'
    id: 'ID'
    item: 'String'
    ok: 'Boolean'
  }
  User: {
    // field return type name
    id: 'ID'
    name: 'String'
  }
  UserConnection: {
    // field return type name
    edges: 'UserEdge'
    pageInfo: 'PageInfo'
  }
  UserEdge: {
    // field return type name
    cursor: 'String'
    node: 'User'
  }
  Bar: {
    // field return type name
    argsTest: 'Boolean'
    ok: 'Boolean'
  }
  Baz: {
    // field return type name
    a: 'Bar'
    ok: 'Boolean'
  }
  Node: {
    // field return type name
    data: 'Node'
    id: 'ID'
  }
  UnusedInterface: {
    // field return type name
    ok: 'Boolean'
  }
}

export interface NexusGenArgTypes {
  Foo: {
    argsTest: {
      // args
      a: NexusGenInputs['InputType'] | null // InputType
    }
  }
  Mutation: {
    someMutationField: {
      // args
      id: string // ID!
    }
  }
  Query: {
    asArgExample: {
      // args
      testAsArg: NexusGenInputs['InputType'] // InputType!
    }
    booleanConnection: {
      // args
      after?: string | null // String
      first: number // Int!
    }
    complexQuery: {
      // args
      count: number // Int!
    }
    deprecatedConnection: {
      // args
      after?: string | null // String
      before?: string | null // String
      first?: number | null // Int
      last?: number | null // Int
    }
    getNumberOrNull: {
      // args
      a: number // Int!
    }
    guardedConnection: {
      // args
      after?: string | null // String
      first: number // Int!
    }
    inlineArgs: {
      // args
      someArg?: NexusGenInputs['SomeArg'] | null // SomeArg
    }
    inputAsArgExample: {
      // args
      testInput?: NexusGenInputs['InputType'] | null // InputType
      testScalar?: string | null // String
    }
    userConnectionAdditionalArgs: {
      // args
      after?: string | null // String
      first: number // Int!
      isEven?: boolean | null // Boolean
    }
    userConnectionBackwardOnly: {
      // args
      before?: string | null // String
      last: number // Int!
    }
    userConnectionForwardOnly: {
      // args
      after?: string | null // String
      first: number // Int!
    }
    usersConnectionNodes: {
      // args
      after?: string | null // String
      before?: string | null // String
      first?: number | null // Int
      last?: number | null // Int
    }
    usersConnectionResolve: {
      // args
      after?: string | null // String
      before?: string | null // String
      first?: number | null // Int
      last?: number | null // Int
    }
  }
  TestObj: {
    argsTest: {
      // args
      a: NexusGenInputs['InputType'] | null // InputType
    }
  }
  Bar: {
    argsTest: {
      // args
      a: NexusGenInputs['InputType'] | null // InputType
    }
  }
}

export interface NexusGenAbstractTypeMembers {
  TestUnion: 'Foo'
  Bar: 'Foo' | 'TestObj'
  Baz: 'TestObj'
  Node: 'SomeNode' | 'TestObj'
}

export interface NexusGenTypeInterfaces {
  Foo: 'Bar'
  SomeNode: 'Node'
  TestObj: 'Bar' | 'Baz' | 'Node'
}

export type NexusGenObjectNames = keyof NexusGenObjects

export type NexusGenInputNames = keyof NexusGenInputs

export type NexusGenEnumNames = never

export type NexusGenInterfaceNames = keyof NexusGenInterfaces

export type NexusGenScalarNames = keyof NexusGenScalars

export type NexusGenUnionNames = keyof NexusGenUnions

export type NexusGenObjectsUsingAbstractStrategyIsTypeOf = never

export type NexusGenAbstractsUsingStrategyResolveType = 'Bar' | 'Baz' | 'TestUnion'

export type NexusGenFeaturesConfig = {
  abstractTypeStrategies: {
    __typename: true
    resolveType: true
    isTypeOf: false
  }
}

export interface NexusGenTypes {
  context: any
  inputTypes: NexusGenInputs
  rootTypes: NexusGenRootTypes
  inputTypeShapes: NexusGenInputs & NexusGenEnums & NexusGenScalars
  argTypes: NexusGenArgTypes
  fieldTypes: NexusGenFieldTypes
  fieldTypeNames: NexusGenFieldTypeNames
  allTypes: NexusGenAllTypes
  typeInterfaces: NexusGenTypeInterfaces
  objectNames: NexusGenObjectNames
  inputNames: NexusGenInputNames
  enumNames: NexusGenEnumNames
  interfaceNames: NexusGenInterfaceNames
  scalarNames: NexusGenScalarNames
  unionNames: NexusGenUnionNames
  allInputTypes: NexusGenTypes['inputNames'] | NexusGenTypes['enumNames'] | NexusGenTypes['scalarNames']
  allOutputTypes:
    | NexusGenTypes['objectNames']
    | NexusGenTypes['enumNames']
    | NexusGenTypes['unionNames']
    | NexusGenTypes['interfaceNames']
    | NexusGenTypes['scalarNames']
  allNamedTypes: NexusGenTypes['allInputTypes'] | NexusGenTypes['allOutputTypes']
  abstractTypes: NexusGenTypes['interfaceNames'] | NexusGenTypes['unionNames']
  abstractTypeMembers: NexusGenAbstractTypeMembers
  objectsUsingAbstractStrategyIsTypeOf: NexusGenObjectsUsingAbstractStrategyIsTypeOf
  abstractsUsingStrategyResolveType: NexusGenAbstractsUsingStrategyResolveType
  features: NexusGenFeaturesConfig
}

declare global {
  interface NexusGenPluginTypeConfig<TypeName extends string> {
    node?: string | core.FieldResolver<TypeName, any>
  }
  interface NexusGenPluginFieldConfig<TypeName extends string, FieldName extends string> {
    /**
     * The complexity for an individual field. Return a number or a function that returns a number to specify
     * the complexity for this field.
     */
    complexity?: QueryComplexity<TypeName, FieldName>
    /**
     * Authorization for an individual field. Returning "true" or "Promise<true>" means the field can be
     * accessed. Returning "false" or "Promise<false>" will respond with a "Not Authorized" error for the
     * field. Returning or throwing an error will also prevent the resolver from executing.
     */
    authorize?: FieldAuthorizeResolver<TypeName, FieldName>
    /**
     * The nullability guard can be helpful, but is also a potentially expensive operation for lists. We need
     * to iterate the entire list to check for null items to guard against. Set this to true to skip the null
     * guard on a specific field if you know there's no potential for unsafe types.
     */
    skipNullGuard?: boolean
    /**
     * Whether the type can be null
     *
     * @default (depends on whether nullability is configured in type or schema)
     * @see declarativeWrappingPlugin
     */
    nullable?: boolean
    /**
     * Whether the type is list of values, or just a single value. If list is true, we assume the type is a
     * list. If list is an array, we'll assume that it's a list with the depth. The boolean indicates whether
     * the type is required (non-null), where true = nonNull, false = nullable.
     *
     * @see declarativeWrappingPlugin
     */
    list?: true | boolean[]
    /**
     * Whether the type should be non null, `required: true` = `nullable: false`
     *
     * @default (depends on whether nullability is configured in type or schema)
     * @see declarativeWrappingPlugin
     */
    required?: boolean
  }
  interface NexusGenPluginInputFieldConfig<TypeName extends string, FieldName extends string> {
    /**
     * Whether the type can be null
     *
     * @default (depends on whether nullability is configured in type or schema)
     * @see declarativeWrappingPlugin
     */
    nullable?: boolean
    /**
     * Whether the type is list of values, or just a single value. If list is true, we assume the type is a
     * list. If list is an array, we'll assume that it's a list with the depth. The boolean indicates whether
     * the type is required (non-null), where true = nonNull, false = nullable.
     *
     * @see declarativeWrappingPlugin
     */
    list?: true | boolean[]
    /**
     * Whether the type should be non null, `required: true` = `nullable: false`
     *
     * @default (depends on whether nullability is configured in type or schema)
     * @see declarativeWrappingPlugin
     */
    required?: boolean
  }
  interface NexusGenPluginSchemaConfig {}
  interface NexusGenPluginArgConfig {
    /**
     * Whether the type can be null
     *
     * @default (depends on whether nullability is configured in type or schema)
     * @see declarativeWrappingPlugin
     */
    nullable?: boolean
    /**
     * Whether the type is list of values, or just a single value. If list is true, we assume the type is a
     * list. If list is an array, we'll assume that it's a list with the depth. The boolean indicates whether
     * the type is required (non-null), where true = nonNull, false = nullable.
     *
     * @see declarativeWrappingPlugin
     */
    list?: true | boolean[]
    /**
     * Whether the type should be non null, `required: true` = `nullable: false`
     *
     * @default (depends on whether nullability is configured in type or schema)
     * @see declarativeWrappingPlugin
     */
    required?: boolean
  }
}
