schema
  @link(url: "https://specs.apollo.dev/link/v1.0")
  @link(url: "https://specs.apollo.dev/join/v0.3", for: EXECUTION)
{
  query: Query
  mutation: Mutation
  subscription: Subscription
}

directive @join__enumValue(graph: join__Graph!) repeatable on ENUM_VALUE

directive @join__field(graph: join__Graph, requires: join__FieldSet, provides: join__FieldSet, type: String, external: Boolean, override: String, usedOverridden: Boolean) repeatable on FIELD_DEFINITION | INPUT_FIELD_DEFINITION

directive @join__graph(name: String!, url: String!) on ENUM_VALUE

directive @join__implements(graph: join__Graph!, interface: String!) repeatable on OBJECT | INTERFACE

directive @join__type(graph: join__Graph!, key: join__FieldSet, extension: Boolean! = false, resolvable: Boolean! = true, isInterfaceObject: Boolean! = false) repeatable on OBJECT | INTERFACE | UNION | ENUM | INPUT_OBJECT | SCALAR

directive @join__unionMember(graph: join__Graph!, member: String!) repeatable on UNION

directive @link(url: String, as: String, for: link__Purpose, import: [link__Import]) repeatable on SCHEMA

directive @noArgs on FIELD | FRAGMENT_DEFINITION | FRAGMENT_SPREAD | INLINE_FRAGMENT | MUTATION | QUERY | SUBSCRIPTION

directive @withArgs(arg1: String = "Default", arg2: String, arg3: Boolean, arg4: Int, arg5: [ID]) on FIELD | FRAGMENT_DEFINITION | FRAGMENT_SPREAD | INLINE_FRAGMENT | MUTATION | QUERY | SUBSCRIPTION

interface AnInterface
  @join__type(graph: MAIN)
{
  sharedField: String!
}

input AnotherInputType
  @join__type(graph: MAIN)
{
  anotherInput: ID!
}

type BasicResponse
  @join__type(graph: MAIN)
{
  id: Int!
  nullableId: Int
}

type BasicTypesResponse
  @join__type(graph: MAIN)
{
  nullableId: ID
  nonNullId: ID!
  nullableInt: Int
  nonNullInt: Int!
  nullableString: String
  nonNullString: String!
  nullableFloat: Float
  nonNullFloat: Float!
  nullableBoolean: Boolean
  nonNullBoolean: Boolean!
}

input EnumInputType
  @join__type(graph: MAIN)
{
  enumInput: SomeEnum!
  nullableEnumInput: SomeEnum
  enumListInput: [SomeEnum!]!
  enumListOfListInput: [[SomeEnum]]
  nestedEnumType: [NestedEnumInputType]
}

type EverythingResponse
  @join__type(graph: MAIN)
{
  id: Int!
  nullableId: Int
  basicTypes: BasicTypesResponse
  enumResponse: SomeEnum
  interfaceResponse: AnInterface
  interfaceImplementationResponse: InterfaceImplementation2
  unionResponse: UnionType
  unionType2Response: UnionType2
  listOfBools: [Boolean!]!
  listOfInterfaces: [AnInterface]
  listOfUnions: [UnionType]
  objectTypeWithInputField(boolInput: Boolean, secondInput: Boolean!): ObjectTypeResponse
  listOfObjects: [ObjectTypeResponse]
}

input InputType
  @join__type(graph: MAIN)
{
  inputString: String!
  inputInt: Int!
  inputBoolean: Boolean
  nestedType: NestedInputType!
  enumInput: SomeEnum
  listInput: [Int!]!
  nestedTypeList: [NestedInputType]
}

input InputTypeWithDefault
  @join__type(graph: MAIN)
{
  nonNullId: ID!
  nonNullIdWithDefault: ID! = "id"
  nullableId: ID
  nullableIdWithDefault: ID = "id"
}

type InterfaceImplementation1 implements AnInterface
  @join__implements(graph: MAIN, interface: "AnInterface")
  @join__type(graph: MAIN)
{
  sharedField: String!
  implementation1Field: Int!
}

