Skip to content

Commit 73184ac

Browse files
authored
fix(cli): "cdk flags" message writes to stderr unconditionally (#790)
This ignores our rules for avoiding writing to `stderr` in CI environments. Use the IoHost instead. Also update the message to include the use of the unstable flag. --- By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license
1 parent df83ecf commit 73184ac

File tree

2 files changed

+14
-12
lines changed

2 files changed

+14
-12
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,7 +1065,7 @@ export class CdkToolkit {
10651065
await printSerializedObject(this.ioHost.asIoHelper(), obscureTemplate(stacks.firstStack.template), json ?? false);
10661066
}
10671067

1068-
await displayFlagsMessage(this.toolkit, this.props.cloudExecutable);
1068+
await displayFlagsMessage(this.ioHost.asIoHelper(), this.toolkit, this.props.cloudExecutable);
10691069
return undefined;
10701070
}
10711071

@@ -1075,7 +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);
1078+
await displayFlagsMessage(this.ioHost.asIoHelper(), this.toolkit, this.props.cloudExecutable);
10791079
return undefined;
10801080
}
10811081

@@ -2112,13 +2112,14 @@ async function askUserConfirmation(
21122112
}
21132113
});
21142114
}
2115-
export async function displayFlagsMessage(toolkit: InternalToolkit, cloudExecutable: CloudExecutable): Promise<void> {
2115+
2116+
export async function displayFlagsMessage(ioHost: IoHelper, toolkit: InternalToolkit, cloudExecutable: CloudExecutable): Promise<void> {
21162117
let numUnconfigured = (await toolkit.flags(cloudExecutable))
21172118
.filter(flag => !OBSOLETE_FLAGS.includes(flag.name))
21182119
.filter(flag => flag.userValue === undefined).length;
21192120

21202121
if (numUnconfigured > 0) {
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.`);
2122+
await ioHost.defaults.warn(`${numUnconfigured} feature flags are not configured. Run 'cdk --unstable=flags flags' to learn more.`);
21222123
}
21232124
}
21242125

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
import { Toolkit } from '@aws-cdk/toolkit-lib';
22
import { displayFlagsMessage } from '../../lib/cli/cdk-toolkit';
3+
import { TestIoHost } from '../_helpers/io-host';
34

45
describe('displayFlagsMessage', () => {
56
let mockToolkit: jest.Mocked<Toolkit>;
67
let mockCloudExecutable: any;
7-
let stderrWriteSpy: jest.SpyInstance;
8+
let ioHost: TestIoHost;
89

910
beforeEach(() => {
1011
mockCloudExecutable = {};
12+
ioHost = new TestIoHost();
1113

1214
mockToolkit = {
1315
flags: jest.fn(),
1416
} as any;
1517

1618
jest.spyOn(Toolkit.prototype, 'flags').mockImplementation(mockToolkit.flags);
17-
stderrWriteSpy = jest.spyOn(process.stderr, 'write').mockImplementation(() => true);
1819
});
1920

2021
afterEach(() => {
@@ -48,12 +49,12 @@ describe('displayFlagsMessage', () => {
4849

4950
mockToolkit.flags.mockResolvedValue(mockFlagsData);
5051

51-
await displayFlagsMessage(mockToolkit as any, mockCloudExecutable);
52+
await displayFlagsMessage(ioHost.asHelper(), mockToolkit as any, mockCloudExecutable);
5253

5354
expect(mockToolkit.flags).toHaveBeenCalledWith(mockCloudExecutable);
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.',
56-
);
55+
expect(ioHost.notifySpy).toHaveBeenCalledWith(expect.objectContaining({
56+
message: expect.stringContaining('1 feature flags are not configured'),
57+
}));
5758
});
5859
test('does not display a message when user has no unconfigured flags', async () => {
5960
const mockFlagsData = [
@@ -67,10 +68,10 @@ describe('displayFlagsMessage', () => {
6768
];
6869
mockToolkit.flags.mockResolvedValue(mockFlagsData);
6970

70-
await displayFlagsMessage(mockToolkit as any, mockCloudExecutable);
71+
await displayFlagsMessage(ioHost.asHelper(), mockToolkit as any, mockCloudExecutable);
7172

7273
expect(mockToolkit.flags).toHaveBeenCalledWith(mockCloudExecutable);
73-
expect(stderrWriteSpy).not.toHaveBeenCalled();
74+
expect(ioHost.notifySpy).not.toHaveBeenCalled();
7475
});
7576
});
7677

0 commit comments

Comments
 (0)