diff --git a/.changeset/rude-vans-notice.md b/.changeset/rude-vans-notice.md new file mode 100644 index 00000000000..739065780a8 --- /dev/null +++ b/.changeset/rude-vans-notice.md @@ -0,0 +1,5 @@ +--- +"@graphql-codegen/cli": minor +--- + +feat(cli): add a dry-run mode with `--check` cli flag diff --git a/packages/graphql-codegen-cli/src/bin.ts b/packages/graphql-codegen-cli/src/bin.ts index 381d2251b21..dfa14f55603 100644 --- a/packages/graphql-codegen-cli/src/bin.ts +++ b/packages/graphql-codegen-cli/src/bin.ts @@ -5,8 +5,8 @@ import { cliError } from './utils/cli-error.js'; const [, , cmd] = process.argv; runCli(cmd) - .then(() => { - process.exit(0); + .then(returnCode => { + process.exit(returnCode); }) .catch(error => { cliError(error); diff --git a/packages/graphql-codegen-cli/src/cli.ts b/packages/graphql-codegen-cli/src/cli.ts index 7daf92d835b..8dd67671367 100644 --- a/packages/graphql-codegen-cli/src/cli.ts +++ b/packages/graphql-codegen-cli/src/cli.ts @@ -4,18 +4,28 @@ import { createContext } from './config.js'; import { lifecycleHooks } from './hooks.js'; import { DetailedError } from '@graphql-codegen/plugin-helpers'; -export async function runCli(cmd: string): Promise { +export async function runCli(cmd: string): Promise { await ensureGraphQlPackage(); if (cmd === 'init') { - return init(); + init(); + return 0; } const context = await createContext(); try { - return await generate(context); + await generate(context); + if (context.checkMode && context.checkModeStaleFiles.length > 0) { + // eslint-disable-next-line no-console + console.log( + `The following stale files were detected:\n${context.checkModeStaleFiles.map(file => ` - ${file}\n`)}` + ); + return 1; + } + return 0; } catch (error) { await lifecycleHooks(context.getConfig().hooks).onError(error.toString()); + return 1; } } diff --git a/packages/graphql-codegen-cli/src/config.ts b/packages/graphql-codegen-cli/src/config.ts index 346cf67ce67..614bc263209 100644 --- a/packages/graphql-codegen-cli/src/config.ts +++ b/packages/graphql-codegen-cli/src/config.ts @@ -30,6 +30,7 @@ export type YamlCliFlags = { silent: boolean; errorsOnly: boolean; profile: boolean; + check?: boolean; verbose?: boolean; debug?: boolean; ignoreNoDocuments?: boolean; @@ -323,6 +324,10 @@ export function updateContextWithCliFlags(context: CodegenContext, cliFlags: Yam context.useProfiler(); } + if (cliFlags.check === true) { + context.enableCheckMode(); + } + context.updateConfig(config); } @@ -331,12 +336,14 @@ export class CodegenContext { private _graphqlConfig?: GraphQLConfig; private config: Types.Config; private _project?: string; + private _checkMode = false; private _pluginContext: { [key: string]: any } = {}; cwd: string; filepath: string; profiler: Profiler; profilerOutput?: string; + checkModeStaleFiles = []; constructor({ config, @@ -387,6 +394,14 @@ export class CodegenContext { }; } + enableCheckMode() { + this._checkMode = true; + } + + get checkMode() { + return this._checkMode; + } + useProfiler() { this.profiler = createProfiler(); diff --git a/packages/graphql-codegen-cli/src/generate-and-save.ts b/packages/graphql-codegen-cli/src/generate-and-save.ts index f06abbe2f2b..dc1c6070c91 100644 --- a/packages/graphql-codegen-cli/src/generate-and-save.ts +++ b/packages/graphql-codegen-cli/src/generate-and-save.ts @@ -73,8 +73,10 @@ export async function generate( if (previousHash && currentHash === previousHash) { debugLog(`Skipping file (${result.filename}) writing due to indentical hash...`); - return; + } else if (context.checkMode) { + context.checkModeStaleFiles.push(result.filename); + return; // skip updating file in dry mode } if (content.length === 0) { diff --git a/website/src/pages/docs/config-reference/codegen-config.mdx b/website/src/pages/docs/config-reference/codegen-config.mdx index b1c9076b626..1b1b43b5c4c 100644 --- a/website/src/pages/docs/config-reference/codegen-config.mdx +++ b/website/src/pages/docs/config-reference/codegen-config.mdx @@ -143,6 +143,21 @@ The Codegen also supports several CLI flags that allow you to override the defau - **`--project` (`-p`)** - To generate only one project out of a [Multi Project](multiproject-config) config file. +- **`--check`** - Enable dry-run mode (see below) + +## Dry-run mode + +Codegen can be run in dry-run mode to check if some new changes are detected: + +```bash +yarn run codegen --check +``` + +When enabled, codegen will return the following exit code: + +- `0`: no changes were detected +- `1`: some changes are missing in existing files + ## Debug Mode To enable debug mode, either set the `debug: true` configuration option or use the CLI `--debug` flag.