I_Want_To_Find_Unused_Fields_In_My_Graphql_Schema

ChatGPT に聞いてみた

提案された実装

// graphql.test.js

const { getIntrospectionQuery, buildClientSchema, printSchema } = require('graphql');
const { readFile } = require('fs');
const { promisify } = require('util');

const readFileAsync = promisify(readFile);

describe('GraphQL Schema Validation', () => {
  let schema;

  beforeAll(async () => {
    // スキーマの読み込み
    const schemaFilePath = 'path/to/schema.graphql'; // スキーマファイルのパス
    const schemaFile = await readFileAsync(schemaFilePath, 'utf8');
    schema = buildClientSchema(JSON.parse(schemaFile));
  });

  it('should validate all GraphQL queries', async () => {
    // プロジェクト内のすべてのGraphQLクエリを読み込む
    const queriesFolderPath = 'path/to/queries'; // クエリファイルの格納フォルダのパス
    const queryFiles = await readFileAsync(queriesFolderPath, 'utf8');

    const queries = [];
    for (const file of queryFiles) {
      const queryFile = await readFileAsync(`${queriesFolderPath}/${file}`, 'utf8');
      queries.push(queryFile);
    }

    // スキーマと照合し、未使用のクエリやフィールドを特定する
    const unusedQueries = [];
    const { errors } = schema.validate(queries, undefined, getIntrospectionQuery());
    for (const error of errors) {
      if (error.message.includes('Cannot query field')) {
        unusedQueries.push(error.message);
      }
    }

    // テストの結果を評価する
    expect(unusedQueries).toEqual([]);
  });
});