logging.js
15.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.patchLogger = patchLogger;
exports.getLogger = getLogger;
exports.loadSecureValuesPreprocessingRules = loadSecureValuesPreprocessingRules;
exports.default = exports.log = void 0;
require("source-map-support/register");
var _npmlog = _interopRequireDefault(require("npmlog"));
var _lodash = _interopRequireDefault(require("lodash"));
var _util = require("./util");
var _moment = _interopRequireDefault(require("moment"));
var _logInternal = _interopRequireDefault(require("./log-internal"));
const NPM_LEVELS = ['silly', 'verbose', 'debug', 'info', 'http', 'warn', 'error'];
const MAX_LOG_RECORDS_COUNT = 3000;
const PREFIX_TIMESTAMP_FORMAT = 'HH-mm-ss:SSS';
let mockLog = {};
for (let level of NPM_LEVELS) {
mockLog[level] = () => {};
}
function patchLogger(logger) {
if (!logger.debug) {
logger.addLevel('debug', 1000, {
fg: 'blue',
bg: 'black'
}, 'dbug');
}
}
function _getLogger() {
const testingMode = parseInt(process.env._TESTING, 10) === 1;
const forceLogMode = parseInt(process.env._FORCE_LOGS, 10) === 1;
const usingGlobalLog = !!global._global_npmlog;
let logger;
if (testingMode && !forceLogMode) {
logger = mockLog;
} else {
logger = global._global_npmlog || _npmlog.default;
logger.maxRecordSize = MAX_LOG_RECORDS_COUNT;
}
patchLogger(logger);
return [logger, usingGlobalLog];
}
function getActualPrefix(prefix, logTimestamp = false) {
let actualPrefix = _lodash.default.isFunction(prefix) ? prefix() : prefix;
if (logTimestamp) {
actualPrefix = `[${(0, _moment.default)().format(PREFIX_TIMESTAMP_FORMAT)}] ${actualPrefix}`;
}
return actualPrefix;
}
function getLogger(prefix = null) {
let [logger, usingGlobalLog] = _getLogger();
let wrappedLogger = {
unwrap: () => logger
};
Object.defineProperty(wrappedLogger, 'level', {
get() {
return logger.level;
},
set(newValue) {
logger.level = newValue;
},
enumerable: true,
configurable: true
});
const logTimestamp = parseInt(process.env._LOG_TIMESTAMP, 10) === 1;
for (const level of NPM_LEVELS) {
wrappedLogger[level] = function (...args) {
const actualPrefix = getActualPrefix(prefix, logTimestamp);
for (const arg of args) {
const out = _lodash.default.isError(arg) && arg.stack ? arg.stack : `${arg}`;
for (const line of out.split('\n')) {
const unleakedLine = (0, _util.unleakString)(line);
logger[level](actualPrefix, _logInternal.default.preprocess(unleakedLine));
}
}
};
}
wrappedLogger.errorAndThrow = function (err) {
this.error(err);
throw _lodash.default.isError(err) ? err : new Error((0, _util.unleakString)(err));
};
if (!usingGlobalLog) {
wrappedLogger.level = 'verbose';
}
wrappedLogger.levels = NPM_LEVELS;
return wrappedLogger;
}
async function loadSecureValuesPreprocessingRules(rulesJsonPath) {
const issues = await _logInternal.default.loadRules(rulesJsonPath);
return {
issues,
rules: _lodash.default.cloneDeep(_logInternal.default.rules)
};
}
const log = getLogger();
exports.log = log;
var _default = log;
exports.default = _default;require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9sb2dnaW5nLmpzIl0sIm5hbWVzIjpbIk5QTV9MRVZFTFMiLCJNQVhfTE9HX1JFQ09SRFNfQ09VTlQiLCJQUkVGSVhfVElNRVNUQU1QX0ZPUk1BVCIsIm1vY2tMb2ciLCJsZXZlbCIsInBhdGNoTG9nZ2VyIiwibG9nZ2VyIiwiZGVidWciLCJhZGRMZXZlbCIsImZnIiwiYmciLCJfZ2V0TG9nZ2VyIiwidGVzdGluZ01vZGUiLCJwYXJzZUludCIsInByb2Nlc3MiLCJlbnYiLCJfVEVTVElORyIsImZvcmNlTG9nTW9kZSIsIl9GT1JDRV9MT0dTIiwidXNpbmdHbG9iYWxMb2ciLCJnbG9iYWwiLCJfZ2xvYmFsX25wbWxvZyIsIm5wbWxvZyIsIm1heFJlY29yZFNpemUiLCJnZXRBY3R1YWxQcmVmaXgiLCJwcmVmaXgiLCJsb2dUaW1lc3RhbXAiLCJhY3R1YWxQcmVmaXgiLCJfIiwiaXNGdW5jdGlvbiIsImZvcm1hdCIsImdldExvZ2dlciIsIndyYXBwZWRMb2dnZXIiLCJ1bndyYXAiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsInNldCIsIm5ld1ZhbHVlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIl9MT0dfVElNRVNUQU1QIiwiYXJncyIsImFyZyIsIm91dCIsImlzRXJyb3IiLCJzdGFjayIsImxpbmUiLCJzcGxpdCIsInVubGVha2VkTGluZSIsIlNFQ1VSRV9WQUxVRVNfUFJFUFJPQ0VTU09SIiwicHJlcHJvY2VzcyIsImVycm9yQW5kVGhyb3ciLCJlcnIiLCJlcnJvciIsIkVycm9yIiwibGV2ZWxzIiwibG9hZFNlY3VyZVZhbHVlc1ByZXByb2Nlc3NpbmdSdWxlcyIsInJ1bGVzSnNvblBhdGgiLCJpc3N1ZXMiLCJsb2FkUnVsZXMiLCJydWxlcyIsImNsb25lRGVlcCIsImxvZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQSxNQUFNQSxVQUFVLEdBQUcsQ0FBQyxP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QyxhQUFuRCxFQUFrRTtBQUNoRSxRQUFNQyxNQUFNLEdBQUcsTUFBTVQscUJBQTJCVSxTQUEzQixDQUFxQ0YsYUFBckMsQ0FBckI7QUFDQSxTQUFPO0FBQ0xDLElBQUFBLE1BREs7QUFFTEUsSUFBQUEsS0FBSyxFQUFFakMsZ0JBQUVrQyxTQUFGLENBQVlaLHFCQUEyQlcsS0FBdkM7QUFGRixHQUFQO0FBSUQ7O0FBR0QsTUFBTUUsR0FBRyxHQUFHaEMsU0FBUyxFQUFyQjs7ZUFHZWdDLEciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbnBtbG9nIGZyb20gJ25wbWxvZyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdW5sZWFrU3RyaW5nIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCBTRUNVUkVfVkFMVUVTX1BSRVBST0NFU1NPUiBmcm9tICcuL2xvZy1pbnRlcm5hbCc7XG5cbi8vIGxldmVscyB0aGF0IGFyZSBhdmFpbGFibGUgZnJvbSBgbnBtbG9nYFxuY29uc3QgTlBNX0xFVkVMUyA9IFsnc2lsbHknLCAndmVyYm9zZScsICdkZWJ1ZycsICdpbmZvJywgJ2h0dHAnLCAnd2FybicsICdlcnJvciddO1xuY29uc3QgTUFYX0xPR19SRUNPUkRTX0NPVU5UID0gMzAwMDtcblxuY29uc3QgUFJFRklYX1RJTUVTVEFNUF9GT1JNQVQgPSAnSEgtbW0tc3M6U1NTJztcblxuLy8gbW9jayBsb2cgb2JqZWN0IHVzZWQgaW4gdGVzdGluZyBtb2RlXG5sZXQgbW9ja0xvZyA9IHt9O1xuZm9yIChsZXQgbGV2ZWwgb2YgTlBNX0xFVkVMUykge1xuICBtb2NrTG9nW2xldmVsXSA9ICgpID0+IHt9O1xufVxuXG5mdW5jdGlvbiBwYXRjaExvZ2dlciAobG9nZ2VyKSB7XG4gIGlmICghbG9nZ2VyLmRlYnVnKSB7XG4gICAgbG9nZ2VyLmFkZExldmVsKCdkZWJ1ZycsIDEwMDAsIHsgZmc6ICdibHVlJywgYmc6ICdibGFjaycgfSwgJ2RidWcnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZ2V0TG9nZ2VyICgpIHtcbiAgLy8gY2hlY2sgaWYgdGhlIHVzZXIgc2V0IHRoZSBgX1RFU1RJTkdgIG9yIGBfRk9SQ0VfTE9HU2AgZmxhZ1xuICBjb25zdCB0ZXN0aW5nTW9kZSA9IHBhcnNlSW50KHByb2Nlc3MuZW52Ll9URVNUSU5HLCAxMCkgPT09IDE7XG4gIGNvbnN0IGZvcmNlTG9nTW9kZSA9IHBhcnNlSW50KHByb2Nlc3MuZW52Ll9GT1JDRV9MT0dTLCAxMCkgPT09IDE7XG5cbiAgLy8gaWYgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBpcyBhIGxvZ2dlciBpbnN0YW5jZSB0aGF0IGlzIGFscmVhZHkgYXJvdW5kLFxuICAvLyBpbiB3aGljaCBjYXNlIHdlIHdhbnQgdCBvIHVzZSB0aGF0XG4gIGNvbnN0IHVzaW5nR2xvYmFsTG9nID0gISFnbG9iYWwuX2dsb2JhbF9ucG1sb2c7XG4gIGxldCBsb2dnZXI7XG4gIGlmICh0ZXN0aW5nTW9kZSAmJiAhZm9yY2VMb2dNb2RlKSB7XG4gICAgLy8gaW4gdGVzdGluZyBtb2RlLCB1c2UgYSBtb2NrIGxvZ2dlciBvYmplY3QgdGhhdCB3ZSBjYW4gcXVlcnlcbiAgICBsb2dnZXIgPSBtb2NrTG9nO1xuICB9IGVsc2Uge1xuICAgIC8vIG90aGVyd2lzZSwgZWl0aGVyIHVzZSB0aGUgZ2xvYmFsLCBvciBhIG5ldyBgbnBtbG9nYCBvYmplY3RcbiAgICBsb2dnZXIgPSBnbG9iYWwuX2dsb2JhbF9ucG1sb2cgfHwgbnBtbG9nO1xuICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEwMDAwLCB3aGljaCBjYXVzZXMgZXhjZXNzaXZlIG1lbW9yeSB1c2FnZVxuICAgIGxvZ2dlci5tYXhSZWNvcmRTaXplID0gTUFYX0xPR19SRUNPUkRTX0NPVU5UO1xuICB9XG4gIHBhdGNoTG9nZ2VyKGxvZ2dlcik7XG4gIHJldHVybiBbbG9nZ2VyLCB1c2luZ0dsb2JhbExvZ107XG59XG5cbmZ1bmN0aW9uIGdldEFjdHVhbFByZWZpeCAocHJlZml4LCBsb2dUaW1lc3RhbXAgPSBmYWxzZSkge1xuICBsZXQgYWN0dWFsUHJlZml4ID0gXy5pc0Z1bmN0aW9uKHByZWZpeCkgPyBwcmVmaXgoKSA6IHByZWZpeDtcbiAgaWYgKGxvZ1RpbWVzdGFtcCkge1xuICAgIGFjdHVhbFByZWZpeCA9IGBbJHttb21lbnQoKS5mb3JtYXQoUFJFRklYX1RJTUVTVEFNUF9GT1JNQVQpfV0gJHthY3R1YWxQcmVmaXh9YDtcbiAgfVxuICByZXR1cm4gYWN0dWFsUHJlZml4O1xufVxuXG5mdW5jdGlvbiBnZXRMb2dnZXIgKHByZWZpeCA9IG51bGwpIHtcbiAgbGV0IFtsb2dnZXIsIHVzaW5nR2xvYmFsTG9nXSA9IF9nZXRMb2dnZXIoKTtcblxuICAvLyB3cmFwIHRoZSBsb2dnZXIgc28gdGhhdCB3ZSBjYW4gY2F0Y2ggYW5kIG1vZGlmeSBhbnkgbG9nZ2luZ1xuICBsZXQgd3JhcHBlZExvZ2dlciA9IHt1bndyYXA6ICgpID0+IGxvZ2dlcn07XG5cbiAgLy8gYWxsb3cgYWNjZXNzIHRvIHRoZSBsZXZlbCBvZiB0aGUgdW5kZXJseWluZyBsb2dnZXJcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBwZWRMb2dnZXIsICdsZXZlbCcsIHtcbiAgICBnZXQgKCkge1xuICAgICAgcmV0dXJuIGxvZ2dlci5sZXZlbDtcbiAgICB9LFxuICAgIHNldCAobmV3VmFsdWUpIHtcbiAgICAgIGxvZ2dlci5sZXZlbCA9IG5ld1ZhbHVlO1xuICAgIH0sXG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG5cbiAgY29uc3QgbG9nVGltZXN0YW1wID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuX0xPR19USU1FU1RBTVAsIDEwKSA9PT0gMTtcblxuICAvLyBhZGQgYWxsIHRoZSBsZXZlbHMgZnJvbSBgbnBtbG9nYCwgYW5kIG1hcCB0byB0aGUgdW5kZXJseWluZyBsb2dnZXJcbiAgZm9yIChjb25zdCBsZXZlbCBvZiBOUE1fTEVWRUxTKSB7XG4gICAgd3JhcHBlZExvZ2dlcltsZXZlbF0gPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgY29uc3QgYWN0dWFsUHJlZml4ID0gZ2V0QWN0dWFsUHJlZml4KHByZWZpeCwgbG9nVGltZXN0YW1wKTtcbiAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0gKF8uaXNFcnJvcihhcmcpICYmIGFyZy5zdGFjaykgPyBhcmcuc3RhY2sgOiBgJHthcmd9YDtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG91dC5zcGxpdCgnXFxuJykpIHtcbiAgICAgICAgICAvLyBpdCBpcyBuZWNlc3NhcnkgdG8gdW5sZWFrIGVhY2ggbGluZSBiZWNhdXNlIGBzcGxpdGAgY2FsbFxuICAgICAgICAgIC8vIGNyZWF0ZXMgXCJ2aWV3c1wiIHRvIHRoZSBvcmlnaW5hbCBzdHJpbmcgYXMgd2VsbCBhcyB0aGUgYHN1YnN0cmluZ2Agb25lXG4gICAgICAgICAgY29uc3QgdW5sZWFrZWRMaW5lID0gdW5sZWFrU3RyaW5nKGxpbmUpO1xuICAgICAgICAgIGxvZ2dlcltsZXZlbF0oYWN0dWFsUHJlZml4LCBTRUNVUkVfVkFMVUVTX1BSRVBST0NFU1NPUi5wcmVwcm9jZXNzKHVubGVha2VkTGluZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICAvLyBhZGQgbWV0aG9kIHRvIGxvZyBhbiBlcnJvciwgYW5kIHRocm93IGl0LCBmb3IgY29udmVuaWVuY2VcbiAgd3JhcHBlZExvZ2dlci5lcnJvckFuZFRocm93ID0gZnVuY3Rpb24gKGVycikge1xuICAgIHRoaXMuZXJyb3IoZXJyKTtcbiAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBgRXJyb3JgIG9iamVjdC4gV3JhcCBpZiBuZWNlc3NhcnlcbiAgICB0aHJvdyAoXy5pc0Vycm9yKGVycikgPyBlcnIgOiBuZXcgRXJyb3IodW5sZWFrU3RyaW5nKGVycikpKTtcbiAgfTtcbiAgaWYgKCF1c2luZ0dsb2JhbExvZykge1xuICAgIC8vIGlmIHdlJ3JlIG5vdCB1c2luZyBhIGdsb2JhbCBsb2cgc3BlY2lmaWVkIGZyb20gc29tZSB0b3AtbGV2ZWwgcGFja2FnZSxcbiAgICAvLyBzZXQgdGhlIGxvZyBsZXZlbCB0byBhIGRlZmF1bHQgb2YgdmVyYm9zZS4gT3RoZXJ3aXNlLCBsZXQgdGhlIHRvcC1sZXZlbFxuICAgIC8vIHBhY2thZ2Ugc2V0IHRoZSBsb2cgbGV2ZWxcbiAgICB3cmFwcGVkTG9nZ2VyLmxldmVsID0gJ3ZlcmJvc2UnO1xuICB9XG4gIHdyYXBwZWRMb2dnZXIubGV2ZWxzID0gTlBNX0xFVkVMUztcbiAgcmV0dXJuIHdyYXBwZWRMb2dnZXI7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9hZFJlc3VsdFxuICogQHByb3BlcnR5IHtMaXN0PHN0cmluZz59IGlzc3VlcyBUaGUgbGlzdCBvZiBydWxlIHBhcnNpbmcgaXNzdWVzIChvbmUgaXRlbSBwZXIgcnVsZSkuXG4gKiBSdWxlcyB3aXRoIGlzc3VlcyBhcmUgc2tpcHBlZC4gQW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZCBpZiBubyBwYXJzaW5nIGlzc3VlcyBleGlzdC5cbiAqIEBwcm9wZXJ0eSB7TGlzdDxTZWN1cmVWYWx1ZVByZXByb2Nlc3NpbmdSdWxlPn0gcnVsZXMgVGhlIGxpc3Qgb2Ygc3VjY2Vzc2Z1bGx5IGxvYWRlZFxuICogcmVwbGFjZW1lbnQgcnVsZXMuIFRoZSBsaXN0IGNvdWxkIGJlIGVtcHR5IGlmIG5vIHJ1bGVzIHdlcmUgbG9hZGVkLlxuICovXG5cbi8qKlxuICogTG9hZHMgdGhlIEpTT04gZmlsZSBjb250YWluaW5nIHNlY3VyZSB2YWx1ZXMgcmVwbGFjZW1lbnQgcnVsZXMuXG4gKiBUaGlzIG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBoaWRlIHNlbnNpdGl2ZSB2YWx1ZXMgdGhhdCBtYXkgcG9zc2libHlcbiAqIGFwcGVhciBpbiBBcHBpdW0gbG9ncy5cbiAqIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZCByZXBsYWNlcyB0aGUgcHJldmlvdXNseSBsb2FkZWQgcnVsZXMgaWYgYW55IGV4aXN0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJ1bGVzSnNvblBhdGggVGhlIGZ1bGwgcGF0aCB0byB0aGUgSlNPTiBmaWxlIGNvbnRhaW5pbmdcbiAqIHRoZSByZXBsYWNlbWVudCBydWxlcy4gRWFjaCBydWxlIGNvdWxkIGVpdGhlciBiZSBhIHN0cmluZyB0byBiZSByZXBsYWNlZFxuICogb3IgYW4gb2JqZWN0IHdpdGggcHJlZGVmaW5lZCBwcm9wZXJ0aWVzLiBTZWUgdGhlIGBSdWxlYCB0eXBlIGRlZmluaXRpb24gaW5cbiAqIGBsb2ctaW50ZXJuYWxzLmpzYCB0byBnZXQgbW9yZSBkZXRhaWxzIG9uIGl0cyBmb3JtYXQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIGZpbGUgY2Fubm90IGJlIGxvYWRlZFxuICogQHJldHVybnMge0xvYWRSZXN1bHR9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRTZWN1cmVWYWx1ZXNQcmVwcm9jZXNzaW5nUnVsZXMgKHJ1bGVzSnNvblBhdGgpIHtcbiAgY29uc3QgaXNzdWVzID0gYXdhaXQgU0VDVVJFX1ZBTFVFU19QUkVQUk9DRVNTT1IubG9hZFJ1bGVzKHJ1bGVzSnNvblBhdGgpO1xuICByZXR1cm4ge1xuICAgIGlzc3VlcyxcbiAgICBydWxlczogXy5jbG9uZURlZXAoU0VDVVJFX1ZBTFVFU19QUkVQUk9DRVNTT1IucnVsZXMpLFxuICB9O1xufVxuXG4vLyBleHBvcnQgYSBkZWZhdWx0IGxvZ2dlciB3aXRoIG5vIHByZWZpeFxuY29uc3QgbG9nID0gZ2V0TG9nZ2VyKCk7XG5cbmV4cG9ydCB7IGxvZywgcGF0Y2hMb2dnZXIsIGdldExvZ2dlciwgbG9hZFNlY3VyZVZhbHVlc1ByZXByb2Nlc3NpbmdSdWxlcyB9O1xuZXhwb3J0IGRlZmF1bHQgbG9nO1xuIl0sImZpbGUiOiJsaWIvbG9nZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9