JavaScriptObfuscatorFacade.ts 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import 'reflect-metadata';
  2. import { ServiceIdentifiers } from './container/ServiceIdentifiers';
  3. import { TInputOptions } from './types/options/TInputOptions';
  4. import { TObfuscationResultsObject } from './types/TObfuscationResultsObject';
  5. import { TDictionary } from './types/TDictionary';
  6. import { IInversifyContainerFacade } from './interfaces/container/IInversifyContainerFacade';
  7. import { IJavaScriptObfuscator } from './interfaces/IJavaScriptObfsucator';
  8. import { IObfuscatedCode } from './interfaces/source-code/IObfuscatedCode';
  9. import { InversifyContainerFacade } from './container/InversifyContainerFacade';
  10. import { Utils } from './utils/Utils';
  11. class JavaScriptObfuscatorFacade {
  12. /**
  13. * @type {string | undefined}
  14. */
  15. public static version: string = process.env.VERSION ?? 'unknown';
  16. /**
  17. * @param {string} sourceCode
  18. * @param {TInputOptions} inputOptions
  19. * @returns {IObfuscatedCode}
  20. */
  21. public static obfuscate (sourceCode: string, inputOptions: TInputOptions = {}): IObfuscatedCode {
  22. const inversifyContainerFacade: IInversifyContainerFacade = new InversifyContainerFacade();
  23. inversifyContainerFacade.load(sourceCode, '', inputOptions);
  24. const javaScriptObfuscator: IJavaScriptObfuscator = inversifyContainerFacade
  25. .get<IJavaScriptObfuscator>(ServiceIdentifiers.IJavaScriptObfuscator);
  26. const obfuscatedCode: IObfuscatedCode = javaScriptObfuscator.obfuscate(sourceCode);
  27. inversifyContainerFacade.unload();
  28. return obfuscatedCode;
  29. }
  30. /**
  31. * @param {TSourceCodesObject} sourceCodesObject
  32. * @param {TInputOptions} inputOptions
  33. * @returns {TObfuscationResultsObject<TSourceCodesObject>}
  34. */
  35. public static obfuscateMultiple <TSourceCodesObject extends TDictionary<string>> (
  36. sourceCodesObject: TSourceCodesObject,
  37. inputOptions: TInputOptions = {}
  38. ): TObfuscationResultsObject<TSourceCodesObject> {
  39. if (typeof sourceCodesObject !== 'object') {
  40. throw new Error('Source codes object should be a plain object');
  41. }
  42. return Object
  43. .keys(sourceCodesObject)
  44. .reduce(
  45. (
  46. acc: TObfuscationResultsObject<TSourceCodesObject>,
  47. sourceCodeIdentifier: keyof TSourceCodesObject,
  48. index: number
  49. ) => {
  50. const identifiersPrefix: string = Utils.getIdentifiersPrefixForMultipleSources(
  51. inputOptions.identifiersPrefix,
  52. index
  53. );
  54. const sourceCode: string = sourceCodesObject[sourceCodeIdentifier];
  55. const sourceCodeOptions: TInputOptions = {
  56. ...inputOptions,
  57. identifiersPrefix
  58. };
  59. return {
  60. ...acc,
  61. [sourceCodeIdentifier]: JavaScriptObfuscatorFacade.obfuscate(sourceCode, sourceCodeOptions)
  62. };
  63. },
  64. <TObfuscationResultsObject<TSourceCodesObject>>{}
  65. );
  66. }
  67. }
  68. export { JavaScriptObfuscatorFacade as JavaScriptObfuscator };