type InterfaceImplementation2 implements AnInterface
  @join__implements(graph: MAIN, interface: "AnInterface")
  @join__type(graph: MAIN)
{
  sharedField: String!
  implementation2Field: Float!
}

scalar join__FieldSet

enum join__Graph {
  MAIN @join__graph(name: "main", url: "http://localhost:4001/graphql")
}

scalar link__Import

enum link__Purpose {
  """
  `SECURITY` features provide metadata necessary to securely resolve fields.
  """
  SECURITY

  """
  `EXECUTION` features provide metadata necessary for operation execution.
  """
  EXECUTION
}

type Mutation
  @join__type(graph: MAIN)
{
  noInputMutation: EverythingResponse!
  graph(id: ID!): TestGraphResponse!
  mutation2(id: ID!): TestGraphResponse2!
  mutation3(id: ID!): TestGraphResponse3!
  mutation4(id1: ID!, id2: ID!): ID!
}

input NestedEnumInputType
  @join__type(graph: MAIN)
{
  someEnum: SomeEnum!
  someNullableEnum: SomeEnum
  someEnumList: [SomeEnum]
  someEnumListOfList: [[SomeEnum]]
}

input NestedInputType
  @join__type(graph: MAIN)
{
  someFloat: Float!
  someNullableFloat: Float
}

type ObjectTypeResponse
  @join__type(graph: MAIN)
{
  stringField: String!
  intField: Int!
  nullableField: String
}

type NestedEnumResponse
  @join__type(graph: MAIN)
{
  singleValue: SomeEnum
  list: [SomeEnum]
  listOfLists: [[SomeEnum]]
}

type EnumResponse 
  @join__type(graph: MAIN)
{
  singleValue: SomeEnum
  list: [SomeEnum]
  listOfLists: [[SomeEnum]]
  nestedObject: NestedEnumResponse
}

type EnumResponseWithNestedQuery 
  @join__type(graph: MAIN)
{
  nestedQuery(input: SomeEnum): StringResponse
}

type StringResponse
  @join__type(graph: MAIN)
{
  str: String 
}

type Query
  @join__type(graph: MAIN)
{
  inputTypeQuery(input: InputType!): EverythingResponse!
  scalarInputQuery(listInput: [String!]!, stringInput: String!, nullableStringInput: String, intInput: Int!, floatInput: Float!, boolInput: Boolean!, enumInput: SomeEnum, idInput: ID!): EverythingResponse!
  noInputQuery: EverythingResponse!
  basicInputTypeQuery(input: NestedInputType!): EverythingResponse!
  anotherInputTypeQuery(input: AnotherInputType): EverythingResponse!
  enumInputQuery(enumInput: SomeEnum, inputType: EnumInputType, stringInput: String, anotherStr: String): EverythingResponse!
  basicResponseQuery: BasicResponse!
  scalarResponseQuery: String
  defaultArgQuery(stringInput: String! = "default", inputType: AnotherInputType = {anotherInput: "inputDefault"}): BasicResponse!
  inputTypeDefaultQuery(input: InputTypeWithDefault): BasicResponse!
  sortQuery(listInput: [String!]!, stringInput: String!, nullableStringInput: String, INTInput: Int!, floatInput: Float!, boolInput: Boolean!, enumInput: SomeEnum, idInput: ID!): SortResponse!
  manyArgsQuery(arg1: String, arg2: String, arg3: String, arg4: String, arg5: String, arg6: String, arg7: String): EverythingResponse!
  underscoreQuery(arg_: String, _arg2: String, _arg3_: String): UnderscoreResponse
  enumUsageQuery(
    nonNullEnumInput: SomeEnum!,
    nullableEnumInput: SomeEnum,
    enumInputList: [SomeEnum],
    enumInputListOfLists: [[SomeEnum]],
    enumInputObject: EnumInputType,
    enumInputObjectList: [EnumInputType],
    enumInputObjectListOfLists: [[EnumInputType]],
    anotherEnumList: [AnotherEnum],
  ): BasicResponse
  enumResponseQuery: EnumResponse,
  enumNestedQuery: EnumResponseWithNestedQuery
}

