UNPKG

@bernhste/obfuscator-io-metro-plugin

Version:

A metro plugin to use javascript-obfuscator library with react-native

63 lines (56 loc) 2.29 kB
const glob = require('glob'); const { mkdirp, readFile, writeFile } = require('fs-extra'); const path = require('path'); var JavaScriptObfuscator = require('javascript-obfuscator'); var convert = require('convert-source-map'); var combine = require('combine-source-map'); var generatedSourceMapLocation = "index.android.bundle.map"; module.exports = async function({ config, filesSrc, filesDest, filteredFileNames, cwd, runConfig }) { console.log({ config, filesSrc, filesDest, filteredFileNames, cwd }); const files = await (new Promise((resolve, reject) => { glob(filesSrc, { cwd }, function (er, files) { if (er) { reject(er); } else { resolve(files); } }) })); const postData = {}; postData.Items = await Promise.all(files.map(async (f) => { return { FileName: f, FileCode: await readFile(`${cwd}/${f}`, 'utf8'), }; })); var sourceMaps = combine.create('index.android.bundle.map'); var offset = { line: 2 }; postData.Items.map((item)=> { sourceMaps = sourceMaps.addFile({source:`${item.FileCode}`,sourceFile:item.FileName},offset); try{ // only obfuscate files which are in scope if(filteredFileNames.includes(item.FileName)){ const obfuscationResult = JavaScriptObfuscator.obfuscate(`${item.FileCode}`, config); item.FileCode = obfuscationResult.getObfuscatedCode(); // item.SourceMap = obfuscationResult.getSourceMap(); } } catch(error){ console.log("Error while obfuscating, Error : ",error); process.exit(-1); } }) sourceMaps = sourceMaps.base64(); var sm = convert.fromBase64(sourceMaps).toJSON(); await Promise.all(postData.Items.map(async (item) => { await mkdirp(`${filesDest}/${path.dirname(item.FileName)}`) await writeFile(`${filesDest}/${item.FileName}`, item.FileCode); })); if(config && config.sourceMap){ generatedSourceMapLocation = runConfig && runConfig.sourceMapLocation ? runConfig.sourceMapLocation : generatedSourceMapLocation; console.log("generating source map ....."); await writeFile(`${generatedSourceMapLocation}`, sm); // generated source map of unobfuscated code console.log(`generated source map file located at ${generatedSourceMapLocation}`); } };