MethodDefinitionTransformer.ts 2.2 KB

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