NumberLiteralObfuscatingReplacer.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { inject, injectable, } from 'inversify';
  2. import { ServiceIdentifiers } from '../../../../container/ServiceIdentifiers';
  3. import * as ESTree from 'estree';
  4. import { IOptions } from '../../../../interfaces/options/IOptions';
  5. import { AbstractObfuscatingReplacer } from '../AbstractObfuscatingReplacer';
  6. import { NodeFactory } from '../../../../node/NodeFactory';
  7. import { NumberUtils } from '../../../../utils/NumberUtils';
  8. import { Utils } from '../../../../utils/Utils';
  9. @injectable()
  10. export class NumberLiteralObfuscatingReplacer extends AbstractObfuscatingReplacer {
  11. /**
  12. * @type {Map<string, string>}
  13. */
  14. private readonly numberLiteralCache: Map <number, string> = new Map();
  15. /**
  16. * @param {IOptions} options
  17. */
  18. constructor (
  19. @inject(ServiceIdentifiers.IOptions) options: IOptions
  20. ) {
  21. super(options);
  22. }
  23. /**
  24. * @param {SimpleLiteral} literalNode
  25. * @returns {Node}
  26. */
  27. public replace (literalNode: ESTree.SimpleLiteral): ESTree.Node {
  28. const literalValue: ESTree.SimpleLiteral['value'] = literalNode.value;
  29. if (typeof literalValue !== 'number') {
  30. throw new Error('`NumberLiteralObfuscatingReplacer` should accept only literals with `number` value');
  31. }
  32. let rawValue: string;
  33. if (this.numberLiteralCache.has(literalValue)) {
  34. rawValue = <string>this.numberLiteralCache.get(literalValue);
  35. } else {
  36. if (!NumberUtils.isCeil(literalValue)) {
  37. rawValue = String(literalValue);
  38. } else {
  39. rawValue = `${Utils.hexadecimalPrefix}${NumberUtils.toHex(literalValue)}`;
  40. }
  41. this.numberLiteralCache.set(literalValue, rawValue);
  42. }
  43. return NodeFactory.literalNode(literalValue, rawValue);
  44. }
  45. }