AstToEvalCallExpressionTransformer.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 jsStringEscape = require('js-string-escape');
  5. import { IOptions } from '../../interfaces/options/IOptions';
  6. import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
  7. import { IVisitor } from '../../interfaces/node-transformers/IVisitor';
  8. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  9. import { Nodes } from '../../node/Nodes';
  10. import { NodeUtils } from '../../node/NodeUtils';
  11. @injectable()
  12. export class AstToEvalCallExpressionTransformer extends AbstractNodeTransformer {
  13. /**
  14. * @param {IRandomGenerator} randomGenerator
  15. * @param {IOptions} options
  16. */
  17. constructor (
  18. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  19. @inject(ServiceIdentifiers.IOptions) options: IOptions
  20. ) {
  21. super(randomGenerator, options);
  22. }
  23. /**
  24. * @return {IVisitor}
  25. */
  26. public getVisitor (): IVisitor {
  27. return {
  28. enter: (node: ESTree.Node, parentNode: ESTree.Node | null) => {
  29. if (parentNode && node.isEvalRoot) {
  30. return this.transformNode(node, parentNode);
  31. }
  32. }
  33. };
  34. }
  35. /**
  36. * @param {ExpressionStatement} node
  37. * @param {Node} parentNode
  38. * @returns {Node}
  39. */
  40. public transformNode (node: ESTree.Node, parentNode: ESTree.Node): ESTree.Node {
  41. const code: string = NodeUtils.convertStructureToCode([node]);
  42. return Nodes.getCallExpressionNode(
  43. Nodes.getIdentifierNode('eval'),
  44. [
  45. Nodes.getLiteralNode(jsStringEscape(code))
  46. ]
  47. );
  48. }
  49. }