CustomCodeHelperFormatter.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { inject, injectable } from 'inversify';
  2. import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
  3. import * as estraverse from 'estraverse';
  4. import * as ESTree from 'estree';
  5. import format from 'string-template';
  6. import { TObject } from '../types/TObject';
  7. import { TStatement } from '../types/node/TStatement';
  8. import { ICustomCodeHelperFormatter } from '../interfaces/custom-code-helpers/ICustomCodeHelperFormatter';
  9. import { IPrevailingKindOfVariablesAnalyzer } from '../interfaces/analyzers/calls-graph-analyzer/IPrevailingKindOfVariablesAnalyzer';
  10. import { NodeGuards } from '../node/NodeGuards';
  11. @injectable()
  12. export class CustomCodeHelperFormatter implements ICustomCodeHelperFormatter {
  13. /**
  14. * @type {ESTree.VariableDeclaration['kind']}
  15. */
  16. private readonly prevailingKindOfVariables: ESTree.VariableDeclaration['kind'];
  17. public constructor (
  18. @inject(ServiceIdentifiers.IPrevailingKindOfVariablesAnalyzer)
  19. prevailingKindOfVariablesAnalyzer: IPrevailingKindOfVariablesAnalyzer
  20. ) {
  21. this.prevailingKindOfVariables = prevailingKindOfVariablesAnalyzer.getPrevailingKind();
  22. }
  23. /**
  24. * @param {string} template
  25. * @param {TMapping} mapping
  26. * @returns {string}
  27. */
  28. public formatTemplate <TMapping extends TObject> (
  29. template: string,
  30. mapping: TMapping
  31. ): string {
  32. return format(template, mapping);
  33. }
  34. /**
  35. * @param {TStatement[]} statements
  36. * @returns {TStatement[]}
  37. */
  38. public formatStructure (statements: TStatement[]): TStatement[] {
  39. for (const statement of statements) {
  40. estraverse.replace(statement, {
  41. enter: (node: ESTree.Node): ESTree.Node | void => {
  42. if (!NodeGuards.isVariableDeclarationNode(node)) {
  43. return;
  44. }
  45. if (this.prevailingKindOfVariables === 'var') {
  46. node.kind = 'var';
  47. }
  48. return node;
  49. }
  50. });
  51. }
  52. return statements;
  53. }
  54. }