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([]);
});
});