OptionsNormalizer.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. import { IObfuscatorOptions } from "../interfaces/IObfuscatorOptions";
  2. import { IOptions } from "../interfaces/IOptions";
  3. import { TOptionsNormalizerRule } from "../types/TOptionsNormalizerRule";
  4. import { Utils } from "../Utils";
  5. export class OptionsNormalizer {
  6. /**
  7. * @type {IObfuscatorOptions}
  8. */
  9. private static DISABLED_UNICODE_ARRAY_OPTIONS: IObfuscatorOptions = {
  10. encodeUnicodeLiterals: false,
  11. rotateUnicodeArray: false,
  12. unicodeArray: false,
  13. unicodeArrayThreshold: 0,
  14. wrapUnicodeArrayCalls: false
  15. };
  16. /**
  17. * @type {IObfuscatorOptions}
  18. */
  19. private static ENCODE_UNICODE_LITERALS_OPTIONS: IObfuscatorOptions = {
  20. encodeUnicodeLiterals: true,
  21. wrapUnicodeArrayCalls: true
  22. };
  23. /**
  24. * @type {IObfuscatorOptions}
  25. */
  26. private static SELF_DEFENDING_OPTIONS: IObfuscatorOptions = {
  27. compact: true,
  28. selfDefending: true
  29. };
  30. /**
  31. * @type {TOptionsNormalizerRule[]}
  32. */
  33. private static normalizerRules: TOptionsNormalizerRule[] = [
  34. OptionsNormalizer.domainLockRule,
  35. OptionsNormalizer.unicodeArrayRule,
  36. OptionsNormalizer.unicodeArrayThresholdRule,
  37. OptionsNormalizer.encodeUnicodeLiteralsRule,
  38. OptionsNormalizer.sourceMapBaseUrl,
  39. OptionsNormalizer.sourceMapFileName,
  40. OptionsNormalizer.selfDefendingRule
  41. ];
  42. /**
  43. * @param options
  44. * @returns {IOptions}
  45. */
  46. public static normalizeOptions (options: IOptions): IOptions {
  47. let normalizedOptions: IOptions = Object.assign({}, options);
  48. for (let normalizerRule of OptionsNormalizer.normalizerRules) {
  49. normalizedOptions = normalizerRule(normalizedOptions);
  50. }
  51. return normalizedOptions;
  52. }
  53. /**
  54. * @param options
  55. * @returns {IOptions}
  56. */
  57. private static domainLockRule (options: IOptions): IOptions {
  58. if (options.domainLock.length) {
  59. let normalizedDomains: string[] = [];
  60. for (let domain of options.domainLock) {
  61. normalizedDomains.push(Utils.extractDomainFromUrl(domain));
  62. }
  63. Object.assign(options, {
  64. domainLock: normalizedDomains
  65. });
  66. }
  67. return options;
  68. }
  69. /**
  70. * @param options
  71. * @returns {IOptions}
  72. */
  73. private static encodeUnicodeLiteralsRule (options: IOptions): IOptions {
  74. if (options.unicodeArray && options.encodeUnicodeLiterals) {
  75. Object.assign(options, OptionsNormalizer.ENCODE_UNICODE_LITERALS_OPTIONS);
  76. }
  77. return options;
  78. }
  79. /**
  80. * @param options
  81. * @returns {IOptions}
  82. */
  83. private static selfDefendingRule (options: IOptions): IOptions {
  84. if (options.selfDefending) {
  85. Object.assign(options, OptionsNormalizer.SELF_DEFENDING_OPTIONS);
  86. }
  87. return options;
  88. }
  89. /**
  90. * @param options
  91. * @returns {IOptions}
  92. */
  93. private static sourceMapBaseUrl (options: IOptions): IOptions {
  94. let sourceMapBaseUrl: string = options.sourceMapBaseUrl;
  95. if (!options.sourceMapFileName) {
  96. Object.assign(options, {
  97. sourceMapBaseUrl: ''
  98. });
  99. return options;
  100. }
  101. if (sourceMapBaseUrl && !sourceMapBaseUrl.endsWith('/')) {
  102. Object.assign(options, {
  103. sourceMapBaseUrl: `${sourceMapBaseUrl}/`
  104. });
  105. }
  106. return options;
  107. }
  108. /**
  109. * @param options
  110. * @returns {IOptions}
  111. */
  112. private static sourceMapFileName (options: IOptions): IOptions {
  113. let sourceMapFileName: string = options.sourceMapFileName;
  114. if (sourceMapFileName) {
  115. sourceMapFileName = sourceMapFileName
  116. .replace(/^\/+/, '')
  117. .split('.')[0];
  118. Object.assign(options, {
  119. sourceMapFileName: `${sourceMapFileName}.js.map`
  120. });
  121. }
  122. return options;
  123. }
  124. /**
  125. * @param options
  126. * @returns {IOptions}
  127. */
  128. private static unicodeArrayRule (options: IOptions): IOptions {
  129. if (!options.unicodeArray) {
  130. Object.assign(options, OptionsNormalizer.DISABLED_UNICODE_ARRAY_OPTIONS);
  131. }
  132. return options;
  133. }
  134. /**
  135. * @param options
  136. * @returns {IOptions}
  137. */
  138. private static unicodeArrayThresholdRule (options: IOptions): IOptions {
  139. if (options.unicodeArrayThreshold === 0) {
  140. Object.assign(options, OptionsNormalizer.DISABLED_UNICODE_ARRAY_OPTIONS);
  141. }
  142. return options;
  143. }
  144. }