ObjectExpressionTransformer.ts 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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 { 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. * var object = { PSEUDO: 1 };
  13. *
  14. * on:
  15. * var object = { 'PSEUDO': 1 };
  16. */
  17. @injectable()
  18. export class ObjectExpressionTransformer extends AbstractNodeTransformer {
  19. /**
  20. * @param {IRandomGenerator} randomGenerator
  21. * @param {IOptions} options
  22. */
  23. constructor (
  24. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  25. @inject(ServiceIdentifiers.IOptions) options: IOptions
  26. ) {
  27. super(randomGenerator, options);
  28. }
  29. /**
  30. * @param {Identifier} node
  31. * @returns {Literal}
  32. */
  33. private static transformIdentifierPropertyKey (node: ESTree.Identifier): ESTree.Literal {
  34. return {
  35. type: NodeType.Literal,
  36. value: node.name,
  37. raw: `'${node.name}'`
  38. };
  39. }
  40. /**
  41. * @return {IVisitor}
  42. */
  43. public getVisitor (): IVisitor {
  44. return {
  45. enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
  46. if (parentNode && NodeGuards.isObjectExpressionNode(node)) {
  47. return this.transformNode(node, parentNode);
  48. }
  49. }
  50. };
  51. }
  52. /**
  53. * @param {ObjectExpression} objectExpressionNode
  54. * @param {NodeGuards} parentNode
  55. * @returns {NodeGuards}
  56. */
  57. public transformNode (objectExpressionNode: ESTree.ObjectExpression, parentNode: ESTree.Node): ESTree.Node {
  58. objectExpressionNode.properties
  59. .forEach((property: ESTree.Property) => {
  60. if (property.computed) {
  61. return;
  62. }
  63. if (property.shorthand) {
  64. property.shorthand = false;
  65. }
  66. if (NodeGuards.isIdentifierNode(property.key)) {
  67. property.key = ObjectExpressionTransformer.transformIdentifierPropertyKey(property.key);
  68. }
  69. });
  70. return objectExpressionNode;
  71. }
  72. }