Skip to content

Commit 78bcd09

Browse files
authored
chore(toolkit): register valid message codes (#33160)
Begins a registry of valid codes that are currently in use within the toolkit, and requires that only registered codes are used. ### 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*
1 parent 0c53765 commit 78bcd09

File tree

4 files changed

+63
-17
lines changed

4 files changed

+63
-17
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { IoMessageCode } from '../io-message';
2+
3+
export const CODES = {
4+
// Default codes -- all 0000 codes
5+
CDK_TOOLKIT_I0000: 'Default toolkit info code',
6+
CDK_TOOLKIT_E0000: 'Default toolkit error code',
7+
CDK_TOOLKIT_W0000: 'Default toolkit warning code',
8+
CDK_SDK_I0000: 'Default sdk info code',
9+
CDK_SDK_E0000: 'Default sdk error code',
10+
CDK_SDK_WOOOO: 'Default sdk warning code',
11+
CDK_ASSETS_I0000: 'Default assets info code',
12+
CDK_ASSETS_E0000: 'Default assets error code',
13+
CDK_ASSETS_W0000: 'Default assets warning code',
14+
CDK_ASSEMBLY_I0000: 'Default assembly info code',
15+
CDK_ASSEMBLY_E0000: 'Default assembly error code',
16+
CDK_ASSEMBLY_W0000: 'Default assembly warning code',
17+
18+
// Toolkit Info codes
19+
CDK_TOOLKIT_I0001: 'Display stack data',
20+
CDK_TOOLKIT_I0002: 'Successfully deployed stacks',
21+
CDK_TOOLKIT_I5001: 'Display synthesis times',
22+
CDK_TOOLKIT_I5050: 'Confirm rollback',
23+
CDK_TOOLKIT_I5060: 'Confirm deploy security sensitive changes',
24+
CDK_TOOLKIT_I7010: 'Confirm destroy stacks',
25+
26+
// Toolkit Warning codes
27+
28+
// Toolkit Error codes
29+
30+
// Assembly Info codes
31+
CDK_ASSEMBLY_I0042: 'Writing updated context',
32+
CDK_ASSEMBLY_I0241: 'Fetching missing context',
33+
34+
// Assembly Warning codes
35+
36+
// Assembly Error codes
37+
CDK_ASSEMBLY_E1111: 'Incompatible CDK CLI version. Upgrade needed.',
38+
};
39+
40+
// If we give CODES a type with key: IoMessageCode,
41+
// this dynamically generated type will generalize to allow all IoMessageCodes.
42+
// Instead, we will validate that VALID_CODE must be IoMessageCode with the '&'.
43+
export type VALID_CODE = keyof typeof CODES & IoMessageCode;

packages/@aws-cdk/toolkit/lib/api/io/private/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ export * from './logger';
22
export * from './messages';
33
export * from './timer';
44
export * from './types';
5+
export * from './codes';

packages/@aws-cdk/toolkit/lib/api/io/private/logger.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as util from 'node:util';
22
import type { Logger } from '@smithy/types';
33
import type { IoMessage, IoMessageCodeCategory, IoMessageLevel, IoRequest } from '../io-message';
4-
import { debug, error, info, messageCode, trace, warn } from './messages';
4+
import { debug, error, info, defaultMessageCode, trace, warn } from './messages';
55
import type { ActionAwareIoHost } from './types';
66
import type { ToolkitAction } from '../../../toolkit';
77
import { formatSdkLoggerContent } from '../../aws-cdk';
@@ -118,7 +118,7 @@ export function asSdkLogger(ioHost: IIoHost, action: ToolkitAction): Logger {
118118
* Turn an ActionAwareIoHost into a logger that is compatible with older code, but doesn't support data
119119
*/
120120
export function asLogger(ioHost: ActionAwareIoHost, category?: IoMessageCodeCategory) {
121-
const code = (level: IoMessageLevel) => messageCode(level, category);
121+
const code = (level: IoMessageLevel) => defaultMessageCode(level, category);
122122

123123
return {
124124
trace: async (msg: string, ...args: any[]) => {

packages/@aws-cdk/toolkit/lib/api/io/private/messages.ts

+17-15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as chalk from 'chalk';
2-
import type { IoMessageCode, IoMessageCodeCategory, IoMessageLevel } from '../io-message';
2+
import type { IoMessageCodeCategory, IoMessageLevel } from '../io-message';
3+
import { type VALID_CODE } from './codes';
34
import type { ActionLessMessage, ActionLessRequest, Optional, SimplifiedMessage } from './types';
45

56
/**
@@ -11,27 +12,28 @@ export function formatMessage<T>(msg: Optional<SimplifiedMessage<T>, 'code'>, ca
1112
return {
1213
time: new Date(),
1314
level: msg.level,
14-
code: msg.code ?? messageCode(msg.level, category),
15+
code: msg.code ?? defaultMessageCode(msg.level, category),
1516
message: msg.message,
1617
data: msg.data,
1718
};
1819
}
1920

2021
/**
21-
* Build a message code from level and category
22+
* Build a message code from level and category. The code must be valid for this function to pass.
23+
* Otherwise it returns a ToolkitError.
2224
*/
23-
export function messageCode(level: IoMessageLevel, category: IoMessageCodeCategory = 'TOOLKIT', number?: `${number}${number}${number}${number}`): IoMessageCode {
25+
export function defaultMessageCode(level: IoMessageLevel, category: IoMessageCodeCategory = 'TOOLKIT'): VALID_CODE {
2426
const levelIndicator = level === 'error' ? 'E' :
2527
level === 'warn' ? 'W' :
2628
'I';
27-
return `CDK_${category}_${levelIndicator}${number ?? '0000'}`;
29+
return `CDK_${category}_${levelIndicator}0000` as VALID_CODE;
2830
}
2931

3032
/**
3133
* Requests a yes/no confirmation from the IoHost.
3234
*/
3335
export const confirm = (
34-
code: IoMessageCode,
36+
code: VALID_CODE,
3537
question: string,
3638
motivation: string,
3739
defaultResponse: boolean,
@@ -49,7 +51,7 @@ export const confirm = (
4951
/**
5052
* Prompt for a a response from the IoHost.
5153
*/
52-
export const prompt = <T, U>(code: IoMessageCode, message: string, defaultResponse: U, payload?: T): ActionLessRequest<T, U> => {
54+
export const prompt = <T, U>(code: VALID_CODE, message: string, defaultResponse: U, payload?: T): ActionLessRequest<T, U> => {
5355
return {
5456
defaultResponse,
5557
...formatMessage({
@@ -64,7 +66,7 @@ export const prompt = <T, U>(code: IoMessageCode, message: string, defaultRespon
6466
/**
6567
* Logs an error level message.
6668
*/
67-
export const error = <T>(message: string, code?: IoMessageCode, payload?: T) => {
69+
export const error = <T>(message: string, code?: VALID_CODE, payload?: T) => {
6870
return formatMessage({
6971
level: 'error',
7072
code,
@@ -76,7 +78,7 @@ export const error = <T>(message: string, code?: IoMessageCode, payload?: T) =>
7678
/**
7779
* Logs an warning level message.
7880
*/
79-
export const warn = <T>(message: string, code?: IoMessageCode, payload?: T) => {
81+
export const warn = <T>(message: string, code?: VALID_CODE, payload?: T) => {
8082
return formatMessage({
8183
level: 'warn',
8284
code,
@@ -88,7 +90,7 @@ export const warn = <T>(message: string, code?: IoMessageCode, payload?: T) => {
8890
/**
8991
* Logs an info level message.
9092
*/
91-
export const info = <T>(message: string, code?: IoMessageCode, payload?: T) => {
93+
export const info = <T>(message: string, code?: VALID_CODE, payload?: T) => {
9294
return formatMessage({
9395
level: 'info',
9496
code,
@@ -101,7 +103,7 @@ export const info = <T>(message: string, code?: IoMessageCode, payload?: T) => {
101103
* Logs an info level message to stdout.
102104
* @deprecated
103105
*/
104-
export const data = <T>(message: string, code?: IoMessageCode, payload?: T) => {
106+
export const data = <T>(message: string, code?: VALID_CODE, payload?: T) => {
105107
return formatMessage({
106108
level: 'info',
107109
code,
@@ -113,7 +115,7 @@ export const data = <T>(message: string, code?: IoMessageCode, payload?: T) => {
113115
/**
114116
* Logs a debug level message.
115117
*/
116-
export const debug = <T>(message: string, code?: IoMessageCode, payload?: T) => {
118+
export const debug = <T>(message: string, code?: VALID_CODE, payload?: T) => {
117119
return formatMessage({
118120
level: 'debug',
119121
code,
@@ -125,7 +127,7 @@ export const debug = <T>(message: string, code?: IoMessageCode, payload?: T) =>
125127
/**
126128
* Logs a trace level message.
127129
*/
128-
export const trace = <T>(message: string, code?: IoMessageCode, payload?: T) => {
130+
export const trace = <T>(message: string, code?: VALID_CODE, payload?: T) => {
129131
return formatMessage({
130132
level: 'trace',
131133
code,
@@ -138,7 +140,7 @@ export const trace = <T>(message: string, code?: IoMessageCode, payload?: T) =>
138140
* Logs an info level success message in green text.
139141
* @deprecated
140142
*/
141-
export const success = <T>(message: string, code?: IoMessageCode, payload?: T) => {
143+
export const success = <T>(message: string, code?: VALID_CODE, payload?: T) => {
142144
return formatMessage({
143145
level: 'info',
144146
code,
@@ -151,7 +153,7 @@ export const success = <T>(message: string, code?: IoMessageCode, payload?: T) =
151153
* Logs an info level message in bold text.
152154
* @deprecated
153155
*/
154-
export const highlight = <T>(message: string, code?: IoMessageCode, payload?: T) => {
156+
export const highlight = <T>(message: string, code?: VALID_CODE, payload?: T) => {
155157
return formatMessage({
156158
level: 'info',
157159
code,

0 commit comments

Comments
 (0)