UNPKG

js-confuser

Version:

JavaScript Obfuscation Tool.

79 lines (62 loc) 1.81 kB
import * as t from "@babel/types"; import { ok } from "assert"; export type LiteralValue = string | number | boolean | undefined | null; export const createLiteral = (value: LiteralValue) => { if (value === null) return t.nullLiteral(); if (value === undefined) return t.identifier("undefined"); switch (typeof value) { case "string": return t.stringLiteral(value); case "number": return numericLiteral(value); case "boolean": return t.booleanLiteral(value); } ok(false); }; /** * Handles both positive and negative numeric literals * @param value * @returns */ export function numericLiteral( value: number ): t.NumericLiteral | t.UnaryExpression { ok(typeof value === "number"); if (value < 0) { return t.unaryExpression("-", t.numericLiteral(-value)); } return t.numericLiteral(value); } export function deepClone(node: t.Node | t.Node[]) { function deepClone(obj) { // Handle non-objects like null, undefined, primitive values, or functions if (obj === null || typeof obj !== "object") { return obj; } // Handle Date if (obj instanceof Date) { return new Date(obj); } // Handle Array if (Array.isArray(obj)) { return obj.map(deepClone); } // Handle Objects const clonedObj = {}; // Handle string and symbol property keys Object.getOwnPropertyNames(obj).forEach((key) => { const value = obj[key]; clonedObj[key] = deepClone(value); }); // Copy simple symbols (Avoid objects = infinite recursion) Object.getOwnPropertySymbols(obj).forEach((symbol) => { const value = obj[symbol]; if (typeof value !== "object") { clonedObj[symbol] = deepClone(value); } }); return clonedObj; } return deepClone(node); }