MethodDefinitionTransformer.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { injectable, inject } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as ESTree from 'estree';
  4. import { IOptions } from '../../interfaces/options/IOptions';
  5. import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
  6. import { IVisitor } from '../../interfaces/node-transformers/IVisitor';
  7. import { NodeType } from '../../enums/node/NodeType';
  8. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  9. import { NodeGuards } from '../../node/NodeGuards';
  10. /**
  11. * replaces:
  12. * foo () { //... };
  13. *
  14. * on:
  15. * ['foo'] { //... };
  16. *
  17. * Literal node will be obfuscated by LiteralTransformer
  18. */
  19. @injectable()
  20. export class MethodDefinitionTransformer extends AbstractNodeTransformer {
  21. /**
  22. * @type {string[]}
  23. */
  24. private static readonly ignoredNames: string[] = ['constructor'];
  25. /**
  26. * @param {IRandomGenerator} randomGenerator
  27. * @param {IOptions} options
  28. */
  29. constructor (
  30. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  31. @inject(ServiceIdentifiers.IOptions) options: IOptions
  32. ) {
  33. super(randomGenerator, options);
  34. }
  35. /**
  36. * @return {IVisitor}
  37. */
  38. public getVisitor (): IVisitor {
  39. return {
  40. enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
  41. if (NodeGuards.isMethodDefinitionNode(node)) {
  42. return this.transformNode(node, parentNode);
  43. }
  44. }
  45. };
  46. }
  47. /**
  48. * replaces:
  49. * object.identifier = 1;
  50. *
  51. * on:
  52. * object['identifier'] = 1;
  53. *
  54. * and skip:
  55. * object[identifier] = 1;
  56. * Literal node will be obfuscated by LiteralTransformer
  57. *
  58. * @param {MethodDefinition} methodDefinitionNode
  59. * @param {NodeGuards} parentNode
  60. * @returns {NodeGuards}
  61. */
  62. public transformNode (methodDefinitionNode: ESTree.MethodDefinition, parentNode: ESTree.Node): ESTree.Node {
  63. if (
  64. NodeGuards.isIdentifierNode(methodDefinitionNode.key) &&
  65. !MethodDefinitionTransformer.ignoredNames.includes(methodDefinitionNode.key.name) &&
  66. methodDefinitionNode.computed === false
  67. ) {
  68. methodDefinitionNode.computed = true;
  69. methodDefinitionNode.key = {
  70. type: NodeType.Literal,
  71. value: methodDefinitionNode.key.name,
  72. raw: `'${methodDefinitionNode.key.name}'`
  73. };
  74. }
  75. return methodDefinitionNode;
  76. }
  77. }