ObjectExpressionTransformer.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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 { TransformationStage } from '../../enums/node-transformers/TransformationStage';
  8. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  9. import { NodeFactory } from '../../node/NodeFactory';
  10. import { NodeGuards } from '../../node/NodeGuards';
  11. import { IEscapeSequenceEncoder } from '../../interfaces/utils/IEscapeSequenceEncoder';
  12. /**
  13. * replaces:
  14. * var object = { PSEUDO: 1 };
  15. *
  16. * on:
  17. * var object = { 'PSEUDO': 1 };
  18. */
  19. @injectable()
  20. export class ObjectExpressionTransformer extends AbstractNodeTransformer {
  21. /**
  22. * @type {IEscapeSequenceEncoder}
  23. */
  24. private readonly escapeSequenceEncoder: IEscapeSequenceEncoder;
  25. /**
  26. * @param {IEscapeSequenceEncoder} escapeSequenceEncoder
  27. * @param {IRandomGenerator} randomGenerator
  28. * @param {IOptions} options
  29. */
  30. constructor (
  31. @inject(ServiceIdentifiers.IEscapeSequenceEncoder) escapeSequenceEncoder: IEscapeSequenceEncoder,
  32. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  33. @inject(ServiceIdentifiers.IOptions) options: IOptions
  34. ) {
  35. super(randomGenerator, options);
  36. this.escapeSequenceEncoder = escapeSequenceEncoder;
  37. }
  38. /**
  39. * @param {TransformationStage} transformationStage
  40. * @returns {IVisitor | null}
  41. */
  42. public getVisitor (transformationStage: TransformationStage): IVisitor | null {
  43. switch (transformationStage) {
  44. case TransformationStage.Converting:
  45. return {
  46. enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
  47. if (parentNode && NodeGuards.isObjectExpressionNode(node)) {
  48. return this.transformNode(node, parentNode);
  49. }
  50. }
  51. };
  52. default:
  53. return null;
  54. }
  55. }
  56. /**
  57. * @param {ObjectExpression} objectExpressionNode
  58. * @param {NodeGuards} parentNode
  59. * @returns {NodeGuards}
  60. */
  61. public transformNode (objectExpressionNode: ESTree.ObjectExpression, parentNode: ESTree.Node): ESTree.Node {
  62. objectExpressionNode.properties
  63. .forEach((property: ESTree.Property) => {
  64. if (!property.key) {
  65. return;
  66. }
  67. if (property.computed) {
  68. this.transformComputedProperty(property);
  69. } else {
  70. this.transformBaseProperty(property);
  71. }
  72. });
  73. return objectExpressionNode;
  74. }
  75. /**
  76. * @param {Property} property
  77. */
  78. private transformComputedProperty (property: ESTree.Property): void {
  79. if (!NodeGuards.isLiteralNode(property.key) || !(typeof property.key.value === 'string')) {
  80. return;
  81. }
  82. property.key = NodeFactory.literalNode(this.getPropertyKeyValue(property.key.value));
  83. }
  84. /**
  85. * @param {Property} property
  86. */
  87. private transformBaseProperty (property: ESTree.Property): void {
  88. if (property.shorthand) {
  89. property.shorthand = false;
  90. }
  91. if (!NodeGuards.isIdentifierNode(property.key)) {
  92. return;
  93. }
  94. property.key = NodeFactory.literalNode(this.getPropertyKeyValue(property.key.name));
  95. }
  96. /**
  97. * @param {string} inputValue
  98. * @returns {string}
  99. */
  100. private getPropertyKeyValue (inputValue: string): string {
  101. return this.options.unicodeEscapeSequence
  102. ? this.escapeSequenceEncoder.encode(inputValue, true)
  103. : inputValue;
  104. }
  105. }