JavaScriptObfuscator.spec.ts 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import { IObfuscationResult } from "../../src/interfaces/IObfuscationResult";
  2. import { JavaScriptObfuscator } from "../../src/JavaScriptObfuscator";
  3. import { NO_CUSTOM_NODES_PRESET } from "../../src/preset-options/NoCustomNodesPreset";
  4. const assert: Chai.AssertStatic = require('chai').assert;
  5. describe('JavaScriptObfuscator', () => {
  6. describe('obfuscate (sourceCode: string, customOptions?: IOptionsPreset): string', () => {
  7. it('should returns empty string if source code is empty', () => {
  8. assert.isNotOk(JavaScriptObfuscator.obfuscate('', Object.assign({}, NO_CUSTOM_NODES_PRESET)));
  9. });
  10. it('should obfuscate simple code with variable inside global scope', () => {
  11. assert.match(
  12. JavaScriptObfuscator.obfuscate(
  13. `var test = 1;`,
  14. Object.assign({}, NO_CUSTOM_NODES_PRESET)
  15. ),
  16. /^var *test *= *0x\d+;$/
  17. );
  18. });
  19. it('should obfuscate simple code with variable inside block-scope', () => {
  20. assert.match(
  21. JavaScriptObfuscator.obfuscate(
  22. `(function () {var test = 1;})()`,
  23. Object.assign({}, NO_CUSTOM_NODES_PRESET)
  24. ),
  25. /^\(function *\(\) *\{ *var *_0x[\w]+ *= *0x\d+; *\}(\(\)\)|\)\(\));?$/
  26. );
  27. });
  28. it('should obfuscate simple code with literal variable value', () => {
  29. let pattern: RegExp = /^var _0x(\w){4} *= *\['(\\[x|u]\d+)+'\]; *var *test *= *_0x(\w){4}\[0x0\];$/;
  30. assert.match(
  31. JavaScriptObfuscator.obfuscate(
  32. `var test = 'abc';`,
  33. Object.assign({}, NO_CUSTOM_NODES_PRESET, {
  34. unicodeArray: true,
  35. unicodeArrayThreshold: 1
  36. })
  37. ),
  38. pattern
  39. );
  40. assert.match(
  41. JavaScriptObfuscator.obfuscate(
  42. `var test = 'абц';`,
  43. Object.assign({}, NO_CUSTOM_NODES_PRESET, {
  44. unicodeArray: true,
  45. unicodeArrayThreshold: 1
  46. })
  47. ),
  48. pattern
  49. );
  50. });
  51. });
  52. describe('obfuscateWithSourceMap (sourceCode: string, customOptions?: IOptionsPreset): string', () => {
  53. describe('if `sourceMap` option is `false`', () => {
  54. it('should returns object with obfuscated code and empty source map', () => {
  55. let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscateWithSourceMap(
  56. `var test = 1;`,
  57. Object.assign({}, NO_CUSTOM_NODES_PRESET)
  58. );
  59. assert.isOk(obfuscationResult.obfuscatedCode);
  60. assert.isNotOk(obfuscationResult.sourceMap);
  61. });
  62. });
  63. describe('if `sourceMap` option is `true`', () => {
  64. it('should returns object with obfuscated code and source map', () => {
  65. let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscateWithSourceMap(
  66. `var test = 1;`,
  67. Object.assign({}, NO_CUSTOM_NODES_PRESET, {
  68. sourceMap: true
  69. })
  70. );
  71. assert.isOk(obfuscationResult.obfuscatedCode);
  72. assert.isOk(JSON.parse(obfuscationResult.sourceMap).mappings);
  73. });
  74. it('should returns object with obfuscated code with inline source map and empty `sourceMap` if `sourceMapMode` is `inline', () => {
  75. let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscateWithSourceMap(
  76. `var test = 1;`,
  77. Object.assign({}, NO_CUSTOM_NODES_PRESET, {
  78. sourceMap: true,
  79. sourceMapMode: 'inline'
  80. })
  81. );
  82. assert.isOk(obfuscationResult.obfuscatedCode);
  83. assert.match(
  84. obfuscationResult.obfuscatedCode,
  85. /sourceMappingURL=data:application\/json;base64/
  86. );
  87. assert.isNotOk(obfuscationResult.sourceMap);
  88. });
  89. it('should returns object with empty obfuscated code and source map with empty data if source code is empty', () => {
  90. let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscateWithSourceMap(
  91. '',
  92. Object.assign({}, NO_CUSTOM_NODES_PRESET, {
  93. sourceMap: true
  94. })
  95. );
  96. assert.isNotOk(obfuscationResult.obfuscatedCode);
  97. assert.deepEqual(JSON.parse(obfuscationResult.sourceMap).names, []);
  98. assert.deepEqual(JSON.parse(obfuscationResult.sourceMap).sources, []);
  99. assert.isNotOk(JSON.parse(obfuscationResult.sourceMap).mappings);
  100. });
  101. });
  102. it('should returns empty string if source code is empty', () => {
  103. assert.isNotOk(
  104. JavaScriptObfuscator.obfuscateWithSourceMap(
  105. '',
  106. Object.assign({}, NO_CUSTOM_NODES_PRESET)
  107. ).obfuscatedCode
  108. );
  109. });
  110. it('should obfuscate simple code with variable inside global scope', () => {
  111. assert.match(
  112. JavaScriptObfuscator.obfuscateWithSourceMap(
  113. `var test = 1;`,
  114. Object.assign({}, NO_CUSTOM_NODES_PRESET)
  115. ).obfuscatedCode,
  116. /^var *test *= *0x\d+;$/
  117. );
  118. });
  119. it('should obfuscate simple code with variable inside block-scope', () => {
  120. assert.match(
  121. JavaScriptObfuscator.obfuscateWithSourceMap(
  122. `(function () {var test = 1;})()`,
  123. Object.assign({}, NO_CUSTOM_NODES_PRESET)
  124. ).obfuscatedCode,
  125. /^\(function *\(\) *\{ *var *_0x[\w]+ *= *0x\d+; *\}(\(\)\)|\)\(\));?$/
  126. );
  127. });
  128. it('should obfuscate simple code with literal variable value', () => {
  129. let pattern: RegExp = /^var _0x(\w){4} *= *\['(\\[x|u]\d+)+'\]; *var *test *= *_0x(\w){4}\[0x0\];$/;
  130. assert.match(
  131. JavaScriptObfuscator.obfuscateWithSourceMap(
  132. `var test = 'abc';`,
  133. Object.assign({}, NO_CUSTOM_NODES_PRESET, {
  134. unicodeArray: true,
  135. unicodeArrayThreshold: 1
  136. })
  137. ).obfuscatedCode,
  138. pattern
  139. );
  140. assert.match(
  141. JavaScriptObfuscator.obfuscateWithSourceMap(
  142. `var test = 'абц';`,
  143. Object.assign({}, NO_CUSTOM_NODES_PRESET, {
  144. unicodeArray: true,
  145. unicodeArrayThreshold: 1
  146. })
  147. ).obfuscatedCode,
  148. pattern
  149. );
  150. });
  151. });
  152. });