IdentifierReplacer.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import { AbstractReplacer } from './AbstractReplacer';
  2. import { Utils } from '../../Utils';
  3. export class IdentifierReplacer extends AbstractReplacer {
  4. /**
  5. * @type {Map<string, string>}
  6. */
  7. private namesMap: Map<string, string> = new Map<string, string>();
  8. /**
  9. * @param nodeValue
  10. * @returns {string}
  11. */
  12. public replace (nodeValue: string): string {
  13. const obfuscatedIdentifierName: string|undefined = this.namesMap.get(nodeValue);
  14. if (!obfuscatedIdentifierName) {
  15. return nodeValue;
  16. }
  17. return obfuscatedIdentifierName;
  18. }
  19. /**
  20. * Store all identifiers names as keys in given `namesMap` with random names as value.
  21. * Reserved names will be ignored.
  22. *
  23. * @param nodeName
  24. */
  25. public storeNames (nodeName: string): void {
  26. if (!this.isReservedName(nodeName)) {
  27. this.namesMap.set(nodeName, Utils.getRandomVariableName());
  28. }
  29. }
  30. /**
  31. * @param name
  32. * @returns {boolean}
  33. */
  34. private isReservedName (name: string): boolean {
  35. return this.options.reservedNames
  36. .some((reservedName: string) => {
  37. return new RegExp(reservedName, 'g').test(name);
  38. });
  39. }
  40. }