Skip to content

Commit b2a426a

Browse files
authored
feat: Support fragments on fragments on types on types (#417)
1 parent 635a9d5 commit b2a426a

10 files changed

Lines changed: 1028 additions & 66 deletions

File tree

packages/graphql_codegen/example/pubspec.lock

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@ packages:
9393
dependency: transitive
9494
description:
9595
name: characters
96-
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
96+
sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b
9797
url: "https://pub.dev"
9898
source: hosted
99-
version: "1.4.0"
99+
version: "1.4.1"
100100
checked_yaml:
101101
dependency: transitive
102102
description:
@@ -337,7 +337,7 @@ packages:
337337
path: ".."
338338
relative: true
339339
source: path
340-
version: "3.0.0"
340+
version: "3.0.1"
341341
graphql_flutter:
342342
dependency: "direct main"
343343
description:
@@ -430,18 +430,18 @@ packages:
430430
dependency: transitive
431431
description:
432432
name: material_color_utilities
433-
sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
433+
sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b"
434434
url: "https://pub.dev"
435435
source: hosted
436-
version: "0.11.1"
436+
version: "0.13.0"
437437
meta:
438438
dependency: transitive
439439
description:
440440
name: meta
441-
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
441+
sha256: "1741988757a65eb6b36abe716829688cf01910bbf91c34354ff7ec1c3de2b349"
442442
url: "https://pub.dev"
443443
source: hosted
444-
version: "1.16.0"
444+
version: "1.18.0"
445445
mime:
446446
dependency: transitive
447447
description:
@@ -832,5 +832,5 @@ packages:
832832
source: hosted
833833
version: "3.1.3"
834834
sdks:
835-
dart: ">=3.9.0 <4.0.0"
835+
dart: ">=3.10.0-0 <4.0.0"
836836
flutter: ">=3.29.0"

packages/graphql_codegen/example/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: graphql_codegen_example
22

33
environment:
4-
sdk: ">=2.17.0 <3.0.0"
4+
sdk: ">=3.8.0 <4.0.0"
55

66
dependencies:
77
graphql_flutter: ^5.2.1

packages/graphql_codegen/lib/src/config/config.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ class GraphQLCodegenConfigScalar {
2222
this.toJsonFunctionName,
2323
});
2424

25-
@override
2625
factory GraphQLCodegenConfigScalar.fromJson(Map<String, dynamic> json) =>
2726
_$GraphQLCodegenConfigScalarFromJson(json);
2827

@@ -45,7 +44,6 @@ class GraphQLCodegenConfigEnum {
4544
required this.fallbackEnumValue,
4645
});
4746

48-
@override
4947
factory GraphQLCodegenConfigEnum.fromJson(Map<String, dynamic> json) =>
5048
_$GraphQLCodegenConfigEnumFromJson(json);
5149

@@ -92,7 +90,6 @@ class GraphQLCodegenConfig {
9290
this.setOperationName = false,
9391
});
9492

95-
@override
9693
factory GraphQLCodegenConfig.fromJson(Map<String, dynamic> json) =>
9794
_$GraphQLCodegenConfigFromJson(json);
9895

packages/graphql_codegen/lib/src/transform/transforming_visitor.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ class RecursiveTransformingVisitor extends Visitor<Node> {
194194
description: visitOne(node.description),
195195
directives: visitAll(node.directives),
196196
fields: visitAll(node.fields),
197+
interfaces: visitAll(node.interfaces),
197198
);
198199
}
199200

@@ -205,6 +206,7 @@ class RecursiveTransformingVisitor extends Visitor<Node> {
205206
name: visitOne(node.name),
206207
directives: visitAll(node.directives),
207208
fields: visitAll(node.fields),
209+
interfaces: visitAll(node.interfaces),
208210
);
209211
}
210212

