Skip to content

Commit df83ecf

Browse files
authored
fix: cdk flags hint is shown before template payload (#785)
When a user runs `cdk synth`, they receive a message about their unconfigured feature flags. This relocates the message to be displayed after the CloudFormation templates, to make it more visible. --- By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license
1 parent 8e53a08 commit df83ecf

File tree

2 files changed

+12
-19
lines changed

2 files changed

+12
-19
lines changed

packages/aws-cdk/lib/cli/cdk-toolkit.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,13 +1059,13 @@ export class CdkToolkit {
10591059
): Promise<any> {
10601060
const stacks = await this.selectStacksForDiff(stackNames, exclusively, autoValidate);
10611061

1062-
await displayFlagsMessage(this.toolkit, this.props.cloudExecutable, this.ioHost.asIoHelper());
1063-
10641062
// if we have a single stack, print it to STDOUT
10651063
if (stacks.stackCount === 1) {
10661064
if (!quiet) {
10671065
await printSerializedObject(this.ioHost.asIoHelper(), obscureTemplate(stacks.firstStack.template), json ?? false);
10681066
}
1067+
1068+
await displayFlagsMessage(this.toolkit, this.props.cloudExecutable);
10691069
return undefined;
10701070
}
10711071

@@ -1075,6 +1075,7 @@ export class CdkToolkit {
10751075
`Supply a stack id (${stacks.stackArtifacts.map((s) => chalk.green(s.hierarchicalId)).join(', ')}) to display its template.`,
10761076
);
10771077

1078+
await displayFlagsMessage(this.toolkit, this.props.cloudExecutable);
10781079
return undefined;
10791080
}
10801081

@@ -2111,14 +2112,13 @@ async function askUserConfirmation(
21112112
}
21122113
});
21132114
}
2114-
export async function displayFlagsMessage(toolkit: InternalToolkit, cloudExecutable: CloudExecutable,
2115-
ioHelper: IoHelper): Promise<void> {
2115+
export async function displayFlagsMessage(toolkit: InternalToolkit, cloudExecutable: CloudExecutable): Promise<void> {
21162116
let numUnconfigured = (await toolkit.flags(cloudExecutable))
21172117
.filter(flag => !OBSOLETE_FLAGS.includes(flag.name))
21182118
.filter(flag => flag.userValue === undefined).length;
21192119

21202120
if (numUnconfigured > 0) {
2121-
await ioHelper.defaults.info(`You currently have ${numUnconfigured} unconfigured feature flags that may require attention to keep your application up-to-date. Run 'cdk flags' to learn more.`);
2121+
process.stderr.write(`You currently have ${numUnconfigured} unconfigured feature flag(s) that may require attention to keep your application up-to-date. Run 'cdk flags' to learn more.`);
21222122
}
21232123
}
21242124

packages/aws-cdk/test/cli/display-flags-message.test.ts

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
11
import { Toolkit } from '@aws-cdk/toolkit-lib';
2-
import { asIoHelper } from '../../lib/api-private';
32
import { displayFlagsMessage } from '../../lib/cli/cdk-toolkit';
4-
import { TestIoHost } from '../_helpers/io-host';
53

64
describe('displayFlagsMessage', () => {
7-
let ioHost: TestIoHost;
8-
let ioHelper: any;
95
let mockToolkit: jest.Mocked<Toolkit>;
106
let mockCloudExecutable: any;
7+
let stderrWriteSpy: jest.SpyInstance;
118

129
beforeEach(() => {
13-
ioHost = new TestIoHost();
14-
ioHelper = asIoHelper(ioHost, 'synth');
1510
mockCloudExecutable = {};
1611

1712
mockToolkit = {
1813
flags: jest.fn(),
1914
} as any;
2015

2116
jest.spyOn(Toolkit.prototype, 'flags').mockImplementation(mockToolkit.flags);
17+
stderrWriteSpy = jest.spyOn(process.stderr, 'write').mockImplementation(() => true);
2218
});
2319

2420
afterEach(() => {
@@ -52,14 +48,11 @@ describe('displayFlagsMessage', () => {
5248

5349
mockToolkit.flags.mockResolvedValue(mockFlagsData);
5450

55-
await displayFlagsMessage(mockToolkit as any, mockCloudExecutable, ioHelper);
51+
await displayFlagsMessage(mockToolkit as any, mockCloudExecutable);
5652

5753
expect(mockToolkit.flags).toHaveBeenCalledWith(mockCloudExecutable);
58-
expect(ioHost.notifySpy).toHaveBeenCalledWith(
59-
expect.objectContaining({
60-
message: 'You currently have 1 unconfigured feature flags that may require attention to keep your application up-to-date. Run \'cdk flags\' to learn more.',
61-
level: 'info',
62-
}),
54+
expect(stderrWriteSpy).toHaveBeenCalledWith(
55+
'You currently have 1 unconfigured feature flag(s) that may require attention to keep your application up-to-date. Run \'cdk flags\' to learn more.',
6356
);
6457
});
6558
test('does not display a message when user has no unconfigured flags', async () => {
@@ -74,10 +67,10 @@ describe('displayFlagsMessage', () => {
7467
];
7568
mockToolkit.flags.mockResolvedValue(mockFlagsData);
7669

77-
await displayFlagsMessage(mockToolkit as any, mockCloudExecutable, ioHelper);
70+
await displayFlagsMessage(mockToolkit as any, mockCloudExecutable);
7871

7972
expect(mockToolkit.flags).toHaveBeenCalledWith(mockCloudExecutable);
80-
expect(ioHost.notifySpy).not.toHaveBeenCalled();
73+
expect(stderrWriteSpy).not.toHaveBeenCalled();
8174
});
8275
});
8376

0 commit comments

Comments
 (0)