JavaScriptObfuscatorCLI.spec.ts 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841
  1. import * as fs from 'fs';
  2. import * as mkdirp from 'mkdirp';
  3. import * as rimraf from 'rimraf';
  4. import * as sinon from 'sinon';
  5. import { assert } from 'chai';
  6. import { StdoutWriteMock } from '../../mocks/StdoutWriteMock';
  7. import { JavaScriptObfuscator } from '../../../src/JavaScriptObfuscatorFacade';
  8. describe('JavaScriptObfuscatorCLI', function (): void {
  9. this.timeout(100000);
  10. const expectedError: RegExp = /Given input path must be a valid/;
  11. const fixturesDirName: string = 'test/fixtures';
  12. const fixtureFileName: string = 'sample.js';
  13. const fixtureFilePath: string = `${fixturesDirName}/${fixtureFileName}`;
  14. const outputDirName: string = 'test/tmp';
  15. const outputFileName: string = 'sample-obfuscated.js';
  16. const outputFilePath: string = `${outputDirName}/${outputFileName}`;
  17. const configDirName: string = 'test/fixtures';
  18. const configFileName: string = 'config.js';
  19. const configFilePath: string = `${configDirName}/${configFileName}`;
  20. describe('run (): void', () => {
  21. before(() => {
  22. mkdirp.sync(outputDirName);
  23. });
  24. describe('Variant #1: obfuscation of single file', () => {
  25. describe('`--output` option is set', () => {
  26. let isFileExist: boolean;
  27. before(() => {
  28. JavaScriptObfuscator.runCLI([
  29. 'node',
  30. 'javascript-obfuscator',
  31. fixtureFilePath,
  32. '--output',
  33. outputFilePath,
  34. '--compact',
  35. 'true',
  36. '--self-defending',
  37. '0'
  38. ]);
  39. isFileExist = fs.existsSync(outputFilePath);
  40. });
  41. it('should create file with obfuscated code in `--output` directory', () => {
  42. assert.equal(isFileExist, true);
  43. });
  44. after(() => {
  45. fs.unlinkSync(outputFilePath);
  46. });
  47. });
  48. describe('`--output` option isn\'t set', () => {
  49. describe('Variant #1: default behaviour', () => {
  50. let outputFixturesFilePath: string,
  51. isFileExist: boolean;
  52. before(() => {
  53. outputFixturesFilePath = `${fixturesDirName}/${outputFileName}`;
  54. JavaScriptObfuscator.runCLI([
  55. 'node',
  56. 'javascript-obfuscator',
  57. fixtureFilePath
  58. ]);
  59. isFileExist = fs.existsSync(outputFixturesFilePath);
  60. });
  61. it(`should create file \`${outputFileName}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
  62. assert.equal(isFileExist, true);
  63. });
  64. after(() => {
  65. fs.unlinkSync(outputFixturesFilePath);
  66. });
  67. });
  68. describe('Variant #2: invalid input file path', () => {
  69. let testFunc: () => void;
  70. before(() => {
  71. testFunc = () => JavaScriptObfuscator.runCLI([
  72. 'node',
  73. 'javascript-obfuscator',
  74. 'wrong/file/path'
  75. ]);
  76. });
  77. it(`should throw an error`, () => {
  78. assert.throws(testFunc, expectedError);
  79. });
  80. });
  81. describe('Variant #3: input file extension isn\'t `.js`', () => {
  82. const expectedError: RegExp = /Given input path must be a valid/;
  83. const outputFileName: string = 'sample-obfuscated.ts';
  84. const outputFilePath: string = `${outputDirName}/${outputFileName}`;
  85. let testFunc: () => void;
  86. before(() => {
  87. fs.writeFileSync(outputFilePath, 'data');
  88. testFunc = () => JavaScriptObfuscator.runCLI([
  89. 'node',
  90. 'javascript-obfuscator',
  91. outputFilePath
  92. ]);
  93. });
  94. it(`should throw an error`, () => {
  95. assert.throws(testFunc, expectedError);
  96. });
  97. after(() => {
  98. fs.unlinkSync(outputFilePath);
  99. });
  100. });
  101. });
  102. describe('--exclude option', () => {
  103. describe('Variant #1: --exclude option is pointed on different file', () => {
  104. let isFileExist: boolean;
  105. before(() => {
  106. JavaScriptObfuscator.runCLI([
  107. 'node',
  108. 'javascript-obfuscator',
  109. fixtureFilePath,
  110. '--output',
  111. outputFilePath,
  112. '--exclude',
  113. '**/foo.js'
  114. ]);
  115. isFileExist = fs.existsSync(outputFilePath);
  116. });
  117. it('should create file with obfuscated code in `--output` directory', () => {
  118. assert.equal(isFileExist, true);
  119. });
  120. });
  121. describe('Variant #2: --exclude option is pointed on input file', () => {
  122. let testFunc: () => void;
  123. before(() => {
  124. testFunc = () => JavaScriptObfuscator.runCLI([
  125. 'node',
  126. 'javascript-obfuscator',
  127. fixtureFilePath,
  128. '--output',
  129. outputFilePath,
  130. '--exclude',
  131. '**/sample.js'
  132. ]);
  133. });
  134. it('should throw an error', () => {
  135. assert.throws(testFunc, expectedError);
  136. });
  137. after(() => {
  138. fs.unlinkSync(outputFilePath);
  139. });
  140. });
  141. });
  142. });
  143. describe('Variant #2: obfuscation of directory', () => {
  144. describe(`Variant #1: default behaviour`, () => {
  145. const directoryPath: string = `${fixturesDirName}/directory-obfuscation`;
  146. const outputFileName1: string = 'foo-obfuscated.js';
  147. const outputFileName2: string = 'bar-obfuscated.js';
  148. const outputFileName3: string = 'baz-obfuscated.js';
  149. const readFileEncoding: string = 'utf8';
  150. const regExp1: RegExp = /^var *a1_0x(\w){4,6} *= *0x1;$/;
  151. const regExp2: RegExp = /^var *a0_0x(\w){4,6} *= *0x2;$/;
  152. let outputFixturesFilePath1: string,
  153. outputFixturesFilePath2: string,
  154. outputFixturesFilePath3: string,
  155. isFileExist1: boolean,
  156. isFileExist2: boolean,
  157. isFileExist3: boolean,
  158. fileContent1: string,
  159. fileContent2: string;
  160. before(() => {
  161. outputFixturesFilePath1 = `${directoryPath}/${outputFileName1}`;
  162. outputFixturesFilePath2 = `${directoryPath}/${outputFileName2}`;
  163. outputFixturesFilePath3 = `${directoryPath}/${outputFileName3}`;
  164. JavaScriptObfuscator.runCLI([
  165. 'node',
  166. 'javascript-obfuscator',
  167. directoryPath,
  168. '--rename-globals',
  169. 'true'
  170. ]);
  171. isFileExist1 = fs.existsSync(outputFixturesFilePath1);
  172. isFileExist2 = fs.existsSync(outputFixturesFilePath2);
  173. isFileExist3 = fs.existsSync(outputFixturesFilePath3);
  174. fileContent1 = fs.readFileSync(outputFixturesFilePath1, readFileEncoding);
  175. fileContent2 = fs.readFileSync(outputFixturesFilePath2, readFileEncoding);
  176. });
  177. it(`should create file \`${outputFileName1}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
  178. assert.equal(isFileExist1, true);
  179. });
  180. it(`should create file \`${outputFileName2}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
  181. assert.equal(isFileExist2, true);
  182. });
  183. it(`shouldn't create file \`${outputFileName3}\` in \`${fixturesDirName}\` directory`, () => {
  184. assert.equal(isFileExist3, false);
  185. });
  186. it(`match #1: should create file with obfuscated code with prefixed identifier`, () => {
  187. assert.match(fileContent1, regExp1);
  188. });
  189. it(`match #2: should create file with obfuscated code with prefixed identifier`, () => {
  190. assert.match(fileContent2, regExp2);
  191. });
  192. after(() => {
  193. rimraf.sync(outputFixturesFilePath1);
  194. rimraf.sync(outputFixturesFilePath2);
  195. });
  196. });
  197. describe('Variant #2: obfuscation of directory with `identifiersPrefix` option value', () => {
  198. const directoryPath: string = `${fixturesDirName}/directory-obfuscation`;
  199. const identifiersPrefix: string = 'foo';
  200. const outputFileName1: string = 'foo-obfuscated.js';
  201. const outputFileName2: string = 'bar-obfuscated.js';
  202. const readFileEncoding: string = 'utf8';
  203. const regExp1: RegExp = /^var *foo1_0x(\w){4,6} *= *0x1;$/;
  204. const regExp2: RegExp = /^var *foo0_0x(\w){4,6} *= *0x2;$/;
  205. let outputFixturesFilePath1: string,
  206. outputFixturesFilePath2: string,
  207. isFileExist1: boolean,
  208. isFileExist2: boolean,
  209. fileContent1: string,
  210. fileContent2: string;
  211. before(() => {
  212. outputFixturesFilePath1 = `${directoryPath}/${outputFileName1}`;
  213. outputFixturesFilePath2 = `${directoryPath}/${outputFileName2}`;
  214. JavaScriptObfuscator.runCLI([
  215. 'node',
  216. 'javascript-obfuscator',
  217. directoryPath,
  218. '--identifiers-prefix',
  219. identifiersPrefix,
  220. '--rename-globals',
  221. 'true'
  222. ]);
  223. isFileExist1 = fs.existsSync(outputFixturesFilePath1);
  224. isFileExist2 = fs.existsSync(outputFixturesFilePath2);
  225. fileContent1 = fs.readFileSync(outputFixturesFilePath1, readFileEncoding);
  226. fileContent2 = fs.readFileSync(outputFixturesFilePath2, readFileEncoding);
  227. });
  228. it(`should create file \`${outputFileName1}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
  229. assert.equal(isFileExist1, true);
  230. });
  231. it(`should create file \`${outputFileName2}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
  232. assert.equal(isFileExist2, true);
  233. });
  234. it(`match #1: should create file with obfuscated code with prefixed identifier`, () => {
  235. assert.match(fileContent1, regExp1);
  236. });
  237. it(`match #2: should create file with obfuscated code with prefixed identifier`, () => {
  238. assert.match(fileContent2, regExp2);
  239. });
  240. after(() => {
  241. rimraf.sync(outputFixturesFilePath1);
  242. rimraf.sync(outputFixturesFilePath2);
  243. });
  244. });
  245. describe('Variant #3: obfuscation of directory with `output` option', () => {
  246. const directoryPath: string = `${fixturesDirName}/directory-obfuscation`;
  247. const outputDirectoryName: string = 'obfuscated';
  248. const outputDirectoryPath: string = `${directoryPath}/${outputDirectoryName}`;
  249. const outputFileName1: string = 'foo.js';
  250. const outputFileName2: string = 'bar.js';
  251. const outputFileName3: string = 'baz.js';
  252. let outputFixturesFilePath1: string,
  253. outputFixturesFilePath2: string,
  254. outputFixturesFilePath3: string,
  255. isFileExist1: boolean,
  256. isFileExist2: boolean,
  257. isFileExist3: boolean;
  258. before(() => {
  259. outputFixturesFilePath1 = `${outputDirectoryPath}/${directoryPath}/${outputFileName1}`;
  260. outputFixturesFilePath2 = `${outputDirectoryPath}/${directoryPath}/${outputFileName2}`;
  261. outputFixturesFilePath3 = `${outputDirectoryPath}/${directoryPath}/${outputFileName3}`;
  262. JavaScriptObfuscator.runCLI([
  263. 'node',
  264. 'javascript-obfuscator',
  265. directoryPath,
  266. '--output',
  267. outputDirectoryPath
  268. ]);
  269. isFileExist1 = fs.existsSync(outputFixturesFilePath1);
  270. isFileExist2 = fs.existsSync(outputFixturesFilePath2);
  271. isFileExist3 = fs.existsSync(outputFixturesFilePath3);
  272. });
  273. it(
  274. `should create file \`${outputFileName1}\` with obfuscated code in ` +
  275. `\`${fixturesDirName}/${outputDirectoryName}\` directory`,
  276. () => {
  277. assert.equal(isFileExist1, true);
  278. }
  279. );
  280. it(
  281. `should create file \`${outputFileName2}\` with obfuscated code in ` +
  282. `\`${fixturesDirName}/${outputDirectoryName}\` directory`,
  283. () => {
  284. assert.equal(isFileExist2, true);
  285. }
  286. );
  287. it(
  288. `shouldn't create file \`${outputFileName3}\` in ` +
  289. `\`${fixturesDirName}/${outputDirectoryName}\` directory`,
  290. () => {
  291. assert.equal(isFileExist3, false);
  292. }
  293. );
  294. after(() => {
  295. rimraf.sync(outputDirectoryPath);
  296. });
  297. });
  298. describe('Variant #4: --exclude option', () => {
  299. describe('Variant #1: --exclude option is pointed on different file', () => {
  300. const directoryPath: string = `${fixturesDirName}/directory-obfuscation`;
  301. const outputFileName1: string = 'foo-obfuscated.js';
  302. const outputFileName2: string = 'bar-obfuscated.js';
  303. const outputFileName3: string = 'baz-obfuscated.js';
  304. const readFileEncoding: string = 'utf8';
  305. const regExp1: RegExp = /^var *a1_0x(\w){4,6} *= *0x1;$/;
  306. const regExp2: RegExp = /^var *a0_0x(\w){4,6} *= *0x2;$/;
  307. let outputFixturesFilePath1: string,
  308. outputFixturesFilePath2: string,
  309. outputFixturesFilePath3: string,
  310. isFileExist1: boolean,
  311. isFileExist2: boolean,
  312. isFileExist3: boolean,
  313. fileContent1: string,
  314. fileContent2: string;
  315. before(() => {
  316. outputFixturesFilePath1 = `${directoryPath}/${outputFileName1}`;
  317. outputFixturesFilePath2 = `${directoryPath}/${outputFileName2}`;
  318. outputFixturesFilePath3 = `${directoryPath}/${outputFileName3}`;
  319. JavaScriptObfuscator.runCLI([
  320. 'node',
  321. 'javascript-obfuscator',
  322. directoryPath,
  323. '--exclude',
  324. '**/bark.js',
  325. '--rename-globals',
  326. 'true'
  327. ]);
  328. isFileExist1 = fs.existsSync(outputFixturesFilePath1);
  329. isFileExist2 = fs.existsSync(outputFixturesFilePath2);
  330. isFileExist3 = fs.existsSync(outputFixturesFilePath3);
  331. fileContent1 = fs.readFileSync(outputFixturesFilePath1, readFileEncoding);
  332. fileContent2 = fs.readFileSync(outputFixturesFilePath2, readFileEncoding);
  333. });
  334. it(`should create file \`${outputFileName1}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
  335. assert.equal(isFileExist1, true);
  336. });
  337. it(`should create file \`${outputFileName2}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
  338. assert.equal(isFileExist2, true);
  339. });
  340. it(`shouldn't create file \`${outputFileName3}\` in \`${fixturesDirName}\` directory`, () => {
  341. assert.equal(isFileExist3, false);
  342. });
  343. it(`match #1: should create file with obfuscated code with prefixed identifier`, () => {
  344. assert.match(fileContent1, regExp1);
  345. });
  346. it(`match #2: should create file with obfuscated code with prefixed identifier`, () => {
  347. assert.match(fileContent2, regExp2);
  348. });
  349. after(() => {
  350. rimraf.sync(outputFixturesFilePath1);
  351. rimraf.sync(outputFixturesFilePath2);
  352. });
  353. });
  354. describe('Variant #2: --exclude option is pointed on file under obfuscating directory', () => {
  355. const directoryPath: string = `${fixturesDirName}/directory-obfuscation`;
  356. const outputFileName1: string = 'foo-obfuscated.js';
  357. const outputFileName2: string = 'bar-obfuscated.js';
  358. const outputFileName3: string = 'baz-obfuscated.js';
  359. const readFileEncoding: string = 'utf8';
  360. const regExp1: RegExp = /^var *a0_0x(\w){4,6} *= *0x2;$/;
  361. let outputFixturesFilePath1: string,
  362. outputFixturesFilePath2: string,
  363. outputFixturesFilePath3: string,
  364. isFileExist1: boolean,
  365. isFileExist2: boolean,
  366. isFileExist3: boolean,
  367. fileContent1: string;
  368. before(() => {
  369. outputFixturesFilePath1 = `${directoryPath}/${outputFileName1}`;
  370. outputFixturesFilePath2 = `${directoryPath}/${outputFileName2}`;
  371. outputFixturesFilePath3 = `${directoryPath}/${outputFileName3}`;
  372. JavaScriptObfuscator.runCLI([
  373. 'node',
  374. 'javascript-obfuscator',
  375. directoryPath,
  376. '--exclude',
  377. '**/foo.js',
  378. '--rename-globals',
  379. 'true'
  380. ]);
  381. isFileExist1 = fs.existsSync(outputFixturesFilePath1);
  382. isFileExist2 = fs.existsSync(outputFixturesFilePath2);
  383. isFileExist3 = fs.existsSync(outputFixturesFilePath3);
  384. fileContent1 = fs.readFileSync(outputFixturesFilePath2, readFileEncoding);
  385. });
  386. it(`shouldn't create file \`${outputFileName1}\` in \`${fixturesDirName}\` directory`, () => {
  387. assert.equal(isFileExist1, false);
  388. });
  389. it(`should create file \`${outputFileName2}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
  390. assert.equal(isFileExist2, true);
  391. });
  392. it(`shouldn't create file \`${outputFileName3}\` in \`${fixturesDirName}\` directory`, () => {
  393. assert.equal(isFileExist3, false);
  394. });
  395. it(`match #1: should create file with obfuscated code with prefixed identifier`, () => {
  396. assert.match(fileContent1, regExp1);
  397. });
  398. after(() => {
  399. rimraf.sync(outputFixturesFilePath1);
  400. rimraf.sync(outputFixturesFilePath2);
  401. });
  402. });
  403. });
  404. });
  405. describe('`--sourceMap` option is set', () => {
  406. const outputSourceMapPath: string = `${outputFilePath}.map`;
  407. describe('Variant #1: `--sourceMapMode` option value is `separate`', () => {
  408. describe('Variant #1: default behaviour', () => {
  409. let isFileExist: boolean,
  410. sourceMapObject: any;
  411. before(() => {
  412. JavaScriptObfuscator.runCLI([
  413. 'node',
  414. 'javascript-obfuscator',
  415. fixtureFilePath,
  416. '--output',
  417. outputFilePath,
  418. '--compact',
  419. 'true',
  420. '--self-defending',
  421. '0',
  422. '--source-map',
  423. 'true'
  424. ]);
  425. try {
  426. const content: string = fs.readFileSync(outputSourceMapPath, { encoding: 'utf8' });
  427. isFileExist = true;
  428. sourceMapObject = JSON.parse(content);
  429. } catch (e) {
  430. isFileExist = false;
  431. }
  432. });
  433. it('should create file with source map in the same directory as output file', () => {
  434. assert.equal(isFileExist, true);
  435. });
  436. it('source map from created file should contains property `version`', () => {
  437. assert.property(sourceMapObject, 'version');
  438. });
  439. it('source map from created file should contains property `sources`', () => {
  440. assert.property(sourceMapObject, 'sources');
  441. });
  442. it('source map from created file should contains property `names`', () => {
  443. assert.property(sourceMapObject, 'names');
  444. });
  445. after(() => {
  446. rimraf.sync(outputFilePath);
  447. rimraf.sync(outputSourceMapPath);
  448. });
  449. });
  450. describe('Variant #2: `sourceMapBaseUrl` option is set', () => {
  451. let isFileExist: boolean,
  452. sourceMapObject: any;
  453. before(() => {
  454. JavaScriptObfuscator.runCLI([
  455. 'node',
  456. 'javascript-obfuscator',
  457. fixtureFilePath,
  458. '--output',
  459. outputFilePath,
  460. '--compact',
  461. 'true',
  462. '--self-defending',
  463. '0',
  464. '--source-map',
  465. 'true',
  466. '--source-map-base-url',
  467. 'http://localhost:9000/'
  468. ]);
  469. try {
  470. const content: string = fs.readFileSync(outputSourceMapPath, { encoding: 'utf8' });
  471. isFileExist = true;
  472. sourceMapObject = JSON.parse(content);
  473. } catch (e) {
  474. isFileExist = false;
  475. }
  476. });
  477. it('should create file with source map in the same directory as output file', () => {
  478. assert.equal(isFileExist, true);
  479. });
  480. it('source map from created file should contains property `version`', () => {
  481. assert.property(sourceMapObject, 'version');
  482. });
  483. it('source map from created file should contains property `sources`', () => {
  484. assert.property(sourceMapObject, 'sources');
  485. });
  486. it('source map from created file should contains property `names`', () => {
  487. assert.property(sourceMapObject, 'names');
  488. });
  489. after(() => {
  490. fs.unlinkSync(outputFilePath);
  491. fs.unlinkSync(outputSourceMapPath);
  492. });
  493. });
  494. describe('Variant #3: `--sourceMapFileName` option is set', () => {
  495. const sourceMapFileName: string = 'test';
  496. const sourceMapFilePath: string = `${sourceMapFileName}.js.map`;
  497. const outputSourceMapFilePath: string = `${outputDirName}/${sourceMapFilePath}`;
  498. let isFileExist: boolean,
  499. sourceMapObject: any;
  500. before(() => {
  501. JavaScriptObfuscator.runCLI([
  502. 'node',
  503. 'javascript-obfuscator',
  504. fixtureFilePath,
  505. '--output',
  506. outputFilePath,
  507. '--compact',
  508. 'true',
  509. '--self-defending',
  510. '0',
  511. '--source-map',
  512. 'true',
  513. '--source-map-file-name',
  514. sourceMapFileName
  515. ]);
  516. try {
  517. const content: string = fs.readFileSync(outputSourceMapFilePath, { encoding: 'utf8' });
  518. isFileExist = true;
  519. sourceMapObject = JSON.parse(content);
  520. } catch (e) {
  521. isFileExist = false;
  522. }
  523. });
  524. it('should create source map file with given name in the same directory as output file', () => {
  525. assert.equal(isFileExist, true);
  526. });
  527. it('source map from created file should contains property `version`', () => {
  528. assert.property(sourceMapObject, 'version');
  529. });
  530. it('source map from created file should contains property `sources`', () => {
  531. assert.property(sourceMapObject, 'sources');
  532. });
  533. it('source map from created file should contains property `names`', () => {
  534. assert.property(sourceMapObject, 'names');
  535. });
  536. after(() => {
  537. fs.unlinkSync(outputFilePath);
  538. fs.unlinkSync(outputSourceMapFilePath);
  539. });
  540. });
  541. });
  542. describe('Variant #2: `--sourceMapMode` option is `inline`', () => {
  543. let isFileExist: boolean;
  544. before(() => {
  545. JavaScriptObfuscator.runCLI([
  546. 'node',
  547. 'javascript-obfuscator',
  548. fixtureFilePath,
  549. '--output',
  550. outputFilePath,
  551. '--compact',
  552. 'true',
  553. '--self-defending',
  554. '0',
  555. '--source-map',
  556. 'true',
  557. '--source-map-mode',
  558. 'inline'
  559. ]);
  560. isFileExist = fs.existsSync(outputSourceMapPath);
  561. });
  562. it('shouldn\'t create file with source map', () => {
  563. assert.equal(isFileExist, false);
  564. });
  565. after(() => {
  566. fs.unlinkSync(outputFilePath);
  567. });
  568. });
  569. });
  570. describe('help output', () => {
  571. let callback: sinon.SinonSpy,
  572. stdoutWriteMock: StdoutWriteMock;
  573. beforeEach(() => {
  574. callback = sinon.spy(console, 'log');
  575. stdoutWriteMock = new StdoutWriteMock(process.stdout.write);
  576. });
  577. describe('`--help` option is set', () => {
  578. let isConsoleLogCalled: boolean;
  579. beforeEach(() => {
  580. stdoutWriteMock.mute();
  581. JavaScriptObfuscator.runCLI([
  582. 'node',
  583. 'javascript-obfuscator',
  584. fixtureFilePath,
  585. '--help'
  586. ]);
  587. stdoutWriteMock.restore();
  588. isConsoleLogCalled = callback.called;
  589. });
  590. it('should print `console.log` help', () => {
  591. assert.equal(isConsoleLogCalled, true);
  592. });
  593. });
  594. describe('no arguments passed', () => {
  595. let isConsoleLogCalled: boolean;
  596. beforeEach(() => {
  597. stdoutWriteMock.mute();
  598. JavaScriptObfuscator.runCLI([
  599. 'node',
  600. 'javascript-obfuscator'
  601. ]);
  602. stdoutWriteMock.restore();
  603. isConsoleLogCalled = callback.called;
  604. });
  605. it('should print `console.log` help', () => {
  606. assert.equal(isConsoleLogCalled, true);
  607. });
  608. });
  609. afterEach(() => {
  610. callback.restore();
  611. });
  612. });
  613. describe('`--config` option is set', () => {
  614. const outputSourceMapPath: string = `${outputFilePath}.map`;
  615. let isFileExist: boolean,
  616. sourceMapObject: any;
  617. before(() => {
  618. JavaScriptObfuscator.runCLI([
  619. 'node',
  620. 'javascript-obfuscator',
  621. fixtureFilePath,
  622. '--output',
  623. outputFilePath,
  624. '--config',
  625. configFilePath
  626. ]);
  627. try {
  628. const content: string = fs.readFileSync(outputSourceMapPath, {encoding: 'utf8'});
  629. isFileExist = true;
  630. sourceMapObject = JSON.parse(content);
  631. } catch (e) {
  632. isFileExist = false;
  633. }
  634. });
  635. it('should create file with source map in the same directory as output file', () => {
  636. assert.equal(isFileExist, true);
  637. });
  638. it('source map from created file should contains property `version`', () => {
  639. assert.property(sourceMapObject, 'version');
  640. });
  641. it('source map from created file should contains property `sources`', () => {
  642. assert.property(sourceMapObject, 'sources');
  643. });
  644. it('source map from created file should contains property `names`', () => {
  645. assert.property(sourceMapObject, 'names');
  646. });
  647. after(() => {
  648. fs.unlinkSync(outputFilePath);
  649. fs.unlinkSync(outputSourceMapPath);
  650. });
  651. });
  652. describe('`--config` option is set but overridden by CLI option', () => {
  653. const outputSourceMapPath: string = `${outputFilePath}.map`;
  654. let isFileExist: boolean;
  655. before(() => {
  656. JavaScriptObfuscator.runCLI([
  657. 'node',
  658. 'javascript-obfuscator',
  659. fixtureFilePath,
  660. '--output',
  661. outputFilePath,
  662. '--config',
  663. configFilePath,
  664. '--source-map',
  665. 'false',
  666. ]);
  667. try {
  668. fs.readFileSync(outputSourceMapPath, {encoding: 'utf8'});
  669. isFileExist = true;
  670. } catch (e) {
  671. isFileExist = false;
  672. }
  673. });
  674. it('should create file without source map in the same directory as output file', () => {
  675. assert.equal(isFileExist, false);
  676. });
  677. after(() => {
  678. fs.unlinkSync(outputFilePath);
  679. });
  680. });
  681. after(() => {
  682. rimraf.sync(outputDirName);
  683. });
  684. });
  685. });