From 5c6279f2e5f5e9a35f7bedf44b401eb394cf6eca Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Sun, 15 Feb 2026 04:40:23 +0000 Subject: [PATCH] fix(codegen): use deepmerge for CLI config merging Replace manual spread operators with deepmerge (via mergeConfig) for merging file config with CLI options. This ensures nested objects like db.pgpm are properly deep-merged rather than overwritten. Also restores filterDefined in buildDbConfig to prevent undefined CLI values from interfering with file config during merge. --- graphql/codegen/src/cli/index.ts | 9 ++++----- graphql/codegen/src/cli/shared.ts | 9 ++++++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/graphql/codegen/src/cli/index.ts b/graphql/codegen/src/cli/index.ts index 8ab33c45a..1a36a11e9 100644 --- a/graphql/codegen/src/cli/index.ts +++ b/graphql/codegen/src/cli/index.ts @@ -9,7 +9,7 @@ import { CLI, CLIOptions, getPackageJson, Inquirerer } from 'inquirerer'; import { findConfigFile, loadConfigFile } from '../core/config'; import { generate } from '../core/generate'; -import type { GraphQLSDKConfigTarget } from '../types/config'; +import { mergeConfig, type GraphQLSDKConfigTarget } from '../types/config'; import { buildDbConfig, buildGenerateOptions, @@ -114,10 +114,9 @@ export const commands = async ( let hasError = false; for (const name of names) { console.log(`\n[${name}]`); - const result = await generate({ - ...targets[name], - ...cliOptions, - } as GraphQLSDKConfigTarget); + const result = await generate( + mergeConfig(targets[name], cliOptions as GraphQLSDKConfigTarget), + ); printResult(result); if (!result.success) hasError = true; } diff --git a/graphql/codegen/src/cli/shared.ts b/graphql/codegen/src/cli/shared.ts index 9b08cb8f5..b7c7e0875 100644 --- a/graphql/codegen/src/cli/shared.ts +++ b/graphql/codegen/src/cli/shared.ts @@ -9,7 +9,7 @@ import { inflektTree } from 'inflekt/transform-keys'; import type { Question } from 'inquirerer'; import type { GenerateResult } from '../core/generate'; -import type { GraphQLSDKConfigTarget } from '../types/config'; +import { mergeConfig, type GraphQLSDKConfigTarget } from '../types/config'; export const splitCommas = ( input: string | undefined, @@ -202,7 +202,10 @@ export function buildDbConfig( ): Record { const { schemas, apiNames, ...rest } = options; if (schemas || apiNames) { - return { ...rest, db: { schemas, apiNames } }; + return { + ...rest, + db: filterDefined({ schemas, apiNames } as Record), + }; } return rest; } @@ -259,5 +262,5 @@ export function buildGenerateOptions( const camelized = camelizeArgv(answers); const normalized = normalizeCodegenListOptions(camelized); const withDb = buildDbConfig(normalized); - return { ...fileConfig, ...withDb } as GraphQLSDKConfigTarget; + return mergeConfig(fileConfig, withDb as GraphQLSDKConfigTarget); }