webpack-plugin-obfuscator
Version:
95 lines • 4.84 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var javascript_obfuscator_1 = __importDefault(require("javascript-obfuscator"));
var multimatch_1 = __importDefault(require("multimatch"));
var webpack_sources_1 = require("webpack-sources");
var WebpackObfuscator = /** @class */ (function () {
function WebpackObfuscator(options, includes) {
if (options === void 0) { options = {}; }
this.options = options;
this.obfuscatorFiles = [];
this.includes = [];
this.options = options;
this.includes = this.includes.concat(includes || []);
this.obfuscatorFiles = [];
}
WebpackObfuscator.prototype.apply = function (compiler) {
var _this = this;
var isDevServer = process.argv.find(function (v) { return v.includes('webpack-dev-server'); });
// dev 直接 return
if (isDevServer) {
console.info('JavascriptObfuscator is disabled on webpack-dev-server as the reloading scripts ', 'and the obfuscator can interfere with each other and break the build');
return;
}
var pluginName = this.constructor.name;
compiler.hooks.emit.tap(pluginName, function (compilation) {
var identifiersPrefixCounter = 0;
compilation.chunks.forEach(function (chunk) {
chunk.files.forEach(function (fileName) {
// 非js文件直接 return 或者 满足外面传进来的 inlcude 条件
if (!fileName.toLowerCase().endsWith('.js') || !_this.shouldInclude(fileName)) {
return;
}
var asset = compilation.assets[fileName];
_this.obfuscatorFiles.push(fileName);
// 拿到 source 和 map
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var _a = _this.extractSourceAndSourceMap(asset), inputSource = _a.inputSource, inputSourceMap = _a.inputSourceMap;
// 拿到加密后的代码和对应的 sourcemap
// eslint-disable-next-line @typescript-eslint/no-unused-vars
var _b = _this.obfuscate(inputSource, fileName, identifiersPrefixCounter), obfuscatedSource = _b.obfuscatedSource, obfuscationSourceMap = _b.obfuscationSourceMap;
var assets = compilation.assets;
assets[fileName] = new webpack_sources_1.RawSource(obfuscatedSource);
identifiersPrefixCounter++;
});
});
});
compiler.hooks.done.tap(pluginName, function () {
console.log('加固的文件是: ', _this.obfuscatorFiles);
});
};
WebpackObfuscator.prototype.shouldInclude = function (filePath) {
return (0, multimatch_1.default)(filePath, this.includes).length > 0;
};
WebpackObfuscator.prototype.extractSourceAndSourceMap = function (asset) {
if (asset.sourceAndMap) {
var _a = asset.sourceAndMap(), source = _a.source, map = _a.map;
return {
inputSource: source,
inputSourceMap: map,
};
}
else {
return {
inputSource: asset.source(),
inputSourceMap: asset.map(),
};
}
};
WebpackObfuscator.prototype.obfuscate = function (javascript, fileName, identifiersPrefixCounter) {
// 混淆多个文件,请使用此选项。此选项有助于避免这些文件的全局标识符之间的冲突。每个文件的前缀应该不同。
var obfuscationResult = javascript_obfuscator_1.default.obfuscate(javascript, __assign({ identifiersPrefix: "".concat(WebpackObfuscator.baseIdentifiersPrefix).concat(identifiersPrefixCounter), sourceMapFileName: fileName + '.map' }, this.options));
return {
obfuscatedSource: obfuscationResult.getObfuscatedCode(),
obfuscationSourceMap: obfuscationResult.getSourceMap(),
};
};
// 混淆多个文件,请使用此选项。此选项有助于避免这些文件的全局标识符之间的冲突。每个文件的前缀应该不同。
WebpackObfuscator.baseIdentifiersPrefix = 'a';
return WebpackObfuscator;
}());
module.exports = WebpackObfuscator;
//# sourceMappingURL=index.js.map