AbstractCustomCodeHelper.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import { inject, injectable } from 'inversify';
  2. import { ServiceIdentifiers } from '../container/ServiceIdentifiers';
  3. import { TIdentifierNamesGeneratorFactory } from '../types/container/generators/TIdentifierNamesGeneratorFactory';
  4. import { TStatement } from '../types/node/TStatement';
  5. import { ICustomCodeHelper } from '../interfaces/custom-code-helpers/ICustomCodeHelper';
  6. import { ICustomCodeHelperFormatter } from '../interfaces/custom-code-helpers/ICustomCodeHelperFormatter';
  7. import { ICustomCodeHelperObfuscator } from '../interfaces/custom-code-helpers/ICustomCodeHelperObfuscator';
  8. import { IIdentifierNamesGenerator } from '../interfaces/generators/identifier-names-generators/IIdentifierNamesGenerator';
  9. import { IOptions } from '../interfaces/options/IOptions';
  10. import { IRandomGenerator } from '../interfaces/utils/IRandomGenerator';
  11. import { GlobalVariableTemplate1 } from './common/templates/GlobalVariableTemplate1';
  12. import { GlobalVariableTemplate2 } from './common/templates/GlobalVariableTemplate2';
  13. @injectable()
  14. export abstract class AbstractCustomCodeHelper <
  15. TInitialData extends unknown[] = unknown[]
  16. > implements ICustomCodeHelper <TInitialData> {
  17. /**
  18. * @type {string[]}
  19. */
  20. private static readonly globalVariableTemplateFunctions: string[] = [
  21. GlobalVariableTemplate1(),
  22. GlobalVariableTemplate2()
  23. ];
  24. /**
  25. * @type {TStatement[] | null}
  26. */
  27. protected cachedNode: TStatement[] | null = null;
  28. /**
  29. * @type {ICustomCodeHelperFormatter}
  30. */
  31. protected readonly customCodeHelperFormatter: ICustomCodeHelperFormatter;
  32. /**
  33. * @type {ICustomCodeHelperObfuscator}
  34. */
  35. protected readonly customCodeHelperObfuscator: ICustomCodeHelperObfuscator;
  36. /**
  37. * @type {IIdentifierNamesGenerator}
  38. */
  39. protected readonly identifierNamesGenerator: IIdentifierNamesGenerator;
  40. /**
  41. * @type {IOptions}
  42. */
  43. protected readonly options: IOptions;
  44. /**
  45. * @type {IRandomGenerator}
  46. */
  47. protected readonly randomGenerator: IRandomGenerator;
  48. /**
  49. * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
  50. * @param {ICustomCodeHelperFormatter} customCodeHelperFormatter
  51. * @param {ICustomCodeHelperObfuscator} customCodeHelperObfuscator
  52. * @param {IRandomGenerator} randomGenerator
  53. * @param {IOptions} options
  54. */
  55. protected constructor (
  56. @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator)
  57. identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory,
  58. @inject(ServiceIdentifiers.ICustomCodeHelperFormatter) customCodeHelperFormatter: ICustomCodeHelperFormatter,
  59. @inject(ServiceIdentifiers.ICustomCodeHelperObfuscator) customCodeHelperObfuscator: ICustomCodeHelperObfuscator,
  60. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  61. @inject(ServiceIdentifiers.IOptions) options: IOptions
  62. ) {
  63. this.identifierNamesGenerator = identifierNamesGeneratorFactory(options);
  64. this.customCodeHelperFormatter = customCodeHelperFormatter;
  65. this.customCodeHelperObfuscator = customCodeHelperObfuscator;
  66. this.randomGenerator = randomGenerator;
  67. this.options = options;
  68. }
  69. /**
  70. * @returns {TStatement[]}
  71. */
  72. public getNode (): TStatement[] {
  73. if (!this.cachedNode) {
  74. const codeHelperTemplate: string = this.getCodeHelperTemplate();
  75. this.cachedNode = this.customCodeHelperFormatter.formatStructure(
  76. this.getNodeStructure(codeHelperTemplate)
  77. );
  78. }
  79. return this.cachedNode;
  80. }
  81. /**
  82. * @returns {string}
  83. */
  84. protected getGlobalVariableTemplate (): string {
  85. return this.randomGenerator
  86. .getRandomGenerator()
  87. .pickone(AbstractCustomCodeHelper.globalVariableTemplateFunctions);
  88. }
  89. /**
  90. * @returns {string}
  91. */
  92. protected getCodeHelperTemplate (): string {
  93. return '';
  94. }
  95. /**
  96. * @param {TInitialData} args
  97. */
  98. public abstract initialize (...args: TInitialData): void;
  99. /**
  100. * @returns {TStatement[]}
  101. */
  102. protected abstract getNodeStructure (codeHelperTemplate: string): TStatement[];
  103. }