@@ -6,10 +6,14 @@ import * as chokidar from 'chokidar';
66import * as fs from 'fs-extra' ;
77import * as promptly from 'promptly' ;
88import * as uuid from 'uuid' ;
9+ import { CliIoHost } from './io-host' ;
910import type { Configuration } from './user-configuration' ;
1011import { PROJECT_CONFIG } from './user-configuration' ;
12+ import type { ToolkitAction } from '../../../@aws-cdk/tmp-toolkit-helpers/src/api' ;
1113import { ToolkitError } from '../../../@aws-cdk/tmp-toolkit-helpers/src/api' ;
1214import { asIoHelper } from '../../../@aws-cdk/tmp-toolkit-helpers/src/api/io/private' ;
15+ import type { ToolkitOptions } from '../../../@aws-cdk/toolkit-lib/lib/toolkit' ;
16+ import { Toolkit } from '../../../@aws-cdk/toolkit-lib/lib/toolkit' ;
1317import { DEFAULT_TOOLKIT_STACK_NAME } from '../api' ;
1418import type { SdkProvider } from '../api/aws-auth' ;
1519import type { BootstrapEnvironmentOptions } from '../api/bootstrap' ;
@@ -59,7 +63,6 @@ import {
5963 buildCfnClient ,
6064} from '../commands/migrate' ;
6165import { result as logResult , debug , error , highlight , info , success , warning } from '../logging' ;
62- import { CliIoHost } from './io-host' ;
6366import { partition , validateSnsTopicArn , formatErrorMessage , deserializeStructure , obscureTemplate , serializeStructure , formatTime } from '../util' ;
6467
6568// Must use a require() otherwise esbuild complains about calling a namespace
@@ -145,6 +148,22 @@ export enum AssetBuildTime {
145148 JUST_IN_TIME = 'just-in-time' ,
146149}
147150
151+ class InternalToolkit extends Toolkit {
152+ private readonly _sdkProvider : SdkProvider ;
153+ public constructor ( sdkProvider : SdkProvider , options : ToolkitOptions ) {
154+ super ( options ) ;
155+ this . _sdkProvider = sdkProvider ;
156+ }
157+
158+ /**
159+ * Access to the AWS SDK
160+ * @internal
161+ */
162+ protected override async sdkProvider ( _action : ToolkitAction ) : Promise < SdkProvider > {
163+ return this . _sdkProvider ;
164+ }
165+ }
166+
148167/**
149168 * Toolkit logic
150169 *
@@ -154,10 +173,21 @@ export enum AssetBuildTime {
154173export class CdkToolkit {
155174 private ioHost : CliIoHost ;
156175 private toolkitStackName : string ;
176+ private toolkit : InternalToolkit ;
157177
158178 constructor ( private readonly props : CdkToolkitProps ) {
159179 this . ioHost = props . ioHost ?? CliIoHost . instance ( ) ;
160180 this . toolkitStackName = props . toolkitStackName ?? DEFAULT_TOOLKIT_STACK_NAME ;
181+
182+ this . toolkit = new InternalToolkit ( props . sdkProvider , {
183+ assemblyFailureAt : this . validateMetadataFailAt ( ) ,
184+ color : true ,
185+ emojis : true ,
186+ ioHost : this . ioHost ,
187+ sdkConfig : { } ,
188+ toolkitStackName : this . toolkitStackName ,
189+ } ) ;
190+ this . toolkit ; // aritifical use of this.toolkit to satisfy TS, we want to prepare usage of the new toolkit without using it just yet
161191 }
162192
163193 public async metadata ( stackName : string , json : boolean ) {
@@ -1251,6 +1281,11 @@ export class CdkToolkit {
12511281 * Validate the stacks for errors and warnings according to the CLI's current settings
12521282 */
12531283 private async validateStacks ( stacks : StackCollection ) {
1284+ const failAt = this . validateMetadataFailAt ( ) ;
1285+ await stacks . validateMetadata ( failAt , stackMetadataLogger ( this . props . verbose ) ) ;
1286+ }
1287+
1288+ private validateMetadataFailAt ( ) : 'warn' | 'error' | 'none' {
12541289 let failAt : 'warn' | 'error' | 'none' = 'error' ;
12551290 if ( this . props . ignoreErrors ) {
12561291 failAt = 'none' ;
@@ -1259,7 +1294,7 @@ export class CdkToolkit {
12591294 failAt = 'warn' ;
12601295 }
12611296
1262- await stacks . validateMetadata ( failAt , stackMetadataLogger ( this . props . verbose ) ) ;
1297+ return failAt ;
12631298 }
12641299
12651300 /**
0 commit comments