diff --git a/core/src/main/kotlin/org/evomaster/core/problem/graphql/builder/GraphQLActionBuilder.kt b/core/src/main/kotlin/org/evomaster/core/problem/graphql/builder/GraphQLActionBuilder.kt index 977e7c2d34..8b6c5892ee 100644 --- a/core/src/main/kotlin/org/evomaster/core/problem/graphql/builder/GraphQLActionBuilder.kt +++ b/core/src/main/kotlin/org/evomaster/core/problem/graphql/builder/GraphQLActionBuilder.kt @@ -624,22 +624,24 @@ object GraphQLActionBuilder { val fields: MutableList = mutableListOf() val selectionInArgs = state.argsTablesIndexedByName[element.typeName] ?: listOf() for (element in selectionInArgs) { - if (element.kindOfFieldType.lowercase() == GqlConst.SCALAR) { - val copy = element.copy( - fieldType = element.typeName, - KindOfFieldName = element.fieldType, - typeName = element.fieldName - ) - + if (element.KindOfFieldName.lowercase() == GqlConst.LIST) { + val copy = copyTableElement(element, element) val template = getInputGene(state, history, maxTreeDepth, copy) + fields.add(template) - } else - if (element.KindOfFieldName.lowercase() == GqlConst.LIST) { - val copy = copyTableElement(element, element) - val template = getInputGene(state, history, maxTreeDepth, copy) + } + else + if (element.kindOfFieldType.lowercase() == GqlConst.SCALAR) { + val copy = element.copy( + fieldType = element.typeName, + KindOfFieldName = element.fieldType, + typeName = element.fieldName + ) + val template = getInputGene(state, history, maxTreeDepth, copy) fields.add(template) - } else + } + else if (element.kindOfFieldType.lowercase() == GqlConst.INPUT_OBJECT) { val copy = copyTableElement(element, element) val template = getInputGene(state, history, maxTreeDepth, copy) diff --git a/core/src/main/kotlin/org/evomaster/core/problem/graphql/builder/StateBuilder.kt b/core/src/main/kotlin/org/evomaster/core/problem/graphql/builder/StateBuilder.kt index d5e8076335..284ea8f57e 100644 --- a/core/src/main/kotlin/org/evomaster/core/problem/graphql/builder/StateBuilder.kt +++ b/core/src/main/kotlin/org/evomaster/core/problem/graphql/builder/StateBuilder.kt @@ -972,50 +972,126 @@ object StateBuilder { Extract tempArgsTables */ private fun extractTempArgsTables(state: TempState, schemaObj: SchemaObj) { + //Todo we need better strategies for arguments extraction for (elementInInputParamTable in state.argsTables) if (elementInInputParamTable.kindOfFieldType == __TypeKind.INPUT_OBJECT.toString()) for (elementIntypes in schemaObj.data.__schema.types) if ((elementInInputParamTable.fieldType == elementIntypes.name) && (elementIntypes.kind == __TypeKind.INPUT_OBJECT)) for (elementInInputFields in elementIntypes.inputFields) { - val kind0 = elementInInputFields.type.kind - val kind1 = elementInInputFields?.type?.ofType?.kind - if (kind0 == __TypeKind.NON_NULL) {//non optional scalar or enum - if (kind1 == __TypeKind.SCALAR || kind1 == __TypeKind.ENUM) { // non optional scalar or enum - - if (kind1 == __TypeKind.ENUM) { - val enumElement: MutableList = - collectEnumElementsInTable( - schemaObj, - elementInInputFields.type.ofType.name - ) - state.tempArgsTables.add( - Table( - typeName = elementIntypes.name, - kindOfFieldType = kind1.toString(), - isKindOfFieldTypeOptional = false, - fieldType = elementInInputFields.type.ofType.name, - fieldName = elementInInputFields.name, - - enumValues = enumElement + /* val kind0 = elementInInputFields.type.kind + val kind1 = elementInInputFields?.type?.ofType?.kind*/ + + val (kind0, kind1, kind2, kind3) = quadKindsInInputs(elementInInputFields) + + if (kind0 == __TypeKind.NON_NULL) {////non-optional list or scalar or enum + if (kind1 == __TypeKind.LIST) {//nn-optional list in the top + if (kind2 == __TypeKind.NON_NULL) { + if (kind3 == __TypeKind.ENUM) { + val enumElement: MutableList = + collectEnumElementsInTable( + schemaObj, + elementInInputFields.type.ofType.ofType.ofType.name + ) + state.tempArgsTables.add( + Table( + KindOfFieldName = __TypeKind.LIST.toString(), + isKindOfFieldNameOptional = false, + + typeName = elementIntypes.name, + kindOfFieldType = kind3.toString(), + isKindOfFieldTypeOptional = false, + fieldType = elementInInputFields.type.ofType.ofType.ofType.name, + fieldName = elementInInputFields.name, + enumValues = enumElement + ) ) - ) - } else - state.tempArgsTables.add( - Table( - typeName = elementIntypes.name, - kindOfFieldType = kind1.toString(), - isKindOfFieldTypeOptional = false, - fieldType = elementInInputFields.type.ofType.name, - fieldName = elementInInputFields.name + } else + if (kind3 == __TypeKind.SCALAR) { + state.tempArgsTables.add( + Table( + KindOfFieldName = __TypeKind.LIST.toString(), + isKindOfFieldNameOptional = false, + + typeName = elementIntypes.name, + kindOfFieldType = kind3.toString(), + isKindOfFieldTypeOptional = false, + fieldType = elementInInputFields.type.ofType.ofType.ofType.name, + fieldName = elementInInputFields.name + ) + ) + } else + //TODO: This portion will generate GC errors, fix me. + if (kind3 == __TypeKind.INPUT_OBJECT) { + state.tempArgsTables.add( + Table( + KindOfFieldName = __TypeKind.LIST.toString(), + isKindOfFieldNameOptional = false, + + typeName = elementIntypes.name, + kindOfFieldType = kind3.toString(), + isKindOfFieldTypeOptional = false, + fieldType = elementInInputFields.type.ofType.ofType.ofType.name, + fieldName = elementInInputFields.name + ) + ) + } + } + } else { + if (kind1 == __TypeKind.SCALAR || kind1 == __TypeKind.ENUM) { // non-optional scalar or enum + if (kind1 == __TypeKind.ENUM) { + val enumElement: MutableList = + collectEnumElementsInTable( + schemaObj, + elementInInputFields.type.ofType.name + ) + state.tempArgsTables.add( + Table( + typeName = elementIntypes.name, + kindOfFieldType = kind1.toString(), + isKindOfFieldTypeOptional = false, + fieldType = elementInInputFields.type.ofType.name, + fieldName = elementInInputFields.name, + + enumValues = enumElement + ) ) - ) + } else + state.tempArgsTables.add( + Table( + typeName = elementIntypes.name, + kindOfFieldType = kind1.toString(), + isKindOfFieldTypeOptional = false, + fieldType = elementInInputFields.type.ofType.name, + fieldName = elementInInputFields.name + ) + ) + } + } - } else // optional scalar or enum - if (kind0 == __TypeKind.SCALAR || kind0 == __TypeKind.ENUM) {// optional scalar or enum - if (kind0 == __TypeKind.ENUM) { - val enumElement: MutableList = - collectEnumElementsInTable(schemaObj, elementInInputFields.type.name) + } else + //TODO: This portion will generate GC errors, fix me. + if (kind0 == __TypeKind.LIST) { + + if (kind1 == __TypeKind.NON_NULL) { + if (kind2 == __TypeKind.INPUT_OBJECT) { + state.tempArgsTables.add( + Table( + KindOfFieldName = __TypeKind.LIST.toString(), + isKindOfFieldNameOptional = true, + + typeName = elementIntypes.name, + kindOfFieldType = kind2.toString(), + isKindOfFieldTypeOptional = false, + fieldType = elementInInputFields.type.ofType.ofType.name, + fieldName = elementInInputFields.name, + ) + ) + } + } + } else + //TODO: This portion will generate GC errors, fix me. + if (kind0 == __TypeKind.INPUT_OBJECT) { state.tempArgsTables.add( Table( typeName = elementIntypes.name, @@ -1023,21 +1099,38 @@ object StateBuilder { isKindOfFieldTypeOptional = true, fieldType = elementInInputFields.type.name, fieldName = elementInInputFields.name, - - enumValues = enumElement ) ) } else - state.tempArgsTables.add( - Table( - typeName = elementIntypes.name, - kindOfFieldType = kind0.toString(), - isKindOfFieldTypeOptional = true, - fieldType = elementInInputFields.type.name, - fieldName = elementInInputFields.name - ) - ) - } + if (kind0 == __TypeKind.SCALAR || kind0 == __TypeKind.ENUM) {// optional scalar or enum + if (kind0 == __TypeKind.ENUM) { + val enumElement: MutableList = + collectEnumElementsInTable( + schemaObj, + elementInInputFields.type.name + ) + state.tempArgsTables.add( + Table( + typeName = elementIntypes.name, + kindOfFieldType = kind0.toString(), + isKindOfFieldTypeOptional = true, + fieldType = elementInInputFields.type.name, + fieldName = elementInInputFields.name, + + enumValues = enumElement + ) + ) + } else + state.tempArgsTables.add( + Table( + typeName = elementIntypes.name, + kindOfFieldType = kind0.toString(), + isKindOfFieldTypeOptional = true, + fieldType = elementInInputFields.type.name, + fieldName = elementInInputFields.name + ) + ) + } } } diff --git a/core/src/test/kotlin/org/evomaster/core/problem/graphql/builder/GraphQLActionBuilderTest.kt b/core/src/test/kotlin/org/evomaster/core/problem/graphql/builder/GraphQLActionBuilderTest.kt index 6b8b9f5269..78725cf982 100644 --- a/core/src/test/kotlin/org/evomaster/core/problem/graphql/builder/GraphQLActionBuilderTest.kt +++ b/core/src/test/kotlin/org/evomaster/core/problem/graphql/builder/GraphQLActionBuilderTest.kt @@ -1679,6 +1679,47 @@ class GraphQLActionBuilderTest { val pipelineSchedule = actionCluster["pipelineSchedule"] as GraphQLAction assertEquals(2, pipelineSchedule.parameters.size) assertTrue(pipelineSchedule.parameters[1] is GQReturnParam) + /**/ + + val organizationInvitationCreate = actionCluster["organizationInvitationCreate"] as GraphQLAction + assertEquals(2, organizationInvitationCreate.parameters.size) + assertTrue(organizationInvitationCreate.parameters[0] is GQInputParam) + + assertTrue(organizationInvitationCreate.parameters[0].name == "input") + assertTrue((organizationInvitationCreate.parameters[0].gene.getWrappedGene(ObjectGene::class.java) != null)) + val objOrganizationInvitationCreate = organizationInvitationCreate.parameters[0].gene.getWrappedGene(ObjectGene::class.java) + if ( objOrganizationInvitationCreate != null) { + + assertTrue( objOrganizationInvitationCreate.fields.any { it.getWrappedGene(ArrayGene::class.java)?.name == "emails" }) } + + + } + + @Test + fun buildkiteFragmentTest() { + //This fragment is used for the issues with inputs + val actionCluster = mutableMapOf() + val json = GraphQLActionBuilderTest::class.java.getResource("/graphql/artificial/buildkite(fragment).json").readText() + + val config = EMConfig() + GraphQLActionBuilder.addActionsFromSchema(json, actionCluster, config.treeDepth) + + assertEquals(1, actionCluster.size) + val organizationInvitationCreate = actionCluster["organizationInvitationCreate"] as GraphQLAction + assertEquals(2, organizationInvitationCreate.parameters.size) + assertTrue(organizationInvitationCreate.parameters[0] is GQInputParam) + + assertTrue(organizationInvitationCreate.parameters[0].name == "input") + assertTrue((organizationInvitationCreate.parameters[0].gene.getWrappedGene(ObjectGene::class.java) != null)) + val objOrganizationInvitationCreate = + organizationInvitationCreate.parameters[0].gene.getWrappedGene(ObjectGene::class.java) + if (objOrganizationInvitationCreate != null) { + + assertTrue(objOrganizationInvitationCreate.fields.any { it.getWrappedGene(ArrayGene::class.java)?.name == "emails" }) + assertTrue(objOrganizationInvitationCreate.fields.any { it.getWrappedGene(ObjectGene::class.java)?.name == "sso" }) + assertTrue(objOrganizationInvitationCreate.fields.any { it.getWrappedGene(ArrayGene::class.java)?.name == "teams" }) + } + } diff --git a/core/src/test/resources/graphql/artificial/buildkite(fragment).json b/core/src/test/resources/graphql/artificial/buildkite(fragment).json new file mode 100644 index 0000000000..53ae542fca --- /dev/null +++ b/core/src/test/resources/graphql/artificial/buildkite(fragment).json @@ -0,0 +1,1003 @@ +{ + "data": { + "__schema": { + "queryType": { + "name": "Query" + }, + "mutationType": { + "name": "Mutation" + }, + "types": [ + { + "kind": "SCALAR", + "name": "Boolean", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "Int", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "SCALAR", + "name": "String", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + + + { + "kind": "OBJECT", + "name": "Mutation", + "fields": [ + { + "name": "organizationInvitationCreate", + "args": [ + { + "name": "input", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "OrganizationInvitationCreateInput", + "ofType": null + } + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "OrganizationInvitationCreatePayload", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + + { + "kind": "INPUT_OBJECT", + "name": "OrganizationInvitationCreateInput", + "fields": null, + "inputFields": [ + { + "name": "clientMutationId", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "organizationID", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "defaultValue": null + }, + { + "name": "emails", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + "defaultValue": null + }, + { + "name": "role", + "type": { + "kind": "ENUM", + "name": "OrganizationMemberRole", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "sso", + "type": { + "kind": "INPUT_OBJECT", + "name": "OrganizationInvitationSSOInput", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "teams", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "OrganizationInvitationTeamAssignmentInput", + "ofType": null + } + } + }, + "defaultValue": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + + { + "kind": "OBJECT", + "name": "OrganizationInvitationCreatePayload", + "fields": [ + { + "name": "clientMutationId", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + + + { + "kind": "OBJECT", + "name": "__Directive", + "fields": [ + { + "name": "name", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "description", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "locations", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "__DirectiveLocation", + "ofType": null + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "args", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__InputValue", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "onOperation", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": true, + "deprecationReason": "Use `locations`." + }, + { + "name": "onFragment", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": true, + "deprecationReason": "Use `locations`." + }, + { + "name": "onField", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "isDeprecated": true, + "deprecationReason": "Use `locations`." + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "__DirectiveLocation", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "QUERY", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MUTATION", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIELD", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FRAGMENT_DEFINITION", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FRAGMENT_SPREAD", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INLINE_FRAGMENT", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SCHEMA", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "SCALAR", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OBJECT", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FIELD_DEFINITION", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ARGUMENT_DEFINITION", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INTERFACE", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UNION", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ENUM", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ENUM_VALUE", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INPUT_OBJECT", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INPUT_FIELD_DEFINITION", + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "__EnumValue", + "fields": [ + { + "name": "name", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "description", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "isDeprecated", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "deprecationReason", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "__Field", + "fields": [ + { + "name": "name", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "description", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "args", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__InputValue", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "type", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "isDeprecated", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "deprecationReason", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "__InputValue", + "fields": [ + { + "name": "name", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "description", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "type", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "defaultValue", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "__Schema", + "fields": [ + { + "name": "types", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "queryType", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "mutationType", + "args": [], + "type": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "directives", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Directive", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "subscriptionType", + "args": [], + "type": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "__Type", + "fields": [ + { + "name": "kind", + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "__TypeKind", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "name", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "description", + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "fields", + "args": [ + { + "name": "includeDeprecated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": "false" + } + ], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Field", + "ofType": null + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "interfaces", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "possibleTypes", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "enumValues", + "args": [ + { + "name": "includeDeprecated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": "false" + } + ], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__EnumValue", + "ofType": null + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "inputFields", + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__InputValue", + "ofType": null + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ofType", + "args": [], + "type": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "__TypeKind", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "SCALAR", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "OBJECT", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INTERFACE", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "UNION", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "ENUM", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "INPUT_OBJECT", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "LIST", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "NON_NULL", + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + } + ], + "directives": [ + { + "name": "include", + "locations": [ + "FIELD", + "FRAGMENT_SPREAD", + "INLINE_FRAGMENT" + ], + "args": [ + { + "name": "if", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "defaultValue": null + } + ] + }, + { + "name": "skip", + "locations": [ + "FIELD", + "FRAGMENT_SPREAD", + "INLINE_FRAGMENT" + ], + "args": [ + { + "name": "if", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "defaultValue": null + } + ] + }, + { + "name": "deprecated", + "locations": [ + "FIELD_DEFINITION", + "ENUM_VALUE" + ], + "args": [ + { + "name": "reason", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": "\"No longer supported\"" + } + ] + } + ] + } + } +} \ No newline at end of file