Skip to content

Commit 8b644f9

Browse files
authored
Allow extensions-only schema #160 (#162)
1 parent b1633a0 commit 8b644f9

File tree

9 files changed

+84
-23
lines changed

9 files changed

+84
-23
lines changed

src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,9 @@ private File generateEnum(MappingContext mappingContext, ExtendedEnumTypeDefinit
217217

218218
private void initCustomTypeMappings(Collection<ExtendedScalarTypeDefinition> scalarTypeDefinitions) {
219219
for (ExtendedScalarTypeDefinition definition : scalarTypeDefinitions) {
220-
mappingConfig.putCustomTypeMappingIfAbsent(definition.getDefinition().getName(), "String");
220+
if (definition.getDefinition() != null) {
221+
mappingConfig.putCustomTypeMappingIfAbsent(definition.getDefinition().getName(), "String");
222+
}
221223
for (ScalarTypeExtensionDefinition extension : definition.getExtensions()) {
222224
mappingConfig.putCustomTypeMappingIfAbsent(extension.getName(), "String");
223225
}

src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDefinition.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package com.kobylynskyi.graphql.codegen.model.definitions;
22

3-
import graphql.language.*;
3+
import graphql.language.Comment;
4+
import graphql.language.NamedNode;
5+
import graphql.language.Node;
46
import lombok.Getter;
5-
import lombok.NonNull;
67
import lombok.Setter;
78

8-
import java.util.*;
9-
import java.util.function.Function;
9+
import java.util.ArrayList;
10+
import java.util.Collection;
11+
import java.util.List;
12+
import java.util.Objects;
1013

1114
/**
1215
* Base class for all GraphQL definition types that contains base definition and its extensions
@@ -18,17 +21,23 @@
1821
@Setter
1922
public abstract class ExtendedDefinition<T extends NamedNode<T>, E extends T> {
2023

21-
@NonNull
24+
/**
25+
* Nullable because some schemas can have just "extends"
26+
*/
2227
protected T definition;
2328
protected List<E> extensions = new ArrayList<>();
2429

2530
public String getName() {
26-
return definition.getName();
31+
if (definition != null) {
32+
return definition.getName();
33+
} else {
34+
return extensions.stream().map(NamedNode::getName).findFirst().orElse(null);
35+
}
2736
}
2837

2938
public List<String> getJavaDoc() {
3039
List<String> comments = new ArrayList<>();
31-
if (definition.getComments() != null) {
40+
if (definition != null && definition.getComments() != null) {
3241
definition.getComments().stream()
3342
.map(Comment::getContent)
3443
.filter(Objects::nonNull)

src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedEnumTypeDefinition.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import graphql.language.EnumTypeExtensionDefinition;
55
import graphql.language.EnumValueDefinition;
66

7+
import java.util.ArrayList;
78
import java.util.List;
89

910
public class ExtendedEnumTypeDefinition extends ExtendedDefinition<EnumTypeDefinition, EnumTypeExtensionDefinition> {
@@ -14,7 +15,10 @@ public class ExtendedEnumTypeDefinition extends ExtendedDefinition<EnumTypeDefin
1415
* @return list of all enum value definitions
1516
*/
1617
public List<EnumValueDefinition> getValueDefinitions() {
17-
List<EnumValueDefinition> definitions = definition.getEnumValueDefinitions();
18+
List<EnumValueDefinition> definitions = new ArrayList<>();
19+
if (definition != null) {
20+
definitions.addAll(definition.getEnumValueDefinitions());
21+
}
1822
extensions.stream()
1923
.map(EnumTypeExtensionDefinition::getEnumValueDefinitions)
2024
.forEach(definitions::addAll);

src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInputObjectTypeDefinition.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@
44
import graphql.language.InputObjectTypeExtensionDefinition;
55
import graphql.language.InputValueDefinition;
66

7+
import java.util.ArrayList;
78
import java.util.List;
89

910
public class ExtendedInputObjectTypeDefinition extends ExtendedDefinition<InputObjectTypeDefinition, InputObjectTypeExtensionDefinition> {
1011

1112
public List<InputValueDefinition> getValueDefinitions() {
12-
List<InputValueDefinition> definitions = definition.getInputValueDefinitions();
13+
List<InputValueDefinition> definitions = new ArrayList<>();
14+
if (definition != null) {
15+
definitions.addAll(definition.getInputValueDefinitions());
16+
}
1317
extensions.stream()
1418
.map(InputObjectTypeDefinition::getInputValueDefinitions)
1519
.forEach(definitions::addAll);

src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInterfaceTypeDefinition.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ public class ExtendedInterfaceTypeDefinition extends ExtendedDefinition<Interfac
1111

1212
public List<ExtendedFieldDefinition> getFieldDefinitions() {
1313
List<ExtendedFieldDefinition> definitions = new ArrayList<>();
14-
definition.getFieldDefinitions().stream()
15-
.map(f -> new ExtendedFieldDefinition(f, false))
16-
.forEach(definitions::add);
14+
if (definition != null) {
15+
definition.getFieldDefinitions().stream()
16+
.map(f -> new ExtendedFieldDefinition(f, false))
17+
.forEach(definitions::add);
18+
}
1719
extensions.stream()
1820
.map(InterfaceTypeExtensionDefinition::getFieldDefinitions)
1921
.flatMap(Collection::stream)

src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedObjectTypeDefinition.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.kobylynskyi.graphql.codegen.model.definitions;
22

3-
import graphql.language.*;
3+
import graphql.language.ObjectTypeDefinition;
4+
import graphql.language.ObjectTypeExtensionDefinition;
5+
import graphql.language.Type;
46

57
import java.util.ArrayList;
68
import java.util.Collection;
@@ -10,9 +12,11 @@ public class ExtendedObjectTypeDefinition extends ExtendedDefinition<ObjectTypeD
1012

1113
public List<ExtendedFieldDefinition> getFieldDefinitions() {
1214
List<ExtendedFieldDefinition> definitions = new ArrayList<>();
13-
definition.getFieldDefinitions().stream()
14-
.map(f -> new ExtendedFieldDefinition(f, false))
15-
.forEach(definitions::add);
15+
if (definition != null) {
16+
definition.getFieldDefinitions().stream()
17+
.map(f -> new ExtendedFieldDefinition(f, false))
18+
.forEach(definitions::add);
19+
}
1620
extensions.stream()
1721
.map(ObjectTypeExtensionDefinition::getFieldDefinitions)
1822
.flatMap(Collection::stream)
@@ -23,7 +27,10 @@ public List<ExtendedFieldDefinition> getFieldDefinitions() {
2327

2428
@SuppressWarnings("rawtypes")
2529
public List<Type> getImplements() {
26-
List<Type> definitionImplements = definition.getImplements();
30+
List<Type> definitionImplements = new ArrayList<>();
31+
if (definition != null) {
32+
definitionImplements.addAll(definition.getImplements());
33+
}
2734
extensions.stream()
2835
.map(ObjectTypeDefinition::getImplements)
2936
.forEach(definitionImplements::addAll);

src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedUnionTypeDefinition.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ public boolean isDefinitionPartOfUnion(ExtendedDefinition<?, ?> definition) {
2727

2828
private Set<String> getMemberTypeNames() {
2929
Set<String> memberTypeNames = new HashSet<>();
30-
getDefinition().getMemberTypes().stream()
31-
.map(NamedNode.class::cast)
32-
.map(NamedNode::getName)
33-
.forEach(memberTypeNames::add);
34-
getExtensions().stream()
30+
if (definition != null) {
31+
definition.getMemberTypes().stream()
32+
.map(NamedNode.class::cast)
33+
.map(NamedNode::getName)
34+
.forEach(memberTypeNames::add);
35+
}
36+
extensions.stream()
3537
.map(UnionTypeDefinition::getMemberTypes)
3638
.flatMap(Collection::stream)
3739
.map(NamedNode.class::cast)

src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExtendTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,17 @@ void generateServerSideClasses() throws Exception {
5656
}
5757
}
5858

59+
@Test
60+
void generate_onlyExtend() throws Exception {
61+
schemaFinder.setIncludePattern("only-extend-queries.*\\.graphqls");
62+
new GraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig).generate();
63+
64+
assertEquals(new HashSet<>(asList("Subscription.java", "UserQuery.java", "User.java",
65+
"UsersCreatedSubscription.java", "CreateUserMutation.java", "Mutation.java", "Query.java",
66+
"UserInput.java")), Arrays.stream(Objects.requireNonNull(outputJavaClassesDir.listFiles()))
67+
.map(File::getName).collect(toSet()));
68+
}
69+
5970
@Test
6071
void generateServerSideClasses_ExtensionFieldsResolvers() throws Exception {
6172
mappingConfig.setGenerateExtensionFieldsResolvers(true);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
extend type Query {
2+
user(userId: ID!): User
3+
}
4+
5+
extend type Mutation {
6+
createUser(input: UserInput!): User
7+
}
8+
9+
extend type Subscription {
10+
usersCreated: [User]
11+
}
12+
13+
type User {
14+
id: ID!
15+
name: String!
16+
}
17+
18+
input UserInput {
19+
name: String!
20+
}

0 commit comments

Comments
 (0)