Overview
Expert knowledge of GraphQL Inspector's validate command for checking operations and documents against a schema with configurable rules.
Overview
The validate command checks GraphQL operations (queries, mutations, subscriptions) and fragments against a schema. It catches errors like undefined fields, wrong argument types, and invalid fragment spreads before runtime.
Core Commands
Basic Validation
# Validate operations against schema
npx @graphql-inspector/cli validate './src/**/*.graphql' './schema.graphql'
# Validate operations from TypeScript files
npx @graphql-inspector/cli validate './src/**/*.tsx' './schema.graphql'
# Validate with glob patterns
npx @graphql-inspector/cli validate './**/*.{graphql,gql}' './schema.graphql'
Federation Support
# Apollo Federation V1
npx @graphql-inspector/cli validate './operations/**/*.graphql' './schema.graphql' \
--federation
# Apollo Federation V2
npx @graphql-inspector/cli validate './operations/**/*.graphql' './schema.graphql' \
--federationV2
# AWS AppSync directives
npx @graphql-inspector/cli validate './operations/**/*.graphql' './schema.graphql' \
--aws
Validation Rules
Depth Limiting
Prevent deeply nested queries that could cause performance issues:
# Fail if query depth exceeds 10
npx @graphql-inspector/cli validate './src/**/*.graphql' './schema.graphql' \
--maxDepth 10
Example violation:
# Depth of 8 - might exceed limit
query DeepQuery {
user { # 1
posts { # 2
author { # 3
followers { # 4
posts { # 5
comments { # 6
author { # 7
name # 8
}
}
}
}
}
}
}
}
Alias Count
Limit alias usage to prevent response explosion:
# Max 5 aliases per operation
npx @graphql-inspector/cli validate './src/**/*.graphql' './schema.graphql' \
--maxAliasCount 5
Example violation:
# 6 aliases - exceeds limit of 5
query TooManyAliases {
user1: user(id: "1") { name }
user2: user(id: "2") { name }
user3: user(id: "3") { name }
user4: user(id: "4") { name }
user5: user(id: "5") { name }
user6: user(id: "6") { name } # Exceeds limit
}
Directive Count
Limit directives to prevent abuse:
# Max 10 directives per operation
npx @graphql-inspector/cli validate './src/**/*.graphql' './schema.graphql' \
--maxDirectiveCount 10
Token Count
Limit query complexity by token count:
# Max 1000 tokens per operation
npx @graphql-inspector/cli validate './src/**/*.graphql' './schema.graphql' \
--maxTokenCount 1000
Complexity Score
Calculate and limit query complexity:
# Max complexity score of 100
npx @graphql-inspector/cli validate './src/**/*.graphql' './schema.graphql' \
--maxComplexityScore 100
Configuration File
Create .graphql-inspector.yaml:
validate:
schema: './schema.graphql'
documents: './src/**/*.graphql'
# Validation limits
maxDepth: 10
maxAliasCount: 5
maxDirectiveCount: 10
maxTokenCount: 1000
maxComplexityScore: 100
# Federation support
federation: false
federationV2: false
aws: false
Common Validation Errors
Unknown Field
Error: Cannot query field "unknownField" on type "User".
Fix: Check field name spelling or add field to schema.
Wrong Argument Type
Error: Argument "id" has invalid value "123".
Expected type "ID!", found "123" (String).
Fix: Use correct type for argument.
Missing Required Argument
Error: Field "user" argument "id" of type "ID!" is required.
Fix: Provide required argument.
Invalid Fragment Spread
Error: Fragment "UserFields" cannot be spread here as objects of
type "Post" can never be of type "User".
Fix: Ensure fragment type matches spread location.
Unused Fragment
Warning: Fragment "UnusedFragment" is never used.
Fix: Remove or use the fragment.
CI/CD Integration
GitHub Actions
name: Validate Operations
on:
pull_request:
paths:
- 'src/**/*.graphql'
- 'src/**/*.tsx'
- 'schema.graphql'
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Inspector
run: npm install -g @graphql-inspector/cli
- name: Validate operations
run: |
graphql-inspector validate \
'src/**/*.graphql' \
schema.graphql \
--maxDepth 10 \
--maxAliasCount 5
Pre-commit Hook
{
"husky": {
"hooks": {
"pre-commit": "graphql-inspector validate 'src/**/*.graphql' schema.graphql"
}
}
}
Extracting Operations from Code
GraphQL Inspector can extract operations from various file types:
TypeScript/JavaScript
// Operations in template literals are detected
const GET_USER = gql`
query GetUser($id: ID!) {
user(id: $id) {
name
email
}
}
`;
React with GraphQL
// Tagged template literals in React files
import { gql } from '@apollo/client';
const USER_QUERY = gql`
query UserQuery {
currentUser {
id
name
}
}
`;
Best Practices
- Validate in CI - Run validation on every PR affecting GraphQL files
- Set reasonable limits - Start with permissive limits, tighten over time
- Validate against production schema - Ensure operations work in production
- Extract operations from code - Validate all operations, not just
.graphqlfiles - Use Federation flags - Enable if using Apollo Federation
- Fail on warnings - Treat unused fragments as errors in CI
- Version your schema - Validate against specific schema versions
- Document limits - Explain why limits exist to developers
Common Patterns
Multi-Schema Validation
For monorepos with multiple schemas:
# Validate against specific service schema
npx @graphql-inspector/cli validate \
'./packages/app/src/**/*.graphql' \
'./packages/api/schema.graphql'
# Validate against federated supergraph
npx @graphql-inspector/cli validate \
'./packages/web/src/**/*.graphql' \
'./supergraph.graphql' \
--federationV2
Incremental Adoption
Start permissive, add stricter rules over time:
# Phase 1: Basic validation only
validate:
schema: './schema.graphql'
documents: './src/**/*.graphql'
# Phase 2: Add depth limiting
validate:
schema: './schema.graphql'
documents: './src/**/*.graphql'
maxDepth: 15
# Phase 3: Add complexity limits
validate:
schema: './schema.graphql'
documents: './src/**/*.graphql'
maxDepth: 10
maxAliasCount: 10
maxComplexityScore: 200
Troubleshooting
"Schema file not found"
- Verify schema path is correct
- Check glob pattern matches schema location
- Use absolute path if relative fails
"No documents found"
- Check glob pattern matches operation files
- Verify file extensions are correct
- Ensure files contain GraphQL operations
"Unknown directive"
- Add
--federationor--federationV2for Federation directives - Add
--awsfor AppSync directives - Check custom directives are defined in schema
Operations not detected in code
- Ensure using tagged template literal (
gql\...``) - Check file extension is included in glob
- Verify GraphQL Inspector can parse the file type
When to Use This Skill
- Setting up operation validation in CI/CD
- Enforcing query complexity limits
- Validating operations before deployment
- Catching schema-operation mismatches early
- Preventing deeply nested queries
- Auditing existing operations for compliance