JavaScriptObfuscator.spec.ts 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import { JavaScriptObfuscator } from "../../src/JavaScriptObfuscator";
  2. import { NO_CUSTOM_NODES_PRESET } from "../../src/preset-options/NoCustomNodesPreset";
  3. import {IObfuscationResult} from "../../src/interfaces/IObfuscationResult";
  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 and empty source map if `sourceMapMode` is `inline', () => {
  75. let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscateWithSourceMap(
  76. `var test = 1;`,
  77. Object.assign({}, NO_CUSTOM_NODES_PRESET, {
  78. sourceMapMode: 'inline'
  79. })
  80. );
  81. assert.isOk(obfuscationResult.obfuscatedCode);
  82. assert.isNotOk(obfuscationResult.sourceMap);
  83. });
  84. it('should returns object with empty obfuscated code and empty source map if source code is empty', () => {
  85. let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscateWithSourceMap(
  86. '',
  87. Object.assign({}, NO_CUSTOM_NODES_PRESET)
  88. );
  89. assert.isNotOk(obfuscationResult.obfuscatedCode);
  90. assert.isNotOk(obfuscationResult.sourceMap);
  91. });
  92. });
  93. it('should returns empty string if source code is empty', () => {
  94. assert.isNotOk(
  95. JavaScriptObfuscator.obfuscateWithSourceMap(
  96. '',
  97. Object.assign({}, NO_CUSTOM_NODES_PRESET)
  98. ).obfuscatedCode
  99. );
  100. });
  101. it('should obfuscate simple code with variable inside global scope', () => {
  102. assert.match(
  103. JavaScriptObfuscator.obfuscateWithSourceMap(
  104. `var test = 1;`,
  105. Object.assign({}, NO_CUSTOM_NODES_PRESET)
  106. ).obfuscatedCode,
  107. /^var *test *= *0x\d+;$/
  108. );
  109. });
  110. it('should obfuscate simple code with variable inside block-scope', () => {
  111. assert.match(
  112. JavaScriptObfuscator.obfuscateWithSourceMap(
  113. `(function () {var test = 1;})()`,
  114. Object.assign({}, NO_CUSTOM_NODES_PRESET)
  115. ).obfuscatedCode,
  116. /^\(function *\(\) *\{ *var *_0x[\w]+ *= *0x\d+; *\}(\(\)\)|\)\(\));?$/
  117. );
  118. });
  119. it('should obfuscate simple code with literal variable value', () => {
  120. let pattern: RegExp = /^var _0x(\w){4} *= *\['(\\[x|u]\d+)+'\]; *var *test *= *_0x(\w){4}\[0x0\];$/;
  121. assert.match(
  122. JavaScriptObfuscator.obfuscateWithSourceMap(
  123. `var test = 'abc';`,
  124. Object.assign({}, NO_CUSTOM_NODES_PRESET, {
  125. unicodeArray: true,
  126. unicodeArrayThreshold: 1
  127. })
  128. ).obfuscatedCode,
  129. pattern
  130. );
  131. assert.match(
  132. JavaScriptObfuscator.obfuscateWithSourceMap(
  133. `var test = 'абц';`,
  134. Object.assign({}, NO_CUSTOM_NODES_PRESET, {
  135. unicodeArray: true,
  136. unicodeArrayThreshold: 1
  137. })
  138. ).obfuscatedCode,
  139. pattern
  140. );
  141. });
  142. });
  143. });