Skip to content

Commit e804925

Browse files
fix(cli): honor per-output preset import config (#10618)
* fix(cli): honor per-output preset import config * chore: add changeset for cli preset config fix * fix(cli): preserve root preset import settings --------- Co-authored-by: Eddy Nguyen <ch@eddeee888.me>
1 parent fbd8360 commit e804925

File tree

3 files changed

+67
-7
lines changed

3 files changed

+67
-7
lines changed

.changeset/thin-bobcats-invite.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@graphql-codegen/cli': patch
3+
---
4+
5+
Honor per-output preset `importExtension` and `emitLegacyCommonJSImports` config instead of always using the root config values.

packages/graphql-codegen-cli/src/codegen.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -349,18 +349,24 @@ export async function executeCodegen(
349349
})
350350
);
351351

352-
const importExtension = normalizeImportExtension({
352+
const rawMergedConfig = {
353+
...rootConfig,
353354
emitLegacyCommonJSImports: config.emitLegacyCommonJSImports,
354355
importExtension: config.importExtension,
355-
});
356-
357-
const mergedConfig = {
358-
...rootConfig,
359356
...(typeof outputFileTemplateConfig === 'string'
360357
? { value: outputFileTemplateConfig }
361358
: outputFileTemplateConfig),
359+
};
360+
361+
const importExtension = normalizeImportExtension({
362+
emitLegacyCommonJSImports: rawMergedConfig.emitLegacyCommonJSImports,
363+
importExtension: rawMergedConfig.importExtension,
364+
});
365+
366+
const mergedConfig = {
367+
...rawMergedConfig,
362368
importExtension,
363-
emitLegacyCommonJSImports: config.emitLegacyCommonJSImports ?? true,
369+
emitLegacyCommonJSImports: rawMergedConfig.emitLegacyCommonJSImports ?? true,
364370
};
365371

366372
const documentTransforms = Array.isArray(outputConfig.documentTransforms)
@@ -412,7 +418,7 @@ export async function executeCodegen(
412418
const output = await codegen({
413419
...outputArgs,
414420
importExtension,
415-
emitLegacyCommonJSImports: config.emitLegacyCommonJSImports ?? true,
421+
emitLegacyCommonJSImports: rawMergedConfig.emitLegacyCommonJSImports ?? true,
416422
cache,
417423
});
418424
result.push({

packages/graphql-codegen-cli/tests/codegen.spec.ts

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,55 @@ describe('Codegen Executor', () => {
259259
expect(result[0].content).toContain('export type QQuery');
260260
});
261261

262+
it('Should inherit root importExtension and emitLegacyCommonJSImports for preset outputs and allow per-output overrides', async () => {
263+
const recordingPreset = {
264+
buildGeneratesSection: ({ baseOutputDir, config }) => [
265+
{
266+
filename: `${baseOutputDir}recorded-config.ts`,
267+
pluginMap: {
268+
recorder: {
269+
plugin: (_schema, _documents, pluginConfig) =>
270+
JSON.stringify({
271+
importExtension: pluginConfig.importExtension,
272+
emitLegacyCommonJSImports: pluginConfig.emitLegacyCommonJSImports,
273+
}),
274+
},
275+
},
276+
plugins: [{ recorder: {} }],
277+
schema: parse(SIMPLE_TEST_SCHEMA),
278+
documents: [],
279+
config,
280+
},
281+
],
282+
};
283+
284+
const { result } = await executeCodegen({
285+
schema: SIMPLE_TEST_SCHEMA,
286+
documents: `query root { f }`,
287+
emitLegacyCommonJSImports: false,
288+
importExtension: '.mjs',
289+
generates: {
290+
'./src/gql/': {
291+
preset: recordingPreset,
292+
},
293+
'./src/gql-with-override/': {
294+
preset: recordingPreset,
295+
config: {
296+
importExtension: '.js',
297+
},
298+
},
299+
},
300+
});
301+
302+
expect(result).toHaveLength(2);
303+
304+
const inheritedOutput = result.find(file => file.filename === './src/gql/recorded-config.ts');
305+
expect(inheritedOutput?.content).toBe(`{"importExtension":".mjs","emitLegacyCommonJSImports":false}`);
306+
307+
const overriddenOutput = result.find(file => file.filename === './src/gql-with-override/recorded-config.ts');
308+
expect(overriddenOutput?.content).toBe(`{"importExtension":".js","emitLegacyCommonJSImports":false}`);
309+
});
310+
262311
it('Should return error on duplicated names', async () => {
263312
const { error } = await executeCodegen({
264313
schema: `

0 commit comments

Comments
 (0)