UNPKG

aws-cdk

Version:

AWS CDK CLI, the command line tool for CDK apps

824 lines 117 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.exec = exec; exports.cli = cli; /* eslint-disable @typescript-eslint/no-shadow */ // yargs const cxapi = require("@aws-cdk/cx-api"); const toolkit_lib_1 = require("@aws-cdk/toolkit-lib"); const chalk = require("chalk"); const util_1 = require("../util"); const cdk_toolkit_1 = require("./cdk-toolkit"); const ci_systems_1 = require("./ci-systems"); const display_version_1 = require("./display-version"); const io_host_1 = require("./io-host"); const parse_command_line_arguments_1 = require("./parse-command-line-arguments"); const platform_warnings_1 = require("./platform-warnings"); const pretty_print_error_1 = require("./pretty-print-error"); const proxy_agent_1 = require("./proxy-agent"); const singleton_plugin_host_1 = require("./singleton-plugin-host"); const error_1 = require("./telemetry/error"); const user_configuration_1 = require("./user-configuration"); const trap_errors_1 = require("./util/trap-errors"); const version_1 = require("./version"); const api_private_1 = require("../../lib/api-private"); const api_1 = require("../api"); const aws_auth_1 = require("../api/aws-auth"); const bootstrap_1 = require("../api/bootstrap"); const deployments_1 = require("../api/deployments"); const hotswap_1 = require("../api/hotswap"); const context_1 = require("../commands/context"); const docs_1 = require("../commands/docs"); const doctor_1 = require("../commands/doctor"); const flags_1 = require("../commands/flags/flags"); const init_1 = require("../commands/init"); const language_1 = require("../commands/language"); const migrate_1 = require("../commands/migrate"); const cxapp_1 = require("../cxapp"); const check_unknown_options_1 = require("./util/check-unknown-options"); const ci_1 = require("./util/ci"); const guess_agent_1 = require("./util/guess-agent"); async function exec(args, synthesizer) { const argv = await (0, parse_command_line_arguments_1.parseCommandLineArguments)(args); argv.language = (0, language_1.getLanguageFromAlias)(argv.language) ?? argv.language; // Handle color output settings // Priority: --no-color > --color > TTY detection if (argv.noColor) { process.env.FORCE_COLOR = '0'; } else if (argv.color) { process.env.FORCE_COLOR = '3'; } else if (!process.stdout.isTTY) { // Default behavior: disable colors for non-TTY process.env.FORCE_COLOR = '0'; } const cmd = argv._[0]; // if one -v, log at a DEBUG level // if 2 -v, log at a TRACE level let ioMessageLevel = 'info'; if (argv.verbose) { switch (argv.verbose) { case 1: ioMessageLevel = 'debug'; break; case 2: default: ioMessageLevel = 'trace'; break; } } const ioHost = io_host_1.CliIoHost.instance({ logLevel: ioMessageLevel, isTTY: process.stdout.isTTY, isCI: Boolean(argv.ci), currentAction: cmd, stackProgress: argv.progress, autoRespond: argv.yes, }, true); const ioHelper = (0, api_private_1.asIoHelper)(ioHost, ioHost.currentAction); // If users request debug information (which switches on CDK_DEBUG=1 to get the // CDK app to emit more information), they probably are troubleshooting and we've // historically decided they then want more logging from the CLI as well. // There is currently no way to get the CDK to emit tracing information that // does not cause the CLI to barf logs to the console. (0, aws_auth_1.setSdkTracing)(argv.debug || argv.verbose > 2); try { await (0, platform_warnings_1.checkForPlatformWarnings)(ioHelper); } catch (e) { await ioHost.defaults.debug(`Error while checking for platform warnings: ${e}`); } await ioHost.defaults.debug('CDK Toolkit CLI version:', (0, version_1.versionWithBuild)()); await ioHost.defaults.debug('Command line arguments:', argv); const unknownOptions = (0, check_unknown_options_1.findUnknownOptions)(argv); if (unknownOptions.length > 0) { const formatted = unknownOptions.map((o) => `--${o}`).join(', '); await ioHost.defaults.warn(`Unknown option(s): ${formatted}. These will be ignored. Run 'cdk --help' to see available options.`); } const configuration = await user_configuration_1.Configuration.fromArgsAndFiles(ioHelper, { commandLineArguments: { ...argv, _: argv._, // TypeScript at its best }, }); // Always create and use ProxyAgent to support configuration via env vars const proxyAgent = await new proxy_agent_1.ProxyAgentProvider(ioHelper).create({ proxyAddress: configuration.settings.get(['proxy']), caBundlePath: configuration.settings.get(['caBundlePath']), }); try { await ioHost.startTelemetry(argv, configuration.context); } catch (e) { await ioHost.asIoHelper().defaults.trace(`Telemetry instantiation failed: ${e.message}`); } ioHost.telemetry?.attachLanguage(await (0, util_1.guessLanguage)(process.cwd())); ioHost.telemetry?.attachAgent((0, guess_agent_1.guessAgent)()); /** * The default value for displaying (and refreshing) notices on all commands. * * If the user didn't supply either `--notices` or `--no-notices`, we do * autodetection. The autodetection currently is: do write notices if we are * not on CI, or are on a CI system where we know that writing to stderr is * safe. We fail "closed"; that is, we decide to NOT print for unknown CI * systems, even though technically we maybe could. */ const isSafeToWriteNotices = !(0, ci_1.isCI)() || Boolean((0, ci_systems_1.ciSystemIsStdErrSafe)()); // Determine if notices should be displayed based on CLI args and configuration let shouldDisplayNotices; if (argv.notices !== undefined) { // CLI argument takes precedence shouldDisplayNotices = argv.notices; } else { // Fall back to configuration file setting, then autodetection const configNotices = configuration.settings.get(['notices']); if (configNotices !== undefined) { // Consider string "false" to be falsy in this context shouldDisplayNotices = configNotices !== 'false' && Boolean(configNotices); } else { // Default autodetection behavior shouldDisplayNotices = isSafeToWriteNotices; } } // Notices either go to stderr, or nowhere ioHost.noticesDestination = shouldDisplayNotices ? 'stderr' : 'drop'; const notices = api_1.Notices.create({ ioHost, context: configuration.context, output: configuration.settings.get(['outdir']), language: await (0, util_1.guessLanguage)(process.cwd()), httpOptions: { agent: proxyAgent }, cliVersion: (0, version_1.versionNumber)(), }); const refreshNotices = (async () => { // the cdk notices command has it's own refresh if (shouldDisplayNotices && cmd !== 'notices') { await (0, trap_errors_1.trapErrors)(ioHelper, 'Could not refresh notices', () => notices.refresh()); } })(); const sdkProvider = await aws_auth_1.SdkProvider.withAwsCliCompatibleDefaults({ ioHelper, requestHandler: (0, aws_auth_1.sdkRequestHandler)(proxyAgent), logger: new aws_auth_1.IoHostSdkLogger((0, api_private_1.asIoHelper)(ioHost, ioHost.currentAction)), pluginHost: singleton_plugin_host_1.GLOBAL_PLUGIN_HOST, }, configuration.settings.get(['profile']), configuration.settings.get(['region'])); try { await ioHost.telemetry?.attachRegion(sdkProvider.defaultRegion); } catch (e) { await ioHost.asIoHelper().defaults.trace(`Telemetry attach region failed: ${e.message}`); } let outDirLock; const cloudExecutable = new cxapp_1.CloudExecutable({ configuration, sdkProvider, synthesizer: synthesizer ?? (async (aws, config) => { // Invoke 'execProgram', and copy the lock for the directory in the global // variable here. It will be released when the CLI exits. Locks are not re-entrant // so release it if we have to synthesize more than once (because of context lookups). await outDirLock?.release(); const { assembly, lock, perfCounters } = await (0, cxapp_1.execProgram)(aws, ioHost.asIoHelper(), config); outDirLock = lock; const tree = await (0, api_1.loadTree)(assembly, ioHelper.defaults.trace.bind(ioHelper.defaults)); if (tree) { const v = (0, api_1.findConstructLibraryVersion)(tree); if (v) { ioHost.telemetry?.attachCdkLibVersion(v); } } if (perfCounters) { ioHost.telemetry?.attachCountersToNextEvent(perfCounters); } return assembly; }), ioHelper: ioHost.asIoHelper(), }); /** Function to load plug-ins, using configurations additively. */ async function loadPlugins(...settings) { for (const source of settings) { const plugins = source.get(['plugin']) || []; for (const plugin of plugins) { await singleton_plugin_host_1.GLOBAL_PLUGIN_HOST.load(plugin, ioHost); } } } await loadPlugins(configuration.settings); if ((typeof cmd) !== 'string') { throw new toolkit_lib_1.ToolkitError('InvalidArgType', `First argument should be a string. Got: ${cmd} (${typeof cmd})`); } try { return await main(cmd, argv); } finally { // If we locked the 'cdk.out' directory, release it here. await outDirLock?.release(); // Do PSAs here await (0, display_version_1.displayVersionMessage)(ioHelper); await refreshNotices; if (cmd === 'notices') { // do not trap errors here // this is the notices command itself, any error should be loud await notices.refresh({ force: true }); await notices.display({ includeAcknowledged: !argv.unacknowledged, showTotal: argv.unacknowledged, }); } else if (shouldDisplayNotices && cmd !== 'version') { await (0, trap_errors_1.trapErrors)(ioHelper, 'Could not display notices', () => notices.display()); } } async function main(command, args) { ioHost.currentAction = command; const toolkitStackName = api_1.ToolkitInfo.determineName(configuration.settings.get(['toolkitStackName'])); await ioHost.defaults.debug(`Toolkit stack: ${chalk.bold(toolkitStackName)}`); const cloudFormation = new deployments_1.Deployments({ sdkProvider, toolkitStackName, ioHelper: (0, api_private_1.asIoHelper)(ioHost, ioHost.currentAction), }); if (args.all && args.STACKS) { throw new toolkit_lib_1.ToolkitError('StacksOrAllRequired', 'You must either specify a list of Stacks or the `--all` argument'); } args.STACKS = args.STACKS ?? (args.STACK ? [args.STACK] : []); args.ENVIRONMENTS = args.ENVIRONMENTS ?? []; const selector = { allTopLevel: args.all, patterns: args.STACKS, }; const cli = new cdk_toolkit_1.CdkToolkit({ ioHost, cloudExecutable, toolkitStackName, deployments: cloudFormation, verbose: argv.trace || argv.verbose > 0, ignoreErrors: argv['ignore-errors'], strict: argv.strict, configuration, sdkProvider, }); switch (command) { case 'context': ioHost.currentAction = 'context'; return (0, context_1.contextHandler)({ ioHelper, context: configuration.context, clear: argv.clear, json: argv.json, force: argv.force, reset: argv.reset, }); case 'docs': case 'doc': ioHost.currentAction = 'docs'; return (0, docs_1.docs)({ ioHelper, browser: configuration.settings.get(['browser']), }); case 'doctor': ioHost.currentAction = 'doctor'; return (0, doctor_1.doctor)({ ioHelper, }); case 'ls': case 'list': ioHost.currentAction = 'list'; return cli.list(args.STACKS, { long: args.long, json: argv.json, showDeps: args.showDependencies, }); case 'diff': ioHost.currentAction = 'diff'; const enableDiffNoFail = isFeatureEnabled(configuration, cxapi.ENABLE_DIFF_NO_FAIL_CONTEXT); return cli.diff({ stackNames: args.STACKS, exclusively: args.exclusively, templatePath: args.template, strict: args.strict, contextLines: args.contextLines, securityOnly: args.securityOnly, fail: args.fail != null ? args.fail : !enableDiffNoFail, compareAgainstProcessedTemplate: args.processed, quiet: args.quiet, method: determineDiffMethod(args), toolkitStackName: toolkitStackName, importExistingResources: args.importExistingResources, includeMoves: args['include-moves'], }); case 'drift': ioHost.currentAction = 'drift'; return cli.drift({ selector, fail: args.fail, }); case 'refactor': cliRequireUnstable(configuration, 'refactor'); ioHost.currentAction = 'refactor'; return cli.refactor({ dryRun: args.dryRun, overrideFile: args.overrideFile, revert: args.revert, stacks: selector, additionalStackNames: arrayFromYargs(args.additionalStackName ?? []), force: args.force ?? false, roleArn: args.roleArn, }); case 'bootstrap': ioHost.currentAction = 'bootstrap'; const source = await determineBootstrapVersion(ioHost, args); if (args.showTemplate) { const bootstrapper = new bootstrap_1.Bootstrapper(source, (0, api_private_1.asIoHelper)(ioHost, ioHost.currentAction)); return bootstrapper.showTemplate(args.json); } return cli.bootstrap(args.ENVIRONMENTS, { source, roleArn: args.roleArn, forceDeployment: argv.force, toolkitStackName: toolkitStackName, execute: args.execute, tags: configuration.settings.get(['tags']), terminationProtection: args.terminationProtection, usePreviousParameters: args['previous-parameters'], importExistingResources: args.importExistingResources, parameters: { bucketName: configuration.settings.get(['toolkitBucket', 'bucketName']), kmsKeyId: configuration.settings.get(['toolkitBucket', 'kmsKeyId']), createCustomerMasterKey: args.bootstrapCustomerKey, qualifier: args.qualifier ?? configuration.context.get('@aws-cdk/core:bootstrapQualifier'), publicAccessBlockConfiguration: args.publicAccessBlockConfiguration, examplePermissionsBoundary: argv.examplePermissionsBoundary, customPermissionsBoundary: argv.customPermissionsBoundary, trustedAccounts: arrayFromYargs(args.trust), trustedAccountsForLookup: arrayFromYargs(args.trustForLookup), untrustedAccounts: arrayFromYargs(args.untrust), cloudFormationExecutionPolicies: arrayFromYargs(args.cloudformationExecutionPolicies), denyExternalId: args.denyExternalId, }, }); case 'deploy': ioHost.currentAction = 'deploy'; const parameterMap = {}; for (const parameter of args.parameters) { if (typeof parameter === 'string') { const keyValue = parameter.split('='); parameterMap[keyValue[0]] = keyValue.slice(1).join('='); } } if (args.execute !== undefined && args.method !== undefined) { throw new toolkit_lib_1.ToolkitError('ConflictingExecuteAndMethod', 'Can not supply both --[no-]execute and --method at the same time'); } return cli.deploy({ selector, exclusively: args.exclusively, toolkitStackName, roleArn: args.roleArn, notificationArns: args.notificationArns, requireApproval: configuration.settings.get(['requireApproval']), reuseAssets: args['build-exclude'], tags: configuration.settings.get(['tags']), deploymentMethod: determineDeploymentMethod(args, configuration), force: args.force, parameters: parameterMap, usePreviousParameters: args['previous-parameters'], outputsFile: configuration.settings.get(['outputsFile']), progress: configuration.settings.get(['progress']), ci: args.ci, rollback: configuration.settings.get(['rollback']), watch: args.watch, traceLogs: args.logs, concurrency: args.concurrency, assetParallelism: configuration.settings.get(['assetParallelism']), assetBuildConcurrency: configuration.settings.get(['assetBuildConcurrency']), assetBuildTime: configuration.settings.get(['assetPrebuild']) ? cdk_toolkit_1.AssetBuildTime.ALL_BEFORE_DEPLOY : cdk_toolkit_1.AssetBuildTime.JUST_IN_TIME, ignoreNoStacks: args.ignoreNoStacks, }); case 'diagnose': cliRequireUnstable(configuration, 'diagnose'); ioHost.currentAction = 'diagnose'; // Implicitly switch 'debug' mode to true, that is going to be most useful. configuration.settings.temporarilyMutable((settings) => { settings.set(['debug'], true); }); return cli.diagnose({ stacks: specificStacksOrAllRecursively(args.STACKS), concurrency: args.concurrency, toolkitStackName: args.toolkitStackName, }); case 'rollback': ioHost.currentAction = 'rollback'; return cli.rollback({ selector, toolkitStackName, roleArn: args.roleArn, force: args.force, validateBootstrapStackVersion: args['validate-bootstrap-version'], orphanLogicalIds: args.orphan, }); case 'publish-assets': ioHost.currentAction = 'publish-assets'; cliRequireUnstable(configuration, 'publish-assets'); return cli.publishAssets({ stacks: convertStackSelector(selector, args.exclusively), force: args.force, concurrency: args.concurrency, }); case 'orphan': cliRequireUnstable(configuration, 'orphan'); ioHost.currentAction = 'orphan'; return cli.orphan({ constructPath: args.PATHS ?? [], roleArn: args.roleArn, toolkitStackName, }); case 'import': ioHost.currentAction = 'import'; return cli.import({ selector, toolkitStackName, roleArn: args.roleArn, deploymentMethod: { method: 'change-set', execute: args.execute, changeSetName: args.changeSetName, }, progress: configuration.settings.get(['progress']), rollback: configuration.settings.get(['rollback']), recordResourceMapping: args['record-resource-mapping'], resourceMappingFile: args['resource-mapping'], resourceMappingInline: args['resource-mapping-inline'], force: args.force, }); case 'watch': ioHost.currentAction = 'watch'; await cli.watch({ selector, exclusively: args.exclusively, toolkitStackName, roleArn: args.roleArn, reuseAssets: args['build-exclude'], deploymentMethod: determineDeploymentMethod(args, configuration, true), force: args.force, progress: configuration.settings.get(['progress']), rollback: configuration.settings.get(['rollback']), traceLogs: args.logs, concurrency: args.concurrency, }); return; case 'destroy': ioHost.currentAction = 'destroy'; return cli.destroy({ selector, exclusively: args.exclusively, force: args.force, roleArn: args.roleArn, concurrency: args.concurrency, }); case 'gc': ioHost.currentAction = 'gc'; cliRequireUnstable(configuration, 'gc'); if (args.bootstrapStackName) { await ioHost.defaults.warn('--bootstrap-stack-name is deprecated and will be removed when gc is GA. Use --toolkit-stack-name.'); } // roleArn is defined for when cloudformation is invoked // This conflicts with direct sdk calls existing in the gc command to s3 and ecr if (args.roleArn) { await ioHost.defaults.warn('The --role-arn option is not supported for the gc command and will be ignored.'); } return cli.garbageCollect(args.ENVIRONMENTS, { action: args.action, type: args.type, rollbackBufferDays: args['rollback-buffer-days'], createdBufferDays: args['created-buffer-days'], bootstrapStackName: args.toolkitStackName ?? args.bootstrapStackName, confirm: args.confirm, }); case 'flags': ioHost.currentAction = 'flags'; cliRequireUnstable(configuration, 'flags'); const toolkit = new toolkit_lib_1.Toolkit({ ioHost, toolkitStackName, unstableFeatures: configuration.settings.get(['unstable']), }); const flagsData = await toolkit.flags(cloudExecutable); const handler = new flags_1.FlagCommandHandler(flagsData, ioHelper, args, toolkit, configuration.context.all); return handler.processFlagsCommand(); case 'synthesize': case 'synth': ioHost.currentAction = 'synth'; const quiet = configuration.settings.get(['quiet']) ?? args.quiet; if (args.exclusively) { return cli.synth(args.STACKS, args.exclusively, quiet, args.validation, argv.json); } else { return cli.synth(args.STACKS, true, quiet, args.validation, argv.json); } case 'notices': ioHost.currentAction = 'notices'; // If the user explicitly asks for notices, they are now the primary output // of the command and they should go to stdout. ioHost.noticesDestination = 'stdout'; // This is a valid command, but we're postponing its execution because displaying // notices automatically happens after every command. return; case 'metadata': ioHost.currentAction = 'metadata'; return cli.metadata(args.STACK, argv.json); case 'acknowledge': case 'ack': ioHost.currentAction = 'notices'; return cli.acknowledge(args.ID); case 'cli-telemetry': ioHost.currentAction = 'cli-telemetry'; if (args.enable === undefined && args.disable === undefined && args.status === undefined) { throw new toolkit_lib_1.ToolkitError('TelemetryArgRequired', 'Must specify \'--enable\', \'--disable\', or \'--status\''); } if (args.status) { return cli.cliTelemetryStatus(args); } else { const enable = args.enable ?? !args.disable; return cli.cliTelemetry(enable); } case 'init': ioHost.currentAction = 'init'; const language = configuration.settings.get(['language']); if (args.list) { return (0, init_1.printAvailableTemplates)(ioHelper, language); } else { // Gate custom template support with unstable flag if (args['from-path']) { cliRequireUnstable(configuration, 'init'); } return (0, init_1.cliInit)({ ioHelper, type: args.TEMPLATE, language, canUseNetwork: undefined, generateOnly: args.generateOnly, libVersion: args.libVersion, fromPath: args['from-path'], templatePath: args['template-path'], packageManager: args['package-manager'], projectName: args.name, }); } case 'migrate': ioHost.currentAction = 'migrate'; return cli.migrate({ stackName: args['stack-name'], fromPath: args['from-path'], fromStack: args['from-stack'], language: args.language, outputPath: args['output-path'], fromScan: (0, migrate_1.getMigrateScanType)(args['from-scan']), filter: args.filter, account: args.account, region: args.region, compress: args.compress, }); case 'version': ioHost.currentAction = 'version'; return ioHost.defaults.result((0, version_1.versionWithBuild)()); default: throw new toolkit_lib_1.ToolkitError('UnknownCommand', 'Unknown command: ' + command); } } } /** * Determine which version of bootstrapping */ async function determineBootstrapVersion(ioHost, args) { let source; if (args.template) { await ioHost.defaults.info(`Using bootstrapping template from ${args.template}`); source = { source: 'custom', templateFile: args.template }; } else if (process.env.CDK_LEGACY_BOOTSTRAP) { await ioHost.defaults.info('CDK_LEGACY_BOOTSTRAP set, using legacy-style bootstrapping'); source = { source: 'legacy' }; } else { // in V2, the "new" bootstrapping is the default source = { source: 'default' }; } return source; } function isFeatureEnabled(configuration, featureFlag) { return configuration.context.get(featureFlag) ?? cxapi.futureFlagDefault(featureFlag); } /** * Convert a StackSelector and exclusively flag to toolkit-lib's StackSelector format */ function convertStackSelector(selector, exclusively) { return { patterns: selector.patterns, strategy: selector.patterns.length > 0 ? toolkit_lib_1.StackSelectionStrategy.PATTERN_MATCH : toolkit_lib_1.StackSelectionStrategy.ALL_STACKS, expand: exclusively ? toolkit_lib_1.ExpandStackSelection.NONE : toolkit_lib_1.ExpandStackSelection.UPSTREAM, }; } /** * Build a toolkit-lib StackSelector from a given set of stack construct path patterns * * If no patterns are given, all stacks in the assembly and all of its stages are selected. */ function specificStacksOrAllRecursively(patterns) { return { strategy: patterns.length > 0 ? toolkit_lib_1.StackSelectionStrategy.PATTERN_MATCH : toolkit_lib_1.StackSelectionStrategy.ALL_STACKS, patterns, }; } /** * Translate a Yargs input array to something that makes more sense in a programming language * model (telling the difference between absence and an empty array) * * - An empty array is the default case, meaning the user didn't pass any arguments. We return * undefined. * - If the user passed a single empty string, they did something like `--array=`, which we'll * take to mean they passed an empty array. */ function arrayFromYargs(xs) { if (xs.length === 0) { return undefined; } return xs.filter((x) => x !== ''); } /** * Resolve the diff method from CLI args. * --method takes precedence, then deprecated --change-set, then --template implies template. */ function determineDiffMethod(args) { if (args.method && args.method !== 'auto') { return args.method; } // Deprecated --no-change-set maps to template if (args['change-set'] === false) { return 'template'; } // --template implies template if (args.template) { return 'template'; } return 'auto'; } function determineDeploymentMethod(args, configuration, watch) { let deploymentMethod; switch (args.method) { case 'execute-change-set': if (!args.STACKS || args.STACKS.length !== 1) { throw new toolkit_lib_1.ToolkitError('ExactlyOneStack', '--method=execute-change-set requires exactly one stack'); } if (watch || args.watch) { throw new toolkit_lib_1.ToolkitError('WatchWithExecuteChangeSet', '--method=execute-change-set cannot be used with watch'); } rejectIncompatibleOptions(args, '--method=execute-change-set', { force: '--force', parameters: '--parameters', importExistingResources: '--import-existing-resources', revertDrift: '--revert-drift', }); return { method: 'execute-change-set', changeSetName: args.changeSetName ?? 'cdk-deploy-change-set', }; case 'direct': rejectIncompatibleOptions(args, '--method=direct', { changeSetName: '--change-set-name', importExistingResources: '--import-existing-resources', revertDrift: '--revert-drift', }); deploymentMethod = { method: 'direct' }; break; case 'change-set': deploymentMethod = { method: 'change-set', execute: true, changeSetName: args.changeSetName, importExistingResources: args.importExistingResources, revertDrift: args.revertDrift, }; break; case 'prepare-change-set': deploymentMethod = { method: 'change-set', execute: false, changeSetName: args.changeSetName, importExistingResources: args.importExistingResources, revertDrift: args.revertDrift, }; break; case undefined: default: deploymentMethod = { method: 'change-set', execute: watch ? true : args.execute ?? true, changeSetName: args.changeSetName, importExistingResources: args.importExistingResources, revertDrift: args.revertDrift, }; break; } const hotswapMode = determineHotswapMode(args.hotswap, args.hotswapFallback, watch); const hotswapProperties = configuration.settings.get(['hotswap']) || {}; switch (hotswapMode) { case hotswap_1.HotswapMode.FALL_BACK: return { method: 'hotswap', properties: hotswapProperties, fallback: deploymentMethod, }; case hotswap_1.HotswapMode.HOTSWAP_ONLY: return { method: 'hotswap', properties: hotswapProperties, }; default: case hotswap_1.HotswapMode.FULL_DEPLOYMENT: return deploymentMethod; } } function cliRequireUnstable(configuration, feature) { if (!configuration.settings.get(['unstable']).includes(feature)) { throw new toolkit_lib_1.ToolkitError(`Unstable${ucfirst(feature)}`, `Unstable feature use: \'${feature}\' is unstable. It must be opted in via \'--unstable\', e.g. \'cdk ${feature} --unstable=${feature}\'`); } function ucfirst(x) { return x[0].toUpperCase() + x.slice(1); } } /** * Throw if any of the given flags are set, as they are incompatible with the given option. */ function rejectIncompatibleOptions(args, option, flags) { for (const [key, flag] of Object.entries(flags)) { const value = args[key]; let isSet = false; if (Array.isArray(value)) { // yargs may default array options to [{}], so only count real values isSet = value.some((v) => typeof v === 'string' || typeof v === 'number'); } else { isSet = !!value; } if (isSet) { throw new toolkit_lib_1.ToolkitError('IncompatibleOptions', `${flag} cannot be used with ${option}`); } } } function determineHotswapMode(hotswap, hotswapFallback, watch) { if (hotswap && hotswapFallback) { throw new toolkit_lib_1.ToolkitError('ConflictingHotswapArgs', 'Can not supply both --hotswap and --hotswap-fallback at the same time'); } else if (!hotswap && !hotswapFallback) { if (hotswap === undefined && hotswapFallback === undefined) { return watch ? hotswap_1.HotswapMode.HOTSWAP_ONLY : hotswap_1.HotswapMode.FULL_DEPLOYMENT; } else if (hotswap === false || hotswapFallback === false) { return hotswap_1.HotswapMode.FULL_DEPLOYMENT; } } let hotswapMode; if (hotswap) { hotswapMode = hotswap_1.HotswapMode.HOTSWAP_ONLY; /* if (hotswapFallback)*/ } else { hotswapMode = hotswap_1.HotswapMode.FALL_BACK; } return hotswapMode; } /* c8 ignore start */ // we never call this in unit tests function cli(args = process.argv.slice(2)) { let error; exec(args) .then(async (value) => { if (typeof value === 'number') { process.exitCode = value; } }) .catch(async (err) => { // Log the stack trace if we're on a developer workstation. Otherwise this will be into a minified // file and the printed code line and stack trace are huge and useless. (0, pretty_print_error_1.prettyPrintError)(err, (0, version_1.isDeveloperBuildVersion)()); error = { name: (0, error_1.cdkCliErrorName)(err), }; process.exitCode = 1; }) .finally(async () => { try { await io_host_1.CliIoHost.get()?.telemetry?.end(error); } catch (e) { await io_host_1.CliIoHost.get()?.asIoHelper().defaults.trace(`Ending Telemetry failed: ${e.message}`); } }); } /* c8 ignore stop */ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNENBLG9CQXVtQkM7QUF5TkQsa0JBd0JDO0FBcDRCRCxpREFBaUQsQ0FBQyxRQUFRO0FBQzFELHlDQUF5QztBQUV6QyxzREFBMkc7QUFDM0csK0JBQStCO0FBQy9CLGtDQUF3QztBQUN4QywrQ0FBMkQ7QUFDM0QsNkNBQW9EO0FBQ3BELHVEQUEwRDtBQUUxRCx1Q0FBc0M7QUFDdEMsaUZBQTJFO0FBQzNFLDJEQUErRDtBQUMvRCw2REFBd0Q7QUFDeEQsK0NBQW1EO0FBQ25ELG1FQUE2RDtBQUM3RCw2Q0FBb0Q7QUFHcEQsNkRBQXFEO0FBQ3JELG9EQUFnRDtBQUNoRCx1Q0FBcUY7QUFDckYsdURBQW1EO0FBRW5ELGdDQUFxRjtBQUNyRiw4Q0FBaUc7QUFFakcsZ0RBQWdEO0FBQ2hELG9EQUFpRDtBQUNqRCw0Q0FBNkM7QUFFN0MsaURBQWdFO0FBQ2hFLDJDQUF3QztBQUN4QywrQ0FBNEM7QUFDNUMsbURBQTZEO0FBQzdELDJDQUFvRTtBQUNwRSxtREFBNEQ7QUFDNUQsaURBQXlEO0FBQ3pELG9DQUF3RDtBQUV4RCx3RUFBa0U7QUFDbEUsa0NBQWlDO0FBQ2pDLG9EQUFnRDtBQUV6QyxLQUFLLFVBQVUsSUFBSSxDQUFDLElBQWMsRUFBRSxXQUF5QjtJQUNsRSxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEsd0RBQXlCLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFBLCtCQUFvQixFQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO0lBRXJFLCtCQUErQjtJQUMvQixpREFBaUQ7SUFDakQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO0lBQ2hDLENBQUM7U0FBTSxJQUFJ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