NodeTransformersModule.ts 4.9 KB

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