UNPKG

aws-cdk

Version:

AWS CDK CLI, the command line tool for CDK apps

141 lines 15.5 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.VersionCheckTTL = void 0; exports.getVersionMessages = getVersionMessages; exports.shouldDisplayVersionMessage = shouldDisplayVersionMessage; exports.displayVersionMessage = displayVersionMessage; const path = __importStar(require("path")); const toolkit_lib_1 = require("@aws-cdk/toolkit-lib"); const chalk_1 = __importDefault(require("chalk")); const fs = __importStar(require("fs-extra")); const semver = __importStar(require("semver")); const util_1 = require("../util"); const console_formatters_1 = require("./util/console-formatters"); const npm_1 = require("./util/npm"); const ONE_DAY_IN_SECONDS = 1 * 24 * 60 * 60; const UPGRADE_DOCUMENTATION_LINKS = { 1: 'https://docs.aws.amazon.com/cdk/v2/guide/migrating-v2.html', }; class VersionCheckTTL { static timestampFilePath() { // Using the same path from account-cache.ts return path.join((0, util_1.cdkCacheDir)(), 'repo-version-ttl'); } file; // File modify times are accurate only to the second ttlSecs; constructor(file, ttlSecs) { this.file = file || VersionCheckTTL.timestampFilePath(); try { fs.mkdirsSync(path.dirname(this.file)); fs.accessSync(path.dirname(this.file), fs.constants.W_OK); } catch { throw new toolkit_lib_1.ToolkitError('DirectoryNotWritable', `Directory (${path.dirname(this.file)}) is not writable.`); } this.ttlSecs = ttlSecs || ONE_DAY_IN_SECONDS; } async hasExpired() { try { const lastCheckTime = (await fs.stat(this.file)).mtimeMs; const today = new Date().getTime(); if ((today - lastCheckTime) / 1000 > this.ttlSecs) { // convert ms to sec return true; } return false; } catch (err) { if (err.code === 'ENOENT') { return true; } else { throw err; } } } async update(latestVersion) { if (!latestVersion) { latestVersion = ''; } await fs.writeFile(this.file, latestVersion); } } exports.VersionCheckTTL = VersionCheckTTL; // Export for unit testing only. // Don't use directly, use displayVersionMessage() instead. async function getVersionMessages(currentVersion, cacheFile) { if (!(await cacheFile.hasExpired())) { return []; } const packageInfo = await (0, npm_1.execNpmView)(currentVersion); const latestVersion = packageInfo.latestVersion; await cacheFile.update(JSON.stringify(packageInfo)); // If the latest version is the same as the current version, there is no need to display a message if (semver.eq(latestVersion, currentVersion)) { return []; } const versionMessage = [ packageInfo.deprecated ? `${chalk_1.default.red(packageInfo.deprecated)}` : undefined, `Newer version of CDK is available [${chalk_1.default.green(latestVersion)}]`, getMajorVersionUpgradeMessage(currentVersion), 'Upgrade recommended (npm install -g aws-cdk)', ].filter(Boolean); return versionMessage; } function getMajorVersionUpgradeMessage(currentVersion) { const currentMajorVersion = semver.major(currentVersion); if (UPGRADE_DOCUMENTATION_LINKS[currentMajorVersion]) { return `Information about upgrading from version ${currentMajorVersion}.x to version ${currentMajorVersion + 1}.x is available here: ${UPGRADE_DOCUMENTATION_LINKS[currentMajorVersion]}`; } } function shouldDisplayVersionMessage() { return !!process.stdout.isTTY && !process.env.CDK_DISABLE_VERSION_CHECK; } async function displayVersionMessage(ioHelper, currentVersion = (0, util_1.versionNumber)(), versionCheckCache) { try { const versionMessages = await getVersionMessages(currentVersion, versionCheckCache ?? new VersionCheckTTL()); for (const e of (0, console_formatters_1.formatAsBanner)(versionMessages)) { await ioHelper.defaults.info(e); } } catch (err) { await ioHelper.defaults.debug(`Could not run version check - ${err.message}`); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzcGxheS12ZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGlzcGxheS12ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtFQSxnREFzQkM7QUFTRCxrRUFFQztBQUVELHNEQWFDO0FBbEhELDJDQUE2QjtBQUM3QixzREFBb0Q7QUFDcEQsa0RBQTBCO0FBQzFCLDZDQUErQjtBQUMvQiwrQ0FBaUM7QUFFakMsa0NBQXFEO0FBQ3JELGtFQUEyRDtBQUMzRCxvQ0FBeUM7QUFFekMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFNUMsTUFBTSwyQkFBMkIsR0FBMkI7SUFDMUQsQ0FBQyxFQUFFLDREQUE0RDtDQUNoRSxDQUFDO0FBRUYsTUFBYSxlQUFlO0lBQ25CLE1BQU0sQ0FBQyxpQkFBaUI7UUFDN0IsNENBQTRDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFBLGtCQUFXLEdBQUUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFZ0IsSUFBSSxDQUFTO0lBRTlCLG9EQUFvRDtJQUNuQyxPQUFPLENBQVM7SUFFakMsWUFBWSxJQUFhLEVBQUUsT0FBZ0I7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLElBQUksZUFBZSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDO1lBQ0gsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQUMsTUFBTSxDQUFD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O0lBQzVMLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsMkJBQTJCO0lBQ3pDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQztBQUMxRSxDQUFDO0FBRU0sS0FBSyxVQUFVLHFCQUFxQixDQUN6QyxRQUFrQixFQUNsQixjQUFjLEdBQUcsSUFBQSxvQkFBYSxHQUFFLEVBQ2hDLGlCQUFtQztJQUVuQyxJQUFJLENBQUM7UUFDSCxNQUFNLGVBQWUsR0FBRyxNQUFNLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxpQkFBaUIsSUFBSSxJQUFJLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDN0csS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFBLG1DQUFjLEVBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxHQUFRLEVBQUUsQ0FBQztRQUNsQixNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNoRixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyIH0gZnJvbSAnLi4vYXBpLXByaXZhdGUnO1xuaW1wb3J0IHsgY2RrQ2FjaGVEaXIsIHZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IGZvcm1hdEFzQmFubmVyIH0gZnJvbSAnLi91dGlsL2NvbnNvbGUtZm9ybWF0dGVycyc7XG5pbXBvcnQgeyBleGVjTnBtVmlldyB9IGZyb20gJy4vdXRpbC9ucG0nO1xuXG5jb25zdCBPTkVfREFZX0lOX1NFQ09ORFMgPSAxICogMjQgKiA2MCAqIDYwO1xuXG5jb25zdCBVUEdSQURFX0RPQ1VNRU5UQVRJT05fTElOS1M6IFJlY29yZDxudW1iZXIsIHN0cmluZz4gPSB7XG4gIDE6ICdodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY2RrL3YyL2d1aWRlL21pZ3JhdGluZy12Mi5odG1sJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBWZXJzaW9uQ2hlY2tUVEwge1xuICBwdWJsaWMgc3RhdGljIHRpbWVzdGFtcEZpbGVQYXRoKCk6IHN0cmluZyB7XG4gICAgLy8gVXNpbmcgdGhlIHNhbWUgcGF0aCBmcm9tIGFjY291bnQtY2FjaGUudHNcbiAgICByZXR1cm4gcGF0aC5qb2luKGNka0NhY2hlRGlyKCksICdyZXBvLXZlcnNpb24tdHRsJyk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGZpbGU6IHN0cmluZztcblxuICAvLyBGaWxlIG1vZGlmeSB0aW1lcyBhcmUgYWNjdXJhdGUgb25seSB0byB0aGUgc2Vjb25kXG4gIHByaXZhdGUgcmVhZG9ubHkgdHRsU2VjczogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGZpbGU/OiBzdHJpbmcsIHR0bFNlY3M/OiBudW1iZXIpIHtcbiAgICB0aGlzLmZpbGUgPSBmaWxlIHx8IFZlcnNpb25DaGVja1RUTC50aW1lc3RhbXBGaWxlUGF0aCgpO1xuICAgIHRyeSB7XG4gICAgICBmcy5ta2RpcnNTeW5jKHBhdGguZGlybmFtZSh0aGlzLmZpbGUpKTtcbiAgICAgIGZzLmFjY2Vzc1N5bmMocGF0aC5kaXJuYW1lKHRoaXMuZmlsZSksIGZzLmNvbnN0YW50cy5XX09LKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0RpcmVjdG9yeU5vdFdyaXRhYmxlJywgYERpcmVjdG9yeSAoJHtwYXRoLmRpcm5hbWUodGhpcy5maWxlKX0pIGlzIG5vdCB3cml0YWJsZS5gKTtcbiAgICB9XG4gICAgdGhpcy50dGxTZWNzID0gdHRsU2VjcyB8fCBPTkVfREFZX0lOX1NFQ09ORFM7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaGFzRXhwaXJlZCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbGFzdENoZWNrVGltZSA9IChhd2FpdCBmcy5zdGF0KHRoaXMuZmlsZSkpLm10aW1lTXM7XG4gICAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG4gICAgICBpZiAoKHRvZGF5IC0gbGFzdENoZWNrVGltZSkgLyAxMDAwID4gdGhpcy50dGxTZWNzKSB7IC8vIGNvbnZlcnQgbXMgdG8gc2VjXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGUobGF0ZXN0VmVyc2lvbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghbGF0ZXN0VmVyc2lvbikge1xuICAgICAgbGF0ZXN0VmVyc2lvbiA9ICcnO1xuICAgIH1cbiAgICBhd2FpdCBmcy53cml0ZUZpbGUodGhpcy5maWxlLCBsYXRlc3RWZXJzaW9uKTtcbiAgfVxufVxuXG4vLyBFeHBvcnQgZm9yIHVuaXQgdGVzdGluZyBvbmx5LlxuLy8gRG9uJ3QgdXNlIGRpcmVjdGx5LCB1c2UgZGlzcGxheVZlcnNpb25NZXNzYWdlKCkgaW5zdGVhZC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRWZXJzaW9uTWVzc2FnZXMoY3VycmVudFZlcnNpb246IHN0cmluZywgY2FjaGVGaWxlOiBWZXJzaW9uQ2hlY2tUVEwpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmICghKGF3YWl0IGNhY2hlRmlsZS5oYXNFeHBpcmVkKCkpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUluZm8gPSBhd2FpdCBleGVjTnBtVmlldyhjdXJyZW50VmVyc2lvbik7XG4gIGNvbnN0IGxhdGVzdFZlcnNpb24gPSBwYWNrYWdlSW5mby5sYXRlc3RWZXJzaW9uO1xuICBhd2FpdCBjYWNoZUZpbGUudXBkYXRlKEpTT04uc3RyaW5naWZ5KHBhY2thZ2VJbmZvKSk7XG5cbiAgLy8gSWYgdGhlIGxhdGVzdCB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IHZlcnNpb24sIHRoZXJlIGlzIG5vIG5lZWQgdG8gZGlzcGxheSBhIG1lc3NhZ2VcbiAgaWYgKHNlbXZlci5lcShsYXRlc3RWZXJzaW9uLCBjdXJyZW50VmVyc2lvbikpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCB2ZXJzaW9uTWVzc2FnZSA9IFtcbiAgICBwYWNrYWdlSW5mby5kZXByZWNhdGVkID8gYCR7Y2hhbGsucmVkKHBhY2thZ2VJbmZvLmRlcHJlY2F0ZWQgYXMgc3RyaW5nKX1gIDogdW5kZWZpbmVkLFxuICAgIGBOZXdlciB2ZXJzaW9uIG9mIENESyBpcyBhdmFpbGFibGUgWyR7Y2hhbGsuZ3JlZW4obGF0ZXN0VmVyc2lvbiBhcyBzdHJpbmcpfV1gLFxuICAgIGdldE1ham9yVmVyc2lvblVwZ3JhZGVNZXNzYWdlKGN1cnJlbnRWZXJzaW9uKSxcbiAgICAnVXBncmFkZSByZWNvbW1lbmRlZCAobnBtIGluc3RhbGwgLWcgYXdzLWNkayknLFxuICBdLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXTtcblxuICByZXR1cm4gdmVyc2lvbk1lc3NhZ2U7XG59XG5cbmZ1bmN0aW9uIGdldE1ham9yVmVyc2lvblVwZ3JhZGVNZXNzYWdlKGN1cnJlbnRWZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcgfCB2b2lkIHtcbiAgY29uc3QgY3VycmVudE1ham9yVmVyc2lvbiA9IHNlbXZlci5tYWpvcihjdXJyZW50VmVyc2lvbik7XG4gIGlmIChVUEdSQURFX0RPQ1VNRU5UQVRJT05fTElOS1NbY3VycmVudE1ham9yVmVyc2lvbl0pIHtcbiAgICByZXR1cm4gYEluZm9ybWF0aW9uIGFib3V0IHVwZ3JhZGluZyBmcm9tIHZlcnNpb24gJHtjdXJyZW50TWFqb3JWZXJzaW9ufS54IHRvIHZlcnNpb24gJHtjdXJyZW50TWFqb3JWZXJzaW9uICsgMX0ueCBpcyBhdmFpbGFibGUgaGVyZTogJHtVUEdSQURFX0RPQ1VNRU5UQVRJT05fTElOS1NbY3VycmVudE1ham9yVmVyc2lvbl19YDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkRGlzcGxheVZlcnNpb25NZXNzYWdlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFwcm9jZXNzLnN0ZG91dC5pc1RUWSAmJiAhcHJvY2Vzcy5lbnYuQ0RLX0RJU0FCTEVfVkVSU0lPTl9DSEVDSztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc3BsYXlWZXJzaW9uTWVzc2FnZShcbiAgaW9IZWxwZXI6IElvSGVscGVyLFxuICBjdXJyZW50VmVyc2lvbiA9IHZlcnNpb25OdW1iZXIoKSxcbiAgdmVyc2lvbkNoZWNrQ2FjaGU/OiBWZXJzaW9uQ2hlY2tUVEwsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB2ZXJzaW9uTWVzc2FnZXMgPSBhd2FpdCBnZXRWZXJzaW9uTWVzc2FnZXMoY3VycmVudFZlcnNpb24sIHZlcnNpb25DaGVja0NhY2hlID8/IG5ldyBWZXJzaW9uQ2hlY2tUVEwoKSk7XG4gICAgZm9yIChjb25zdCBlIG9mIGZvcm1hdEFzQmFubmVyKHZlcnNpb25NZXNzYWdlcykpIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmluZm8oZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgIGF3YWl0IGlvSGVscGVyLmRlZmF1bHRzLmRlYnVnKGBDb3VsZCBub3QgcnVuIHZlcnNpb24gY2hlY2sgLSAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59XG4iXX0=