AbstractNodeTransformer.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { inject, injectable, postConstruct } from 'inversify';
  2. import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
  3. import * as estraverse from 'estraverse';
  4. import * as ESTree from 'estree';
  5. import { IInitializable } from '../interfaces/IInitializable';
  6. import { INodeTransformer } from '../interfaces/node-transformers/INodeTransformer';
  7. import { IOptions } from '../interfaces/options/IOptions';
  8. import { IRandomGenerator } from '../interfaces/utils/IRandomGenerator';
  9. import { IVisitor } from '../interfaces/node-transformers/IVisitor';
  10. import { initializable } from '../decorators/Initializable';
  11. import { TransformationStage } from '../enums/node-transformers/TransformationStage';
  12. @injectable()
  13. export abstract class AbstractNodeTransformer implements INodeTransformer, IInitializable {
  14. /**
  15. * @type {number}
  16. */
  17. @initializable()
  18. protected nodeIdentifier: number;
  19. /**
  20. * @type {IOptions}
  21. */
  22. protected readonly options: IOptions;
  23. /**
  24. * @type {IRandomGenerator}
  25. */
  26. protected readonly randomGenerator: IRandomGenerator;
  27. /**
  28. * @param {IRandomGenerator} randomGenerator
  29. * @param {IOptions} options
  30. */
  31. constructor (
  32. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  33. @inject(ServiceIdentifiers.IOptions) options: IOptions
  34. ) {
  35. this.randomGenerator = randomGenerator;
  36. this.options = options;
  37. }
  38. @postConstruct()
  39. public initialize (): void {
  40. this.nodeIdentifier = this.randomGenerator.getRandomInteger(0, 10000);
  41. }
  42. /**
  43. * @param {TransformationStage} transformationStage
  44. * @returns {IVisitor | null}
  45. */
  46. public abstract getVisitor (transformationStage: TransformationStage): IVisitor | null;
  47. /**
  48. * @param {Node} node
  49. * @param {Node} parentNode
  50. * @returns {Node | VisitorOption}
  51. */
  52. public abstract transformNode (node: ESTree.Node, parentNode: ESTree.Node): ESTree.Node | estraverse.VisitorOption;
  53. }