Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(toolkit): option to strip color and style #33244

Merged
merged 6 commits into from
Jan 31, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions packages/@aws-cdk/toolkit/lib/api/io/private/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ import type { ToolkitAction } from '../../../toolkit';
import { formatSdkLoggerContent } from '../../aws-cdk';
import type { IIoHost } from '../io-host';

/**
* An IoHost wrapper that adds the given action to an actionless message before
* sending the message to the given IoHost
*/
export function withAction(ioHost: IIoHost, action: ToolkitAction) {
return {
notify: async <T>(msg: Omit<IoMessage<T>, 'action'>) => {
Expand All @@ -24,6 +28,31 @@ export function withAction(ioHost: IIoHost, action: ToolkitAction) {
};
}

/**
* An IoHost wrapper that strips out ANSI colors and styles from the message before
* sending the message to the given IoHost
*/
export function withoutColor(ioHost: IIoHost): IIoHost {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure about how we feel about this but it currently replaces style as well, i.e. chalk.bold

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah that's fine

return {
notify: async <T>(msg: IoMessage<T>) => {
await ioHost.notify({
...msg,
message: stripColor(msg.message),
});
},
requestResponse: async <T, U>(msg: IoRequest<T, U>) => {
return ioHost.requestResponse({
...msg,
message: stripColor(msg.message),
});
},
};
}

function stripColor(msg: string): string {
return msg.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, '');
}

/**
* An IoHost wrapper that strips out emojis from the message before
* sending the message to the given IoHost
Expand Down
15 changes: 14 additions & 1 deletion packages/@aws-cdk/toolkit/lib/toolkit/toolkit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { CachedCloudAssemblySource, IdentityCloudAssemblySource, StackAssembly,
import { ALL_STACKS, CloudAssemblySourceBuilder } from '../api/cloud-assembly/private';
import { ToolkitError } from '../api/errors';
import { IIoHost, IoMessageCode, IoMessageLevel } from '../api/io';
import { asSdkLogger, withAction, Timer, confirm, error, highlight, info, success, warn, ActionAwareIoHost, debug, result, withoutEmojis } from '../api/io/private';
import { asSdkLogger, withAction, Timer, confirm, error, highlight, info, success, warn, ActionAwareIoHost, debug, result, withoutEmojis, withoutColor } from '../api/io/private';

/**
* The current action being performed by the CLI. 'none' represents the absence of an action.
Expand Down Expand Up @@ -54,6 +54,16 @@ export interface ToolkitOptions {
*/
emojis?: boolean;

/**
* Whether to allow ANSI colors and formatting in IoHost messages.
* Setting this value to `falsez enforces that no color or style shows up
* in messages sent to the IoHost.
* Setting this value to true is a no-op; it is equivalent to the default.
*
* @default - detects color from the TTY status of the IoHost
*/
color?: boolean;

/**
* Configuration options for the SDK.
*/
Expand Down Expand Up @@ -102,6 +112,9 @@ export class Toolkit extends CloudAssemblySourceBuilder implements AsyncDisposab
if (props.emojis === false) {
ioHost = withoutEmojis(ioHost);
}
if (props.color === false) {
ioHost = withoutColor(ioHost);
}
this.ioHost = ioHost;
}

Expand Down
21 changes: 21 additions & 0 deletions packages/@aws-cdk/toolkit/test/toolkit/toolkit.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* - Source Builders: Tests for the Cloud Assembly Source Builders are in `test/api/cloud-assembly/source-builder.test.ts`
*/

import * as chalk from 'chalk';
import { Toolkit } from '../../lib';
import { TestIoHost } from '../_helpers';

Expand All @@ -27,3 +28,23 @@ test('emojis can be stripped from message', async () => {
message: 'Smile123',
}));
});

test('color can be stripped from message', async () => {
const ioHost = new TestIoHost();
const toolkit = new Toolkit({ ioHost, color: false });

await toolkit.ioHost.notify({
message: chalk.red('RED') + chalk.bold('BOLD') + chalk.blue('BLUE'),
action: 'deploy',
level: 'info',
code: 'CDK_TOOLKIT_I0000',
time: new Date(),
});

expect(ioHost.notifySpy).toHaveBeenCalledWith(expect.objectContaining({
action: 'deploy',
level: 'info',
code: 'CDK_TOOLKIT_I0000',
message: 'REDBOLDBLUE',
}));
});