modify-source-webpack-plugin
Version:
Webpack plugin for modifying modules source
109 lines • 4.58 kB
JavaScript
;
exports.__esModule = true;
exports.ModifySourcePlugin = void 0;
var operations_1 = require("./operations");
var validate = require('schema-utils').validate;
var validationSchema = {
type: 'object',
additionalProperties: false,
properties: {
rules: {
type: 'array',
items: {
type: 'object',
additionalProperties: false,
properties: {
test: {
anyOf: [{ "instanceof": 'Function' }, { "instanceof": 'RegExp' }]
},
operations: {
type: 'array',
items: {
type: 'object'
}
}
}
}
},
constants: {
type: 'object'
},
debug: {
type: 'boolean'
}
}
};
var PLUGIN_NAME = 'ModifySourcePlugin';
var ModifySourcePlugin = /** @class */ (function () {
function ModifySourcePlugin(options) {
this.options = options;
validate(validationSchema, options, {
name: PLUGIN_NAME
});
}
ModifySourcePlugin.prototype.apply = function (compiler) {
var _a = this.options, rules = _a.rules, debug = _a.debug, _b = _a.constants, constants = _b === void 0 ? {} : _b;
compiler.hooks.compilation.tap(PLUGIN_NAME, function (compilation) {
var _a;
var modifiedModules = [];
var tapCallback = function (_, normalModule) {
var userRequest = normalModule.userRequest || '';
var startIndex = userRequest.lastIndexOf('!') === -1
? 0
: userRequest.lastIndexOf('!') + 1;
var moduleRequest = userRequest
.substring(startIndex)
.replace(/\\/g, '/');
if (modifiedModules.includes(moduleRequest)) {
return;
}
rules.forEach(function (ruleOptions) {
var _a;
var test = ruleOptions.test;
var isMatched = (function () {
if (typeof test === 'function' && test(normalModule)) {
return true;
}
return test instanceof RegExp && test.test(moduleRequest);
})();
if (isMatched) {
var serializableOperations = (_a = ruleOptions.operations) === null || _a === void 0 ? void 0 : _a.map(function (op) {
return operations_1.Operation.makeSerializable(op);
});
var loader = void 0;
try {
loader = require.resolve('./loader.js');
}
catch (e) {
loader = require.resolve('../build/loader.js');
}
normalModule.loaders.push({
loader: loader,
options: {
moduleRequest: moduleRequest,
operations: serializableOperations,
constants: constants
}
});
modifiedModules.push(moduleRequest);
if (debug) {
// eslint-disable-next-line no-console
console.log("\n[".concat(PLUGIN_NAME, "] Use loader for \"").concat(moduleRequest, "\"."));
}
}
});
};
var NormalModule = (_a = compiler.webpack) === null || _a === void 0 ? void 0 : _a.NormalModule;
var isNormalModuleAvailable = Boolean(NormalModule) && Boolean(NormalModule.getCompilationHooks);
if (isNormalModuleAvailable) {
NormalModule.getCompilationHooks(compilation).beforeLoaders.tap(PLUGIN_NAME, tapCallback);
}
else {
compilation.hooks.normalModuleLoader.tap(PLUGIN_NAME, tapCallback);
}
});
};
return ModifySourcePlugin;
}());
exports.ModifySourcePlugin = ModifySourcePlugin;
//# sourceMappingURL=ModifySourcePlugin.js.map