Skip to content

Commit

Permalink
fix: generate input types when client api is generated (#575)
Browse files Browse the repository at this point in the history
* fix: generate input types when client api is generated

* remove unnecessary blank line

* fix wrong argument signature
  • Loading branch information
Cole Turner authored Jun 29, 2023
1 parent a66224a commit 9c925eb
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,7 @@ class CodeGen(private val config: CodeGenConfig) {
private val document = buildDocument()
private val requiredTypeCollector = RequiredTypeCollector(
document = document,
queries = config.includeQueries,
mutations = config.includeMutations,
subscriptions = config.includeSubscriptions
config = config
)

@Suppress("DuplicatedCode")
Expand Down Expand Up @@ -325,9 +323,7 @@ class CodeGen(private val config: CodeGenConfig) {

val requiredTypeCollector = RequiredTypeCollector(
document = document,
queries = config.includeQueries,
mutations = config.includeMutations,
subscriptions = config.includeSubscriptions
config = config
)
val requiredTypes = requiredTypeCollector.requiredTypes

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,19 +34,22 @@ import graphql.util.TraverserContext

class RequiredTypeCollector(
private val document: Document,
queries: Set<String> = emptySet(),
mutations: Set<String> = emptySet(),
subscriptions: Set<String> = emptySet()
config: CodeGenConfig
) {
val requiredTypes: Set<String> = LinkedHashSet()

init {
val fieldDefinitions = mutableListOf<FieldDefinition>()
for (definition in document.definitions.asSequence().filterIsInstance<ObjectTypeDefinition>()) {
when (definition.name) {
"Query" -> definition.fieldDefinitions.filterTo(fieldDefinitions) { it.name in queries }
"Mutation" -> definition.fieldDefinitions.filterTo(fieldDefinitions) { it.name in mutations }
"Subscription" -> definition.fieldDefinitions.filterTo(fieldDefinitions) { it.name in subscriptions }
"Query" -> definition.fieldDefinitions.filterTo(fieldDefinitions) { it.name in config.includeQueries }
"Mutation" -> definition.fieldDefinitions.filterTo(fieldDefinitions) { it.name in config.includeMutations }
"Subscription" -> definition.fieldDefinitions.filterTo(fieldDefinitions) { it.name in config.includeSubscriptions }
else -> {
if (config?.generateClientApiv2 == true || config?.generateClientApi == true) {
fieldDefinitions.addAll(definition.fieldDefinitions)
}
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,35 +56,35 @@ class RequiredTypeCollectorTest {

@Test
fun `Related input types and enums should be included`() {
val types = RequiredTypeCollector(document, setOf("search")).requiredTypes
val types = RequiredTypeCollector(document, CodeGenConfig(includeQueries = setOf("search"))).requiredTypes

assertThat(types).contains("Filter", "ShowType")
}

@Test
fun `Related nested input types and enums should be included`() {
val types = RequiredTypeCollector(document, setOf("searchByExample")).requiredTypes
val types = RequiredTypeCollector(document, CodeGenConfig(includeQueries = setOf("searchByExample"))).requiredTypes

assertThat(types).contains("ExampleShow", "ExampleActor", "ShowType")
}

@Test
fun `Unrelated input types should be omitted`() {
val types = RequiredTypeCollector(document, setOf("searchByExample")).requiredTypes
val types = RequiredTypeCollector(document, CodeGenConfig(includeQueries = setOf("searchByExample"))).requiredTypes

assertThat(types).doesNotContain("Filter")
}

@Test
fun `All related input types should be included for multiple queries`() {
val types = RequiredTypeCollector(document, setOf("searchByExample", "search")).requiredTypes
val types = RequiredTypeCollector(document, CodeGenConfig(includeQueries = setOf("searchByExample", "search"))).requiredTypes

assertThat(types).contains("ExampleShow", "Filter", "ShowType", "ExampleActor")
}

@Test
fun `Lists of required input types should be included`() {
val types = RequiredTypeCollector(document, setOf("searchByExamples")).requiredTypes
val types = RequiredTypeCollector(document, CodeGenConfig(includeQueries = setOf("searchByExamples"))).requiredTypes
assertThat(types).contains("ExampleShow", "ExampleActor", "ShowType")
}
}

0 comments on commit 9c925eb

Please sign in to comment.