ObjectPatternPropertiesTransformer.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 { NodeTransformationStage } from '../../enums/node-transformers/NodeTransformationStage';
  8. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  9. import { NodeGuards } from '../../node/NodeGuards';
  10. import { NodeUtils } from '../../node/NodeUtils';
  11. @injectable()
  12. export class ObjectPatternPropertiesTransformer extends AbstractNodeTransformer {
  13. /**
  14. * @param {IRandomGenerator} randomGenerator
  15. * @param {IOptions} options
  16. */
  17. public constructor (
  18. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  19. @inject(ServiceIdentifiers.IOptions) options: IOptions
  20. ) {
  21. super(randomGenerator, options);
  22. }
  23. /**
  24. * @param {NodeTransformationStage} nodeTransformationStage
  25. * @returns {IVisitor | null}
  26. */
  27. public getVisitor (nodeTransformationStage: NodeTransformationStage): IVisitor | null {
  28. switch (nodeTransformationStage) {
  29. case NodeTransformationStage.Converting:
  30. return {
  31. enter: (node: ESTree.Node, parentNode: ESTree.Node | null): ESTree.Node | undefined => {
  32. if (parentNode && NodeGuards.isPropertyNode(node)) {
  33. return this.transformNode(node, parentNode);
  34. }
  35. }
  36. };
  37. default:
  38. return null;
  39. }
  40. }
  41. /**
  42. * replaces:
  43. * const {foo} = bar;
  44. *
  45. * on:
  46. * const {foo: foo} = bar;
  47. *
  48. * @param {Property} propertyNode
  49. * @param {NodeGuards} parentNode
  50. * @returns {NodeGuards}
  51. */
  52. public transformNode (propertyNode: ESTree.Property, parentNode: ESTree.Node): ESTree.Node {
  53. if (!NodeGuards.isObjectPatternNode(parentNode) || !propertyNode.shorthand) {
  54. return propertyNode;
  55. }
  56. propertyNode.shorthand = false;
  57. propertyNode.value = NodeUtils.clone(propertyNode.value);
  58. NodeUtils.parentizeNode(propertyNode.value, parentNode);
  59. return propertyNode;
  60. }
  61. }