Skip to content

Commit b5f3301

Browse files
committed
feat: include DataFetchingEnvironment in all resolver interface functions
1 parent 55f7101 commit b5f3301

File tree

8 files changed

+77
-64
lines changed

8 files changed

+77
-64
lines changed

src/helpers/build-config-with-defaults.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,14 @@ export function buildConfigWithDefaults(
1515
"com.expediagroup.graphql.generator.annotations.*",
1616
...(config.extraImports ?? []),
1717
],
18-
} as const;
18+
extraResolverArguments: [
19+
{
20+
argumentName: "dataFetchingEnvironment",
21+
argumentType: "graphql.schema.DataFetchingEnvironment",
22+
},
23+
...(config.extraResolverArguments ?? []),
24+
],
25+
} as const satisfies GraphQLKotlinCodegenConfig;
1926
}
2027

2128
export type CodegenConfigWithDefaults = ReturnType<

src/helpers/build-field-definition.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,17 @@ export function buildFieldDefinition(
4242
return `${arg.name.value}: ${typeMetadata.typeName}${arg.type.kind === Kind.NON_NULL_TYPE ? "" : "?"}`;
4343
});
4444
const additionalFieldArguments = config.extraResolverArguments
45-
?.map(({ typeNames, argumentType, argumentName }) => {
45+
?.map((resolverArgument) => {
46+
const { argumentName, argumentType } = resolverArgument;
4647
const shouldIncludeArg =
47-
!typeNames ||
48-
typeNames.some((typeName) => typeName === definitionNode.name.value);
49-
return shouldIncludeArg ? `${argumentName}: ${argumentType}` : undefined;
48+
!("typeNames" in resolverArgument) ||
49+
!resolverArgument.typeNames ||
50+
resolverArgument.typeNames.some(
51+
(typeName) => typeName === definitionNode.name.value,
52+
);
53+
return shouldUseFunction && shouldIncludeArg
54+
? `${argumentName}: ${argumentType}`
55+
: undefined;
5056
})
5157
.filter(Boolean);
5258
const allFieldArguments = existingFieldArguments?.concat(

test/unit/should_consolidate_input_and_output_types/expected.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,12 @@ data class MyTypeToConsolidateInputParent(
7070

7171
@GraphQLIgnore
7272
interface MyTypeToConsolidateParent2 {
73-
suspend fun field(input: MyTypeToConsolidate): String? = null
73+
suspend fun field(input: MyTypeToConsolidate, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = null
7474
}
7575

7676
@GraphQLIgnore
7777
interface MyTypeToConsolidateParent2CompletableFuture {
78-
fun field(input: MyTypeToConsolidate): java.util.concurrent.CompletableFuture<String?>
78+
fun field(input: MyTypeToConsolidate, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String?>
7979
}
8080

8181
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])

test/unit/should_generate_field_resolver_interfaces/expected.kt

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,18 @@ import com.expediagroup.graphql.generator.annotations.*
44

55
@GraphQLIgnore
66
interface Query {
7-
suspend fun nullableField(): FieldType? = null
8-
suspend fun nonNullableField(): FieldType
9-
suspend fun nullableResolver(arg: String): String? = null
10-
suspend fun nonNullableResolver(arg: InputTypeGenerateFieldResolverInterfaces): String
7+
suspend fun nullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): FieldType? = null
8+
suspend fun nonNullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): FieldType
9+
suspend fun nullableResolver(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = null
10+
suspend fun nonNullableResolver(arg: InputTypeGenerateFieldResolverInterfaces, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String
1111
}
1212

1313
@GraphQLIgnore
1414
interface QueryCompletableFuture {
15-
fun nullableField(): java.util.concurrent.CompletableFuture<FieldType?>
16-
fun nonNullableField(): java.util.concurrent.CompletableFuture<FieldType>
17-
fun nullableResolver(arg: String): java.util.concurrent.CompletableFuture<String?>
18-
fun nonNullableResolver(arg: InputTypeGenerateFieldResolverInterfaces): java.util.concurrent.CompletableFuture<String>
15+
fun nullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<FieldType?>
16+
fun nonNullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<FieldType>
17+
fun nullableResolver(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String?>
18+
fun nonNullableResolver(arg: InputTypeGenerateFieldResolverInterfaces, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String>
1919
}
2020

2121
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.INPUT_OBJECT])
@@ -24,32 +24,32 @@ data class InputTypeGenerateFieldResolverInterfaces(
2424
)
2525

2626
interface MyFieldInterface {
27-
suspend fun field1(): String?
28-
suspend fun field2(): String
29-
suspend fun nullableListResolver(arg1: Int?, arg2: Int): List<String?>?
30-
suspend fun nonNullableListResolver(arg1: Int, arg2: Int?): List<String>
27+
suspend fun field1(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String?
28+
suspend fun field2(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String
29+
suspend fun nullableListResolver(arg1: Int?, arg2: Int, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): List<String?>?
30+
suspend fun nonNullableListResolver(arg1: Int, arg2: Int?, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): List<String>
3131
}
3232

3333
@GraphQLIgnore
3434
interface FieldType : MyFieldInterface {
35-
override suspend fun field1(): String? = null
36-
override suspend fun field2(): String
37-
suspend fun booleanField1(): Boolean? = null
38-
suspend fun booleanField2(): Boolean = false
39-
suspend fun integerField1(): Int? = null
40-
suspend fun integerField2(): Int
41-
override suspend fun nullableListResolver(arg1: Int?, arg2: Int): List<String?>? = null
42-
override suspend fun nonNullableListResolver(arg1: Int, arg2: Int?): List<String> = emptyList()
35+
override suspend fun field1(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = null
36+
override suspend fun field2(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String
37+
suspend fun booleanField1(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): Boolean? = null
38+
suspend fun booleanField2(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): Boolean = false
39+
suspend fun integerField1(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): Int? = null
40+
suspend fun integerField2(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): Int
41+
override suspend fun nullableListResolver(arg1: Int?, arg2: Int, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): List<String?>? = null
42+
override suspend fun nonNullableListResolver(arg1: Int, arg2: Int?, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): List<String> = emptyList()
4343
}
4444

4545
@GraphQLIgnore
4646
interface FieldTypeCompletableFuture {
47-
fun field1(): java.util.concurrent.CompletableFuture<String?>
48-
fun field2(): java.util.concurrent.CompletableFuture<String>
49-
fun booleanField1(): java.util.concurrent.CompletableFuture<Boolean?>
50-
fun booleanField2(): java.util.concurrent.CompletableFuture<Boolean>
51-
fun integerField1(): java.util.concurrent.CompletableFuture<Int?>
52-
fun integerField2(): java.util.concurrent.CompletableFuture<Int>
53-
fun nullableListResolver(arg1: Int?, arg2: Int): java.util.concurrent.CompletableFuture<List<String?>?>
54-
fun nonNullableListResolver(arg1: Int, arg2: Int?): java.util.concurrent.CompletableFuture<List<String>>
47+
fun field1(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String?>
48+
fun field2(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String>
49+
fun booleanField1(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<Boolean?>
50+
fun booleanField2(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<Boolean>
51+
fun integerField1(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<Int?>
52+
fun integerField2(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<Int>
53+
fun nullableListResolver(arg1: Int?, arg2: Int, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<List<String?>?>
54+
fun nonNullableListResolver(arg1: Int, arg2: Int?, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<List<String>>
5555
}

test/unit/should_honor_extraResolverArguments_config/codegen.config.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ export default {
44
resolverTypes: ["MyIncludedExtraFieldArgsType"],
55
extraResolverArguments: [
66
{
7-
argumentName: "dataFetchingEnvironment",
8-
argumentType: "graphql.schema.DataFetchingEnvironment",
7+
argumentName: "myExtraFieldArg",
8+
argumentType: "String",
99
typeNames: ["MyExtraFieldArgsType", "MyIncludedExtraFieldArgsType"],
1010
},
1111
],

test/unit/should_honor_extraResolverArguments_config/expected.kt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,36 @@ import com.expediagroup.graphql.generator.annotations.*
44

55
@GraphQLIgnore
66
interface MyExtraFieldArgsType {
7-
suspend fun myField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = null
8-
suspend fun fieldWithArgs(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String
7+
suspend fun myField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment, myExtraFieldArg: String): String? = null
8+
suspend fun fieldWithArgs(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment, myExtraFieldArg: String): String
99
}
1010

1111
@GraphQLIgnore
1212
interface MyExtraFieldArgsTypeCompletableFuture {
13-
fun myField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String?>
14-
fun fieldWithArgs(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String>
13+
fun myField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment, myExtraFieldArg: String): java.util.concurrent.CompletableFuture<String?>
14+
fun fieldWithArgs(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment, myExtraFieldArg: String): java.util.concurrent.CompletableFuture<String>
1515
}
1616

1717
@GraphQLIgnore
1818
interface MyIncludedExtraFieldArgsType {
19-
suspend fun myField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = null
20-
suspend fun myOtherField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = null
19+
suspend fun myField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment, myExtraFieldArg: String): String? = null
20+
suspend fun myOtherField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment, myExtraFieldArg: String): String? = null
2121
}
2222

2323
@GraphQLIgnore
2424
interface MyIncludedExtraFieldArgsTypeCompletableFuture {
25-
fun myField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String?>
26-
fun myOtherField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String?>
25+
fun myField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment, myExtraFieldArg: String): java.util.concurrent.CompletableFuture<String?>
26+
fun myOtherField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment, myExtraFieldArg: String): java.util.concurrent.CompletableFuture<String?>
2727
}
2828

2929
@GraphQLIgnore
3030
interface MyOtherType {
31-
suspend fun myField(arg: String): String
32-
suspend fun myOtherField(): String? = null
31+
suspend fun myField(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String
32+
suspend fun myOtherField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = null
3333
}
3434

3535
@GraphQLIgnore
3636
interface MyOtherTypeCompletableFuture {
37-
fun myField(arg: String): java.util.concurrent.CompletableFuture<String>
38-
fun myOtherField(): java.util.concurrent.CompletableFuture<String?>
37+
fun myField(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String>
38+
fun myOtherField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String?>
3939
}

test/unit/should_honor_resolverTypes_config/expected.kt

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,30 @@ import com.expediagroup.graphql.generator.annotations.*
44

55
@GraphQLIgnore
66
interface MyResolverType {
7-
suspend fun nullableField(): String? = null
8-
suspend fun nonNullableField(): String
9-
suspend fun nullableResolver(arg: String): String? = null
10-
suspend fun nonNullableResolver(arg: String): String
7+
suspend fun nullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = null
8+
suspend fun nonNullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String
9+
suspend fun nullableResolver(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = null
10+
suspend fun nonNullableResolver(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String
1111
}
1212

1313
@GraphQLIgnore
1414
interface MyResolverTypeCompletableFuture {
15-
fun nullableField(): java.util.concurrent.CompletableFuture<String?>
16-
fun nonNullableField(): java.util.concurrent.CompletableFuture<String>
17-
fun nullableResolver(arg: String): java.util.concurrent.CompletableFuture<String?>
18-
fun nonNullableResolver(arg: String): java.util.concurrent.CompletableFuture<String>
15+
fun nullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String?>
16+
fun nonNullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String>
17+
fun nullableResolver(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String?>
18+
fun nonNullableResolver(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String>
1919
}
2020

2121
@GraphQLIgnore
2222
interface MyIncludedResolverType {
23-
suspend fun nullableField(): String? = null
24-
suspend fun nonNullableField(): String
23+
suspend fun nullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String? = null
24+
suspend fun nonNullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String
2525
}
2626

2727
@GraphQLIgnore
2828
interface MyIncludedResolverTypeCompletableFuture {
29-
fun nullableField(): java.util.concurrent.CompletableFuture<String?>
30-
fun nonNullableField(): java.util.concurrent.CompletableFuture<String>
29+
fun nullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String?>
30+
fun nonNullableField(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String>
3131
}
3232

3333
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
@@ -37,7 +37,7 @@ data class MyExcludedResolverType(
3737
)
3838

3939
interface MyIncludedInterface {
40-
suspend fun field(): String?
40+
suspend fun field(dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String?
4141
}
4242

4343
interface MyExcludedInterface {

test/unit/should_replace_federation_directives/expected.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ data class FederatedType(
1414
@com.expediagroup.graphql.generator.federation.directives.KeyDirective(com.expediagroup.graphql.generator.federation.directives.FieldSet("some other field"))
1515
@GraphQLIgnore
1616
interface FederatedTypeResolver {
17-
suspend fun field(arg: String): String
17+
suspend fun field(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): String
1818
@com.expediagroup.graphql.generator.federation.directives.ExternalDirective
1919
val field2: String?
2020
}
@@ -23,7 +23,7 @@ interface FederatedTypeResolver {
2323
@com.expediagroup.graphql.generator.federation.directives.KeyDirective(com.expediagroup.graphql.generator.federation.directives.FieldSet("some other field"))
2424
@GraphQLIgnore
2525
interface FederatedTypeResolverCompletableFuture {
26-
fun field(arg: String): java.util.concurrent.CompletableFuture<String>
26+
fun field(arg: String, dataFetchingEnvironment: graphql.schema.DataFetchingEnvironment): java.util.concurrent.CompletableFuture<String>
2727
@com.expediagroup.graphql.generator.federation.directives.ExternalDirective
2828
val field2: java.util.concurrent.CompletableFuture<String?>
2929
}

0 commit comments

Comments
 (0)