parcel-bundler
Version:
Blazing fast, zero configuration web application bundler
333 lines (267 loc) • 8.19 kB
JavaScript
"use strict";
const chalk = require('chalk');
const readline = require('readline');
const prettyError = require('./utils/prettyError');
const emoji = require('./utils/emoji');
const _require = require('grapheme-breaker'),
countBreaks = _require.countBreaks;
const stripAnsi = require('strip-ansi');
const ora = require('ora');
const WorkerFarm = require('./workerfarm/WorkerFarm');
const path = require('path');
const fs = require('fs');
class Logger {
constructor(options) {
this.lines = 0;
this.spinner = null;
this.setOptions(options);
}
setOptions(options) {
this.logLevel = options && isNaN(options.logLevel) === false ? Number(options.logLevel) : 3;
this.color = options && typeof options.color === 'boolean' ? options.color : chalk.supportsColor;
this.chalk = new chalk.constructor({
enabled: this.color
});
this.isTest = options && typeof options.isTest === 'boolean' ? options.isTest : process.env.NODE_ENV === 'test';
}
countLines(message) {
return stripAnsi(message).split('\n').reduce((p, line) => {
if (process.stdout.columns) {
return p + Math.ceil((line.length || 1) / process.stdout.columns);
}
return p + 1;
}, 0);
}
writeRaw(message) {
this.stopSpinner();
this.lines += this.countLines(message) - 1;
process.stdout.write(message);
}
write(message, persistent = false) {
if (this.logLevel > 3) {
return this.verbose(message);
}
if (!persistent) {
this.lines += this.countLines(message);
}
this.stopSpinner();
this._log(message);
}
verbose(message) {
if (this.logLevel < 4) {
return;
}
let currDate = new Date();
message = `[${currDate.toLocaleTimeString()}]: ${message}`;
if (this.logLevel > 4) {
if (!this.logFile) {
this.logFile = fs.createWriteStream(path.join(process.cwd(), `parcel-debug-${currDate.toLocaleDateString()}@${currDate.toLocaleTimeString()}.log`));
}
this.logFile.write(stripAnsi(message) + '\n');
}
this._log(message);
}
log(message) {
if (this.logLevel < 3) {
return;
}
this.write(message);
}
persistent(message) {
if (this.logLevel < 3) {
return;
}
this.write(this.chalk.bold(message), true);
}
warn(err) {
if (this.logLevel < 2) {
return;
}
this._writeError(err, emoji.warning, this.chalk.yellow);
}
error(err) {
if (this.logLevel < 1) {
return;
}
this._writeError(err, emoji.error, this.chalk.red.bold);
}
success(message) {
this.log(`${emoji.success} ${this.chalk.green.bold(message)}`);
}
_writeError(err, emoji, color) {
let _prettyError = prettyError(err, {
color: this.color
}),
message = _prettyError.message,
stack = _prettyError.stack;
this.write(color(`${emoji} ${message}`));
if (stack) {
this.write(stack);
}
}
clear() {
if (!this.color || this.isTest || this.logLevel > 3) {
return;
}
while (this.lines > 0) {
readline.clearLine(process.stdout, 0);
readline.moveCursor(process.stdout, 0, -1);
this.lines--;
}
readline.cursorTo(process.stdout, 0);
this.stopSpinner();
}
progress(message) {
if (this.logLevel < 3) {
return;
}
if (this.logLevel > 3) {
return this.verbose(message);
}
let styledMessage = this.chalk.gray.bold(message);
if (!this.spinner) {
this.spinner = ora({
text: styledMessage,
stream: process.stdout,
enabled: this.isTest ? false : undefined // fall back to ora default unless we need to explicitly disable it.
}).start();
} else {
this.spinner.text = styledMessage;
}
}
stopSpinner() {
if (this.spinner) {
this.spinner.stop();
this.spinner = null;
}
}
handleMessage(options) {
this[options.method](...options.args);
}
_log(message) {
console.log(message);
}
table(columns, table) {
// Measure column widths
let colWidths = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = table[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
let row = _step.value;
let i = 0;
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = row[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
let item = _step3.value;
colWidths[i] = Math.max(colWidths[i] || 0, stringWidth(item));
i++;
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
_iterator3.return();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
} // Render rows
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = table[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
let row = _step2.value;
let items = row.map((item, i) => {
// Add padding between columns unless the alignment is the opposite to the
// next column and pad to the column width.
let padding = !columns[i + 1] || columns[i + 1].align === columns[i].align ? 4 : 0;
return pad(item, colWidths[i] + padding, columns[i].align);
});
this.log(items.join(''));
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
}
} // Pad a string with spaces on either side
function pad(text, length, align = 'left') {
let pad = ' '.repeat(length - stringWidth(text));
if (align === 'right') {
return pad + text;
}
return text + pad;
} // Count visible characters in a string
function stringWidth(string) {
return countBreaks(stripAnsi('' + string));
} // If we are in a worker, make a proxy class which will
// send the logger calls to the main process via IPC.
// These are handled in WorkerFarm and directed to handleMessage above.
if (WorkerFarm.isWorker()) {
class LoggerProxy {}
var _iteratorNormalCompletion4 = true;
var _didIteratorError4 = false;
var _iteratorError4 = undefined;
try {
for (var _iterator4 = Object.getOwnPropertyNames(Logger.prototype)[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
let method = _step4.value;
LoggerProxy.prototype[method] = (...args) => {
WorkerFarm.callMaster({
location: __filename,
method,
args
}, false);
};
}
} catch (err) {
_didIteratorError4 = true;
_iteratorError4 = err;
} finally {
try {
if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
_iterator4.return();
}
} finally {
if (_didIteratorError4) {
throw _iteratorError4;
}
}
}
module.exports = new LoggerProxy();
} else {
module.exports = new Logger();
}