12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385 |
- import * as fs from 'fs';
- import * as mkdirp from 'mkdirp';
- import * as path from 'path';
- import * as rimraf from 'rimraf';
- import * as sinon from 'sinon';
- import { resolveSources } from 'source-map-resolve';
- import { assert } from 'chai';
- import { ISourceMap } from '../../../src/interfaces/source-code/ISourceMap';
- import { StdoutWriteMock } from '../../mocks/StdoutWriteMock';
- import { JavaScriptObfuscatorCLI } from '../../../src/JavaScriptObfuscatorCLIFacade';
- import { parseSourceMapFromObfuscatedCode } from '../../helpers/parseSourceMapFromObfuscatedCode';
- describe('JavaScriptObfuscatorCLI', function (): void {
- this.timeout(100000);
- const expectedError: RegExp = /Given input path must be a valid/;
- const fixturesDirName: string = path.join('test', 'fixtures');
- const fixtureFileName: string = 'sample.js';
- const fixtureFilePath: string = path.join(fixturesDirName, fixtureFileName);
- const outputDirName: string = path.join('test', 'tmp');
- const outputFileName: string = 'sample-obfuscated.js';
- const outputFilePath: string = path.join(outputDirName, outputFileName);
- const configDirName: string = path.join('test', 'fixtures');
- const configFileName: string = 'config.js';
- const configFilePath: string = path.join(configDirName, configFileName);
- describe('run', () => {
- before(() => {
- mkdirp.sync(outputDirName);
- });
- describe('Variant #1: obfuscation of single file', () => {
- describe('--output` option is set', () => {
- describe('Variant #1: input file path is before options', () => {
- let isFileExist: boolean;
- before(() => {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--output',
- outputFilePath,
- '--compact',
- 'true',
- '--self-defending',
- '0'
- ]);
- isFileExist = fs.existsSync(outputFilePath);
- });
- it('should create file with obfuscated code in `--output` directory', () => {
- assert.equal(isFileExist, true);
- });
- after(() => {
- fs.unlinkSync(outputFilePath);
- });
- });
- describe('Variant #2: input file path is after options', () => {
- let isFileExist: boolean;
- before(() => {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- '--output',
- outputFilePath,
- '--compact',
- 'true',
- '--self-defending',
- '0',
- fixtureFilePath
- ]);
- isFileExist = fs.existsSync(outputFilePath);
- });
- it('should create file with obfuscated code in `--output` directory', () => {
- assert.equal(isFileExist, true);
- });
- after(() => {
- fs.unlinkSync(outputFilePath);
- });
- });
- });
- describe('`--output` option isn\'t set', () => {
- describe('Variant #1: default behaviour', () => {
- let outputFixturesFilePath: string,
- isFileExist: boolean;
- before(() => {
- outputFixturesFilePath = path.join(fixturesDirName, outputFileName);
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath
- ]);
- isFileExist = fs.existsSync(outputFixturesFilePath);
- });
- it(`should create file \`${outputFileName}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist, true);
- });
- after(() => {
- fs.unlinkSync(outputFixturesFilePath);
- });
- });
- describe('Variant #2: invalid input file path', () => {
- let testFunc: () => void;
- before(() => {
- testFunc = () => JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- path.join('wrong', 'file', 'path')
- ]);
- });
- it(`should throw an error`, () => {
- assert.throws(testFunc, expectedError);
- });
- });
- describe('Variant #3: input file extension isn\'t `.js`', () => {
- const expectedError: RegExp = /Given input path must be a valid/;
- const outputFileName: string = 'sample-obfuscated.ts';
- const outputFilePath: string = path.join(outputDirName, outputFileName);
- let testFunc: () => void;
- before(() => {
- fs.writeFileSync(outputFilePath, 'data');
- testFunc = () => JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- outputFilePath
- ]);
- });
- it(`should throw an error`, () => {
- assert.throws(testFunc, expectedError);
- });
- after(() => {
- fs.unlinkSync(outputFilePath);
- });
- });
- });
- describe('--exclude option', () => {
- describe('Variant #1: --exclude option is pointed on different file', () => {
- let isFileExist: boolean;
- before(() => {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--output',
- outputFilePath,
- '--exclude',
- path.join('**', 'foo.js')
- ]);
- isFileExist = fs.existsSync(outputFilePath);
- });
- it('should create file with obfuscated code in `--output` directory', () => {
- assert.equal(isFileExist, true);
- });
- });
- describe('Variant #2: --exclude option is pointed on input file', () => {
- let testFunc: () => void;
- before(() => {
- testFunc = () => JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--output',
- outputFilePath,
- '--exclude',
- path.join('**', 'sample.js')
- ]);
- });
- it('should throw an error', () => {
- assert.throws(testFunc, expectedError);
- });
- after(() => {
- fs.unlinkSync(outputFilePath);
- });
- });
- });
- });
- describe('Variant #2: obfuscation of directory', () => {
- describe(`Variant #1: default behaviour`, () => {
- const directoryPath: string = path.join(fixturesDirName, 'directory-obfuscation');
- const outputFileName1: string = 'foo-obfuscated.js';
- const outputFileName2: string = 'bar-obfuscated.js';
- const outputFileName3: string = 'baz-obfuscated.js';
- const readFileEncoding = 'utf8';
- const regExp1: RegExp = /^var a1_0x(\w){4,6} *= *0x1;$/;
- const regExp2: RegExp = /^var a0_0x(\w){4,6} *= *0x2;$/;
- let outputFixturesFilePath1: string,
- outputFixturesFilePath2: string,
- outputFixturesFilePath3: string,
- isFileExist1: boolean,
- isFileExist2: boolean,
- isFileExist3: boolean,
- fileContent1: string,
- fileContent2: string;
- before(() => {
- outputFixturesFilePath1 = path.join(directoryPath, outputFileName1);
- outputFixturesFilePath2 = path.join(directoryPath, outputFileName2);
- outputFixturesFilePath3 = path.join(directoryPath, outputFileName3);
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- directoryPath,
- '--rename-globals',
- 'true'
- ]);
- isFileExist1 = fs.existsSync(outputFixturesFilePath1);
- isFileExist2 = fs.existsSync(outputFixturesFilePath2);
- isFileExist3 = fs.existsSync(outputFixturesFilePath3);
- fileContent1 = fs.readFileSync(outputFixturesFilePath1, readFileEncoding);
- fileContent2 = fs.readFileSync(outputFixturesFilePath2, readFileEncoding);
- });
- it(`should create file \`${outputFileName1}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist1, true);
- });
- it(`should create file \`${outputFileName2}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist2, true);
- });
- it(`shouldn't create file \`${outputFileName3}\` in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist3, false);
- });
- it(`match #1: should create file with obfuscated code with prefixed identifier`, () => {
- assert.match(fileContent1, regExp1);
- });
- it(`match #2: should create file with obfuscated code with prefixed identifier`, () => {
- assert.match(fileContent2, regExp2);
- });
- after(() => {
- rimraf.sync(outputFixturesFilePath1);
- rimraf.sync(outputFixturesFilePath2);
- });
- });
- describe('Variant #2: obfuscation of directory with `identifiersPrefix` option value', () => {
- const directoryPath: string = path.join(fixturesDirName, 'directory-obfuscation');
- const identifiersPrefix: string = 'foo';
- const outputFileName1: string = 'foo-obfuscated.js';
- const outputFileName2: string = 'bar-obfuscated.js';
- const readFileEncoding = 'utf8';
- const regExp1: RegExp = /^var foo1_0x(\w){4,6} *= *0x1;$/;
- const regExp2: RegExp = /^var foo0_0x(\w){4,6} *= *0x2;$/;
- let outputFixturesFilePath1: string,
- outputFixturesFilePath2: string,
- isFileExist1: boolean,
- isFileExist2: boolean,
- fileContent1: string,
- fileContent2: string;
- before(() => {
- outputFixturesFilePath1 = path.join(directoryPath, outputFileName1);
- outputFixturesFilePath2 = path.join(directoryPath, outputFileName2);
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- directoryPath,
- '--identifiers-prefix',
- identifiersPrefix,
- '--rename-globals',
- 'true'
- ]);
- isFileExist1 = fs.existsSync(outputFixturesFilePath1);
- isFileExist2 = fs.existsSync(outputFixturesFilePath2);
- fileContent1 = fs.readFileSync(outputFixturesFilePath1, readFileEncoding);
- fileContent2 = fs.readFileSync(outputFixturesFilePath2, readFileEncoding);
- });
- it(`should create file \`${outputFileName1}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist1, true);
- });
- it(`should create file \`${outputFileName2}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist2, true);
- });
- it(`match #1: should create file with obfuscated code with prefixed identifier`, () => {
- assert.match(fileContent1, regExp1);
- });
- it(`match #2: should create file with obfuscated code with prefixed identifier`, () => {
- assert.match(fileContent2, regExp2);
- });
- after(() => {
- rimraf.sync(outputFixturesFilePath1);
- rimraf.sync(outputFixturesFilePath2);
- });
- });
- describe('Variant #3: obfuscation of directory with `output` option', () => {
- const directoryPath: string = path.join(fixturesDirName, 'directory-obfuscation');
- const outputDirectoryName: string = 'obfuscated';
- const outputDirectoryPath: string = path.join(directoryPath, outputDirectoryName);
- const outputFileName1: string = 'foo.js';
- const outputFileName2: string = 'bar.js';
- const outputFileName3: string = 'baz.js';
- let outputFixturesFilePath1: string,
- outputFixturesFilePath2: string,
- outputFixturesFilePath3: string,
- isFileExist1: boolean,
- isFileExist2: boolean,
- isFileExist3: boolean;
- before(() => {
- outputFixturesFilePath1 = path.join(outputDirectoryPath, outputFileName1);
- outputFixturesFilePath2 = path.join(outputDirectoryPath, outputFileName2);
- outputFixturesFilePath3 = path.join(outputDirectoryPath, outputFileName3);
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- directoryPath,
- '--output',
- outputDirectoryPath
- ]);
- isFileExist1 = fs.existsSync(outputFixturesFilePath1);
- isFileExist2 = fs.existsSync(outputFixturesFilePath2);
- isFileExist3 = fs.existsSync(outputFixturesFilePath3);
- });
- it(
- `should create file \`${outputFileName1}\` with obfuscated code in ` +
- `\`${path.join(fixturesDirName, outputDirectoryName)}\` directory`,
- () => {
- assert.equal(isFileExist1, true);
- }
- );
- it(
- `should create file \`${outputFileName2}\` with obfuscated code in ` +
- `\`${path.join(fixturesDirName, outputDirectoryName)}\` directory`,
- () => {
- assert.equal(isFileExist2, true);
- }
- );
- it(
- `shouldn't create file \`${outputFileName3}\` in ` +
- `\`${path.join(fixturesDirName, outputDirectoryName)}\` directory`,
- () => {
- assert.equal(isFileExist3, false);
- }
- );
- after(() => {
- rimraf.sync(outputDirectoryPath);
- });
- });
- describe('Variant #4: --exclude option', () => {
- describe('Variant #1: --exclude option is pointed on different file', () => {
- const directoryPath: string = path.join(fixturesDirName, 'directory-obfuscation');
- const outputFileName1: string = 'foo-obfuscated.js';
- const outputFileName2: string = 'bar-obfuscated.js';
- const outputFileName3: string = 'baz-obfuscated.js';
- const readFileEncoding = 'utf8';
- const regExp1: RegExp = /^var a1_0x(\w){4,6} *= *0x1;$/;
- const regExp2: RegExp = /^var a0_0x(\w){4,6} *= *0x2;$/;
- let outputFixturesFilePath1: string,
- outputFixturesFilePath2: string,
- outputFixturesFilePath3: string,
- isFileExist1: boolean,
- isFileExist2: boolean,
- isFileExist3: boolean,
- fileContent1: string,
- fileContent2: string;
- before(() => {
- outputFixturesFilePath1 = path.join(directoryPath, outputFileName1);
- outputFixturesFilePath2 = path.join(directoryPath, outputFileName2);
- outputFixturesFilePath3 = path.join(directoryPath, outputFileName3);
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- directoryPath,
- '--exclude',
- path.join('**', 'bark.js'),
- '--rename-globals',
- 'true'
- ]);
- isFileExist1 = fs.existsSync(outputFixturesFilePath1);
- isFileExist2 = fs.existsSync(outputFixturesFilePath2);
- isFileExist3 = fs.existsSync(outputFixturesFilePath3);
- fileContent1 = fs.readFileSync(outputFixturesFilePath1, readFileEncoding);
- fileContent2 = fs.readFileSync(outputFixturesFilePath2, readFileEncoding);
- });
- it(`should create file \`${outputFileName1}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist1, true);
- });
- it(`should create file \`${outputFileName2}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist2, true);
- });
- it(`shouldn't create file \`${outputFileName3}\` in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist3, false);
- });
- it(`match #1: should create file with obfuscated code with prefixed identifier`, () => {
- assert.match(fileContent1, regExp1);
- });
- it(`match #2: should create file with obfuscated code with prefixed identifier`, () => {
- assert.match(fileContent2, regExp2);
- });
- after(() => {
- rimraf.sync(outputFixturesFilePath1);
- rimraf.sync(outputFixturesFilePath2);
- });
- });
- describe('Variant #2: --exclude option is pointed on file under obfuscating directory', () => {
- const directoryPath: string = path.join(fixturesDirName, 'directory-obfuscation');
- const outputFileName1: string = 'foo-obfuscated.js';
- const outputFileName2: string = 'bar-obfuscated.js';
- const outputFileName3: string = 'baz-obfuscated.js';
- const readFileEncoding = 'utf8';
- const regExp1: RegExp = /^var a0_0x(\w){4,6} *= *0x2;$/;
- let outputFixturesFilePath1: string,
- outputFixturesFilePath2: string,
- outputFixturesFilePath3: string,
- isFileExist1: boolean,
- isFileExist2: boolean,
- isFileExist3: boolean,
- fileContent1: string;
- before(() => {
- outputFixturesFilePath1 = path.join(directoryPath, outputFileName1);
- outputFixturesFilePath2 = path.join(directoryPath, outputFileName2);
- outputFixturesFilePath3 = path.join(directoryPath, outputFileName3);
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- directoryPath,
- '--exclude',
- path.join('**', 'foo.js'),
- '--rename-globals',
- 'true'
- ]);
- isFileExist1 = fs.existsSync(outputFixturesFilePath1);
- isFileExist2 = fs.existsSync(outputFixturesFilePath2);
- isFileExist3 = fs.existsSync(outputFixturesFilePath3);
- fileContent1 = fs.readFileSync(outputFixturesFilePath2, readFileEncoding);
- });
- it(`shouldn't create file \`${outputFileName1}\` in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist1, false);
- });
- it(`should create file \`${outputFileName2}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist2, true);
- });
- it(`shouldn't create file \`${outputFileName3}\` in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist3, false);
- });
- it(`match #1: should create file with obfuscated code with prefixed identifier`, () => {
- assert.match(fileContent1, regExp1);
- });
- after(() => {
- rimraf.sync(outputFixturesFilePath1);
- rimraf.sync(outputFixturesFilePath2);
- });
- });
- });
- });
- describe('`--sourceMap` option is set', () => {
- const outputSourceMapPath: string = `${outputFilePath}.map`;
- describe('Variant #1: `--sourceMapMode` option value is `separate`', () => {
- describe('Variant #1: default behaviour', () => {
- let isFileExist: boolean,
- resolvedSources: string,
- sourceCodeContent: string,
- sourceMapObject: ISourceMap;
- before((done) => {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--output',
- outputFilePath,
- '--compact',
- 'true',
- '--self-defending',
- '0',
- '--source-map',
- 'true'
- ]);
- try {
- sourceCodeContent = fs.readFileSync(fixtureFilePath, { encoding: 'utf8' });
- const sourceMapContent: string = fs.readFileSync(outputSourceMapPath, { encoding: 'utf8' });
- isFileExist = true;
- sourceMapObject = JSON.parse(sourceMapContent);
- resolveSources(sourceMapObject, fixtureFilePath, fs.readFile, (error, result) => {
- resolvedSources = typeof result.sourcesContent[0] === 'string'
- ? result.sourcesContent[0]
- : '';
- done();
- });
- } catch (e) {
- isFileExist = false;
- }
- });
- it('should create file with source map in the same directory as output file', () => {
- assert.equal(isFileExist, true);
- });
- it('source map from created file should contains property `version`', () => {
- assert.property(sourceMapObject, 'version');
- });
- it('source map from created file should contains property `names`', () => {
- assert.property(sourceMapObject, 'names');
- });
- it('should resolve correct sources from source map', () => {
- assert.equal(resolvedSources, sourceCodeContent);
- });
- after(() => {
- rimraf.sync(outputFilePath);
- rimraf.sync(outputSourceMapPath);
- });
- });
- describe('Variant #2: `sourceMapBaseUrl` option is set', () => {
- let isFileExist: boolean,
- resolvedSources: string,
- sourceCodeContent: string,
- sourceMapObject: ISourceMap;
- before((done) => {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--output',
- outputFilePath,
- '--compact',
- 'true',
- '--self-defending',
- '0',
- '--source-map',
- 'true',
- '--source-map-base-url',
- 'http://localhost:9000/'
- ]);
- try {
- sourceCodeContent = fs.readFileSync(fixtureFilePath, { encoding: 'utf8' });
- const sourceMapContent: string = fs.readFileSync(outputSourceMapPath, { encoding: 'utf8' });
- isFileExist = true;
- sourceMapObject = JSON.parse(sourceMapContent);
- resolveSources(sourceMapObject, fixtureFilePath, fs.readFile, (error, result) => {
- resolvedSources = typeof result.sourcesContent[0] === 'string'
- ? result.sourcesContent[0]
- : '';
- done();
- });
- } catch (e) {
- isFileExist = false;
- }
- });
- it('should create file with source map in the same directory as output file', () => {
- assert.equal(isFileExist, true);
- });
- it('source map from created file should contains property `version`', () => {
- assert.property(sourceMapObject, 'version');
- });
- it('source map from created file should contains property `names`', () => {
- assert.property(sourceMapObject, 'names');
- });
- it('should resolve correct sources from source map', () => {
- assert.equal(resolvedSources, sourceCodeContent);
- });
- after(() => {
- fs.unlinkSync(outputFilePath);
- fs.unlinkSync(outputSourceMapPath);
- });
- });
- describe('Variant #3: `--sourceMapFileName` option is set', () => {
- const sourceMapFileName: string = 'test';
- const sourceMapFilePath: string = `${sourceMapFileName}.js.map`;
- const outputSourceMapFilePath: string = path.join(outputDirName, sourceMapFilePath);
- let isFileExist: boolean,
- resolvedSources: string,
- sourceCodeContent: string,
- sourceMapObject: ISourceMap;
- before((done) => {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--output',
- outputFilePath,
- '--compact',
- 'true',
- '--self-defending',
- '0',
- '--source-map',
- 'true',
- '--source-map-file-name',
- sourceMapFileName
- ]);
- try {
- sourceCodeContent = fs.readFileSync(fixtureFilePath, { encoding: 'utf8' });
- const sourceMapContent: string = fs.readFileSync(outputSourceMapFilePath, { encoding: 'utf8' });
- isFileExist = true;
- sourceMapObject = JSON.parse(sourceMapContent);
- resolveSources(sourceMapObject, fixtureFilePath, fs.readFile, (error, result) => {
- resolvedSources = typeof result.sourcesContent[0] === 'string'
- ? result.sourcesContent[0]
- : '';
- done();
- });
- } catch (e) {
- isFileExist = false;
- }
- });
- it('should create source map file with given name in the same directory as output file', () => {
- assert.equal(isFileExist, true);
- });
- it('source map from created file should contains property `version`', () => {
- assert.property(sourceMapObject, 'version');
- });
- it('source map from created file should contains property `names`', () => {
- assert.property(sourceMapObject, 'names');
- });
- it('should resolve correct sources from source map', () => {
- assert.equal(resolvedSources, sourceCodeContent);
- });
- after(() => {
- fs.unlinkSync(outputFilePath);
- fs.unlinkSync(outputSourceMapFilePath);
- });
- });
- describe('Variant #4: `sourceMapSourcesMode` option is set', () => {
- describe('Variant #1: `sourcesContent` value', () => {
- const expectedSourceMapSourceName: string = 'sourceMap';
- let isFileExist: boolean,
- resolvedSources: string,
- sourceCodeContent: string,
- sourceMapObject: ISourceMap;
- before((done) => {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--output',
- outputFilePath,
- '--compact',
- 'true',
- '--self-defending',
- '0',
- '--source-map',
- 'true',
- '--source-map-sources-mode',
- 'sources-content'
- ]);
- try {
- sourceCodeContent = fs.readFileSync(fixtureFilePath, { encoding: 'utf8' });
- const sourceMapContent: string = fs.readFileSync(outputSourceMapPath, { encoding: 'utf8' });
- isFileExist = true;
- sourceMapObject = JSON.parse(sourceMapContent);
- resolveSources(sourceMapObject, fixtureFilePath, fs.readFile, (error, result) => {
- resolvedSources = typeof result.sourcesContent[0] === 'string'
- ? result.sourcesContent[0]
- : '';
- done();
- });
- } catch (e) {
- isFileExist = false;
- }
- });
- it('should create file with source map in the same directory as output file', () => {
- assert.equal(isFileExist, true);
- });
- it('source map from created file should contains property `sources`', () => {
- assert.property(sourceMapObject, 'sources');
- });
- it('source map from created file should contains property `sourcesContent`', () => {
- assert.property(sourceMapObject, 'sourcesContent');
- });
- it('source map source should has correct sources', () => {
- assert.equal(sourceMapObject.sources[0], expectedSourceMapSourceName);
- });
- it('source map source should has correct sources content', () => {
- assert.equal(sourceMapObject.sourcesContent[0], sourceCodeContent);
- });
- it('should resolve correct sources from source map', () => {
- assert.equal(resolvedSources, sourceCodeContent);
- });
- after(() => {
- rimraf.sync(outputFilePath);
- rimraf.sync(outputSourceMapPath);
- });
- });
- describe('Variant #2: `sources` value', () => {
- const expectedSourceMapSourceName: string = path.basename(fixtureFileName);
- let isFileExist: boolean,
- resolvedSources: string,
- sourceCodeContent: string,
- sourceMapObject: ISourceMap;
- before((done) => {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--output',
- outputFilePath,
- '--compact',
- 'true',
- '--self-defending',
- '0',
- '--source-map',
- 'true',
- '--source-map-sources-mode',
- 'sources'
- ]);
- try {
- sourceCodeContent = fs.readFileSync(fixtureFilePath, { encoding: 'utf8' });
- const sourceMapContent: string = fs.readFileSync(outputSourceMapPath, { encoding: 'utf8' });
- isFileExist = true;
- sourceMapObject = JSON.parse(sourceMapContent);
- resolveSources(sourceMapObject, fixtureFilePath, fs.readFile, (error, result) => {
- resolvedSources = typeof result.sourcesContent[0] === 'string'
- ? result.sourcesContent[0]
- : '';
- done();
- });
- } catch (e) {
- isFileExist = false;
- }
- });
- it('should create file with source map in the same directory as output file', () => {
- assert.equal(isFileExist, true);
- });
- it('source map from created file should contains property `sources`', () => {
- assert.property(sourceMapObject, 'sources');
- });
- it('source map from created file should not contains property `sourcesContent`', () => {
- assert.notProperty(sourceMapObject, 'sourcesContent');
- });
- it('source map source should has correct sources', () => {
- assert.equal(sourceMapObject.sources[0], expectedSourceMapSourceName);
- });
- it('should resolve correct sources from source map', () => {
- assert.equal(resolvedSources, sourceCodeContent);
- });
- after(() => {
- rimraf.sync(outputFilePath);
- rimraf.sync(outputSourceMapPath);
- });
- });
- });
- });
- describe('Variant #2: `--sourceMapMode` option is `inline`', () => {
- describe('Variant #1: default behaviour', () => {
- let isFileExist: boolean,
- resolvedSources: string,
- sourceCodeContent: string,
- sourceMapObject: ISourceMap;
- before((done) => {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--output',
- outputFilePath,
- '--compact',
- 'true',
- '--self-defending',
- '0',
- '--source-map',
- 'true',
- '--source-map-mode',
- 'inline'
- ]);
- isFileExist = fs.existsSync(outputSourceMapPath);
- sourceCodeContent = fs.readFileSync(fixtureFilePath, { encoding: 'utf8' });
- const obfuscatedCodeContent = fs.readFileSync(outputFilePath, { encoding: 'utf8' });
- sourceMapObject = parseSourceMapFromObfuscatedCode(obfuscatedCodeContent);
- resolveSources(sourceMapObject, fixtureFilePath, fs.readFile, (error, result) => {
- resolvedSources = typeof result.sourcesContent[0] === 'string'
- ? result.sourcesContent[0]
- : '';
- done();
- });
- });
- it('shouldn\'t create file with source map', () => {
- assert.equal(isFileExist, false);
- });
- it('should resolve correct sources from source map', () => {
- assert.equal(resolvedSources, sourceCodeContent);
- });
- after(() => {
- fs.unlinkSync(outputFilePath);
- });
- });
- describe('Variant #2: `sourceMapSourcesMode` option is set', () => {
- describe('Variant #1: `sourcesContent` value', () => {
- const expectedSourceMapSourceName: string = 'sourceMap';
- let isFileExist: boolean,
- resolvedSources: string,
- sourceCodeContent: string,
- sourceMapObject: ISourceMap;
- before((done) => {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--output',
- outputFilePath,
- '--compact',
- 'true',
- '--self-defending',
- '0',
- '--source-map',
- 'true',
- '--source-map-mode',
- 'inline',
- '--source-map-sources-mode',
- 'sources-content'
- ]);
- isFileExist = fs.existsSync(outputSourceMapPath);
- sourceCodeContent = fs.readFileSync(fixtureFilePath, { encoding: 'utf8' });
- const obfuscatedCodeContent = fs.readFileSync(outputFilePath, { encoding: 'utf8' });
- sourceMapObject = parseSourceMapFromObfuscatedCode(obfuscatedCodeContent);
- resolveSources(sourceMapObject, fixtureFilePath, fs.readFile, (error, result) => {
- resolvedSources = typeof result.sourcesContent[0] === 'string'
- ? result.sourcesContent[0]
- : '';
- done();
- });
- });
- it('shouldn\'t create file with source map', () => {
- assert.equal(isFileExist, false);
- });
- it('source map from created file should contains property `sources`', () => {
- assert.property(sourceMapObject, 'sources');
- });
- it('source map from created file should contains property `sourcesContent`', () => {
- assert.property(sourceMapObject, 'sourcesContent');
- });
- it('source map source should has correct sources', () => {
- assert.equal(sourceMapObject.sources[0], expectedSourceMapSourceName);
- });
- it('source map source should has correct sources content', () => {
- assert.equal(sourceMapObject.sourcesContent[0], sourceCodeContent);
- });
- it('should resolve correct sources from source map', () => {
- assert.equal(resolvedSources, sourceCodeContent);
- });
- after(() => {
- fs.unlinkSync(outputFilePath);
- });
- });
- describe('Variant #2: `sources` value', () => {
- const expectedSourceMapSourceName: string = path.basename(fixtureFileName);
- let isFileExist: boolean,
- resolvedSources: string,
- sourceCodeContent: string,
- sourceMapObject: ISourceMap;
- before((done) => {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--output',
- outputFilePath,
- '--compact',
- 'true',
- '--self-defending',
- '0',
- '--source-map',
- 'true',
- '--source-map-mode',
- 'inline',
- '--source-map-sources-mode',
- 'sources'
- ]);
- isFileExist = fs.existsSync(outputSourceMapPath);
- sourceCodeContent = fs.readFileSync(fixtureFilePath, { encoding: 'utf8' });
- const obfuscatedCodeContent = fs.readFileSync(outputFilePath, { encoding: 'utf8' });
- sourceMapObject = parseSourceMapFromObfuscatedCode(obfuscatedCodeContent);
- resolveSources(sourceMapObject, fixtureFilePath, fs.readFile, (error, result) => {
- resolvedSources = typeof result.sourcesContent[0] === 'string'
- ? result.sourcesContent[0]
- : '';
- done();
- });
- });
- it('shouldn\'t create file with source map', () => {
- assert.equal(isFileExist, false);
- });
- it('source map from created file should contains property `sources`', () => {
- assert.property(sourceMapObject, 'sources');
- });
- it('source map from created file should contains property `sourcesContent`', () => {
- assert.notProperty(sourceMapObject, 'sourcesContent');
- });
- it('source map source should has correct sources', () => {
- assert.equal(sourceMapObject.sources[0], expectedSourceMapSourceName);
- });
- it('should resolve correct sources from source map', () => {
- assert.equal(resolvedSources, sourceCodeContent);
- });
- after(() => {
- fs.unlinkSync(outputFilePath);
- });
- });
- });
- });
- });
- describe('help output', () => {
- let callback: sinon.SinonSpy<any, void>,
- stdoutWriteMock: StdoutWriteMock,
- stubExit: sinon.SinonStub;
- beforeEach(() => {
- stubExit = sinon.stub(process, 'exit');
- callback = sinon.spy(console, 'log');
- stdoutWriteMock = new StdoutWriteMock(process.stdout.write);
- });
- describe('`--help` option is set without any additional parameters', () => {
- let isConsoleLogCalled: boolean;
- beforeEach(() => {
- stdoutWriteMock.mute();
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- '--help'
- ]);
- stdoutWriteMock.restore();
- isConsoleLogCalled = callback.called;
- });
- it('should print `console.log` help', () => {
- assert.equal(isConsoleLogCalled, true);
- });
- });
- describe('`--help` option is set before file path', () => {
- let isConsoleLogCalled: boolean;
- beforeEach(() => {
- stdoutWriteMock.mute();
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- '--help',
- fixtureFilePath
- ]);
- stdoutWriteMock.restore();
- isConsoleLogCalled = callback.called;
- });
- it('should print `console.log` help', () => {
- assert.equal(isConsoleLogCalled, true);
- });
- });
- describe('`--help` option is set after file path', () => {
- let isConsoleLogCalled: boolean;
- beforeEach(() => {
- stdoutWriteMock.mute();
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--help'
- ]);
- stdoutWriteMock.restore();
- isConsoleLogCalled = callback.called;
- });
- it('should print `console.log` help', () => {
- assert.equal(isConsoleLogCalled, true);
- });
- });
- describe('no arguments passed', () => {
- let isConsoleLogCalled: boolean;
- beforeEach(() => {
- stdoutWriteMock.mute();
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator'
- ]);
- stdoutWriteMock.restore();
- isConsoleLogCalled = callback.called;
- });
- it('should print `console.log` help', () => {
- assert.equal(isConsoleLogCalled, true);
- });
- });
- afterEach(() => {
- stubExit.restore();
- callback.restore();
- });
- });
- describe('`--config` option is set', () => {
- describe('Base options', () => {
- const outputSourceMapPath: string = `${outputFilePath}.map`;
- let isFileExist: boolean,
- sourceMapObject: any;
- before(() => {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--output',
- outputFilePath,
- '--config',
- configFilePath
- ]);
- try {
- const content: string = fs.readFileSync(outputSourceMapPath, {encoding: 'utf8'});
- isFileExist = true;
- sourceMapObject = JSON.parse(content);
- } catch (e) {
- isFileExist = false;
- }
- });
- it('should create file with source map in the same directory as output file', () => {
- assert.equal(isFileExist, true);
- });
- it('source map from created file should contains property `version`', () => {
- assert.property(sourceMapObject, 'version');
- });
- it('source map from created file should contains property `sources`', () => {
- assert.property(sourceMapObject, 'sources');
- });
- it('source map from created file should contains property `names`', () => {
- assert.property(sourceMapObject, 'names');
- });
- after(() => {
- fs.unlinkSync(outputFilePath);
- fs.unlinkSync(outputSourceMapPath);
- });
- });
- describe('`--exclude` option', () => {
- const directoryPath: string = path.join(fixturesDirName, 'directory-obfuscation');
- const outputFileName1: string = 'foo-obfuscated.js';
- const outputFileName2: string = 'bar-obfuscated.js';
- let outputFixturesFilePath1: string,
- outputFixturesFilePath2: string,
- isFileExist1: boolean,
- isFileExist2: boolean;
- before(() => {
- outputFixturesFilePath1 = path.join(directoryPath, outputFileName1);
- outputFixturesFilePath2 = path.join(directoryPath, outputFileName2);
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- directoryPath,
- '--config',
- configFilePath
- ]);
- isFileExist1 = fs.existsSync(outputFixturesFilePath1);
- isFileExist2 = fs.existsSync(outputFixturesFilePath2);
- });
- it(`shouldn't create file \`${outputFileName1}\` in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist1, false);
- });
- it(`should create file \`${outputFileName2}\` with obfuscated code in \`${fixturesDirName}\` directory`, () => {
- assert.equal(isFileExist2, true);
- });
- after(() => {
- rimraf.sync(outputFixturesFilePath1);
- rimraf.sync(outputFixturesFilePath2);
- });
- });
- });
- describe('`--config` option is set but overridden by CLI option', () => {
- const outputSourceMapPath: string = `${outputFilePath}.map`;
- let isFileExist: boolean;
- before(() => {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- fixtureFilePath,
- '--output',
- outputFilePath,
- '--config',
- configFilePath,
- '--source-map',
- 'false',
- ]);
- try {
- fs.readFileSync(outputSourceMapPath, {encoding: 'utf8'});
- isFileExist = true;
- } catch (e) {
- isFileExist = false;
- }
- });
- it('should create file without source map in the same directory as output file', () => {
- assert.equal(isFileExist, false);
- });
- after(() => {
- fs.unlinkSync(outputFilePath);
- });
- });
- describe('Logging', () => {
- describe('Obfuscating file message', () => {
- const directoryPath: string = path.join(fixturesDirName, 'directory-obfuscation');
- const inputFileName1: string = 'foo.js';
- const inputFileName2: string = 'bar.js';
- const inputFilePath1: string = path.join(directoryPath, inputFileName1);
- const inputFilePath2: string = path.join(directoryPath, inputFileName2);
- const outputFileName1: string = 'foo-obfuscated.js';
- const outputFileName2: string = 'bar-obfuscated.js';
- const outputFilePath1: string = path.join(directoryPath, outputFileName1);
- const outputFilePath2: string = path.join(directoryPath, outputFileName2);
- const expectedLoggingMessage1: string = `[javascript-obfuscator-cli] Obfuscating file: ${inputFilePath1}...`;
- const expectedLoggingMessage2: string = `[javascript-obfuscator-cli] Obfuscating file: ${inputFilePath2}...`;
- let consoleLogSpy: sinon.SinonSpy<any, void>,
- loggingMessageResult1: string,
- loggingMessageResult2: string;
- before(() => {
- consoleLogSpy = sinon.spy(console, 'log');
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- directoryPath,
- '--rename-globals',
- 'true'
- ]);
- loggingMessageResult1 = consoleLogSpy.getCall(1).args[0];
- loggingMessageResult2 = consoleLogSpy.getCall(0).args[0];
- });
- it('Variant #1: should log file name to the console', () => {
- assert.include(loggingMessageResult1, expectedLoggingMessage1);
- });
- it('Variant #2: should log file name to the console', () => {
- assert.include(loggingMessageResult2, expectedLoggingMessage2);
- });
- after(() => {
- rimraf.sync(outputFilePath1);
- rimraf.sync(outputFilePath2);
- consoleLogSpy.restore();
- });
- });
- describe('Error message', () => {
- const directoryPath: string = path.join(fixturesDirName, 'directory-obfuscation-error');
- const inputFileName: string = 'foo.js';
- const inputFilePath: string = path.join(directoryPath, inputFileName);
- const expectedLoggingMessage1: string = `[javascript-obfuscator-cli] Error in file: ${inputFilePath}...`;
- let consoleLogSpy: sinon.SinonSpy<any, void>,
- loggingMessageResult: string
- before(() => {
- consoleLogSpy = sinon.spy(console, 'log');
- try {
- JavaScriptObfuscatorCLI.obfuscate([
- 'node',
- 'javascript-obfuscator',
- directoryPath,
- '--rename-globals',
- 'true'
- ]);
- } catch {}
- loggingMessageResult = consoleLogSpy.getCall(1).args[0];
- });
- it('Should log file name to the console', () => {
- assert.include(loggingMessageResult, expectedLoggingMessage1);
- });
- after(() => {
- consoleLogSpy.restore();
- });
- });
- });
- after(() => {
- rimraf.sync(outputDirName);
- });
- });
- });
|