103 lines
2.8 KiB
JavaScript
103 lines
2.8 KiB
JavaScript
#!/usr/bin/env node
|
|
import { promises as fs } from "fs";
|
|
import path from "path";
|
|
import { fileURLToPath } from "url";
|
|
import JavaScriptObfuscator from "javascript-obfuscator";
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = path.dirname(__filename);
|
|
const rootDir = path.resolve(__dirname, "..");
|
|
const distDir = path.join(rootDir, "dist");
|
|
|
|
const copyTargets = [
|
|
{ from: path.join(rootDir, "index.js"), to: path.join(distDir, "index.js") },
|
|
{ from: path.join(rootDir, "lib"), to: path.join(distDir, "lib") },
|
|
{ from: path.join(rootDir, "bin"), to: path.join(distDir, "bin") },
|
|
{ from: path.join(rootDir, "package.json"), to: path.join(distDir, "package.json") },
|
|
{ from: path.join(rootDir, "Readme.md"), to: path.join(distDir, "Readme.md") }
|
|
];
|
|
|
|
async function main() {
|
|
await fs.rm(distDir, { recursive: true, force: true });
|
|
await fs.mkdir(distDir, { recursive: true });
|
|
|
|
for (const target of copyTargets) {
|
|
await copy(target.from, target.to);
|
|
}
|
|
|
|
await obfuscateDirectory(distDir);
|
|
console.log("Obfuscated build written to", distDir);
|
|
}
|
|
|
|
async function copy(src, dest) {
|
|
const stat = await fs.stat(src);
|
|
if (stat.isDirectory()) {
|
|
await fs.mkdir(dest, { recursive: true });
|
|
const entries = await fs.readdir(src);
|
|
for (const entry of entries) {
|
|
await copy(path.join(src, entry), path.join(dest, entry));
|
|
}
|
|
return;
|
|
}
|
|
|
|
await fs.copyFile(src, dest);
|
|
}
|
|
|
|
async function obfuscateDirectory(dir) {
|
|
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
await Promise.all(
|
|
entries.map(async entry => {
|
|
const entryPath = path.join(dir, entry.name);
|
|
if (entry.isDirectory()) {
|
|
await obfuscateDirectory(entryPath);
|
|
return;
|
|
}
|
|
|
|
if (entry.isFile() && entry.name.endsWith(".js")) {
|
|
await obfuscateFile(entryPath);
|
|
}
|
|
})
|
|
);
|
|
}
|
|
|
|
async function obfuscateFile(filePath) {
|
|
const original = await fs.readFile(filePath, "utf8");
|
|
const { shebang, body } = extractShebang(original);
|
|
const obfuscated = JavaScriptObfuscator.obfuscate(body, {
|
|
compact: true,
|
|
controlFlowFlattening: true,
|
|
stringArray: true,
|
|
stringArrayEncoding: ["base64"],
|
|
deadCodeInjection: true,
|
|
target: "node",
|
|
identifierNamesGenerator: "hexadecimal"
|
|
});
|
|
|
|
const content = shebang
|
|
? `${shebang}\n${obfuscated.getObfuscatedCode()}`
|
|
: obfuscated.getObfuscatedCode();
|
|
await fs.writeFile(filePath, content, "utf8");
|
|
}
|
|
|
|
function extractShebang(source) {
|
|
if (!source.startsWith("#!")) {
|
|
return { body: source };
|
|
}
|
|
|
|
const newlineIndex = source.indexOf("\n");
|
|
if (newlineIndex === -1) {
|
|
return { shebang: source, body: "" };
|
|
}
|
|
|
|
return {
|
|
shebang: source.slice(0, newlineIndex),
|
|
body: source.slice(newlineIndex + 1)
|
|
};
|
|
}
|
|
|
|
main().catch(err => {
|
|
console.error("Build failed:");
|
|
console.error(err);
|
|
process.exitCode = 1;
|
|
});
|