NodeTransformersModule.ts 4.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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/node-control-flow-transformers/FunctionControlFlowTransformer';
  6. import { CatchClauseObfuscator } from '../../../node-transformers/node-obfuscators/CatchClauseObfuscator';
  7. import { FunctionDeclarationObfuscator } from '../../../node-transformers/node-obfuscators/FunctionDeclarationObfuscator';
  8. import { FunctionObfuscator } from '../../../node-transformers/node-obfuscators/FunctionObfuscator';
  9. import { LabeledStatementObfuscator } from '../../../node-transformers/node-obfuscators/LabeledStatementObfuscator';
  10. import { LiteralObfuscator } from '../../../node-transformers/node-obfuscators/LiteralObfuscator';
  11. import { MemberExpressionObfuscator } from '../../../node-transformers/node-obfuscators/MemberExpressionObfuscator';
  12. import { MethodDefinitionObfuscator } from '../../../node-transformers/node-obfuscators/MethodDefinitionObfuscator';
  13. import { ObjectExpressionObfuscator } from '../../../node-transformers/node-obfuscators/ObjectExpressionObfuscator';
  14. import { VariableDeclarationObfuscator } from '../../../node-transformers/node-obfuscators/VariableDeclarationObfuscator';
  15. export const nodeTransformersModule: interfaces.ContainerModule = new ContainerModule((bind: interfaces.Bind) => {
  16. // node control flow transformers
  17. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  18. .to(FunctionControlFlowTransformer)
  19. .whenTargetNamed(NodeTransformers.FunctionControlFlowTransformer);
  20. // node obfuscators
  21. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  22. .to(CatchClauseObfuscator)
  23. .whenTargetNamed(NodeTransformers.CatchClauseObfuscator);
  24. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  25. .to(FunctionDeclarationObfuscator)
  26. .whenTargetNamed(NodeTransformers.FunctionDeclarationObfuscator);
  27. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  28. .to(FunctionObfuscator)
  29. .whenTargetNamed(NodeTransformers.FunctionObfuscator);
  30. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  31. .to(LabeledStatementObfuscator)
  32. .whenTargetNamed(NodeTransformers.LabeledStatementObfuscator);
  33. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  34. .to(LiteralObfuscator)
  35. .whenTargetNamed(NodeTransformers.LiteralObfuscator);
  36. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  37. .to(MemberExpressionObfuscator)
  38. .whenTargetNamed(NodeTransformers.MemberExpressionObfuscator);
  39. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  40. .to(MethodDefinitionObfuscator)
  41. .whenTargetNamed(NodeTransformers.MethodDefinitionObfuscator);
  42. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  43. .to(ObjectExpressionObfuscator)
  44. .whenTargetNamed(NodeTransformers.ObjectExpressionObfuscator);
  45. bind<INodeTransformer>(ServiceIdentifiers.INodeTransformer)
  46. .to(VariableDeclarationObfuscator)
  47. .whenTargetNamed(NodeTransformers.VariableDeclarationObfuscator);
  48. // node transformers factory
  49. bind<INodeTransformer[]>(ServiceIdentifiers.Factory__INodeTransformer)
  50. .toFactory<INodeTransformer[]>((context: interfaces.Context) => {
  51. const cache: Map <NodeTransformers, INodeTransformer> = new Map();
  52. return (nodeTransformersMap: Map<string, NodeTransformers[]>) => (nodeType: string) => {
  53. const nodeTransformers: NodeTransformers[] = nodeTransformersMap.get(nodeType) || [];
  54. const instancesArray: INodeTransformer[] = [];
  55. nodeTransformers.forEach((transformer: NodeTransformers) => {
  56. let nodeTransformer: INodeTransformer;
  57. if (cache.has(transformer)) {
  58. nodeTransformer = <INodeTransformer>cache.get(transformer);
  59. } else {
  60. nodeTransformer = context.container.getNamed<INodeTransformer>(
  61. ServiceIdentifiers.INodeTransformer,
  62. transformer
  63. );
  64. cache.set(transformer, nodeTransformer);
  65. }
  66. instancesArray.push(nodeTransformer);
  67. });
  68. return instancesArray;
  69. };
  70. });
  71. });