anobis
Version:
JavaScript obfuscator
77 lines (64 loc) • 2.54 kB
text/typescript
import { injectable, inject } from 'inversify';
import { ServiceIdentifiers } from '../../../../container/ServiceIdentifiers';
import * as ESTree from 'estree';
import { IIdentifierObfuscatingReplacer } from '../../../../interfaces/node-transformers/obfuscating-transformers/IIdentifierObfuscatingReplacer';
import { IOptions } from '../../../../interfaces/options/IOptions';
import { IRandomGenerator } from '../../../../interfaces/utils/IRandomGenerator';
import { AbstractObfuscatingReplacer } from '../AbstractObfuscatingReplacer';
import { Nodes } from '../../../../node/Nodes';
()
export class BaseIdentifierObfuscatingReplacer extends AbstractObfuscatingReplacer implements IIdentifierObfuscatingReplacer {
/**
* @type {Map<string, string>}
*/
private readonly namesMap: Map<string, string> = new Map();
/**
* @type {IRandomGenerator}
*/
private readonly randomGenerator: IRandomGenerator;
/**
* @param {IRandomGenerator} randomGenerator
* @param {IOptions} options
*/
constructor (
(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
(ServiceIdentifiers.IOptions) options: IOptions
) {
super(options);
this.randomGenerator = randomGenerator;
}
/**
* @param {string} nodeValue
* @param {number} nodeIdentifier
* @returns {Identifier}
*/
public replace (nodeValue: string, nodeIdentifier: number): ESTree.Identifier {
const mapKey: string = `${nodeValue}-${String(nodeIdentifier)}`;
if (this.namesMap.has(mapKey)) {
nodeValue = <string>this.namesMap.get(mapKey);
}
return Nodes.getIdentifierNode(nodeValue);
}
/**
* Store all `nodeIdentifier`'s as keys in given `namesMap` with random names as value.
* Reserved names will be ignored.
*
* @param {string} nodeName
* @param {number} nodeIdentifier
*/
public storeNames (nodeName: string, nodeIdentifier: number): void {
if (!this.isReservedName(nodeName)) {
this.namesMap.set(`${nodeName}-${String(nodeIdentifier)}`, this.randomGenerator.getRandomVariableName(6));
}
}
/**
* @param {string} name
* @returns {boolean}
*/
private isReservedName (name: string): boolean {
return this.options.reservedNames
.some((reservedName: string) => {
return new RegExp(reservedName, 'g').exec(name) !== null;
});
}
}