hard-source-webpack-plugin
Version:
Hard cache the source of modules in webpack.
134 lines (117 loc) • 3.97 kB
JavaScript
const chalk = require('chalk');
const pluginCompat = require('./util/plugin-compat');
const LOGGER_SEPARATOR = ':';
const DEFAULT_LOGGER_PREFIX = 'hardsource';
const messages = {
'serialization--error-freezing-module': {
short: value =>
`Could not freeze ${value.data.moduleReadable}: ${
value.data.errorMessage
}`,
},
'serialzation--cache-incomplete': {
short: value =>
`Last compilation did not finish saving. Building new cache.`,
},
'confighash--directory-no-confighash': {
short: value => `Config hash skipped in cache directory.`,
},
'confighash--new': {
short: value =>
`Writing new cache ${value.data.configHash.substring(0, 8)}...`,
},
'confighash--reused': {
short: value =>
`Reading from cache ${value.data.configHash.substring(0, 8)}...`,
},
'caches--delete-old': {
short: value =>
`Deleted ${value.data.deletedSizeMB} MB. Using ${
value.data.sizeMB
} MB of disk space.`,
},
'caches--keep': {
short: value => `Using ${value.data.sizeMB} MB of disk space.`,
},
'environment--inputs': {
short: value =>
`Tracking node dependencies with: ${value.data.inputs.join(', ')}.`,
},
'environment--config-changed': {
short: value => 'Configuration changed. Building new cache.',
},
'environment--changed': {
short: value => `Node dependencies changed. Building new cache.`,
},
'environment--hardsource-changed': {
short: value => `hard-source version changed. Building new cache.`,
},
'childcompiler--no-cache': {
once: value =>
`A child compiler has its cache disabled. Skipping child in hard-source.`,
},
'childcompiler--unnamed-cache': {
once: value =>
`A child compiler has unnamed cache. Skipping child in hard-source.`,
},
unrecognized: {
short: value => value.message,
},
};
const logLevels = ['error', 'warn', 'info', 'log', 'debug'];
const levelId = level => logLevels.indexOf(level.toLowerCase());
const compareLevel = (a, b) => levelId(a) - levelId(b);
class ChalkLoggerPlugin {
constructor(options = {}) {
this.options = options;
this.once = {};
// mode: 'test' or 'none'
this.options.mode =
this.options.mode || (process.env.NODE_ENV === 'test' ? 'test' : 'none');
// level: 'error', 'warn', 'info', 'log', 'debug'
this.options.level =
this.options.level || (this.options.mode === 'test' ? 'warn' : 'debug');
}
apply(compiler) {
const compilerHooks = pluginCompat.hooks(compiler);
compilerHooks.hardSourceLog.tap('HardSource - ChalkLoggerPlugin', value => {
if (compareLevel(this.options.level, value.level) < 0) {
return;
}
let headerColor = chalk.white;
let color = chalk.white;
if (value.level === 'error') {
headerColor = chalk.red;
} else if (value.level === 'warn') {
headerColor = chalk.yellow;
} else if (value.level === 'info') {
headerColor = chalk.white;
} else {
headerColor = color = chalk.gray;
}
const header = headerColor(
`[${DEFAULT_LOGGER_PREFIX}${LOGGER_SEPARATOR}${compiler.__hardSource_shortConfigHash ||
value.from}]`,
);
// Always use warn or error so that output goes to stderr.
const consoleFn = value.level === 'error' ? console.error : console.warn;
let handle = messages[value.data.id];
if (!handle) {
handle = messages.unrecognized;
}
if (handle) {
if (handle.once) {
if (!this.once[value.data.id]) {
this.once[value.data.id] = true;
consoleFn.call(console, header, color(handle.once(value)));
}
} else if (handle.short) {
consoleFn.call(console, header, color(handle.short(value)));
}
} else {
consoleFn.call(console, header, color(value.message));
}
});
}
}
module.exports = ChalkLoggerPlugin;