JavaScriptObfuscatorCLI.spec.ts 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. import * as fs from 'fs';
  2. import * as mkdirp from 'mkdirp';
  3. import * as sinon from 'sinon';
  4. import { assert } from 'chai';
  5. import { StdoutWriteMock } from '../../mocks/StdoutWriteMock';
  6. import { JavaScriptObfuscator } from '../../../src/JavaScriptObfuscator';
  7. describe('JavaScriptObfuscatorCLI', function (): void {
  8. let fixturesDirName: string = 'test/fixtures',
  9. fixtureFileName: string = 'sample.js',
  10. fixtureFilePath: string = `${fixturesDirName}/${fixtureFileName}`,
  11. outputDirName: string = 'test/tmp',
  12. outputFileName: string = 'sample-obfuscated.js',
  13. outputFilePath: string = `${outputDirName}/${outputFileName}`;
  14. this.timeout(5000);
  15. describe('run (): void', () => {
  16. before(() => {
  17. mkdirp.sync(outputDirName);
  18. });
  19. describe('--output option is set', () => {
  20. it('should creates file with obfuscated JS code in --output directory', () => {
  21. JavaScriptObfuscator.runCLI([
  22. 'node',
  23. 'javascript-obfuscator',
  24. fixtureFilePath,
  25. '--output',
  26. outputFilePath,
  27. '--compact',
  28. 'true',
  29. '--selfDefending',
  30. '0'
  31. ]);
  32. assert.equal(fs.existsSync(outputFilePath), true);
  33. });
  34. afterEach(() => {
  35. fs.unlinkSync(outputFilePath);
  36. });
  37. });
  38. describe('--output option is not set', () => {
  39. it(`should creates file called \`${outputFileName}\` with obfuscated JS code in \`${fixturesDirName}\` directory`, () => {
  40. let outputFixturesFilePath: string = `${fixturesDirName}/${outputFileName}`;
  41. JavaScriptObfuscator.runCLI([
  42. 'node',
  43. 'javascript-obfuscator',
  44. fixtureFilePath
  45. ]);
  46. assert.equal(fs.existsSync(outputFixturesFilePath), true);
  47. fs.unlinkSync(outputFixturesFilePath);
  48. });
  49. it(`should throw an error if input path is not a valid file path`, () => {
  50. assert.throws(() => JavaScriptObfuscator.runCLI([
  51. 'node',
  52. 'javascript-obfuscator',
  53. 'wrong/file/path'
  54. ]), ReferenceError);
  55. });
  56. it(`should throw an error if input file extension is not a .js extension`, () => {
  57. let outputWrongExtensionFileName: string = 'sample-obfuscated.ts',
  58. outputWrongExtensionFilePath: string = `${outputDirName}/${outputWrongExtensionFileName}`;
  59. fs.writeFileSync(outputWrongExtensionFilePath, 'data');
  60. assert.throws(() => JavaScriptObfuscator.runCLI([
  61. 'node',
  62. 'javascript-obfuscator',
  63. outputWrongExtensionFilePath
  64. ]), ReferenceError);
  65. fs.unlinkSync(outputWrongExtensionFilePath);
  66. });
  67. });
  68. describe('--sourceMap option is set', () => {
  69. let outputSourceMapPath: string = `${outputFilePath}.map`;
  70. describe('--sourceMapMode option is `separate`', () => {
  71. it('should creates file with source map in the same directory as output file', () => {
  72. JavaScriptObfuscator.runCLI([
  73. 'node',
  74. 'javascript-obfuscator',
  75. fixtureFilePath,
  76. '--output',
  77. outputFilePath,
  78. '--compact',
  79. 'true',
  80. '--selfDefending',
  81. '0',
  82. '--sourceMap',
  83. 'true'
  84. ]);
  85. assert.equal(fs.existsSync(outputSourceMapPath), true);
  86. const content: string = fs.readFileSync(outputSourceMapPath, { encoding: 'utf8' }),
  87. sourceMap: any = JSON.parse(content);
  88. assert.property(sourceMap, 'version');
  89. assert.property(sourceMap, 'sources');
  90. assert.property(sourceMap, 'names');
  91. });
  92. it('should creates file with source map in the same directory as output file if `sourceMapBaseUrl` is set', () => {
  93. JavaScriptObfuscator.runCLI([
  94. 'node',
  95. 'javascript-obfuscator',
  96. fixtureFilePath,
  97. '--output',
  98. outputFilePath,
  99. '--compact',
  100. 'true',
  101. '--selfDefending',
  102. '0',
  103. '--sourceMap',
  104. 'true',
  105. '--sourceMapBaseUrl',
  106. 'http://localhost:9000/'
  107. ]);
  108. assert.equal(fs.existsSync(outputSourceMapPath), true);
  109. const content: string = fs.readFileSync(outputSourceMapPath, { encoding: 'utf8' }),
  110. sourceMap: any = JSON.parse(content);
  111. assert.property(sourceMap, 'version');
  112. assert.property(sourceMap, 'sources');
  113. assert.property(sourceMap, 'names');
  114. });
  115. afterEach(() => {
  116. fs.unlinkSync(outputSourceMapPath);
  117. });
  118. });
  119. describe('--sourceMapFileName option is set', () => {
  120. let sourceMapFileName: string = 'test',
  121. sourceMapFilePath: string = `${sourceMapFileName}.js.map`,
  122. outputSourceMapFilePath: string = `${outputDirName}/${sourceMapFilePath}`;
  123. it('should creates source map file with given name in the same directory as output file', () => {
  124. JavaScriptObfuscator.runCLI([
  125. 'node',
  126. 'javascript-obfuscator',
  127. fixtureFilePath,
  128. '--output',
  129. outputFilePath,
  130. '--compact',
  131. 'true',
  132. '--selfDefending',
  133. '0',
  134. '--sourceMap',
  135. 'true',
  136. '--sourceMapFileName',
  137. sourceMapFileName
  138. ]);
  139. assert.equal(fs.existsSync(outputSourceMapFilePath), true);
  140. const content: string = fs.readFileSync(outputSourceMapFilePath, { encoding: 'utf8' }),
  141. sourceMap: any = JSON.parse(content);
  142. assert.property(sourceMap, 'version');
  143. assert.property(sourceMap, 'sources');
  144. assert.property(sourceMap, 'names');
  145. });
  146. afterEach(() => {
  147. fs.unlinkSync(outputSourceMapFilePath);
  148. });
  149. });
  150. describe('--sourceMapMode option is `inline`', () => {
  151. it('shouldn\'t create file with source map if `sourceMapMode` is `inline`', () => {
  152. JavaScriptObfuscator.runCLI([
  153. 'node',
  154. 'javascript-obfuscator',
  155. fixtureFilePath,
  156. '--output',
  157. outputFilePath,
  158. '--compact',
  159. 'true',
  160. '--selfDefending',
  161. '0',
  162. '--sourceMap',
  163. 'true',
  164. '--sourceMapMode',
  165. 'inline'
  166. ]);
  167. assert.equal(fs.existsSync(outputSourceMapPath), false);
  168. });
  169. });
  170. afterEach(() => {
  171. fs.unlinkSync(outputFilePath);
  172. });
  173. });
  174. describe('help output', () => {
  175. let callback: sinon.SinonSpy,
  176. stdoutWriteMock: StdoutWriteMock;
  177. beforeEach(() => {
  178. callback = sinon.spy(console, 'log');
  179. stdoutWriteMock = new StdoutWriteMock(process.stdout.write);
  180. });
  181. it('should print `console.log` help if `--help` option is set', () => {
  182. stdoutWriteMock.mute();
  183. JavaScriptObfuscator.runCLI([
  184. 'node',
  185. 'javascript-obfuscator',
  186. fixtureFilePath,
  187. '--help'
  188. ]);
  189. stdoutWriteMock.restore();
  190. assert.equal(callback.called, true);
  191. });
  192. it('should print `console.log` help if no options is passed', () => {
  193. stdoutWriteMock.mute();
  194. JavaScriptObfuscator.runCLI([
  195. 'node',
  196. 'javascript-obfuscator'
  197. ]);
  198. stdoutWriteMock.restore();
  199. assert.equal(callback.called, true);
  200. });
  201. afterEach(() => {
  202. callback.restore();
  203. });
  204. });
  205. after(() => {
  206. fs.rmdirSync(outputDirName);
  207. });
  208. });
  209. });