aws-cdk
Version:
AWS CDK CLI, the command line tool for CDK apps
141 lines • 15.5 kB
JavaScript
;
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=