NodeTransformersModule.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { ContainerModule, interfaces } from 'inversify';
  2. import { ServiceIdentifiers } from '../../ServiceIdentifiers';
  3. import { INodeTransformer } from '../../../interfaces/node-transformers/INodeTransformer';
  4. import { NodeTransformers } from '../../../enums/container/NodeTransformers';
  5. import { FunctionControlFlowTransformer } from '../../../node-transformers/control-flow-transformers/FunctionControlFlowTransformer';
  6. import { BlockStatementControlFlowTransformer } from '../../../node-transformers/control-flow-transformers/BlockStatementControlFlowTransformer';
  7. import { CatchClauseTransformer } from '../../../node-transformers/obfuscating-transformers/CatchClauseTransformer';
  8. import { FunctionDeclarationTransformer } from '../../../node-transformers/obfuscating-transformers/FunctionDeclarationTransformer';
  9. import { FunctionTransformer } from '../../../node-transformers/obfuscating-transformers/FunctionTransformer';
  10. import { LabeledStatementTransformer } from '../../../node-transformers/obfuscating-transformers/LabeledStatementTransformer';
  11. import { LiteralTransformer } from '../../../node-transformers/obfuscating-transformers/LiteralTransformer';
  12. import { MemberExpressionTransformer } from '../../../node-transformers/converting-transformers/MemberExpressionTransformer';
  13. import { MethodDefinitionTransformer } from '../../../node-transformers/converting-transformers/MethodDefinitionTransformer';
  14. import { ObjectExpressionTransformer } from '../../../node-transformers/obfuscating-transformers/ObjectExpressionTransformer';
  15. import { TemplateLiteralTransformer } from '../../../node-transformers/converting-transformers/TemplateLiteralTransformer';
  16. import { VariableDeclarationTransformer } from '../../../node-transformers/obfuscating-transformers/VariableDeclarationTransformer';
  17. export const nodeTransformersModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => {
  18. // control flow transformers
  19. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  20. .to(BlockStatementControlFlowTransformer)
  21. .whenTargetNamed(NodeTransformers.BlockStatementControlFlowTransformer);
  22. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  23. .to(FunctionControlFlowTransformer)
  24. .whenTargetNamed(NodeTransformers.FunctionControlFlowTransformer);
  25. // converting transformers
  26. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  27. .to(MemberExpressionTransformer)
  28. .whenTargetNamed(NodeTransformers.MemberExpressionTransformer);
  29. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  30. .to(MethodDefinitionTransformer)
  31. .whenTargetNamed(NodeTransformers.MethodDefinitionTransformer);
  32. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  33. .to(TemplateLiteralTransformer)
  34. .whenTargetNamed(NodeTransformers.TemplateLiteralTransformer);
  35. // obfuscation transformers
  36. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  37. .to(CatchClauseTransformer)
  38. .whenTargetNamed(NodeTransformers.CatchClauseTransformer);
  39. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  40. .to(FunctionDeclarationTransformer)
  41. .whenTargetNamed(NodeTransformers.FunctionDeclarationTransformer);
  42. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  43. .to(FunctionTransformer)
  44. .whenTargetNamed(NodeTransformers.FunctionTransformer);
  45. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  46. .to(LabeledStatementTransformer)
  47. .whenTargetNamed(NodeTransformers.LabeledStatementTransformer);
  48. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  49. .to(LiteralTransformer)
  50. .whenTargetNamed(NodeTransformers.LiteralTransformer);
  51. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  52. .to(ObjectExpressionTransformer)
  53. .whenTargetNamed(NodeTransformers.ObjectExpressionTransformer);
  54. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  55. .to(VariableDeclarationTransformer)
  56. .whenTargetNamed(NodeTransformers.VariableDeclarationTransformer);
  57. // node transformers factory
  58. bind<INodeTransformer[]>(ServiceIdentifiers.Factory__INodeTransformer)
  59. .toFactory<INodeTransformer[]>((context: interfaces.Context) => {
  60. const cache: Map <NodeTransformers, INodeTransformer> = new Map();
  61. return (nodeTransformersMap: Map<string, NodeTransformers[]>) => (nodeType: string) => {
  62. const nodeTransformers: NodeTransformers[] = nodeTransformersMap.get(nodeType) || [];
  63. const instancesArray: INodeTransformer[] = [];
  64. nodeTransformers.forEach((transformer: NodeTransformers) => {
  65. let nodeTransformer: INodeTransformer;
  66. if (cache.has(transformer)) {
  67. nodeTransformer = <INodeTransformer>cache.get(transformer);
  68. } else {
  69. nodeTransformer = context.container.getNamed<INodeTransformer>(
  70. ServiceIdentifiers.INodeTransformer,
  71. transformer
  72. );
  73. cache.set(transformer, nodeTransformer);
  74. }
  75. instancesArray.push(nodeTransformer);
  76. });
  77. return instancesArray;
  78. };
  79. });
  80. });