briq-vite-obfuscator-plugin/index.js

91 lines
3.4 KiB
JavaScript

"use strict";
var javascriptObfuscator = require("javascript-obfuscator");
var fs = require("node:fs");
var path = require("node:path");
let { SourceMapConsumer, SourceMapGenerator } = require("source-map");
function obfuscatorPlugin(obOptions) {
let { excludeChunks, options } = obOptions || {};
return {
name: "vite-plugin-javascript-obfuscator",
enforce: "post",
apply:
(obOptions === null || obOptions === void 0 ? void 0 : obOptions.apply) ||
(() => true),
async writeBundle(output_options, bundle) {
for (let output_file in bundle) {
if (bundle[output_file].type != "chunk") {
continue;
}
let chunk = bundle[output_file];
if (output_file.match(/\.(js|mjs|cjs)$/)) {
if (excludeChunks.indexOf(chunk.name) == -1) {
console.log(
`[briq-vite-obfuscator-plugin] Obfuscating chunk ${chunk.name} (${output_file}) ...`
);
let abs_path = path.join(output_options.dir, output_file);
const obfuscationResult = javascriptObfuscator.obfuscate(
chunk.code,
{
...options,
sourceMapBaseUrl:
"http://localhost:1498/" +
(process.env.PROJECT_NAME || "unknown_project") +
"/" +
(process.env.GIT_COMMIT_SHA || "unknown_commit"),
sourceMapFileName: output_file,
}
);
let code = obfuscationResult.getObfuscatedCode();
fs.writeFileSync(abs_path, code);
console.log(
` Obufuscated file written to ${abs_path}`
);
if (options.sourceMap) {
let smap = obfuscationResult.getSourceMap();
let abs_path_src = path.join(
output_options.dir,
output_file + ".map"
);
// let abs_path_dst = path.join(output_options.dir, 'obf-'+output_file+'.map');
if (smap) {
// leggo source map precedente
let consumer1 = null;
try {
let content = fs.readFileSync(abs_path_src, {
encoding: "utf-8",
});
consumer1 = await new SourceMapConsumer(JSON.parse(content));
} catch (e) {
console.error(
" can't read original source map"
);
}
let write_map = "";
if (consumer1) {
let consumer2 = await new SourceMapConsumer(JSON.parse(smap));
let generator = SourceMapGenerator.fromSourceMap(consumer2);
generator.applySourceMap(consumer1, "sourceMap");
write_map = generator.toString();
} else {
write_map = smap;
}
fs.writeFileSync(abs_path_src, write_map);
console.log(
` Source map written to ${abs_path_src}`
);
}
}
} else {
console.log(
`[briq-vite-obfuscator-plugin] Ignoring chunk ${chunk.name} (explicitly excluded)`
);
}
}
}
},
};
}
module.exports = obfuscatorPlugin;