UNPKG

webpack-plugin-obfuscator

Version:
95 lines 4.84 kB
"use strict"; 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