diff --git a/src/QueryComplexity.ts b/src/QueryComplexity.ts index 41dee1e..8f9e5b3 100644 --- a/src/QueryComplexity.ts +++ b/src/QueryComplexity.ts @@ -35,6 +35,9 @@ import { Kind, getNamedType, GraphQLError, + SchemaMetaFieldDef, + TypeMetaFieldDef, + TypeNameMetaFieldDef, } from 'graphql'; export type ComplexityEstimatorArgs = { @@ -307,7 +310,23 @@ export default class QueryComplexity { switch (childNode.kind) { case Kind.FIELD: { - const field = fields[childNode.name.value]; + let field = null; + + switch (childNode.name.value) { + case SchemaMetaFieldDef.name: + field = SchemaMetaFieldDef; + break; + case TypeMetaFieldDef.name: + field = TypeMetaFieldDef; + break; + case TypeNameMetaFieldDef.name: + field = TypeNameMetaFieldDef; + break; + default: + field = fields[childNode.name.value]; + break; + } + // Invalid field, should be caught by other validation rules if (!field) { break; diff --git a/src/__tests__/QueryComplexity-test.ts b/src/__tests__/QueryComplexity-test.ts index 92269dd..6c2ec43 100644 --- a/src/__tests__/QueryComplexity-test.ts +++ b/src/__tests__/QueryComplexity-test.ts @@ -611,6 +611,33 @@ describe('QueryComplexity analysis', () => { expect(complexity2).to.equal(20); }); + it('should calculate complexity for meta fields', () => { + const query = parse(` + query Primary { + __typename + __type(name: "Primary") { + name + } + __schema { + types { + name + } + } + } + `); + + const complexity = getComplexity({ + estimators: [ + fieldExtensionsEstimator(), + simpleEstimator({ defaultComplexity: 1 }), + ], + schema, + query, + }); + + expect(complexity).to.equal(6); + }); + it('should calculate max complexity for fragment on union type', () => { const query = parse(` query Primary {