UNPKG

aws-cdk

Version:

CDK Toolkit, the command line tool for CDK apps

107 lines 13.7 kB
"use strict"; // This is an exact copy of the file `packages/aws-cdk/lib/logging.ts` from 2024-11-29 // https://github.com/aws/aws-cdk/blob/81cde0e2e1f83f80273d14724d5518cc20dc5a80/packages/aws-cdk/lib/logging.ts // After this we started refactoring the file and functionality changed significantly. // In order to preserver backwards-compatibly for users with unsanctioned usage of this file, // we keep a copy of the original version around. // See https://github.com/aws/aws-cdk/pull/33021 for more information. Object.defineProperty(exports, "__esModule", { value: true }); exports.data = exports.print = exports.highlight = exports.success = exports.warning = exports.error = exports.debug = exports.trace = exports.CI = exports.logLevel = exports.LogLevel = void 0; exports.withCorkedLogging = withCorkedLogging; exports.setLogLevel = setLogLevel; exports.setCI = setCI; exports.increaseVerbosity = increaseVerbosity; exports.prefix = prefix; const util = require("util"); const chalk = require("chalk"); const { stdout, stderr } = process; async function withCorkedLogging(block) { corkLogging(); try { return await block(); } finally { uncorkLogging(); } } let CORK_COUNTER = 0; const logBuffer = []; function corked() { return CORK_COUNTER !== 0; } function corkLogging() { CORK_COUNTER += 1; } function uncorkLogging() { CORK_COUNTER -= 1; if (!corked()) { logBuffer.forEach(([stream, str]) => stream.write(str + '\n')); logBuffer.splice(0); } } const logger = (stream, styles, timestamp) => (fmt, ...args) => { const ts = timestamp ? `[${formatTime(new Date())}] ` : ''; let str = ts + util.format(fmt, ...args); if (styles && styles.length) { str = styles.reduce((a, style) => style(a), str); } const realStream = typeof stream === 'function' ? stream() : stream; // Logger is currently corked, so we store the message to be printed // later when we are uncorked. if (corked()) { logBuffer.push([realStream, str]); return; } realStream.write(str + '\n'); }; function formatTime(d) { return `${lpad(d.getHours(), 2)}:${lpad(d.getMinutes(), 2)}:${lpad(d.getSeconds(), 2)}`; function lpad(x, w) { const s = `${x}`; return '0'.repeat(Math.max(w - s.length, 0)) + s; } } var LogLevel; (function (LogLevel) { /** Not verbose at all */ LogLevel[LogLevel["DEFAULT"] = 0] = "DEFAULT"; /** Pretty verbose */ LogLevel[LogLevel["DEBUG"] = 1] = "DEBUG"; /** Extremely verbose */ LogLevel[LogLevel["TRACE"] = 2] = "TRACE"; })(LogLevel || (exports.LogLevel = LogLevel = {})); exports.logLevel = LogLevel.DEFAULT; exports.CI = false; function setLogLevel(newLogLevel) { exports.logLevel = newLogLevel; } function setCI(newCI) { exports.CI = newCI; } function increaseVerbosity() { exports.logLevel += 1; } const stream = () => exports.CI ? stdout : stderr; const _debug = logger(stream, [chalk.gray], true); const trace = (fmt, ...args) => exports.logLevel >= LogLevel.TRACE && _debug(fmt, ...args); exports.trace = trace; const debug = (fmt, ...args) => exports.logLevel >= LogLevel.DEBUG && _debug(fmt, ...args); exports.debug = debug; exports.error = logger(stderr, [chalk.red]); exports.warning = logger(stream, [chalk.yellow]); exports.success = logger(stream, [chalk.green]); exports.highlight = logger(stream, [chalk.bold]); exports.print = logger(stream); exports.data = logger(stdout); /** * Create a logger output that features a constant prefix string. * * @param prefixString the prefix string to be appended before any log entry. * @param fn the logger function to be used (typically one of the other functions in this module) * * @returns a new LoggerFunction. */ function prefix(prefixString, fn) { return (fmt, ...args) => fn(`%s ${fmt}`, prefixString, ...args); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnYWN5LWxvZ2dpbmctc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibGVnYWN5LWxvZ2dpbmctc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxzRkFBc0Y7QUFDdEYsK0dBQStHO0FBQy9HLHNGQUFzRjtBQUN0Riw2RkFBNkY7QUFDN0YsaURBQWlEO0FBQ2pELHNFQUFzRTs7O0FBV3RFLDhDQU9DO0FBOERELGtDQUVDO0FBRUQsc0JBRUM7QUFFRCw4Q0FFQztBQXdCRCx3QkFFQztBQWpIRCw2QkFBNkI7QUFDN0IsK0JBQStCO0FBRy9CLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO0FBSTVCLEtBQUssVUFBVSxpQkFBaUIsQ0FBSSxLQUF1QjtJQUNoRSxXQUFXLEVBQUUsQ0FBQztJQUNkLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO1lBQVMsQ0FBQztRQUNULGFBQWEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBRUQsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO0FBQ3JCLE1BQU0sU0FBUyxHQUF5QixFQUFFLENBQUM7QUFFM0MsU0FBUyxNQUFNO0lBQ2IsT0FBTyxZQUFZLEtBQUssQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxTQUFTLFdBQVc7SUFDbEIsWUFBWSxJQUFJLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBUyxhQUFhO0lBQ3BCLFlBQVksSUFBSSxDQUFDLENBQUM7SUFDbEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7UUFDZCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDL0QsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFD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aGUgZmlsZSBgcGFja2FnZXMvYXdzLWNkay9saWIvbG9nZ2luZy50c2AgZnJvbSAyMDI0LTExLTI5XG4vLyBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi84MWNkZTBlMmUxZjgzZjgwMjczZDE0NzI0ZDU1MThjYzIwZGM1YTgwL3BhY2thZ2VzL2F3cy1jZGsvbGliL2xvZ2dpbmcudHNcbi8vIEFmdGVyIHRoaXMgd2Ugc3RhcnRlZCByZWZhY3RvcmluZyB0aGUgZmlsZSBhbmQgZnVuY3Rpb25hbGl0eSBjaGFuZ2VkIHNpZ25pZmljYW50bHkuXG4vLyBJbiBvcmRlciB0byBwcmVzZXJ2ZXIgYmFja3dhcmRzLWNvbXBhdGlibHkgZm9yIHVzZXJzIHdpdGggdW5zYW5jdGlvbmVkIHVzYWdlIG9mIHRoaXMgZmlsZSxcbi8vIHdlIGtlZXAgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIGFyb3VuZC5cbi8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvcHVsbC8zMzAyMSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cblxuaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tICdzdHJlYW0nO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICd1dGlsJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcblxudHlwZSBTdHlsZUZuID0gKHN0cjogc3RyaW5nKSA9PiBzdHJpbmc7XG5jb25zdCB7IHN0ZG91dCwgc3RkZXJyIH0gPSBwcm9jZXNzO1xuXG50eXBlIFdyaXRhYmxlRmFjdG9yeSA9ICgpID0+IFdyaXRhYmxlO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aENvcmtlZExvZ2dpbmc8QT4oYmxvY2s6ICgpID0+IFByb21pc2U8QT4pOiBQcm9taXNlPEE+IHtcbiAgY29ya0xvZ2dpbmcoKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgYmxvY2soKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB1bmNvcmtMb2dnaW5nKCk7XG4gIH1cbn1cblxubGV0IENPUktfQ09VTlRFUiA9IDA7XG5jb25zdCBsb2dCdWZmZXI6IFtXcml0YWJsZSwgc3RyaW5nXVtdID0gW107XG5cbmZ1bmN0aW9uIGNvcmtlZCgpIHtcbiAgcmV0dXJuIENPUktfQ09VTlRFUiAhPT0gMDtcbn1cblxuZnVuY3Rpb24gY29ya0xvZ2dpbmcoKSB7XG4gIENPUktfQ09VTlRFUiArPSAxO1xufVxuXG5mdW5jdGlvbiB1bmNvcmtMb2dnaW5nKCkge1xuICBDT1JLX0NPVU5URVIgLT0gMTtcbiAgaWYgKCFjb3JrZWQoKSkge1xuICAgIGxvZ0J1ZmZlci5mb3JFYWNoKChbc3RyZWFtLCBzdHJdKSA9PiBzdHJlYW0ud3JpdGUoc3RyICsgJ1xcbicpKTtcbiAgICBsb2dCdWZmZXIuc3BsaWNlKDApO1xuICB9XG59XG5cbmNvbnN0IGxvZ2dlciA9IChzdHJlYW06IFdyaXRhYmxlIHwgV3JpdGFibGVGYWN0b3J5LCBzdHlsZXM/OiBTdHlsZUZuW10sIHRpbWVzdGFtcD86IGJvb2xlYW4pID0+IChmbXQ6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gIGNvbnN0IHRzID0gdGltZXN0YW1wID8gYFske2Zvcm1hdFRpbWUobmV3IERhdGUoKSl9XSBgIDogJyc7XG5cbiAgbGV0IHN0ciA9IHRzICsgdXRpbC5mb3JtYXQoZm10LCAuLi5hcmdzKTtcbiAgaWYgKHN0eWxlcyAmJiBzdHlsZXMubGVuZ3RoKSB7XG4gICAgc3RyID0gc3R5bGVzLnJlZHVjZSgoYSwgc3R5bGUpID0+IHN0eWxlKGEpLCBzdHIpO1xuICB9XG5cbiAgY29uc3QgcmVhbFN0cmVhbSA9IHR5cGVvZiBzdHJlYW0gPT09ICdmdW5jdGlvbicgPyBzdHJlYW0oKSA6IHN0cmVhbTtcblxuICAvLyBMb2dnZXIgaXMgY3VycmVudGx5IGNvcmtlZCwgc28gd2Ugc3RvcmUgdGhlIG1lc3NhZ2UgdG8gYmUgcHJpbnRlZFxuICAvLyBsYXRlciB3aGVuIHdlIGFyZSB1bmNvcmtlZC5cbiAgaWYgKGNvcmtlZCgpKSB7XG4gICAgbG9nQnVmZmVyLnB1c2goW3JlYWxTdHJlYW0sIHN0cl0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHJlYWxTdHJlYW0ud3JpdGUoc3RyICsgJ1xcbicpO1xufTtcblxuZnVuY3Rpb24gZm9ybWF0VGltZShkOiBEYXRlKSB7XG4gIHJldHVybiBgJHtscGFkKGQuZ2V0SG91cnMoKSwgMil9OiR7bHBhZChkLmdldE1pbnV0ZXMoKSwgMil9OiR7bHBhZChkLmdldFNlY29uZHMoKSwgMil9YDtcblxuICBmdW5jdGlvbiBscGFkKHg6IGFueSwgdzogbnVtYmVyKSB7XG4gICAgY29uc3QgcyA9IGAke3h9YDtcbiAgICByZXR1cm4gJzAnLnJlcGVhdChNYXRoLm1heCh3IC0gcy5sZW5ndGgsIDApKSArIHM7XG4gIH1cbn1cblxuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICAvKiogTm90IHZlcmJvc2UgYXQgYWxsICovXG4gIERFRkFVTFQgPSAwLFxuICAvKiogUHJldHR5IHZlcmJvc2UgKi9cbiAgREVCVUcgPSAxLFxuICAvKiogRXh0cmVtZWx5IHZlcmJvc2UgKi9cbiAgVFJBQ0UgPSAyLFxufVxuXG5leHBvcnQgbGV0IGxvZ0xldmVsID0gTG9nTGV2ZWwuREVGQVVMVDtcbmV4cG9ydCBsZXQgQ0kgPSBmYWxzZTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldExvZ0xldmVsKG5ld0xvZ0xldmVsOiBMb2dMZXZlbCkge1xuICBsb2dMZXZlbCA9IG5ld0xvZ0xldmVsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0Q0kobmV3Q0k6IGJvb2xlYW4pIHtcbiAgQ0kgPSBuZXdDSTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluY3JlYXNlVmVyYm9zaXR5KCkge1xuICBsb2dMZXZlbCArPSAxO1xufVxuXG5jb25zdCBzdHJlYW0gPSAoKSA9PiBDSSA/IHN0ZG91dCA6IHN0ZGVycjtcbmNvbnN0IF9kZWJ1ZyA9IGxvZ2dlcihzdHJlYW0sIFtjaGFsay5ncmF5XSwgdHJ1ZSk7XG5cbmV4cG9ydCBjb25zdCB0cmFjZSA9IChmbXQ6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiBsb2dMZXZlbCA+PSBMb2dMZXZlbC5UUkFDRSAmJiBfZGVidWcoZm10LCAuLi5hcmdzKTtcbmV4cG9ydCBjb25zdCBkZWJ1ZyA9IChmbXQ6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiBsb2dMZXZlbCA+PSBMb2dMZXZlbC5ERUJVRyAmJiBfZGVidWcoZm10LCAuLi5hcmdzKTtcbmV4cG9ydCBjb25zdCBlcnJvciA9IGxvZ2dlcihzdGRlcnIsIFtjaGFsay5yZWRdKTtcbmV4cG9ydCBjb25zdCB3YXJuaW5nID0gbG9nZ2VyKHN0cmVhbSwgW2NoYWxrLnllbGxvd10pO1xuZXhwb3J0IGNvbnN0IHN1Y2Nlc3MgPSBsb2dnZXIoc3RyZWFtLCBbY2hhbGsuZ3JlZW5dKTtcbmV4cG9ydCBjb25zdCBoaWdobGlnaHQgPSBsb2dnZXIoc3RyZWFtLCBbY2hhbGsuYm9sZF0pO1xuZXhwb3J0IGNvbnN0IHByaW50ID0gbG9nZ2VyKHN0cmVhbSk7XG5leHBvcnQgY29uc3QgZGF0YSA9IGxvZ2dlcihzdGRvdXQpO1xuXG5leHBvcnQgdHlwZSBMb2dnZXJGdW5jdGlvbiA9IChmbXQ6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkO1xuXG4vKipcbiAqIENyZWF0ZSBhIGxvZ2dlciBvdXRwdXQgdGhhdCBmZWF0dXJlcyBhIGNvbnN0YW50IHByZWZpeCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHByZWZpeFN0cmluZyB0aGUgcHJlZml4IHN0cmluZyB0byBiZSBhcHBlbmRlZCBiZWZvcmUgYW55IGxvZyBlbnRyeS5cbiAqIEBwYXJhbSBmbiAgIHRoZSBsb2dnZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCAodHlwaWNhbGx5IG9uZSBvZiB0aGUgb3RoZXIgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlKVxuICpcbiAqIEByZXR1cm5zIGEgbmV3IExvZ2dlckZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlZml4KHByZWZpeFN0cmluZzogc3RyaW5nLCBmbjogTG9nZ2VyRnVuY3Rpb24pOiBMb2dnZXJGdW5jdGlvbiB7XG4gIHJldHVybiAoZm10OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSA9PiBmbihgJXMgJHtmbXR9YCwgcHJlZml4U3RyaW5nLCAuLi5hcmdzKTtcbn1cbiJdfQ==