diff --git a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generateClient.kt b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generateClient.kt index b134035fd8..80b881446c 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generateClient.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generateClient.kt @@ -35,7 +35,8 @@ fun generateClient( schemaPath: String, queries: List, useOptionalInputWrapper: Boolean = false, - parserOptions: ParserOptions.Builder.() -> Unit = {} + parserOptions: ParserOptions.Builder.() -> Unit = {}, + useSharedResponseTypes: Boolean = false ): List { val customScalars = customScalarsMap.associateBy { it.scalar } val config = GraphQLClientGeneratorConfig( @@ -44,7 +45,8 @@ fun generateClient( customScalarMap = customScalars, serializer = serializer, useOptionalInputWrapper = useOptionalInputWrapper, - parserOptions = parserOptions + parserOptions = parserOptions, + useSharedResponseTypes = useSharedResponseTypes ) val generator = GraphQLClientGenerator(schemaPath, config) return generator.generate(queries) diff --git a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/GraphQLClientGenerator.kt b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/GraphQLClientGenerator.kt index 43970dd049..74bd35edd7 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/GraphQLClientGenerator.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/GraphQLClientGenerator.kt @@ -66,6 +66,8 @@ class GraphQLClientGenerator( */ fun generate(queries: List): List { val result = mutableListOf() + + // Generate client code with shared types for (query in queries) { result.addAll(generate(query)) } @@ -119,8 +121,10 @@ class GraphQLClientGenerator( allowDeprecated = config.allowDeprecated, customScalarMap = config.customScalarMap, serializer = config.serializer, - useOptionalInputWrapper = config.useOptionalInputWrapper + useOptionalInputWrapper = config.useOptionalInputWrapper, + config = config ) + val queryConstName = capitalizedOperationName.toUpperUnderscore() val queryConstProp = PropertySpec.builder(queryConstName, STRING) .addModifiers(KModifier.CONST) @@ -216,6 +220,7 @@ class GraphQLClientGenerator( // shared types sharedTypes.putAll(context.enumClassToTypeSpecs.mapValues { listOf(it.value) }) sharedTypes.putAll(context.inputClassToTypeSpecs.mapValues { listOf(it.value) }) + sharedTypes.putAll(context.responseClassToTypeSpecs.mapValues { listOf(it.value) }) context.scalarClassToConverterTypeSpecs .values .forEach { diff --git a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/GraphQLClientGeneratorConfig.kt b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/GraphQLClientGeneratorConfig.kt index 8844955ced..60f462c1e7 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/GraphQLClientGeneratorConfig.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/GraphQLClientGeneratorConfig.kt @@ -33,6 +33,8 @@ data class GraphQLClientGeneratorConfig( val serializer: GraphQLSerializer = GraphQLSerializer.JACKSON, /** Explicit opt-in flag to enable support for optional inputs. */ val useOptionalInputWrapper: Boolean = false, + /** Boolean flag indicating whether to generate shared response types instead of operation-specific duplicates. Defaults to false. */ + val useSharedResponseTypes: Boolean = false, /** Set parser options for processing GraphQL queries and schema definition language documents */ val parserOptions: ParserOptions.Builder.() -> Unit = {} ) diff --git a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/GraphQLClientGeneratorContext.kt b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/GraphQLClientGeneratorContext.kt index bef5742b93..7a99b258a0 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/GraphQLClientGeneratorContext.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/GraphQLClientGeneratorContext.kt @@ -21,6 +21,7 @@ import com.squareup.kotlinpoet.TypeAliasSpec import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec import graphql.language.Document +import graphql.language.Selection import graphql.schema.idl.TypeDefinitionRegistry /** @@ -36,7 +37,8 @@ data class GraphQLClientGeneratorContext( val allowDeprecated: Boolean = false, val customScalarMap: Map = mapOf(), val serializer: GraphQLSerializer = GraphQLSerializer.JACKSON, - val useOptionalInputWrapper: Boolean = false + val useOptionalInputWrapper: Boolean = false, + val config: GraphQLClientGeneratorConfig ) { // per operation caches val typeSpecs: MutableMap = mutableMapOf() @@ -45,6 +47,7 @@ data class GraphQLClientGeneratorContext( // shared type caches val enumClassToTypeSpecs: MutableMap = mutableMapOf() val inputClassToTypeSpecs: MutableMap = mutableMapOf() + val responseClassToTypeSpecs: MutableMap = mutableMapOf() val scalarClassToConverterTypeSpecs: MutableMap = mutableMapOf() val typeAliases: MutableMap = mutableMapOf() internal fun isTypeAlias(typeName: String) = typeAliases.containsKey(typeName) @@ -52,6 +55,8 @@ data class GraphQLClientGeneratorContext( // class name and type selection caches val classNameCache: MutableMap> = mutableMapOf() val typeToSelectionSetMap: MutableMap> = mutableMapOf() + val responseTypeToSelectionSetMap: MutableMap>> = mutableMapOf() + val sharedTypeVariantToSelectionSetMap: MutableMap> = mutableMapOf() private val customScalarClassNames: Set = customScalarMap.values.map { it.className }.toSet() internal fun isCustomScalar(typeName: TypeName): Boolean = customScalarClassNames.contains(typeName) diff --git a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generateTypeName.kt b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generateTypeName.kt index b74b4fca92..a2d20c7f60 100644 --- a/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generateTypeName.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/main/kotlin/com/expediagroup/graphql/plugin/client/generator/types/generateTypeName.kt @@ -111,8 +111,50 @@ internal fun generateCustomClassName(context: GraphQLClientGeneratorContext, gra // generate corresponding type spec when (graphQLTypeDefinition) { is ObjectTypeDefinition -> { - className = generateClassName(context, graphQLTypeDefinition, selectionSet) - context.typeSpecs[className] = generateGraphQLObjectTypeSpec(context, graphQLTypeDefinition, selectionSet) + if (context.config.useSharedResponseTypes) { + // Use cross-operation reuse logic similar to existing single-operation logic + val globalCachedTypes = context.responseClassToTypeSpecs.keys.filter { it.simpleName.startsWith(graphQLTypeDefinition.name) } + + if (globalCachedTypes.isNotEmpty()) { + // Check if any existing shared type matches this selection set + var foundMatch = false + for (cachedType in globalCachedTypes) { + if (isCachedTypeApplicableForSharedType(context, cachedType, graphQLTypeDefinition, selectionSet)) { + className = cachedType + foundMatch = true + break + } + } + + if (!foundMatch) { + // Generate new variant (ComplexObject2, ComplexObject3, etc.) + val variantNumber = globalCachedTypes.size + 1 + val variantName = if (variantNumber == 1) graphQLTypeDefinition.name else "${graphQLTypeDefinition.name}$variantNumber" + className = ClassName("${context.packageName}.responses", variantName) + context.responseClassToTypeSpecs[className] = generateGraphQLObjectTypeSpec(context, graphQLTypeDefinition, selectionSet, variantName) + + // Track selection set for this variant + if (selectionSet != null) { + val selectedFields = calculateSelectedFields(context, graphQLTypeDefinition.name, selectionSet) + context.sharedTypeVariantToSelectionSetMap[variantName] = selectedFields + } + } + } else { + // First occurrence - create base shared type + className = ClassName("${context.packageName}.responses", graphQLTypeDefinition.name) + context.responseClassToTypeSpecs[className] = generateGraphQLObjectTypeSpec(context, graphQLTypeDefinition, selectionSet) + + // Track selection set for this variant + if (selectionSet != null) { + val selectedFields = calculateSelectedFields(context, graphQLTypeDefinition.name, selectionSet) + context.sharedTypeVariantToSelectionSetMap[graphQLTypeDefinition.name] = selectedFields + } + } + } else { + // Use original logic for operation-specific types + className = generateClassName(context, graphQLTypeDefinition, selectionSet) + context.typeSpecs[className] = generateGraphQLObjectTypeSpec(context, graphQLTypeDefinition, selectionSet) + } } is InputObjectTypeDefinition -> { className = generateClassName(context, graphQLTypeDefinition, selectionSet, packageName = "${context.packageName}.inputs") @@ -258,3 +300,19 @@ private fun calculateSelectedFields( } return result } + +/** + * Helper function to check if a cached shared type matches the current selection set. + */ +private fun isCachedTypeApplicableForSharedType( + context: GraphQLClientGeneratorContext, + cachedClassName: ClassName, + graphQLTypeDefinition: TypeDefinition<*>, + selectionSet: SelectionSet? +): Boolean { + if (selectionSet == null) return true + + val selectedFields = calculateSelectedFields(context, graphQLTypeDefinition.name, selectionSet) + val cachedTypeFields = context.sharedTypeVariantToSelectionSetMap[cachedClassName.simpleName] + return selectedFields == cachedTypeFields +} diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/Operation1.graphql b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/Operation1.graphql new file mode 100644 index 0000000000..097bca27ea --- /dev/null +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/Operation1.graphql @@ -0,0 +1,33 @@ +query Operation1 { + first: complexObjectQuery { + id + name + } + second: complexObjectQuery { + id + name + details { + id + value + } + } + third: complexObjectQuery { + id + name + details { + id + } + } + fourth: complexObjectQuery { + id + name + } + fifth: complexObjectQuery { + id + name + details { + id + value + } + } +} diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/Operation1.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/Operation1.kt new file mode 100644 index 0000000000..8a085d33a6 --- /dev/null +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/Operation1.kt @@ -0,0 +1,51 @@ +package com.expediagroup.graphql.generated + +import com.expediagroup.graphql.client.Generated +import com.expediagroup.graphql.client.types.GraphQLClientRequest +import com.expediagroup.graphql.generated.responses.ComplexObject +import com.expediagroup.graphql.generated.responses.ComplexObject2 +import com.expediagroup.graphql.generated.responses.ComplexObject3 +import com.fasterxml.jackson.`annotation`.JsonProperty +import kotlin.String +import kotlin.reflect.KClass + +public const val OPERATION1: String = + "query Operation1 {\n first: complexObjectQuery {\n id\n name\n }\n second: complexObjectQuery {\n id\n name\n details {\n id\n value\n }\n }\n third: complexObjectQuery {\n id\n name\n details {\n id\n }\n }\n fourth: complexObjectQuery {\n id\n name\n }\n fifth: complexObjectQuery {\n id\n name\n details {\n id\n value\n }\n }\n}" + +@Generated +public class Operation1 : GraphQLClientRequest { + override val query: String = OPERATION1 + + override val operationName: String = "Operation1" + + override fun responseType(): KClass = Operation1.Result::class + + @Generated + public data class Result( + /** + * Query returning an object that references another object + */ + @get:JsonProperty(value = "first") + public val first: ComplexObject, + /** + * Query returning an object that references another object + */ + @get:JsonProperty(value = "second") + public val second: ComplexObject2, + /** + * Query returning an object that references another object + */ + @get:JsonProperty(value = "third") + public val third: ComplexObject3, + /** + * Query returning an object that references another object + */ + @get:JsonProperty(value = "fourth") + public val fourth: ComplexObject, + /** + * Query returning an object that references another object + */ + @get:JsonProperty(value = "fifth") + public val fifth: ComplexObject2, + ) +} diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/Operation2.graphql b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/Operation2.graphql new file mode 100644 index 0000000000..a17e6380d7 --- /dev/null +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/Operation2.graphql @@ -0,0 +1,33 @@ +query Operation2 { + first: complexObjectQuery { + id + name + } + second: complexObjectQuery { + id + name + details { + id + value + } + } + third: complexObjectQuery { + id + name + details { + id + } + } + fourth: complexObjectQuery { + id + name + } + fifth: complexObjectQuery { + id + name + details { + id + value + } + } +} diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/Operation2.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/Operation2.kt new file mode 100644 index 0000000000..ddd6c1a2c2 --- /dev/null +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/Operation2.kt @@ -0,0 +1,51 @@ +package com.expediagroup.graphql.generated + +import com.expediagroup.graphql.client.Generated +import com.expediagroup.graphql.client.types.GraphQLClientRequest +import com.expediagroup.graphql.generated.responses.ComplexObject +import com.expediagroup.graphql.generated.responses.ComplexObject2 +import com.expediagroup.graphql.generated.responses.ComplexObject3 +import com.fasterxml.jackson.`annotation`.JsonProperty +import kotlin.String +import kotlin.reflect.KClass + +public const val OPERATION2: String = + "query Operation2 {\n first: complexObjectQuery {\n id\n name\n }\n second: complexObjectQuery {\n id\n name\n details {\n id\n value\n }\n }\n third: complexObjectQuery {\n id\n name\n details {\n id\n }\n }\n fourth: complexObjectQuery {\n id\n name\n }\n fifth: complexObjectQuery {\n id\n name\n details {\n id\n value\n }\n }\n}" + +@Generated +public class Operation2 : GraphQLClientRequest { + override val query: String = OPERATION2 + + override val operationName: String = "Operation2" + + override fun responseType(): KClass = Operation2.Result::class + + @Generated + public data class Result( + /** + * Query returning an object that references another object + */ + @get:JsonProperty(value = "first") + public val first: ComplexObject, + /** + * Query returning an object that references another object + */ + @get:JsonProperty(value = "second") + public val second: ComplexObject2, + /** + * Query returning an object that references another object + */ + @get:JsonProperty(value = "third") + public val third: ComplexObject3, + /** + * Query returning an object that references another object + */ + @get:JsonProperty(value = "fourth") + public val fourth: ComplexObject, + /** + * Query returning an object that references another object + */ + @get:JsonProperty(value = "fifth") + public val fifth: ComplexObject2, + ) +} diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/ComplexObject.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/ComplexObject.kt new file mode 100644 index 0000000000..40b343ef2b --- /dev/null +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/ComplexObject.kt @@ -0,0 +1,25 @@ +package com.expediagroup.graphql.generated.responses + +import com.expediagroup.graphql.client.Generated +import com.fasterxml.jackson.`annotation`.JsonProperty +import kotlin.Int +import kotlin.String + +/** + * Multi line description of a complex type. + * This is a second line of the paragraph. + * This is final line of the description. + */ +@Generated +public data class ComplexObject( + /** + * Some unique identifier + */ + @get:JsonProperty(value = "id") + public val id: Int, + /** + * Some object name + */ + @get:JsonProperty(value = "name") + public val name: String, +) diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/ComplexObject2.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/ComplexObject2.kt new file mode 100644 index 0000000000..b5ab17e07c --- /dev/null +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/ComplexObject2.kt @@ -0,0 +1,30 @@ +package com.expediagroup.graphql.generated.responses + +import com.expediagroup.graphql.client.Generated +import com.fasterxml.jackson.`annotation`.JsonProperty +import kotlin.Int +import kotlin.String + +/** + * Multi line description of a complex type. + * This is a second line of the paragraph. + * This is final line of the description. + */ +@Generated +public data class ComplexObject2( + /** + * Some unique identifier + */ + @get:JsonProperty(value = "id") + public val id: Int, + /** + * Some object name + */ + @get:JsonProperty(value = "name") + public val name: String, + /** + * Some additional details + */ + @get:JsonProperty(value = "details") + public val details: DetailsObject, +) diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/ComplexObject3.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/ComplexObject3.kt new file mode 100644 index 0000000000..e85f9ad8f6 --- /dev/null +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/ComplexObject3.kt @@ -0,0 +1,30 @@ +package com.expediagroup.graphql.generated.responses + +import com.expediagroup.graphql.client.Generated +import com.fasterxml.jackson.`annotation`.JsonProperty +import kotlin.Int +import kotlin.String + +/** + * Multi line description of a complex type. + * This is a second line of the paragraph. + * This is final line of the description. + */ +@Generated +public data class ComplexObject3( + /** + * Some unique identifier + */ + @get:JsonProperty(value = "id") + public val id: Int, + /** + * Some object name + */ + @get:JsonProperty(value = "name") + public val name: String, + /** + * Some additional details + */ + @get:JsonProperty(value = "details") + public val details: DetailsObject2, +) diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/DetailsObject.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/DetailsObject.kt new file mode 100644 index 0000000000..e50917cefa --- /dev/null +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/DetailsObject.kt @@ -0,0 +1,23 @@ +package com.expediagroup.graphql.generated.responses + +import com.expediagroup.graphql.client.Generated +import com.fasterxml.jackson.`annotation`.JsonProperty +import kotlin.Int +import kotlin.String + +/** + * Inner type object description + */ +@Generated +public data class DetailsObject( + /** + * Unique identifier + */ + @get:JsonProperty(value = "id") + public val id: Int, + /** + * Actual detail value + */ + @get:JsonProperty(value = "value") + public val `value`: String, +) diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/DetailsObject2.kt b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/DetailsObject2.kt new file mode 100644 index 0000000000..71b6dd8beb --- /dev/null +++ b/plugins/client/graphql-kotlin-client-generator/src/test/data/generator/cross_operation_reuse_types/responses/DetailsObject2.kt @@ -0,0 +1,17 @@ +package com.expediagroup.graphql.generated.responses + +import com.expediagroup.graphql.client.Generated +import com.fasterxml.jackson.`annotation`.JsonProperty +import kotlin.Int + +/** + * Inner type object description + */ +@Generated +public data class DetailsObject2( + /** + * Unique identifier + */ + @get:JsonProperty(value = "id") + public val id: Int, +) diff --git a/plugins/client/graphql-kotlin-client-generator/src/test/kotlin/com/expediagroup/graphql/plugin/client/generator/GenerateGraphQLClientIT.kt b/plugins/client/graphql-kotlin-client-generator/src/test/kotlin/com/expediagroup/graphql/plugin/client/generator/GenerateGraphQLClientIT.kt index 5bba8258c6..f84df1faed 100755 --- a/plugins/client/graphql-kotlin-client-generator/src/test/kotlin/com/expediagroup/graphql/plugin/client/generator/GenerateGraphQLClientIT.kt +++ b/plugins/client/graphql-kotlin-client-generator/src/test/kotlin/com/expediagroup/graphql/plugin/client/generator/GenerateGraphQLClientIT.kt @@ -26,7 +26,12 @@ class GenerateGraphQLClientIT { @ParameterizedTest @MethodSource("generatorTests") fun `verify generation of client code using default settings`(testDirectory: File) { - verifyClientGeneration(defaultConfig, testDirectory) + val config = if (testDirectory.name == "cross_operation_reuse_types") { + defaultConfig.copy(useSharedResponseTypes = true) + } else { + defaultConfig + } + verifyClientGeneration(config, testDirectory) } companion object { diff --git a/plugins/graphql-kotlin-gradle-plugin/src/main/kotlin/com/expediagroup/graphql/plugin/gradle/actions/GenerateClientAction.kt b/plugins/graphql-kotlin-gradle-plugin/src/main/kotlin/com/expediagroup/graphql/plugin/gradle/actions/GenerateClientAction.kt index e020040180..9838aed60b 100644 --- a/plugins/graphql-kotlin-gradle-plugin/src/main/kotlin/com/expediagroup/graphql/plugin/gradle/actions/GenerateClientAction.kt +++ b/plugins/graphql-kotlin-gradle-plugin/src/main/kotlin/com/expediagroup/graphql/plugin/gradle/actions/GenerateClientAction.kt @@ -56,7 +56,8 @@ abstract class GenerateClientAction : WorkAction { parserOptions.captureIgnoredChars?.let { captureIgnoredChars(it) } parserOptions.captureSourceLocation?.let { captureSourceLocation(it) } parserOptions.captureLineComments?.let { captureLineComments(it) } - } + }, + useSharedResponseTypes = false ).forEach { it.writeTo(targetDirectory) } diff --git a/plugins/graphql-kotlin-maven-plugin/src/main/kotlin/com/expediagroup/graphql/plugin/maven/GenerateClientAbstractMojo.kt b/plugins/graphql-kotlin-maven-plugin/src/main/kotlin/com/expediagroup/graphql/plugin/maven/GenerateClientAbstractMojo.kt index efa195a8bf..4eb44dc1d6 100644 --- a/plugins/graphql-kotlin-maven-plugin/src/main/kotlin/com/expediagroup/graphql/plugin/maven/GenerateClientAbstractMojo.kt +++ b/plugins/graphql-kotlin-maven-plugin/src/main/kotlin/com/expediagroup/graphql/plugin/maven/GenerateClientAbstractMojo.kt @@ -145,7 +145,7 @@ abstract class GenerateClientAbstractMojo : AbstractMojo() { captureLineComments?.let { captureLineComments(it) } captureSourceLocation?.let { captureSourceLocation(it) } } - }).forEach { + }, useSharedResponseTypes = false).forEach { it.writeTo(outputDirectory) }