CodeTransformersRunner.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { inject, injectable } from 'inversify';
  2. import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
  3. import { TCodeTransformerFactory } from '../types/container/code-transformers/TCodeTransformerFactory';
  4. import { TDictionary } from '../types/TDictionary';
  5. import { ICodeTransformer } from '../interfaces/code-transformers/ICodeTransformer';
  6. import { ICodeTransformersRunner } from '../interfaces/code-transformers/ICodeTransformersRunner';
  7. import { ITransformerNamesGroupsBuilder } from '../interfaces/utils/ITransformerNamesGroupsBuilder';
  8. import { CodeTransformer } from '../enums/code-transformers/CodeTransformer';
  9. import { CodeTransformationStage } from '../enums/code-transformers/CodeTransformationStage';
  10. @injectable()
  11. export class CodeTransformersRunner implements ICodeTransformersRunner {
  12. /**
  13. * @type {TCodeTransformerFactory}
  14. */
  15. private readonly codeTransformerFactory: TCodeTransformerFactory;
  16. /**
  17. * @type {ITransformerNamesGroupsBuilder}
  18. */
  19. private readonly codeTransformerNamesGroupsBuilder: ITransformerNamesGroupsBuilder<
  20. CodeTransformer,
  21. ICodeTransformer
  22. >;
  23. /**
  24. * @param {TNodeTransformerFactory} codeTransformerFactory
  25. * @param {ITransformerNamesGroupsBuilder} codeTransformerNamesGroupsBuilder
  26. */
  27. public constructor (
  28. @inject(ServiceIdentifiers.Factory__ICodeTransformer)
  29. codeTransformerFactory: TCodeTransformerFactory,
  30. @inject(ServiceIdentifiers.ICodeTransformerNamesGroupsBuilder)
  31. codeTransformerNamesGroupsBuilder: ITransformerNamesGroupsBuilder<
  32. CodeTransformer,
  33. ICodeTransformer
  34. >,
  35. ) {
  36. this.codeTransformerFactory = codeTransformerFactory;
  37. this.codeTransformerNamesGroupsBuilder = codeTransformerNamesGroupsBuilder;
  38. }
  39. /**
  40. * @param {string} code
  41. * @param {CodeTransformer[]} codeTransformerNames
  42. * @param {CodeTransformationStage} codeTransformationStage
  43. * @returns {string}
  44. */
  45. public transform (
  46. code: string,
  47. codeTransformerNames: CodeTransformer[],
  48. codeTransformationStage: CodeTransformationStage
  49. ): string {
  50. if (!codeTransformerNames.length) {
  51. return code;
  52. }
  53. const normalizedCodeTransformers: TDictionary<ICodeTransformer> =
  54. this.buildNormalizedCodeTransformers(codeTransformerNames, codeTransformationStage);
  55. const codeTransformerNamesGroups: CodeTransformer[][] =
  56. this.codeTransformerNamesGroupsBuilder.build(normalizedCodeTransformers);
  57. for (const nodeTransformerNamesGroup of codeTransformerNamesGroups) {
  58. for (const nodeTransformerName of nodeTransformerNamesGroup) {
  59. const codeTransformer: ICodeTransformer = normalizedCodeTransformers[nodeTransformerName];
  60. code = codeTransformer.transformCode(code, codeTransformationStage);
  61. }
  62. }
  63. return code;
  64. }
  65. /**
  66. * @param {NodeTransformer[]} codeTransformerNames
  67. * @param {NodeTransformationStage} codeTransformationStage
  68. * @returns {TDictionary<INodeTransformer>}
  69. */
  70. private buildNormalizedCodeTransformers (
  71. codeTransformerNames: CodeTransformer[],
  72. codeTransformationStage: CodeTransformationStage
  73. ): TDictionary<ICodeTransformer> {
  74. return codeTransformerNames
  75. .reduce<TDictionary<ICodeTransformer>>(
  76. (acc: TDictionary<ICodeTransformer>, codeTransformerName: CodeTransformer) => {
  77. const codeTransformer: ICodeTransformer = this.codeTransformerFactory(codeTransformerName);
  78. return {
  79. ...acc,
  80. [codeTransformerName]: codeTransformer
  81. };
  82. },
  83. {}
  84. );
  85. }
  86. }