InversifyContainerFacade.ts 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. import { Container, interfaces } from 'inversify';
  2. import { ServiceIdentifiers } from './ServiceIdentifiers';
  3. import { analyzersModule } from './modules/analyzers/AnalyzersModule';
  4. import { codeTransformersModule } from './modules/code-transformers/CodeTransformersModule';
  5. import { controlFlowTransformersModule } from './modules/node-transformers/ControlFlowTransformersModule';
  6. import { convertingTransformersModule } from './modules/node-transformers/ConvertingTransformersModule';
  7. import { customCodeHelpersModule } from './modules/custom-code-helpers/CustomCodeHelpersModule';
  8. import { customNodesModule } from './modules/custom-nodes/CustomNodesModule';
  9. import { deadCodeInjectionTransformersModule } from './modules/node-transformers/DeadCodeInjectionTransformersModule';
  10. import { finalizingTransformersModule } from './modules/node-transformers/FinalizingTransformersModule';
  11. import { generatorsModule } from './modules/generators/GeneratorsModule';
  12. import { initializingTransformersModule } from './modules/node-transformers/InitializingTransformersModule';
  13. import { nodeModule } from './modules/node/NodeModule';
  14. import { nodeTransformersModule } from './modules/node-transformers/NodeTransformersModule';
  15. import { optionsModule } from './modules/options/OptionsModule';
  16. import { preparingTransformersModule } from './modules/node-transformers/PreparingTransformersModule';
  17. import { renameIdentifiersTransformersModule } from './modules/node-transformers/RenameIdentifiersTransformersModule';
  18. import { renamePropertiesTransformersModule } from './modules/node-transformers/RenamePropertiesTransformersModule';
  19. import { simplifyingTransformersModule } from './modules/node-transformers/SimplifyingTransformersModule';
  20. import { storagesModule } from './modules/storages/StoragesModule';
  21. import { stringArrayTransformersModule } from './modules/node-transformers/StringArrayTransformersModule';
  22. import { utilsModule } from './modules/utils/UtilsModule';
  23. import { TInputOptions } from '../types/options/TInputOptions';
  24. import { ICodeTransformersRunner } from '../interfaces/code-transformers/ICodeTransformersRunner';
  25. import { IInversifyContainerFacade } from '../interfaces/container/IInversifyContainerFacade';
  26. import { IJavaScriptObfuscator } from '../interfaces/IJavaScriptObfsucator';
  27. import { ILogger } from '../interfaces/logger/ILogger';
  28. import { IObfuscationResult } from '../interfaces/source-code/IObfuscationResult';
  29. import { ISourceCode } from '../interfaces/source-code/ISourceCode';
  30. import { INodeTransformersRunner } from '../interfaces/node-transformers/INodeTransformersRunner';
  31. import { CodeTransformersRunner } from '../code-transformers/CodeTransformersRunner';
  32. import { JavaScriptObfuscator } from '../JavaScriptObfuscator';
  33. import { Logger } from '../logger/Logger';
  34. import { NodeTransformersRunner } from '../node-transformers/NodeTransformersRunner';
  35. import { ObfuscationResult } from '../source-code/ObfuscationResult';
  36. import { SourceCode } from '../source-code/SourceCode';
  37. export class InversifyContainerFacade implements IInversifyContainerFacade {
  38. /**
  39. * @type {interfaces.Container}
  40. */
  41. private readonly container: interfaces.Container;
  42. public constructor () {
  43. this.container = new Container();
  44. }
  45. /**
  46. * @param {interfaces.ServiceIdentifier<U>} serviceIdentifier
  47. * @returns {U}
  48. */
  49. public static getFactory <T extends string, U> (
  50. serviceIdentifier: interfaces.ServiceIdentifier<U>
  51. ): (context: interfaces.Context) => (bindingName: T) => U {
  52. return (context: interfaces.Context): (bindingName: T) => U => {
  53. return (bindingName: T): U => {
  54. return context.container.getNamed<U>(serviceIdentifier, bindingName);
  55. };
  56. };
  57. }
  58. /**
  59. * @param {interfaces.ServiceIdentifier<U>} serviceIdentifier
  60. * @returns {U}
  61. */
  62. public static getCacheFactory <T extends string, U> (
  63. serviceIdentifier: interfaces.ServiceIdentifier<U>
  64. ): (context: interfaces.Context) => (bindingName: T) => U {
  65. return (context: interfaces.Context): (bindingName: T) => U => {
  66. const cache: Map <T, U> = new Map();
  67. return (bindingName: T): U => {
  68. if (cache.has(bindingName)) {
  69. return <U>cache.get(bindingName);
  70. }
  71. const object: U = context.container.getNamed<U>(serviceIdentifier, bindingName);
  72. cache.set(bindingName, object);
  73. return object;
  74. };
  75. };
  76. }
  77. /**
  78. * @param {interfaces.ServiceIdentifier<interfaces.Newable<U>>} serviceIdentifier
  79. * @param {interfaces.ServiceIdentifier<interfaces.Newable<Object>>[]} dependencies
  80. * @returns {U}
  81. */
  82. public static getConstructorFactory <T extends string, U> (
  83. serviceIdentifier: interfaces.ServiceIdentifier<interfaces.Newable<U>>,
  84. ...dependencies: interfaces.ServiceIdentifier<interfaces.Newable<Record<string, any>>>[]
  85. ): (context: interfaces.Context) => (bindingName: T) => U {
  86. return (context: interfaces.Context): (bindingName: T) => U => {
  87. const cache: Map<T, interfaces.Newable<U>> = new Map();
  88. const cachedDependencies: Record<string, any>[] = [];
  89. return (bindingName: T): U => {
  90. dependencies.forEach((
  91. dependency: interfaces.ServiceIdentifier<interfaces.Newable<Record<string, any>>>,
  92. index: number
  93. ) => {
  94. if (!cachedDependencies[index]) {
  95. cachedDependencies[index] = context.container.get(dependency);
  96. }
  97. });
  98. if (cache.has(bindingName)) {
  99. return new (<interfaces.Newable<U>>cache.get(bindingName))(...cachedDependencies);
  100. }
  101. const constructor: interfaces.Newable<U> = context.container
  102. .getNamed<interfaces.Newable<U>>(
  103. serviceIdentifier,
  104. bindingName
  105. );
  106. cache.set(bindingName, constructor);
  107. return new constructor(...cachedDependencies);
  108. };
  109. };
  110. }
  111. /**
  112. * @param {interfaces.ServiceIdentifier<T>} serviceIdentifier
  113. * @returns {T}
  114. */
  115. public get <T> (serviceIdentifier: interfaces.ServiceIdentifier<T>): T {
  116. return this.container.get<T>(serviceIdentifier);
  117. }
  118. /**
  119. * @param {interfaces.ServiceIdentifier<T>} serviceIdentifier
  120. * @param {string | number | symbol} named
  121. * @returns {T}
  122. */
  123. public getNamed <T> (serviceIdentifier: interfaces.ServiceIdentifier<T>, named: string | number | symbol): T {
  124. return this.container.getNamed<T>(serviceIdentifier, named);
  125. }
  126. /**
  127. * @param {string} sourceCode
  128. * @param {string} sourceMap
  129. * @param {TInputOptions} options
  130. */
  131. public load (sourceCode: string, sourceMap: string, options: TInputOptions): void {
  132. this.container
  133. .bind<ISourceCode>(ServiceIdentifiers.ISourceCode)
  134. .toDynamicValue(() => new SourceCode(sourceCode, sourceMap))
  135. .inSingletonScope();
  136. this.container
  137. .bind<TInputOptions>(ServiceIdentifiers.TInputOptions)
  138. .toDynamicValue(() => options)
  139. .inSingletonScope();
  140. this.container
  141. .bind<ILogger>(ServiceIdentifiers.ILogger)
  142. .to(Logger)
  143. .inSingletonScope();
  144. this.container
  145. .bind<IJavaScriptObfuscator>(ServiceIdentifiers.IJavaScriptObfuscator)
  146. .to(JavaScriptObfuscator)
  147. .inSingletonScope();
  148. this.container
  149. .bind<ICodeTransformersRunner>(ServiceIdentifiers.ICodeTransformersRunner)
  150. .to(CodeTransformersRunner)
  151. .inSingletonScope();
  152. this.container
  153. .bind<INodeTransformersRunner>(ServiceIdentifiers.INodeTransformersRunner)
  154. .to(NodeTransformersRunner)
  155. .inSingletonScope();
  156. this.container
  157. .bind<IObfuscationResult>(ServiceIdentifiers.IObfuscationResult)
  158. .to(ObfuscationResult);
  159. this.container
  160. .bind<IObfuscationResult>(ServiceIdentifiers.Factory__IObfuscationResult)
  161. .toFactory<IObfuscationResult>((context: interfaces.Context) => {
  162. return (obfuscatedCodeAsString: string, sourceMapAsString: string): IObfuscationResult => {
  163. const obfuscationResult: IObfuscationResult = context.container
  164. .get<IObfuscationResult>(ServiceIdentifiers.IObfuscationResult);
  165. obfuscationResult.initialize(obfuscatedCodeAsString, sourceMapAsString);
  166. return obfuscationResult;
  167. };
  168. });
  169. // modules
  170. this.container.load(analyzersModule);
  171. this.container.load(codeTransformersModule);
  172. this.container.load(controlFlowTransformersModule);
  173. this.container.load(convertingTransformersModule);
  174. this.container.load(customCodeHelpersModule);
  175. this.container.load(customNodesModule);
  176. this.container.load(deadCodeInjectionTransformersModule);
  177. this.container.load(finalizingTransformersModule);
  178. this.container.load(generatorsModule);
  179. this.container.load(initializingTransformersModule);
  180. this.container.load(nodeModule);
  181. this.container.load(nodeTransformersModule);
  182. this.container.load(optionsModule);
  183. this.container.load(preparingTransformersModule);
  184. this.container.load(renameIdentifiersTransformersModule);
  185. this.container.load(renamePropertiesTransformersModule);
  186. this.container.load(simplifyingTransformersModule);
  187. this.container.load(storagesModule);
  188. this.container.load(stringArrayTransformersModule);
  189. this.container.load(utilsModule);
  190. }
  191. public unload (): void {
  192. this.container.unbindAll();
  193. }
  194. }