hard-source-webpack-plugin
Version:
Hard cache the source of modules in webpack.
110 lines (99 loc) • 2.71 kB
JavaScript
const WebpackError = require('webpack/lib/WebpackError');
const ModuleError = require('webpack/lib/ModuleError');
const ModuleWarning = require('webpack/lib/ModuleWarning');
const pluginCompat = require('./util/plugin-compat');
class TransformModuleErrorsPlugin {
apply(compiler) {
let freeze;
let thaw;
let mapFreeze;
let mapThaw;
pluginCompat.tap(
compiler,
'_hardSourceMethods',
'TransformModuleErrorsPlugin',
methods => {
// store = methods.store;
// fetch = methods.fetch;
freeze = methods.freeze;
thaw = methods.thaw;
mapFreeze = methods.mapFreeze;
mapThaw = methods.mapThaw;
},
);
function freezeErrorWarning(
frozen,
{ message, details, originLoc, dependencies, name, loc, constructor },
extra,
) {
return {
constructor: constructor.name,
message: message,
details: details,
originLoc: originLoc,
dependencies:
dependencies && mapFreeze('Dependency', null, dependencies, extra),
name: name,
loc: loc,
};
}
pluginCompat.tap(
compiler,
'_hardSourceFreezeModuleError',
'TransformModuleErrorsPlugin',
freezeErrorWarning,
);
pluginCompat.tap(
compiler,
'_hardSourceFreezeModuleWarning',
'TransformModuleErrorsPlugin',
freezeErrorWarning,
);
function thawError(
ErrorClass,
error,
{ constructor, message, details, originLoc, dependencies, name, loc },
extra,
) {
const module = extra.module;
error = new ErrorClass(module, message);
if (constructor === 'SystemImportDeprecationWarning') {
error = new WebpackError(message);
error.module = module;
}
if (details) {
error.details = details;
}
if (extra.origin) {
error.origin = extra.origin;
}
if (originLoc) {
error.originLoc = originLoc;
}
if (dependencies) {
error.dependencies = mapThaw('Dependency', null, dependencies, extra);
}
if (name) {
error.name = name;
}
if (loc) {
error.loc = loc;
}
return error;
}
pluginCompat.tap(
compiler,
'_hardSourceThawModuleError',
'TransformModuleErrorsPlugin',
(error, frozen, extra) => thawError(ModuleError, error, frozen, extra),
);
pluginCompat.tap(
compiler,
'_hardSourceThawModuleWarning',
'TransformModuleErrorsPlugin',
(warning, frozen, extra) =>
thawError(ModuleWarning, warning, frozen, extra),
);
}
}
module.exports = TransformModuleErrorsPlugin;