Skip to content

Commit c9e062a

Browse files
authored
Complexity for meta fields + test (#92)
1 parent fa1f9d5 commit c9e062a

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

src/QueryComplexity.ts

+20-1
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ import {
3535
Kind,
3636
getNamedType,
3737
GraphQLError,
38+
SchemaMetaFieldDef,
39+
TypeMetaFieldDef,
40+
TypeNameMetaFieldDef,
3841
} from 'graphql';
3942

4043
export type ComplexityEstimatorArgs = {
@@ -307,7 +310,23 @@ export default class QueryComplexity {
307310

308311
switch (childNode.kind) {
309312
case Kind.FIELD: {
310-
const field = fields[childNode.name.value];
313+
let field = null;
314+
315+
switch (childNode.name.value) {
316+
case SchemaMetaFieldDef.name:
317+
field = SchemaMetaFieldDef;
318+
break;
319+
case TypeMetaFieldDef.name:
320+
field = TypeMetaFieldDef;
321+
break;
322+
case TypeNameMetaFieldDef.name:
323+
field = TypeNameMetaFieldDef;
324+
break;
325+
default:
326+
field = fields[childNode.name.value];
327+
break;
328+
}
329+
311330
// Invalid field, should be caught by other validation rules
312331
if (!field) {
313332
break;

src/__tests__/QueryComplexity-test.ts

+27
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,33 @@ describe('QueryComplexity analysis', () => {
611611
expect(complexity2).to.equal(20);
612612
});
613613

614+
it('should calculate complexity for meta fields', () => {
615+
const query = parse(`
616+
query Primary {
617+
__typename
618+
__type(name: "Primary") {
619+
name
620+
}
621+
__schema {
622+
types {
623+
name
624+
}
625+
}
626+
}
627+
`);
628+
629+
const complexity = getComplexity({
630+
estimators: [
631+
fieldExtensionsEstimator(),
632+
simpleEstimator({ defaultComplexity: 1 }),
633+
],
634+
schema,
635+
query,
636+
});
637+
638+
expect(complexity).to.equal(6);
639+
});
640+
614641
it('should calculate max complexity for fragment on union type', () => {
615642
const query = parse(`
616643
query Primary {

0 commit comments

Comments
 (0)