enum SomeEnum
  @join__type(graph: MAIN)
{
  SOME_VALUE_1 @join__enumValue(graph: MAIN)
  SOME_VALUE_2 @join__enumValue(graph: MAIN)
  SOME_VALUE_3 @join__enumValue(graph: MAIN)
  SOME_VALUE_4 @join__enumValue(graph: MAIN)
  SOME_VALUE_5 @join__enumValue(graph: MAIN)
  SOME_VALUE_6 @join__enumValue(graph: MAIN)
  SOME_VALUE_7 @join__enumValue(graph: MAIN)
  SOME_VALUE_8 @join__enumValue(graph: MAIN)
  SOME_VALUE_9 @join__enumValue(graph: MAIN)
  SOME_VALUE_10 @join__enumValue(graph: MAIN)
  SOME_VALUE_11 @join__enumValue(graph: MAIN)
  SOME_VALUE_12 @join__enumValue(graph: MAIN)
  SOME_VALUE_13 @join__enumValue(graph: MAIN)
  SOME_VALUE_14 @join__enumValue(graph: MAIN)
  SOME_VALUE_15 @join__enumValue(graph: MAIN)
  SOME_VALUE_16 @join__enumValue(graph: MAIN)
  SOME_VALUE_17 @join__enumValue(graph: MAIN)
  SOME_VALUE_18 @join__enumValue(graph: MAIN)
  SOME_VALUE_19 @join__enumValue(graph: MAIN)
  SOME_VALUE_20 @join__enumValue(graph: MAIN)
  SOME_VALUE_21 @join__enumValue(graph: MAIN)
  SOME_VALUE_22 @join__enumValue(graph: MAIN)
  SOME_VALUE_23 @join__enumValue(graph: MAIN)
  SOME_VALUE_24 @join__enumValue(graph: MAIN)
  SOME_VALUE_25 @join__enumValue(graph: MAIN)
  SOME_VALUE_26 @join__enumValue(graph: MAIN)
  SOME_VALUE_27 @join__enumValue(graph: MAIN)
  SOME_VALUE_28 @join__enumValue(graph: MAIN)
  SOME_VALUE_29 @join__enumValue(graph: MAIN)
  SOME_VALUE_30 @join__enumValue(graph: MAIN)
  SOME_VALUE_31 @join__enumValue(graph: MAIN)
  SOME_VALUE_32 @join__enumValue(graph: MAIN)
  SOME_VALUE_33 @join__enumValue(graph: MAIN)
  SOME_VALUE_34 @join__enumValue(graph: MAIN)
}

enum AnotherEnum
  @join__type(graph: MAIN)
{
  ANOTHER_VALUE_1 @join__enumValue(graph: MAIN)
  ANOTHER_VALUE_2 @join__enumValue(graph: MAIN)
  ANOTHER_VALUE_3 @join__enumValue(graph: MAIN)
}

type SortResponse
  @join__type(graph: MAIN)
{
  id: Int!
  nullableId: Int
  zzz: Int
  aaa: Int
  CCC: Int
}

type TestGraphResponse
  @join__type(graph: MAIN)
{
  updateCheckConfiguration(downgradeDefaultValueChange: Boolean, downgradeStaticChecks: Boolean): Int!
}

type TestGraphResponse2
  @join__type(graph: MAIN)
{
  updateCheckConfiguration(arg1: Boolean, arg2: Boolean): Int!
}

type TestGraphResponse3
  @join__type(graph: MAIN)
{
  updateCheckConfiguration(arg1: String, arg2: String, arg3: String): Int!
}

type UnderscoreResponse
  @join__type(graph: MAIN)
{
  _: String
  _name: String
  _name_: String
  name_: String
}

type Subscription
  @join__type(graph: MAIN)
{
  noInputSubscription: EverythingResponse!
}

union UnionType
  @join__type(graph: MAIN)
  @join__unionMember(graph: MAIN, member: "UnionType1")
  @join__unionMember(graph: MAIN, member: "UnionType2")
 = UnionType1 | UnionType2

type UnionType1
  @join__type(graph: MAIN)
{
  unionType1Field: String!
  nullableString: String
}

type UnionType2
  @join__type(graph: MAIN)
{
  unionType2Field: String!
  nullableString: String
}