diff --git a/e2e/nx-plugin-e2e/tests/executor-cli.e2e.test.ts b/e2e/nx-plugin-e2e/tests/executor-cli.e2e.test.ts index 8d35466c7..b218b711f 100644 --- a/e2e/nx-plugin-e2e/tests/executor-cli.e2e.test.ts +++ b/e2e/nx-plugin-e2e/tests/executor-cli.e2e.test.ts @@ -116,6 +116,31 @@ describe('executor command', () => { ).rejects.toThrow(''); }); + it('should execute print-config executor with output', async () => { + const cwd = path.join(testFileDir, 'execute-print-config-command'); + await addTargetToWorkspace(tree, { cwd, project }); + + const { stdout, code } = await executeProcess({ + command: 'npx', + args: [ + 'nx', + 'run', + `${project}:code-pushup`, + 'print-config', + '--output=code-pushup.config.json', + ], + cwd, + }); + + expect(code).toBe(0); + const cleanStdout = removeColorCodes(stdout); + expect(cleanStdout).toContain('nx run my-lib:code-pushup print-config'); + + await expect( + readJsonFile(path.join(cwd, 'code-pushup.config.json')), + ).resolves.not.toThrow(); + }); + it('should execute print-config executor with api key', async () => { const cwd = path.join(testFileDir, 'execute-print-config-command'); await addTargetToWorkspace(tree, { cwd, project }); diff --git a/packages/nx-plugin/src/executors/cli/executor.unit.test.ts b/packages/nx-plugin/src/executors/cli/executor.unit.test.ts index b0f943660..daab1594c 100644 --- a/packages/nx-plugin/src/executors/cli/executor.unit.test.ts +++ b/packages/nx-plugin/src/executors/cli/executor.unit.test.ts @@ -80,11 +80,12 @@ describe('runAutorunExecutor', () => { it('should process executorOptions', async () => { const output = await runAutorunExecutor( - { persist: { filename: 'REPORT' } }, + { output: 'code-pushup.config.json', persist: { filename: 'REPORT' } }, executorContext('testing-utils'), ); expect(output.success).toBe(true); - expect(output.command).toMatch('--persist.filename="REPORT"'); + expect(output.command).toContain('--output="code-pushup.config.json"'); + expect(output.command).toContain('--persist.filename="REPORT"'); }); it('should create command from context and options if no api key is set', async () => { diff --git a/packages/nx-plugin/src/executors/cli/schema.json b/packages/nx-plugin/src/executors/cli/schema.json index e494c4cc0..85cd0de19 100644 --- a/packages/nx-plugin/src/executors/cli/schema.json +++ b/packages/nx-plugin/src/executors/cli/schema.json @@ -44,6 +44,10 @@ "type": "string", "description": "Prefix for project name" }, + "output": { + "type": "string", + "description": "Config output path of print-config command" + }, "persist": { "type": "object", "properties": { diff --git a/packages/nx-plugin/src/executors/cli/schema.ts b/packages/nx-plugin/src/executors/cli/schema.ts index d73a394b6..7477a276e 100644 --- a/packages/nx-plugin/src/executors/cli/schema.ts +++ b/packages/nx-plugin/src/executors/cli/schema.ts @@ -6,6 +6,8 @@ import type { ProjectExecutorOnlyOptions, } from '../internal/types.js'; +export type PrintConfigOptions = { output?: string }; +export type PrintConfigCommandExecutorOptions = PrintConfigOptions; export type AutorunCommandExecutorOnlyOptions = ProjectExecutorOnlyOptions & CollectExecutorOnlyOptions & GeneralExecutorOnlyOptions; @@ -16,4 +18,5 @@ export type AutorunCommandExecutorOptions = Partial< persist: Partial; } & AutorunCommandExecutorOnlyOptions & GlobalExecutorOptions ->; +> & + PrintConfigOptions; diff --git a/packages/nx-plugin/src/executors/cli/utils.ts b/packages/nx-plugin/src/executors/cli/utils.ts index afcca4542..5530e00c0 100644 --- a/packages/nx-plugin/src/executors/cli/utils.ts +++ b/packages/nx-plugin/src/executors/cli/utils.ts @@ -7,6 +7,7 @@ import type { NormalizedExecutorContext } from '../internal/context.js'; import type { AutorunCommandExecutorOnlyOptions, AutorunCommandExecutorOptions, + PrintConfigCommandExecutorOptions, } from './schema.js'; export function parseAutorunExecutorOnlyOptions( @@ -20,6 +21,15 @@ export function parseAutorunExecutorOnlyOptions( }; } +export function parsePrintConfigExecutorOptions( + options: Partial, +): PrintConfigCommandExecutorOptions { + const { output } = options; + return { + ...(output && { output }), + }; +} + export function parseAutorunExecutorOptions( options: Partial, normalizedContext: NormalizedExecutorContext, @@ -33,6 +43,7 @@ export function parseAutorunExecutorOptions( ); const hasApiToken = uploadCfg?.apiKey != null; return { + ...parsePrintConfigExecutorOptions(options), ...parseAutorunExecutorOnlyOptions(options), ...globalConfig(options, normalizedContext), persist: persistConfig({ projectPrefix, ...persist }, normalizedContext), diff --git a/packages/nx-plugin/src/executors/cli/utils.unit.test.ts b/packages/nx-plugin/src/executors/cli/utils.unit.test.ts index 7a4141eff..025c322fb 100644 --- a/packages/nx-plugin/src/executors/cli/utils.unit.test.ts +++ b/packages/nx-plugin/src/executors/cli/utils.unit.test.ts @@ -5,8 +5,25 @@ import { mergeExecutorOptions, parseAutorunExecutorOnlyOptions, parseAutorunExecutorOptions, + parsePrintConfigExecutorOptions, } from './utils.js'; +describe('parsePrintConfigExecutorOptions', () => { + it('should provide NO default output path', () => { + expect(parsePrintConfigExecutorOptions({})).toStrictEqual( + expect.not.objectContaining({ output: expect.anything() }), + ); + }); + + it('should process given output path', () => { + expect( + parsePrintConfigExecutorOptions({ output: 'code-pushup.config.json' }), + ).toStrictEqual( + expect.objectContaining({ output: 'code-pushup.config.json' }), + ); + }); +}); + describe('parseAutorunExecutorOnlyOptions', () => { it('should provide NO default projectPrefix', () => { expect(parseAutorunExecutorOnlyOptions({})).toStrictEqual(