const pluginCompat = require('./util/plugin-compat');
|
|
const matchTest = (test, source) => {
|
if (Array.isArray(test)) {
|
return test.some(subtest => matchTest(subtest, source));
|
} else if (test instanceof RegExp) {
|
return test.test(source);
|
} else if (typeof test === 'string') {
|
return source.startsWith(test);
|
} else if (typeof test === 'function') {
|
return test(source);
|
}
|
return false;
|
};
|
|
const matchOne = ({ test, include, exclude }, source) => {
|
return (
|
(test ? matchTest(test, source) : true) &&
|
(include ? matchTest(include, source) : true) &&
|
(exclude ? !matchTest(exclude, source) : true)
|
);
|
};
|
|
const matchAny = (test, source) => {
|
if (Array.isArray(test)) {
|
return test.some(subtest => matchOne(subtest, source));
|
}
|
return matchOne(test, source);
|
};
|
|
class ExcludeModulePlugin {
|
constructor(match) {
|
this.match = match;
|
}
|
|
apply(compiler) {
|
const compilerHooks = pluginCompat.hooks(compiler);
|
|
compilerHooks.afterPlugins.tap('HardSource - ExcludeModulePlugin', () => {
|
compilerHooks._hardSourceAfterFreezeModule.tap(
|
'HardSource - ExcludeModulePlugin',
|
(frozen, module, extra) => {
|
if (matchAny(this.match, module.identifier())) {
|
return null;
|
}
|
return frozen;
|
},
|
);
|
});
|
}
|
}
|
|
module.exports = ExcludeModulePlugin;
|