packages/graphql_codegen/lib/src/visitor/context_visitor.dart

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -143,25 +143,37 @@ class ContextVisitor extends RecursiveVisitor {
143143
_visitInFragment(fragmentDef, fragmentName);
144144
return;
145145
}
146-
if (context.currentType is! ObjectTypeDefinitionNode) {
147-
return;
148-
}
149-
// Current type condition
150-
final typeCondition = fragmentDef.typeCondition;
146+
if (context.currentType is ObjectTypeDefinitionNode) {
147+
// Current type condition
148+
final typeCondition = fragmentDef.typeCondition;
151149

152-
// Find concrete types of the type conditions.
153-
final typeConditionConcreteTypes = context.schema
154-
.lookupConcreteTypes(typeCondition.on.name)
155-
.map((e) => e.name)
156-
.toSet();
150+
// Find concrete types of the type conditions.
151+
final typeConditionConcreteTypes = context.schema
152+
.lookupConcreteTypes(typeCondition.on.name)
153+
.map((e) => e.name)
154+
.toSet();
157155

158-
if (!typeConditionConcreteTypes.contains(context.currentType.name)) {
156+
if (!typeConditionConcreteTypes.contains(context.currentType.name)) {
157+
return;
158+
}
159+
final typedFragmentName = fragmentName.withSegment(
160+
TypeNameSegment(context.currentType.name),
161+
);
162+
_visitInFragment(fragmentDef, typedFragmentName);
159163
return;
160164
}
161-
final typedFragmentName = fragmentName.withSegment(
162-
TypeNameSegment(context.currentType.name),
163-
);
164-
_visitInFragment(fragmentDef, typedFragmentName);
165+
166+
final currentType = context.currentType;
167+
if (currentType is InterfaceTypeDefinitionNode) {
168+
final typeConditionName = fragmentDef.typeCondition.on.name;
169+
final currentTypeInterfaces = currentType.interfaces
170+
.map((e) => e.name)
171+
.toSet();
172+
if (!currentTypeInterfaces.contains(typeConditionName)) {
173+
return;
174+
}
175+
_visitInFragment(fragmentDef, fragmentName);
176+
}
165177
}
166178

167179
@override

packages/graphql_codegen/pubspec.lock

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@ packages:
55
dependency: transitive
66
description:
77
name: _fe_analyzer_shared
8-
sha256: dd3d2ad434b9510001d089e8de7556d50c834481b9abc2891a0184a8493a19dc
8+
sha256: f0bb5d1648339c8308cc0b9838d8456b3cfe5c91f9dc1a735b4d003269e5da9a
99
url: "https://pub.dev"
1010
source: hosted
11-
version: "89.0.0"
11+
version: "88.0.0"
1212
analyzer:
1313
dependency: transitive
1414
description:
1515
name: analyzer
16-
sha256: c22b6e7726d1f9e5db58c7251606076a71ca0dbcf76116675edfadbec0c9e875
16+
sha256: "0b7b9c329d2879f8f05d6c05b32ee9ec025f39b077864bdb5ac9a7b63418a98f"
1717
url: "https://pub.dev"
1818
source: hosted
19-
version: "8.2.0"
19+
version: "8.1.1"
2020
args:
2121
dependency: transitive
2222
description:
@@ -698,4 +698,4 @@ packages:
698698
source: hosted
699699
version: "3.1.3"
700700
sdks:
701-
dart: ">=3.9.0 <4.0.0"
701+
dart: ">=3.8.0 <4.0.0"

packages/graphql_codegen/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ environment:
1111
sdk: ">=3.8.0 <4.0.0"
1212

1313
dependencies:
14-
gql: ^1.0.0
14+
gql: ^1.0.1
1515
build: "^4.0.1"
1616
glob: ^2.0.1
1717
code_builder: ^4.2.0
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
interface Node {
2+
id: ID!
3+
}
4+
interface Animal implements Node {
5+
id: ID!
6+
name: String!
7+
}
8+
type Dog implements Animal & Node {
9+
id: ID!
10+
name: String!
11+
goodBoy: Boolean!
12+
}
13+
type Query {
14+
animal: Animal!
15+
}
16+
17+
fragment NodeFragment on Node {
18+
id
19+
}
20+
fragment AnimalFragment on Animal {
21+
...NodeFragment
22+
name
23+
}
24+
25+
query GetAnimal {
26+
animal {
27+
...AnimalFragment
28+
}
29+
}

0 commit comments

Comments
 (0)