UNPKG

aws-cdk

Version:

AWS CDK Toolkit CLI, the command line tool for CDK apps

120 lines 15 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.doctor = doctor; const process = __importStar(require("process")); const cxapi = __importStar(require("@aws-cdk/cx-api")); const chalk_1 = __importDefault(require("chalk")); const display_version_1 = require("../cli/display-version"); const version_1 = require("../cli/version"); async function doctor({ ioHelper, settings, agent }) { let exitStatus = 0; for (const verification of verifications) { if (!await verification(ioHelper, settings)) { exitStatus = -1; } } await (0, display_version_1.displayVersionMessage)(ioHelper, { agent }); return exitStatus; } const verifications = [ displayVersionInformation, displayCliConfiguration, displayAwsEnvironmentVariables, displayCdkEnvironmentVariables, ]; // ### Verifications ### async function displayCliConfiguration(ioHelper, settings) { const verbosity = Number(settings?.get(['verbose']) ?? 0); const verbose = verbosity ? `extra verbosity (-${'v'.repeat(verbosity)})` : 'normal verbosity'; const debug = []; if (Boolean(settings?.get(['debugApp']))) { debug.push('CDK app'); } if (Boolean(settings?.get(['debugCli']))) { debug.push('CLI'); } const debugging = debug.length ? `debugging ${debug.join(' & ')}` : 'no debugging'; await ioHelper.defaults.info(chalk_1.default.gray.italic(`${verbose}, ${debugging}`)); return true; } async function displayVersionInformation(ioHelper) { await ioHelper.defaults.info(`ℹ️ CDK CLI Version: ${chalk_1.default.green((0, version_1.versionWithBuild)())}`); return true; } async function displayAwsEnvironmentVariables(ioHelper) { const keys = Object.keys(process.env).filter(s => s.startsWith('AWS_')); if (keys.length === 0) { await ioHelper.defaults.info('ℹ️ No AWS environment variables'); return true; } await ioHelper.defaults.info('ℹ️ AWS environment variables:'); for (const key of keys) { await ioHelper.defaults.info(` - ${chalk_1.default.blue(key)} = ${chalk_1.default.green(anonymizeAwsVariable(key, process.env[key]))}`); } return true; } async function displayCdkEnvironmentVariables(ioHelper) { const keys = Object.keys(process.env).filter(s => s.startsWith('CDK_')); if (keys.length === 0) { await ioHelper.defaults.info('ℹ️ No CDK environment variables'); return true; } await ioHelper.defaults.info('ℹ️ CDK environment variables:'); let healthy = true; for (const key of keys.sort()) { if (key === cxapi.CONTEXT_ENV || key === cxapi.CONTEXT_OVERFLOW_LOCATION_ENV || key === cxapi.OUTDIR_ENV) { await ioHelper.defaults.info(` - ${chalk_1.default.red(key)} = ${chalk_1.default.green(process.env[key])} (⚠️ reserved for use by the CDK toolkit)`); healthy = false; } else { await ioHelper.defaults.info(` - ${chalk_1.default.blue(key)} = ${chalk_1.default.green(process.env[key])}`); } } return healthy; } function anonymizeAwsVariable(name, value) { if (name === 'AWS_ACCESS_KEY_ID') { return value.slice(0, 4) + '<redacted>'; } // Show ASIA/AKIA key type, but hide identifier if (name === 'AWS_SECRET_ACCESS_KEY' || name === 'AWS_SESSION_TOKEN' || name === 'AWS_SECURITY_TOKEN') { return '<redacted>'; } return value; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZG9jdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEJBLHdCQVNDO0FBdENELGlEQUFtQztBQUNuQyx1REFBeUM7QUFDekMsa0RBQTBCO0FBRzFCLDREQUErRDtBQUMvRCw0Q0FBa0Q7QUF1QjNDLEtBQUssVUFBVSxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBaUI7SUFDdkUsSUFBSSxVQUFVLEdBQVcsQ0FBQyxDQUFDO0lBQzNCLEtBQUssTUFBTSxZQUFZLElBQUksYUFBYSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLE1BQU0sWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzVDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sSUFBQSx1Q0FBcUIsRUFBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxNQUFNLGFBQWEsR0FBbUY7SUFDcEcseUJBQXlCO0lBQ3pCLHVCQUF1QjtJQUN2Qiw4QkFBOEI7SUFDOUIsOEJBQThCO0NBQy9CLENBQUM7QUFFRix3QkFBd0I7QUFFeEIsS0FBSyxVQUFVLHVCQUF1QixDQUFDLFFBQWtCLEVBQUUsUUFBbUI7SUFDNUUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFELE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7SUFFL0Ys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SyxDQUFDLFdBQVcsSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDLDZCQUE2QixJQUFJLEdBQUcsS0FBSyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDekcsTUFBTSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLGVBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sZUFBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBRSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7WUFDbkksT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNsQixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxlQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLGVBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM3RixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLElBQVksRUFBRSxLQUFhO0lBQ3ZELElBQUksSUFBSSxLQUFLLG1CQUFtQixFQUFFLENBQUM7UUFDakMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUM7SUFDMUMsQ0FBQyxDQUFDLCtDQUErQztJQUNqRCxJQUFJLElBQUksS0FBSyx1QkFBdUIsSUFBSSxJQUFJLEtBQUssbUJBQW1CLElBQUksSUFBSSxLQUFLLG9CQUFvQixFQUFFLENBQUM7UUFDdEcsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgaHR0cHMgZnJvbSAnbm9kZTpodHRwcyc7XG5pbXBvcnQgKiBhcyBwcm9jZXNzIGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgdHlwZSB7IFNldHRpbmdzIH0gZnJvbSAnLi4vYXBpL3NldHRpbmdzJztcbmltcG9ydCB0eXBlIHsgSW9IZWxwZXIgfSBmcm9tICcuLi9hcGktcHJpdmF0ZSc7XG5pbXBvcnQgeyBkaXNwbGF5VmVyc2lvbk1lc3NhZ2UgfSBmcm9tICcuLi9jbGkvZGlzcGxheS12ZXJzaW9uJztcbmltcG9ydCB7IHZlcnNpb25XaXRoQnVpbGQgfSBmcm9tICcuLi9jbGkvdmVyc2lvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdG9yT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGlvSGVscGVyOiBJb0hlbHBlcjtcblxuICAvKipcbiAgICogVGhlIHJlc29sdmVkIENMSSBzZXR0aW5ncywgdXNlZCB0byByZXBvcnQgdGhlIGFjdGl2ZSBDTEkgY29uZmlndXJhdGlvblxuICAgKiAoZGVidWcgdGFyZ2V0cywgdmVyYm9zaXR5LCAuLi4pLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGNvbmZpZ3VyYXRpb24gaXMgbm90IHJlcG9ydGVkXG4gICAqL1xuICByZWFkb25seSBzZXR0aW5ncz86IFNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBUaGUgYWdlbnQgdXNlZCBmb3IgdGhlIG5ldHdvcmsgcmVxdWVzdCBvZiB0aGUgdmVyc2lvbiBjaGVja1xuICAgKlxuICAgKiBVc2UgdGhpcyB0byBzZXQgdXAgYSBwcm94eSBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBzaGFyZWQgZ2xvYmFsIG5vZGUgYWdlbnRcbiAgICovXG4gIHJlYWRvbmx5IGFnZW50PzogaHR0cHMuQWdlbnQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb2N0b3IoeyBpb0hlbHBlciwgc2V0dGluZ3MsIGFnZW50IH06IERvY3Rvck9wdGlvbnMpOiBQcm9taXNlPG51bWJlcj4ge1xuICBsZXQgZXhpdFN0YXR1czogbnVtYmVyID0gMDtcbiAgZm9yIChjb25zdCB2ZXJpZmljYXRpb24gb2YgdmVyaWZpY2F0aW9ucykge1xuICAgIGlmICghYXdhaXQgdmVyaWZpY2F0aW9uKGlvSGVscGVyLCBzZXR0aW5ncykpIHtcbiAgICAgIGV4aXRTdGF0dXMgPSAtMTtcbiAgICB9XG4gIH1cbiAgYXdhaXQgZGlzcGxheVZlcnNpb25NZXNzYWdlKGlvSGVscGVyLCB7IGFnZW50IH0pO1xuICByZXR1cm4gZXhpdFN0YXR1cztcbn1cblxuY29uc3QgdmVyaWZpY2F0aW9uczogQXJyYXk8KGlvSGVscGVyOiBJb0hlbHBlciwgc2V0dGluZ3M/OiBTZXR0aW5ncykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4+ID0gW1xuICBkaXNwbGF5VmVyc2lvbkluZm9ybWF0aW9uLFxuICBkaXNwbGF5Q2xpQ29uZmlndXJhdGlvbixcbiAgZGlzcGxheUF3c0Vudmlyb25tZW50VmFyaWFibGVzLFxuICBkaXNwbGF5Q2RrRW52aXJvbm1lbnRWYXJpYWJsZXMsXG5dO1xuXG4vLyAjIyMgVmVyaWZpY2F0aW9ucyAjIyNcblxuYXN5bmMgZnVuY3Rpb24gZGlzcGxheUNsaUNvbmZpZ3VyYXRpb24oaW9IZWxwZXI6IElvSGVscGVyLCBzZXR0aW5ncz86IFNldHRpbmdzKSB7XG4gIGNvbnN0IHZlcmJvc2l0eSA9IE51bWJlcihzZXR0aW5ncz8uZ2V0KFsndmVyYm9zZSddKSA/PyAwKTtcbiAgY29uc3QgdmVyYm9zZSA9IHZlcmJvc2l0eSA/IGBleHRyYSB2ZXJib3NpdHkgKC0keyd2Jy5yZXBlYXQodmVyYm9zaXR5KX0pYCA6ICdub3JtYWwgdmVyYm9zaXR5JztcblxuICBjb25zdCBkZWJ1ZyA9IFtdO1xuICBpZiAoQm9vbGVhbihzZXR0aW5ncz8uZ2V0KFsnZGVidWdBcHAnXSkpKSB7XG4gICAgZGVidWcucHVzaCgnQ0RLIGFwcCcpO1xuICB9XG4gIGlmIChCb29sZWFuKHNldHRpbmdzPy5nZXQoWydkZWJ1Z0NsaSddKSkpIHtcbiAgICBkZWJ1Zy5wdXNoKCdDTEknKTtcbiAgfVxuICBjb25zdCBkZWJ1Z2dpbmcgPSBkZWJ1Zy5sZW5ndGggPyBgZGVidWdnaW5nICR7ZGVidWcuam9pbignICYgJyl9YCA6ICdubyBkZWJ1Z2dpbmcnO1xuXG4gIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oY2hhbGsuZ3JheS5pdGFsaWMoXG4gICAgYCR7dmVyYm9zZX0sICR7ZGVidWdnaW5nfWAsXG4gICkpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzcGxheVZlcnNpb25JbmZvcm1hdGlvbihpb0hlbHBlcjogSW9IZWxwZXIpIHtcbiAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhg4oS577iPIENESyBDTEkgVmVyc2lvbjogJHtjaGFsay5ncmVlbih2ZXJzaW9uV2l0aEJ1aWxkKCkpfWApO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzcGxheUF3c0Vudmlyb25tZW50VmFyaWFibGVzKGlvSGVscGVyOiBJb0hlbHBlcikge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmZpbHRlcihzID0+IHMuc3RhcnRzV2l0aCgnQVdTXycpKTtcbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygn4oS577iPIE5vIEFXUyBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCfihLnvuI8gQVdTIGVudmlyb25tZW50IHZhcmlhYmxlczonKTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oYCAgLSAke2NoYWxrLmJsdWUoa2V5KX0gPSAke2NoYWxrLmdyZWVuKGFub255bWl6ZUF3c1ZhcmlhYmxlKGtleSwgcHJvY2Vzcy5lbnZba2V5XSEpKX1gKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGlzcGxheUNka0Vudmlyb25tZW50VmFyaWFibGVzKGlvSGVscGVyOiBJb0hlbHBlcikge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmZpbHRlcihzID0+IHMuc3RhcnRzV2l0aCgnQ0RLXycpKTtcbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbygn4oS577iPIE5vIENESyBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKCfihLnvuI8gQ0RLIGVudmlyb25tZW50IHZhcmlhYmxlczonKTtcbiAgbGV0IGhlYWx0aHkgPSB0cnVlO1xuICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzLnNvcnQoKSkge1xuICAgIGlmIChrZXkgPT09IGN4YXBpLkNPTlRFWFRfRU5WIHx8IGtleSA9PT0gY3hhcGkuQ09OVEVYVF9PVkVSRkxPV19MT0NBVElPTl9FTlYgfHwga2V5ID09PSBjeGFwaS5PVVRESVJfRU5WKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5kZWZhdWx0cy5pbmZvKGAgIC0gJHtjaGFsay5yZWQoa2V5KX0gPSAke2NoYWxrLmdyZWVuKHByb2Nlc3MuZW52W2tleV0hKX0gKOKaoO+4jyByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBDREsgdG9vbGtpdClgKTtcbiAgICAgIGhlYWx0aHkgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgaW9IZWxwZXIuZGVmYXVsdHMuaW5mbyhgICAtICR7Y2hhbGsuYmx1ZShrZXkpfSA9ICR7Y2hhbGsuZ3JlZW4ocHJvY2Vzcy5lbnZba2V5XSEpfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaGVhbHRoeTtcbn1cblxuZnVuY3Rpb24gYW5vbnltaXplQXdzVmFyaWFibGUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gIGlmIChuYW1lID09PSAnQVdTX0FDQ0VTU19LRVlfSUQnKSB7XG4gICAgcmV0dXJuIHZhbHVlLnNsaWNlKDAsIDQpICsgJzxyZWRhY3RlZD4nO1xuICB9IC8vIFNob3cgQVNJQS9BS0lBIGtleSB0eXBlLCBidXQgaGlkZSBpZGVudGlmaWVyXG4gIGlmIChuYW1lID09PSAnQVdTX1NFQ1JFVF9BQ0NFU1NfS0VZJyB8fCBuYW1lID09PSAnQVdTX1NFU1NJT05fVE9LRU4nIHx8IG5hbWUgPT09ICdBV1NfU0VDVVJJVFlfVE9LRU4nKSB7XG4gICAgcmV0dXJuICc8cmVkYWN0ZWQ+JztcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG4iXX0=