Skip to content

fix: add graphql valid object annotation to all input and output types #45

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Apr 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/definitions/input.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ export function buildInputObjectDefinition(
definitionNode: node,
});

return `${annotations}data class ${node.name.value}(
const inputRestrictionAnnotation =
"@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.INPUT_OBJECT])\n";
return `${annotations}${inputRestrictionAnnotation}data class ${node.name.value}(
${classMembers}
)`;
}
10 changes: 9 additions & 1 deletion src/definitions/object.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { isResolverType } from "../helpers/is-resolver-type";
import { buildFieldDefinition } from "../helpers/build-field-definition";
import { isExternalField } from "../helpers/is-external-field";
import { CodegenConfigWithDefaults } from "../helpers/build-config-with-defaults";
import { inputTypeHasMatchingOutputType } from "../helpers/input-type-has-matching-output-type";

export function buildObjectTypeDefinition(
node: ObjectTypeDefinitionNode,
Expand Down Expand Up @@ -57,7 +58,14 @@ ${getDataClassMembers({ node, schema, config, completableFuture: true })}
}`;
}

return `${annotations}data class ${name}(
const potentialMatchingInputType = schema.getType(`${name}Input`)?.astNode;
const typeWillBeConsolidated =
potentialMatchingInputType?.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION &&
inputTypeHasMatchingOutputType(potentialMatchingInputType, schema);
const outputRestrictionAnnotation = typeWillBeConsolidated
? ""
: "@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])\n";
return `${annotations}${outputRestrictionAnnotation}data class ${name}(
${getDataClassMembers({ node, schema, config })}
)${interfaceInheritance}`;
}
Expand Down
1 change: 1 addition & 0 deletions test/unit/should_annotate_types_properly/expected.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.kotlin.generated
import com.expediagroup.graphql.generator.annotations.*

@GraphQLDescription("A description for MyType")
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeThatShouldBeProperlyAnnotated(
val field: String? = null,
@GraphQLDescription("A description for fieldWithDescription")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,28 +25,34 @@ data class MyTypeToConsolidate4(
val field: String? = null
)

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyTypeNotToConsolidate(
val field: String? = null
)

@GraphQLDescription("The type name must exactly match in order to consolidate")
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.INPUT_OBJECT])
data class MyTypeToNotConsolidateInput(
val field: String? = null
)

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyTypeToNotConsolidate2(
val field: String? = null
)

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.INPUT_OBJECT])
data class MyTypeInputToNotConsolidate2(
val field: String? = null
)

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyTypeWhereFieldsDoNotMatch(
val field: String? = null,
val field2: String? = null
)

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.INPUT_OBJECT])
data class MyTypeWhereFieldsDoNotMatchInput(
val field: String? = null,
val field2: Int? = null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.kotlin.generated

import com.expediagroup.graphql.generator.annotations.*

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyFloatType(
val field: Double? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.kotlin.generated

import com.expediagroup.graphql.generator.annotations.*

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyBooleanType(
val field: Boolean = false,
val field2: Boolean? = null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ interface QueryCompletableFuture {
fun nonNullableResolver(arg: InputTypeGenerateFieldResolverInterfaces): java.util.concurrent.CompletableFuture<String>
}

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.INPUT_OBJECT])

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why does this need this annotation INPUT_OBJECT. This doesn't end with Input and also this is an interface.

Copy link
Collaborator Author

@danadajian danadajian Apr 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This class is generated from this type which is an input

Copy link
Collaborator Author

@danadajian danadajian Apr 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Basically any input that doesn't have a matching type is going to get this annotation

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And vice versa - any type that doesn't have a matching input will get @GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will add detailed docs on this later

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense

data class InputTypeGenerateFieldResolverInterfaces(
val field: String? = null
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.kotlin.generated
import com.expediagroup.graphql.generator.annotations.*

@GraphQLDescription("A description for MyInputType")
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.INPUT_OBJECT])
data class InputTypeThatShouldBeGeneratedProperly(
val field1: String? = null,
@GraphQLDescription("A description for field2")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ interface InterfaceWithInheritance {
}

@GraphQLDescription("A description for MyInterfaceImplementation")
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyInterfaceImplementation(
override val field: String? = null,
override val field2: String
Expand All @@ -22,6 +23,7 @@ interface InheritedInterface2 {
val field2: String
}

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyMergedInterfaceImplementation(
override val field: String? = null,
override val field2: String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.kotlin.generated

import com.expediagroup.graphql.generator.annotations.*

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyListType(
val field: List<String> = emptyList(),
val field2: List<String?> = emptyList(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ package com.kotlin.generated

import com.expediagroup.graphql.generator.annotations.*

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyType3(
val field: String? = null
) : MyUnion1, MyUnion2

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyType4(
val field: String? = null
) : MyUnion1, MyUnion2
Expand All @@ -14,6 +16,7 @@ interface MyUnion1

interface MyUnion2

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyMultiUnionType(
val field: MyUnion1? = null,
val field2: MyUnion2? = null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@ package com.kotlin.generated
import com.expediagroup.graphql.generator.annotations.*

@GraphQLDescription("A description for MyType1")
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeForNonNullableUnionList1(
val field: String? = null
) : UnionForNonNullableList

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeForNonNullableUnionList2(
val field: String? = null
) : UnionForNonNullableList

@GraphQLDescription("A description for UnionForNonNullableList")
interface UnionForNonNullableList

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyNonNullableUnionListType(
val field: List<UnionForNonNullableList> = emptyList(),
val field2: List<UnionForNonNullableList?> = emptyList()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ interface MyInterface {
val field2: String
}

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyInterfaceFieldType(
val field: MyInterface? = null,
val field2: MyInterface
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@ package com.kotlin.generated
import com.expediagroup.graphql.generator.annotations.*

@GraphQLDescription("A description for TypeForGeneratingUnionListTypes1")
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeForGeneratingUnionListTypes1(
val field: String? = null
) : UnionForGeneratingUnionListTypes

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeForGeneratingUnionListTypes2(
val field: String? = null
) : UnionForGeneratingUnionListTypes

@GraphQLDescription("A description for UnionForGeneratingUnionListTypes")
interface UnionForGeneratingUnionListTypes

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyUnionListType(
@GraphQLDescription("A description for field")
val field: List<UnionForGeneratingUnionListTypes>? = null,
Expand Down
3 changes: 3 additions & 0 deletions test/unit/should_generate_union_types_properly/expected.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@ package com.kotlin.generated
import com.expediagroup.graphql.generator.annotations.*

@GraphQLDescription("A description for MyType1")
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeForGeneratingUnionTypesProperly1(
val field: String? = null
) : UnionForGeneratingUnionsProperly

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeForGeneratingUnionTypesProperly2(
val field: String? = null
) : UnionForGeneratingUnionsProperly

@GraphQLDescription("A trimmed description for UnionForGeneratingUnionsProperly")
interface UnionForGeneratingUnionsProperly

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyUnionType(
@GraphQLDescription("A description for field")
val field: UnionForGeneratingUnionsProperly? = null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ package com.kotlin.generated
import com.expediagroup.graphql.generator.annotations.*
import should_honor_dependentTypesInScope_config.*

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyTypeInOnlyTypes(
val field: TypeInScope,
val field2: TypeOutOfScope
)

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeInScope(
val field: String? = null,
val unionInScopeField: UnionInScope? = null,
Expand All @@ -17,6 +19,7 @@ data class TypeInScope(

interface UnionInScope

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class Type1(
val field: String? = null
) : UnionInScope, ExternalUnionAsInterface
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import should_honor_directiveReplacements_config.*
@SomeAnnotation1
@SomeAnnotation2
@SomeAnnotationWithArgs(arg1 = "arg1", arg2 = 0)
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeHonoringDirectiveReplacements(
val field: String? = null
) : MyDirectiveUnion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import should_honor_directiveReplacements_config.*
@GraphQLDescription("A description for MyDirectiveType")
@SomeAnnotation1
@SomeAnnotation2
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeHonoringDirectiveReplacementsMultipleDirectives(
val field: String? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@ import should_honor_directiveReplacements_config.*

@SomeAnnotation1
@CommonAnnotation
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeHonoringDirectiveReplacementsDefinitionType(
val field: String? = null
)

@SomeAnnotation2
@CommonAnnotation
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.INPUT_OBJECT])
data class MyDirectiveTypeInput(
val field: String? = null
)
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.kotlin.generated

import com.expediagroup.graphql.generator.annotations.*

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeHonoringIncludeDependentTypesConfig(
val field: MyNestedType? = null
)
1 change: 1 addition & 0 deletions test/unit/should_honor_onlyTypes_config/expected.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.kotlin.generated

import com.expediagroup.graphql.generator.annotations.*

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeHonoringOnlyTypesConfig(
val field1: String? = null,
@GraphQLDescription("A description for field2")
Expand Down
1 change: 1 addition & 0 deletions test/unit/should_honor_packageName_config/expected.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.some.custom.name

import com.expediagroup.graphql.generator.annotations.*

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeHonoringPackageNameConfig(
val field: String? = null
)
1 change: 1 addition & 0 deletions test/unit/should_honor_resolverTypes_config/expected.kt
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ interface MyIncludedResolverTypeCompletableFuture {
fun nonNullableField(): java.util.concurrent.CompletableFuture<String>
}

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class MyExcludedResolverType(
val nullableField: String? = null,
val nonNullableField: String
Expand Down
3 changes: 3 additions & 0 deletions test/unit/should_honor_union_generation_config/expected.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ package com.kotlin.generated
import com.expediagroup.graphql.generator.annotations.*

@GraphQLDescription("A description for TypeForHonoringUnionGenerationConfig1")
@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeForHonoringUnionGenerationConfig1(
val field: String? = null
)

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class TypeForHonoringUnionGenerationConfig2(
val field: String? = null
)
Expand All @@ -18,6 +20,7 @@ data class TypeForHonoringUnionGenerationConfig2(
)
annotation class UnionAsAnnotation

@GraphQLValidObjectLocations(locations = [GraphQLValidObjectLocations.Locations.OBJECT])
data class UnionForHonoringUnionGenerationConfig(
@UnionAsAnnotation
@GraphQLDescription("A description for field")
Expand Down
Loading