Skip to content

Commit

Permalink
chore(toolkit): option to strip color and style (#33244)
Browse files Browse the repository at this point in the history
Closes [#33237](#33237) along with #33243.

```ts
new Toolkit({ ioHost, color: false });
```

Can strip color and style by specifying the property when creating the `Toolkit`.

### Checklist
- [x] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md)

----

*By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
  • Loading branch information
kaizencc authored Jan 31, 2025
1 parent ba2f5c8 commit c346e82
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 1 deletion.
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 {
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',
}));
});

0 comments on commit c346e82

Please sign in to comment.