Skip to content

Commit d63e707

Browse files
committed
Merge remote-tracking branch 'upstream/master'
2 parents 0001f12 + 91462d5 commit d63e707

File tree

3 files changed

+288
-0
lines changed

3 files changed

+288
-0
lines changed

links/gql_exec/lib/gql_exec.dart

+1
Original file line numberDiff line numberDiff line change
@@ -62,5 +62,6 @@ export "src/context.dart";
6262
export "src/error.dart";
6363
export "src/http.dart";
6464
export "src/operation.dart";
65+
export "src/operation_operationtype_extension.dart";
6566
export "src/request.dart";
6667
export "src/response.dart";
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
import "package:collection/collection.dart";
2+
import "package:gql/ast.dart";
3+
4+
import "../gql_exec.dart";
5+
6+
extension OperationTypeExtension on Operation {
7+
OperationType? getOperationType() {
8+
final visitor = _OperationTypeVisitor(operationName);
9+
10+
final type = document.definitions
11+
.map((d) => d.accept(visitor))
12+
.whereNotNull()
13+
.firstOrNull;
14+
15+
return type;
16+
}
17+
}
18+
19+
/// use visitor to avoid expensive type checks
20+
class _OperationTypeVisitor extends Visitor<OperationType?> {
21+
final String? operationName;
22+
23+
_OperationTypeVisitor(this.operationName);
24+
25+
@override
26+
OperationType? visitArgumentNode(ArgumentNode node) => null;
27+
28+
@override
29+
OperationType? visitBooleanValueNode(BooleanValueNode node) => null;
30+
31+
@override
32+
OperationType? visitDefaultValueNode(DefaultValueNode node) => null;
33+
34+
@override
35+
OperationType? visitDirectiveDefinitionNode(DirectiveDefinitionNode node) =>
36+
null;
37+
38+
@override
39+
OperationType? visitDirectiveNode(DirectiveNode node) => null;
40+
41+
@override
42+
OperationType? visitDocumentNode(DocumentNode node) => null;
43+
44+
@override
45+
OperationType? visitEnumTypeDefinitionNode(EnumTypeDefinitionNode node) =>
46+
null;
47+
48+
@override
49+
OperationType? visitEnumTypeExtensionNode(EnumTypeExtensionNode node) => null;
50+
51+
@override
52+
OperationType? visitEnumValueDefinitionNode(EnumValueDefinitionNode node) =>
53+
null;
54+
55+
@override
56+
OperationType? visitEnumValueNode(EnumValueNode node) => null;
57+
58+
@override
59+
OperationType? visitFieldDefinitionNode(FieldDefinitionNode node) => null;
60+
61+
@override
62+
OperationType? visitFieldNode(FieldNode node) => null;
63+
64+
@override
65+
OperationType? visitFloatValueNode(FloatValueNode node) => null;
66+
67+
@override
68+
OperationType? visitFragmentDefinitionNode(FragmentDefinitionNode node) =>
69+
null;
70+
71+
@override
72+
OperationType? visitFragmentSpreadNode(FragmentSpreadNode node) => null;
73+
74+
@override
75+
OperationType? visitInlineFragmentNode(InlineFragmentNode node) => null;
76+
77+
@override
78+
OperationType? visitInputObjectTypeDefinitionNode(
79+
InputObjectTypeDefinitionNode node) =>
80+
null;
81+
82+
@override
83+
OperationType? visitInputObjectTypeExtensionNode(
84+
InputObjectTypeExtensionNode node) =>
85+
null;
86+
87+
@override
88+
OperationType? visitInputValueDefinitionNode(InputValueDefinitionNode node) =>
89+
null;
90+
91+
@override
92+
OperationType? visitIntValueNode(IntValueNode node) => null;
93+
94+
@override
95+
OperationType? visitInterfaceTypeDefinitionNode(
96+
InterfaceTypeDefinitionNode node) =>
97+
null;
98+
99+
@override
100+
OperationType? visitInterfaceTypeExtensionNode(
101+
InterfaceTypeExtensionNode node) =>
102+
null;
103+
104+
@override
105+
OperationType? visitListTypeNode(ListTypeNode node) => null;
106+
107+
@override
108+
OperationType? visitListValueNode(ListValueNode node) => null;
109+
110+
@override
111+
OperationType? visitNameNode(NameNode node) => null;
112+
113+
@override
114+
OperationType? visitNamedTypeNode(NamedTypeNode node) => null;
115+
116+
@override
117+
OperationType? visitNullValueNode(NullValueNode node) => null;
118+
119+
@override
120+
OperationType? visitObjectFieldNode(ObjectFieldNode node) => null;
121+
122+
@override
123+
OperationType? visitObjectTypeDefinitionNode(ObjectTypeDefinitionNode node) =>
124+
null;
125+
126+
@override
127+
OperationType? visitObjectTypeExtensionNode(ObjectTypeExtensionNode node) =>
128+
null;
129+
130+
@override
131+
OperationType? visitObjectValueNode(ObjectValueNode node) => null;
132+
133+
@override
134+
OperationType? visitOperationDefinitionNode(OperationDefinitionNode node) =>
135+
operationName == null || node.name?.value == operationName
136+
? node.type
137+
: null;
138+
139+
@override
140+
OperationType? visitOperationTypeDefinitionNode(
141+
OperationTypeDefinitionNode node) =>
142+
null;
143+
144+
@override
145+
OperationType? visitScalarTypeDefinitionNode(ScalarTypeDefinitionNode node) =>
146+
null;
147+
148+
@override
149+
OperationType? visitScalarTypeExtensionNode(ScalarTypeExtensionNode node) =>
150+
null;
151+
152+
@override
153+
OperationType? visitSchemaDefinitionNode(SchemaDefinitionNode node) => null;
154+
155+
@override
156+
OperationType? visitSchemaExtensionNode(SchemaExtensionNode node) => null;
157+
158+
@override
159+
OperationType? visitSelectionSetNode(SelectionSetNode node) => null;
160+
161+
@override
162+
OperationType? visitStringValueNode(StringValueNode node) => null;
163+
164+
@override
165+
OperationType? visitTypeConditionNode(TypeConditionNode node) => null;
166+
167+
@override
168+
OperationType? visitUnionTypeDefinitionNode(UnionTypeDefinitionNode node) =>
169+
null;
170+
171+
@override
172+
OperationType? visitUnionTypeExtensionNode(UnionTypeExtensionNode node) =>
173+
null;
174+
175+
@override
176+
OperationType? visitVariableDefinitionNode(VariableDefinitionNode node) =>
177+
null;
178+
179+
@override
180+
OperationType? visitVariableNode(VariableNode node) => null;
181+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import "package:gql/ast.dart";
2+
import "package:gql/language.dart";
3+
import "package:gql_exec/gql_exec.dart";
4+
import "package:test/test.dart";
5+
6+
void main() {
7+
group("getOperationType", () {
8+
test("returns the operation type for query", () {
9+
final query = parseString("""
10+
query MyQuery {
11+
foo
12+
}
13+
""");
14+
15+
final type = Operation(document: query, operationName: "MyQuery")
16+
.getOperationType();
17+
18+
expect(type, OperationType.query);
19+
});
20+
21+
test("returns the operation type for mutation", () {
22+
final query = parseString("""
23+
mutation MyMutation {
24+
foo
25+
}
26+
""");
27+
28+
final type = Operation(document: query, operationName: "MyMutation")
29+
.getOperationType();
30+
31+
expect(type, OperationType.mutation);
32+
});
33+
34+
test("returns the operation type for subscription", () {
35+
final query = parseString("""
36+
subscription MySubscription {
37+
foo
38+
}
39+
""");
40+
41+
final type = Operation(document: query, operationName: "MySubscription")
42+
.getOperationType();
43+
44+
expect(type, OperationType.subscription);
45+
});
46+
47+
test("return type of not name is passed to operation", () {
48+
final query = parseString("""
49+
query MyQuery {
50+
foo
51+
}
52+
""");
53+
54+
final type = Operation(document: query).getOperationType();
55+
56+
expect(type, OperationType.query);
57+
});
58+
59+
test("returns type if multiple operations are present", () {
60+
final query = parseString("""
61+
query MyQuery {
62+
foo
63+
}
64+
65+
mutation MyMutation {
66+
foo
67+
}
68+
""");
69+
70+
final type = Operation(document: query, operationName: "MyMutation")
71+
.getOperationType();
72+
73+
expect(type, OperationType.mutation);
74+
});
75+
76+
test("returns null if no operation is found", () {
77+
final query = parseString("""
78+
query MyQuery {
79+
foo
80+
}
81+
82+
mutation MyMutation {
83+
foo
84+
}
85+
""");
86+
87+
final type = Operation(document: query, operationName: "MyOperation")
88+
.getOperationType();
89+
90+
expect(type, null);
91+
});
92+
93+
test("returns null if documents has no operations", () {
94+
final query = parseString("""
95+
fragment MyFragment on Foo {
96+
foo
97+
}
98+
""");
99+
100+
final type = Operation(document: query, operationName: "MyFragment")
101+
.getOperationType();
102+
103+
expect(type, null);
104+
});
105+
});
106+
}

0 commit comments

Comments
 (0)