UNPKG

anobis

Version:
77 lines (64 loc) 2.54 kB
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'; @injectable() 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 ( @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator, @inject(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; }); } }