Skip to content

Commit 3a8e3c1

Browse files
authored
fix: ignore directive replacements for consolidated types when definitionType is input/output (#119)
* unit test * make test pass * improve test * fix integration tests * fix integration tests * fix integration tests
1 parent 85a3257 commit 3a8e3c1

File tree

13 files changed

+115
-10
lines changed

13 files changed

+115
-10
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@expediagroup/graphql-kotlin-codegen",
3-
"packageManager": "bun@1.1.17",
3+
"packageManager": "bun@1.1.32",
44
"main": "dist/plugin.cjs",
55
"types": "dist/plugin.d.cts",
66
"files": [

src/annotations/build-annotations.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { indent } from "@graphql-codegen/visitor-plugin-common";
1515
import {
1616
EnumValueDefinitionNode,
1717
FieldDefinitionNode,
18+
GraphQLSchema,
1819
InputValueDefinitionNode,
1920
Kind,
2021
TypeDefinitionNode,
@@ -31,10 +32,12 @@ export type DefinitionNode =
3132
| EnumValueDefinitionNode;
3233

3334
export function buildAnnotations({
35+
schema,
3436
config,
3537
definitionNode,
3638
typeMetadata,
3739
}: {
40+
schema: GraphQLSchema;
3841
config: CodegenConfigWithDefaults;
3942
definitionNode: DefinitionNode;
4043
typeMetadata?: TypeMetadata;
@@ -49,6 +52,7 @@ export function buildAnnotations({
4952
const directiveAnnotations = buildDirectiveAnnotations(
5053
definitionNode,
5154
config,
55+
schema,
5256
);
5357
const unionAnnotation = typeMetadata?.unionAnnotation
5458
? `@${typeMetadata.unionAnnotation}\n`

src/annotations/build-directive-annotations.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,21 @@ limitations under the License.
1414
import { CodegenConfigWithDefaults } from "../config/build-config-with-defaults";
1515
import { DefinitionNode } from "./build-annotations";
1616
import { ConstDirectiveNode } from "graphql/language";
17-
import { Kind } from "graphql";
17+
import { GraphQLSchema, isInputObjectType, Kind } from "graphql";
18+
import { shouldConsolidateTypes } from "../utils/should-consolidate-types";
19+
import { sanitizeName } from "../utils/sanitize-name";
1820

1921
export function buildDirectiveAnnotations(
2022
definitionNode: DefinitionNode,
2123
config: CodegenConfigWithDefaults,
24+
schema: GraphQLSchema,
2225
) {
26+
const name = sanitizeName(definitionNode.name.value);
27+
const potentialMatchingInputType = schema.getType(`${name}Input`);
28+
const typeWillBeConsolidated =
29+
isInputObjectType(potentialMatchingInputType) &&
30+
potentialMatchingInputType.astNode &&
31+
shouldConsolidateTypes(potentialMatchingInputType.astNode, schema, config);
2332
const directives = definitionNode.directives ?? [];
2433
return directives
2534
.map((directive) => {
@@ -29,9 +38,17 @@ export function buildDirectiveAnnotations(
2938
if (federationReplacement) return federationReplacement + "\n";
3039

3140
const directiveReplacementFromConfig = config.directiveReplacements?.find(
32-
({ directive, definitionType }) =>
33-
directive === directiveName &&
34-
(!definitionType || definitionType === definitionNode.kind),
41+
({ directive, definitionType }) => {
42+
if (directive !== directiveName) return false;
43+
if (!definitionType) return true;
44+
if (definitionType !== definitionNode.kind) return false;
45+
if (
46+
definitionType !== Kind.INPUT_OBJECT_TYPE_DEFINITION &&
47+
definitionType !== Kind.OBJECT_TYPE_DEFINITION
48+
)
49+
return true;
50+
return !typeWillBeConsolidated;
51+
},
3552
);
3653
if (!directiveReplacementFromConfig) return "";
3754
const kotlinAnnotations = buildKotlinAnnotations(

src/definitions/enum.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@ import { buildAnnotations } from "../annotations/build-annotations";
1717
import { shouldExcludeTypeDefinition } from "../config/should-exclude-type-definition";
1818
import { CodegenConfigWithDefaults } from "../config/build-config-with-defaults";
1919
import { sanitizeName } from "../utils/sanitize-name";
20+
import { GraphQLSchema } from "graphql";
2021

2122
export function buildEnumTypeDefinition(
2223
node: EnumTypeDefinitionNode,
24+
schema: GraphQLSchema,
2325
config: CodegenConfigWithDefaults,
2426
) {
2527
if (shouldExcludeTypeDefinition(node, config)) {
@@ -29,10 +31,11 @@ export function buildEnumTypeDefinition(
2931
const enumName = sanitizeName(node.name.value);
3032
const enumValues =
3133
node.values?.map((valueNode) => {
32-
return buildEnumValueDefinition(valueNode, config);
34+
return buildEnumValueDefinition(valueNode, schema, config);
3335
}) ?? [];
3436

3537
const annotations = buildAnnotations({
38+
schema,
3639
config,
3740
definitionNode: node,
3841
});
@@ -47,10 +50,12 @@ ${indentMultiline(enumValues.join(",\n") + ";", 2)}
4750

4851
function buildEnumValueDefinition(
4952
node: EnumValueDefinitionNode,
53+
schema: GraphQLSchema,
5054
config: CodegenConfigWithDefaults,
5155
) {
5256
const annotations = buildAnnotations({
5357
config,
58+
schema,
5459
definitionNode: node,
5560
});
5661
if (!config.convert) {

src/definitions/field.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ export function buildObjectFieldDefinition({
7272
typeMetadata,
7373
);
7474
const annotations = buildAnnotations({
75+
schema,
7576
config,
7677
definitionNode: fieldNode,
7778
typeMetadata,
@@ -112,6 +113,7 @@ export function buildConstructorFieldDefinition({
112113
typeMetadata,
113114
);
114115
const annotations = buildAnnotations({
116+
schema,
115117
config,
116118
definitionNode: fieldNode,
117119
typeMetadata,
@@ -156,6 +158,7 @@ export function buildInterfaceFieldDefinition({
156158
typeMetadata,
157159
);
158160
const annotations = buildAnnotations({
161+
schema,
159162
config,
160163
definitionNode: fieldNode,
161164
typeMetadata,

src/definitions/input.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export function buildInputObjectDefinition(
4040
const initial = typeToUse.isNullable ? " = null" : "";
4141

4242
const annotations = buildAnnotations({
43+
schema,
4344
config,
4445
definitionNode: field,
4546
});
@@ -53,6 +54,7 @@ export function buildInputObjectDefinition(
5354
.join(",\n");
5455

5556
const annotations = buildAnnotations({
57+
schema,
5658
config,
5759
definitionNode: node,
5860
});

src/definitions/interface.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export function buildInterfaceDefinition(
4040
.join("\n");
4141

4242
const annotations = buildAnnotations({
43+
schema,
4344
config,
4445
definitionNode: node,
4546
});

src/definitions/object.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ export function buildObjectTypeDefinition(
4242
}
4343

4444
const annotations = buildAnnotations({
45+
schema,
4546
config,
4647
definitionNode: node,
4748
});
48-
const name = sanitizeName(node.name.value);
4949
const dependentInterfaces = getDependentInterfaceNames(node);
5050
const dependentUnions = getDependentUnionsForType(schema, node);
5151
const interfacesToInherit =
@@ -57,6 +57,7 @@ export function buildObjectTypeDefinition(
5757
);
5858
const interfaceInheritance = `${interfacesToInherit.length ? ` : ${sanitizedInterfaceNames.join(", ")}` : ""}`;
5959

60+
const name = sanitizeName(node.name.value);
6061
const potentialMatchingInputType = schema.getType(`${name}Input`);
6162
const typeWillBeConsolidated =
6263
isInputObjectType(potentialMatchingInputType) &&

src/definitions/union.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ See the License for the specific language governing permissions and
1111
limitations under the License.
1212
*/
1313

14-
import { UnionTypeDefinitionNode } from "graphql";
14+
import { GraphQLSchema, UnionTypeDefinitionNode } from "graphql";
1515
import { shouldExcludeTypeDefinition } from "../config/should-exclude-type-definition";
1616
import { CodegenConfigWithDefaults } from "../config/build-config-with-defaults";
1717
import {
@@ -22,12 +22,14 @@ import { sanitizeName } from "../utils/sanitize-name";
2222

2323
export function buildUnionTypeDefinition(
2424
node: UnionTypeDefinitionNode,
25+
schema: GraphQLSchema,
2526
config: CodegenConfigWithDefaults,
2627
) {
2728
if (shouldExcludeTypeDefinition(node, config)) {
2829
return "";
2930
}
3031
const annotations = buildAnnotations({
32+
schema,
3133
config,
3234
definitionNode: node,
3335
});

src/visitor.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export class KotlinVisitor extends BaseVisitor<
4040
}
4141

4242
EnumTypeDefinition(node: EnumTypeDefinitionNode): string {
43-
return buildEnumTypeDefinition(node, this.config);
43+
return buildEnumTypeDefinition(node, this._schema, this.config);
4444
}
4545

4646
InterfaceTypeDefinition(node: InterfaceTypeDefinitionNode): string {
@@ -56,6 +56,6 @@ export class KotlinVisitor extends BaseVisitor<
5656
}
5757

5858
UnionTypeDefinition(node: UnionTypeDefinitionNode): string {
59-
return buildUnionTypeDefinition(node, this.config);
59+
return buildUnionTypeDefinition(node, this._schema, this.config);
6060
}
6161
}

0 commit comments

Comments
 (0)