From 2c0e52a3da3b7a1b5ffb0958d71e2e2ae83a22f3 Mon Sep 17 00:00:00 2001 From: Michael Nicholls Date: Wed, 26 Mar 2014 16:37:07 +0000 Subject: [PATCH 001/127] fix #1 add delete project api --- jscrambler.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/jscrambler.js b/jscrambler.js index 4fa2478..73941e2 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -92,5 +92,20 @@ exports = module.exports = else deferred.resolve(JSON.parse(body)); }); return deferred.promise; + }, + /** + * Deletes code through the API. + * @param {JScramblerClient} client + * @param {String} projectId + * @returns {Q.promise} + */ + deleteCode: function (client, projectId) { + var deferred = Q.defer(); + client.delete('/code/' + projectId + '.zip', null, function (err, res, body) { + if (err) deferred.reject(err); + else if (res.statusCode >= 400) deferred.reject(res); + else deferred.resolve(JSON.parse(body)); + }); + return deferred.promise; } }; From 601d32448db180e0e83b48cd48770e86ada04174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 14 Apr 2014 14:40:13 +0100 Subject: [PATCH 002/127] fix #4 zip compression and extraction --- bin/jscrambler | 3 +-- jscrambler.js | 45 +++++++++++++++++++++++++++++++++++++++++---- package.json | 3 ++- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/bin/jscrambler b/bin/jscrambler index 0e0d72d..f09ec65 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -2,7 +2,6 @@ 'use strict'; var commander = require('commander'); -var fs = require('fs-extra'); var jScrambler = require('../jscrambler'); var path = require('path'); @@ -38,5 +37,5 @@ jScrambler return jScrambler.downloadCode(client, res.id); }) .then(function (res) { - fs.outputFileSync(dest, res); + return jScrambler.unzipProject(res, dest); }); diff --git a/jscrambler.js b/jscrambler.js index 73941e2..75e39c8 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -1,12 +1,17 @@ -'use strict'; -var JScramblerClient = require('./jscrambler-client'); -var Q = require('q'); /** * A facade to access JScrambler API using JScramblerClient. * @namespace jScramblerFacade * @author José Magalhães (magalhas@gmail.com) * @license MIT */ +'use strict'; + +var fs = require('fs-extra'); +var JScramblerClient = require('./jscrambler-client'); +var JSZip = require('jszip'); +var path = require('path'); +var Q = require('q'); + exports = module.exports = /** @lends jScramblerFacade */ { @@ -86,11 +91,13 @@ exports = module.exports = */ uploadCode: function (client, params) { var deferred = Q.defer(); + this.zipProject(params.files); client.post('/code.json', params, function (err, res, body) { + this.cleanZipProject(); if (err) deferred.reject(err); else if (res.statusCode >= 400) deferred.reject(res); else deferred.resolve(JSON.parse(body)); - }); + }.bind(this)); return deferred.promise; }, /** @@ -107,5 +114,35 @@ exports = module.exports = else deferred.resolve(JSON.parse(body)); }); return deferred.promise; + }, + /** + * It cleans the temporary zip project. + */ + cleanZipProject: function () { + fs.unlinkSync('.tmp.zip'); + }, + /** + * It zips all files inside the passed parameter into a single zip file. + */ + zipProject: function (files) { + var zip = new JSZip(); + for (var i = 0, l = files.length; i < l; ++i) { + zip.file(files[i], fs.readFileSync(files[i])); + } + fs.outputFileSync('.tmp.zip', zip.generate(), {encoding: 'base64'}); + files[0] = '.tmp.zip'; + files.length = 1; + }, + /** + * It unzips a zip file to the given destination. + */ + unzipProject: function (zipFile, dest) { + var zip = new JSZip(zipFile); + for (var file in zip.files) { + if (!zip.files[file].options.dir) { + var buffer = zip.file(file).asNodeBuffer(); + fs.outputFileSync(path.join(dest, file), buffer); + } + } } }; diff --git a/package.json b/package.json index 0896352..9aa8c4f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "lodash": "^2.4.1", "needle": "^0.6.6", "commander": "^2.1.0", - "fs-extra": "^0.8.1" + "fs-extra": "^0.8.1", + "jszip": "^2.2.0" }, "main": "jscrambler", "bin": "bin/jscrambler" From 0bb74666e3728181bb91927474067f0c12c866cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 14 Apr 2014 14:41:44 +0100 Subject: [PATCH 003/127] v0.3.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9aa8c4f..fe387f9 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.3.0", + "version": "0.3.1", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From 79e6013720b3486ba9f30926ccbcf44d72cade48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 14 Apr 2014 14:44:51 +0100 Subject: [PATCH 004/127] add .npmignore --- .npmignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .npmignore diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..d344ba6 --- /dev/null +++ b/.npmignore @@ -0,0 +1 @@ +config.json From ae2a3327454e42bfbb4edfcc679db7e5582ce5f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 21 Apr 2014 13:06:37 +0100 Subject: [PATCH 005/127] fix uri encoding not covering some reserved characters --- jscrambler-client.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jscrambler-client.js b/jscrambler-client.js index 613cf6f..19f33dc 100644 --- a/jscrambler-client.js +++ b/jscrambler-client.js @@ -61,6 +61,11 @@ function buildSortedQuery (params) { var query = ''; for (var i = 0, l = keys.length; i < l; i++) query += encodeURIComponent(keys[i]) + '=' + encodeURIComponent(params[keys[i]]) + '&'; + query = query + .replace(/\*/g, '%2A') + .replace(/[!'()]/g, escape) + .replace(/%7E/g, '~') + .replace(/\+/g, '%20'); // Strip the last separator and return return query.substring(0, query.length - 1); } From 94053f172754f2056f991f7708df956865956e94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Magalh=C3=A3es?= Date: Mon, 28 Apr 2014 14:09:30 +0100 Subject: [PATCH 006/127] update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d2d7a20..e7a9e8a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# JSCrambler Client for Node.js +# JScrambler Client for Node.js ## CLI ```shell From bce20447f4b0f405c065bf909c5e9586ae3d0867 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 28 Apr 2014 17:31:56 +0100 Subject: [PATCH 007/127] v0.3.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fe387f9..f6b6d73 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.3.1", + "version": "0.3.2", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From 4b46bbdacd503b741775dd531918865afe78ff9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 6 May 2014 14:39:32 +0100 Subject: [PATCH 008/127] support files input as buffers --- jscrambler.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index 75e39c8..9ba22e7 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -127,7 +127,15 @@ exports = module.exports = zipProject: function (files) { var zip = new JSZip(); for (var i = 0, l = files.length; i < l; ++i) { - zip.file(files[i], fs.readFileSync(files[i])); + var buffer, name; + if (files[i].contents) { + name = path.relative(files[i].cwd, files[i].path); + buffer = files[i].contents; + } else { + name = files[i]; + buffer = fs.readFileSync(files[i]); + } + zip.file(name, buffer); } fs.outputFileSync('.tmp.zip', zip.generate(), {encoding: 'base64'}); files[0] = '.tmp.zip'; @@ -141,7 +149,11 @@ exports = module.exports = for (var file in zip.files) { if (!zip.files[file].options.dir) { var buffer = zip.file(file).asNodeBuffer(); - fs.outputFileSync(path.join(dest, file), buffer); + if (typeof dest === 'function') { + dest(buffer, file); + } else if (dest) { + fs.outputFileSync(path.join(dest, file), buffer); + } } } } From 7f62e49fc3794b148dc550483ff16133d1ca2129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 6 May 2014 14:40:04 +0100 Subject: [PATCH 009/127] v0.3.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f6b6d73..ad5e030 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.3.2", + "version": "0.3.3", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From dd2e20d43cc2c73ef37d0da6d1d068846ad036ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Wed, 7 May 2014 15:14:02 +0100 Subject: [PATCH 010/127] better error treatment --- jscrambler.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index 9ba22e7..4799185 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -37,7 +37,7 @@ exports = module.exports = path += '.zip'; client.get(path, null, function (err, res, body) { if (err) deferred.reject(err); - else if (res.statusCode >= 400) deferred.reject(res); + else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); else deferred.resolve(body); }); }); @@ -52,7 +52,7 @@ exports = module.exports = var deferred = Q.defer(); client.get('/code.json', null, function (err, res, body) { if (err) deferred.reject(err); - else if (res.statusCode >= 400) deferred.reject(res); + else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); else deferred.resolve(JSON.parse(body)); }); return deferred.promise; @@ -95,7 +95,7 @@ exports = module.exports = client.post('/code.json', params, function (err, res, body) { this.cleanZipProject(); if (err) deferred.reject(err); - else if (res.statusCode >= 400) deferred.reject(res); + else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); else deferred.resolve(JSON.parse(body)); }.bind(this)); return deferred.promise; @@ -110,7 +110,7 @@ exports = module.exports = var deferred = Q.defer(); client.delete('/code/' + projectId + '.zip', null, function (err, res, body) { if (err) deferred.reject(err); - else if (res.statusCode >= 400) deferred.reject(res); + else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); else deferred.resolve(JSON.parse(body)); }); return deferred.promise; From 01a8c5b35ba8105f9254bae75fbdaa5de8a09abc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Wed, 7 May 2014 15:14:36 +0100 Subject: [PATCH 011/127] bin output to console when using a single source file without a destination --- bin/jscrambler | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/bin/jscrambler b/bin/jscrambler index f09ec65..2294c8d 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -9,12 +9,15 @@ commander .version(require('../package.json').version) .usage('[source files] [options]') .option('-c, --config [config]', 'JScrambler configuration options') - .option('-o, --output ', 'Output directory') + .option('-o, --output ', 'Output directory. If not specified the output is printed.') .option('-a, --access-key ', 'Access key') .option('-s, --secret-key ', 'Secret key') .parse(process.argv); -if (!commander.output || !commander.accessKey || !commander.secretKey) { +if (!commander.accessKey || !commander.secretKey) { + console.log(commander.help()); +} else if (!commander.output && commander.args.length > 1) { + console.error('Destination must be specified unless only one file is used as input.'); console.log(commander.help()); } @@ -37,5 +40,14 @@ jScrambler return jScrambler.downloadCode(client, res.id); }) .then(function (res) { + if (filesSrc.length === 1 && !dest) { + dest = function (buffer, file) { + console.log(buffer.toString()); + } + } return jScrambler.unzipProject(res, dest); + }) + .fail(function (err) { + console.error(err); + process.exit(1); }); From 6b241fa7c431060e9a8f550477cd9575c146f5a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Wed, 7 May 2014 15:52:23 +0100 Subject: [PATCH 012/127] update README.md with CLI examples --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index e7a9e8a..4ab8a2d 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,16 @@ npm install -g jscrambler -a, --access-key Access key -s, --secret-key Secret key +### Output to a single file +```shell +jscrambler input.js -a XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -s XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX > output.js +``` + +### Output multiple files to a directory +```shell +jscrambler input1.js input2.js -o dest/ -a XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -s XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` + ## API ```shell npm install jscrambler From ee6d569b15aca1d8312931e0bf3d10da3c21268e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Thu, 8 May 2014 18:30:01 +0100 Subject: [PATCH 013/127] minimatch cli --- README.md | 4 ++++ bin/jscrambler | 17 +++++++++++++---- package.json | 3 ++- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 4ab8a2d..af27631 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,10 @@ jscrambler input.js -a XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -s XXXXXXXXXXXXX ```shell jscrambler input1.js input2.js -o dest/ -a XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -s XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ``` +### Using minimatch +```shell +jscrambler "lib/**/*.js" -o dest/ -a XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -s XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +``` ## API ```shell diff --git a/bin/jscrambler b/bin/jscrambler index 2294c8d..3d32df1 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -2,6 +2,7 @@ 'use strict'; var commander = require('commander'); +var glob = require('glob'); var jScrambler = require('../jscrambler'); var path = require('path'); @@ -15,13 +16,21 @@ commander .parse(process.argv); if (!commander.accessKey || !commander.secretKey) { - console.log(commander.help()); -} else if (!commander.output && commander.args.length > 1) { + console.error('Access and secret keys must be provided to engage with the services.'); + process.exit(1); +} + +var filesSrc = []; +var globSrc = commander.args; +for (var i = 0, l = globSrc.length; i < l; ++i) { + filesSrc = filesSrc.concat(glob.sync(globSrc[i])); +} + +if (!commander.output && filesSrc.length > 1) { console.error('Destination must be specified unless only one file is used as input.'); - console.log(commander.help()); + process.exit(1); } -var filesSrc = commander.args; var dest = commander.output; var accessKey = commander.accessKey; var secretKey = commander.secretKey; diff --git a/package.json b/package.json index ad5e030..9eceff5 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,8 @@ "needle": "^0.6.6", "commander": "^2.1.0", "fs-extra": "^0.8.1", - "jszip": "^2.2.0" + "jszip": "^2.2.0", + "glob": "^3.2.9" }, "main": "jscrambler", "bin": "bin/jscrambler" From be2ad1976a8340d999179a4c0c4324ad0c5ad66b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Thu, 8 May 2014 18:30:51 +0100 Subject: [PATCH 014/127] v0.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9eceff5..a00a336 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.3.3", + "version": "0.4.0", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From 0991cdaae6e6d8f89983c7a3f389e833277d3fb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 16 May 2014 10:44:48 +0100 Subject: [PATCH 015/127] process method that executes the common use case of the client --- jscrambler.js | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/jscrambler.js b/jscrambler.js index 4799185..97586e9 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -7,6 +7,7 @@ 'use strict'; var fs = require('fs-extra'); +var glob = require('glob'); var JScramblerClient = require('./jscrambler-client'); var JSZip = require('jszip'); var path = require('path'); @@ -115,6 +116,68 @@ exports = module.exports = }); return deferred.promise; }, + /** + * Common operation sequence intended when using the client. First it + * uploads a project, then it polls the server to download and unzip the + * project into a folder. + * @param {String|Object} configPathOrObject + * @returns {Q.promise} + */ + process: function (configPathOrObject, destCallback) { + var config = typeof configPathOrObject === 'string' ? + require(configPathOrObject) : configPathOrObject; + if (!config.keys || !config.keys.accessKey || !config.keys.secretKey) { + throw new Exception('Access key and secret key must be provided in the configuration file.'); + } + var accessKey = config.keys.accessKey; + var secretKey = config.keys.secretKey; + var host = config.host; + var port = config.port; + var apiVersion = config.apiVersion; + // Instance a JScrambler client + var client = new this.Client({ + accessKey: accessKey, + secretKey: secretKey, + host: host, + port: port, + apiVersion: apiVersion + }); + // Check for source files and add them to the parameters + if (!config.filesSrc) { + throw new Exception('Source files must be provided.'); + } + // Check if output directory was provided + if (!config.filesDest && !destCallback) { + throw new Exception('Output directory must be provided.'); + } + var filesSrc = []; + for (var i = 0, l = config.filesSrc.length; i < l; ++i) { + if (typeof config.filesSrc[i] === 'string') { + filesSrc = filesSrc.concat(glob.sync(config.filesSrc[i])); + } else { + filesSrc.push(config.filesSrc[i]); + } + } + // Prepare object to post + var params = config.params || {}; + params.files = filesSrc; + var self = this; + var projectId; + return this + .uploadCode(client, params) + .then(function (res) { + projectId = res.id; + return self.downloadCode(client, res.id); + }) + .then(function (res) { + return self.unzipProject(res, config.filesDest || destCallback); + }) + .then(function () { + if (config.deleteProject) { + return self.deleteCode(client, projectId); + } + }); + }, /** * It cleans the temporary zip project. */ From 1fdaf5bf29967d46163024ed0e50017d73cbadd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 16 May 2014 15:11:36 +0100 Subject: [PATCH 016/127] fix method to zip was trying to read directories as files --- jscrambler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jscrambler.js b/jscrambler.js index 97586e9..5c7267a 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -194,7 +194,7 @@ exports = module.exports = if (files[i].contents) { name = path.relative(files[i].cwd, files[i].path); buffer = files[i].contents; - } else { + } else if (!fs.lstatSync(files[i]).isDirectory()) { name = files[i]; buffer = fs.readFileSync(files[i]); } From a7af815fe106eae263054ebf540691a2bf6c2d26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 19 May 2014 12:17:04 +0100 Subject: [PATCH 017/127] fix requests timeout was low (10s). there's no timeout now. --- jscrambler-client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jscrambler-client.js b/jscrambler-client.js index 19f33dc..69d5757 100644 --- a/jscrambler-client.js +++ b/jscrambler-client.js @@ -158,7 +158,7 @@ JScramblerClient.prototype.get = function (path, params, callback) { */ JScramblerClient.prototype.request = function (method, path, params, callback) { var signedData; - var options = {}; + var options = {timeout: 0}; if (!params) params = {}; // If post sign data and set the request as multipart if (method === 'POST') { From 85db935be45e815e77339e21654d7ce4304e60a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Wed, 21 May 2014 12:32:24 +0100 Subject: [PATCH 018/127] fix empty folders were not being added to the uploaded zip file and memory issues when handling big data --- jscrambler.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index 5c7267a..655e091 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -194,13 +194,17 @@ exports = module.exports = if (files[i].contents) { name = path.relative(files[i].cwd, files[i].path); buffer = files[i].contents; - } else if (!fs.lstatSync(files[i]).isDirectory()) { + } else if (!fs.statSync(files[i]).isDirectory()) { name = files[i]; buffer = fs.readFileSync(files[i]); + } else { + zip.folder(files[i]); + } + if (name) { + zip.file(name, buffer); } - zip.file(name, buffer); } - fs.outputFileSync('.tmp.zip', zip.generate(), {encoding: 'base64'}); + fs.outputFileSync('.tmp.zip', zip.generate({type: 'nodebuffer'}), {encoding: 'base64'}); files[0] = '.tmp.zip'; files.length = 1; }, From b7d07b022bffd35f1686f1774b4f2df7eb97b29b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Thu, 22 May 2014 16:42:44 +0100 Subject: [PATCH 019/127] improved error handling on some promises --- jscrambler.js | 68 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index 655e091..9043d4a 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -37,10 +37,17 @@ exports = module.exports = } else if (!/^.*\.zip$/.test(projectId)) path += '.zip'; client.get(path, null, function (err, res, body) { - if (err) deferred.reject(err); - else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); - else deferred.resolve(body); + try { + if (err) deferred.reject(err); + else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); + else deferred.resolve(body); + } catch (ex) { + deferred.reject(body); + } }); + }) + .fail(function () { + deferred.reject.apply(null, arguments); }); return deferred.promise; }, @@ -49,12 +56,17 @@ exports = module.exports = * @param {JScramblerClient} client * @returns {Q.promise} */ - getInfo: function (client) { + getInfo: function (client, projectId) { var deferred = Q.defer(); - client.get('/code.json', null, function (err, res, body) { - if (err) deferred.reject(err); - else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); - else deferred.resolve(JSON.parse(body)); + var path = projectId ? '/code/' + projectId + '.json' : '/code.json'; + client.get(path, null, function (err, res, body) { + try { + if (err) deferred.reject(err); + else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); + else deferred.resolve(JSON.parse(body)); + } catch (ex) { + deferred.reject(body); + } }); return deferred.promise; }, @@ -65,20 +77,22 @@ exports = module.exports = var deferred = Q.defer(); var isFinished = function () { this - .getInfo(client) + .getInfo(client, projectId) .then(function (res) { - for (var i = 0, l = res.length; i < l; ++i) { - // Find projectId inside the response - if (res[i].id === projectId) { - // Did it finish? - if (res[i].finished_at) { - deferred.resolve(); - return; - } + // Did it finish? + if (res.finished_at) { + if (res.error_id && res.error_id !== '0') { + deferred.reject(res); + } else { + deferred.resolve(); } + return; } // Try again later... setTimeout(isFinished, 1000); + }) + .fail(function () { + deferred.reject.apply(null, arguments); }); }.bind(this); isFinished(); @@ -95,9 +109,13 @@ exports = module.exports = this.zipProject(params.files); client.post('/code.json', params, function (err, res, body) { this.cleanZipProject(); - if (err) deferred.reject(err); - else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); - else deferred.resolve(JSON.parse(body)); + try { + if (err) deferred.reject(err); + else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); + else deferred.resolve(JSON.parse(body)); + } catch (ex) { + deferred.reject(body); + } }.bind(this)); return deferred.promise; }, @@ -110,9 +128,13 @@ exports = module.exports = deleteCode: function (client, projectId) { var deferred = Q.defer(); client.delete('/code/' + projectId + '.zip', null, function (err, res, body) { - if (err) deferred.reject(err); - else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); - else deferred.resolve(JSON.parse(body)); + try { + if (err) deferred.reject(err); + else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); + else deferred.resolve(JSON.parse(body)); + } catch (ex) { + deferred.reject(body); + } }); return deferred.promise; }, From 08006c5be33868c9371498f30d600ece7afde54b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Thu, 22 May 2014 16:43:13 +0100 Subject: [PATCH 020/127] add host, port and api version arguments to the CLI --- bin/jscrambler | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/bin/jscrambler b/bin/jscrambler index 3d32df1..1238f98 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -10,9 +10,12 @@ commander .version(require('../package.json').version) .usage('[source files] [options]') .option('-c, --config [config]', 'JScrambler configuration options') - .option('-o, --output ', 'Output directory. If not specified the output is printed.') + .option('-o, --output [output]', 'Output directory. If not specified the output is printed.') .option('-a, --access-key ', 'Access key') .option('-s, --secret-key ', 'Secret key') + .option('-h, --host [host]', 'Hostname') + .option('-p, --port [port]', 'Port') + .option('-v, --api-version [apiVersion]', 'Version') .parse(process.argv); if (!commander.accessKey || !commander.secretKey) { @@ -34,13 +37,19 @@ if (!commander.output && filesSrc.length > 1) { var dest = commander.output; var accessKey = commander.accessKey; var secretKey = commander.secretKey; +var host = commander.host; +var port = commander.port && parseInt(commander.port); +var apiVersion = commander.apiVersion; var config = commander.config && require(path.resolve(commander.config, '.')) || {}; config.files = filesSrc; var client = new jScrambler.Client({ accessKey: accessKey, - secretKey: secretKey + secretKey: secretKey, + host: host, + port: port, + apiVersion: apiVersion }); jScrambler From cd1c6c475aa88851776c29e122051b373827b4f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Thu, 22 May 2014 20:03:02 +0100 Subject: [PATCH 021/127] v0.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a00a336..bdafa0e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.4.0", + "version": "0.5.0", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From 0f01fa9e5cbe298099ef0e6716b62537cb98d1af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 23 May 2014 11:34:27 +0100 Subject: [PATCH 022/127] update dependencies --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index bdafa0e..ae6d40c 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,8 @@ "needle": "^0.6.6", "commander": "^2.1.0", "fs-extra": "^0.8.1", - "jszip": "^2.2.0", - "glob": "^3.2.9" + "jszip": "^2.2.2", + "glob": "^3.2.11" }, "main": "jscrambler", "bin": "bin/jscrambler" From fee6f9623ac36184775ae15ebb8cc48fd4fbaacf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 26 May 2014 16:29:37 +0100 Subject: [PATCH 023/127] fix when sending zip files there's no need to zip them --- jscrambler.js | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index 9043d4a..38d62b2 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -210,25 +210,29 @@ exports = module.exports = * It zips all files inside the passed parameter into a single zip file. */ zipProject: function (files) { - var zip = new JSZip(); - for (var i = 0, l = files.length; i < l; ++i) { - var buffer, name; - if (files[i].contents) { - name = path.relative(files[i].cwd, files[i].path); - buffer = files[i].contents; - } else if (!fs.statSync(files[i]).isDirectory()) { - name = files[i]; - buffer = fs.readFileSync(files[i]); - } else { - zip.folder(files[i]); - } - if (name) { - zip.file(name, buffer); + if (files.length === 1 && /^.*\.zip$/.test(files[0])) { + fs.outputFileSync('.tmp.zip', fs.readFileSync(files[0])); + } else { + var zip = new JSZip(); + for (var i = 0, l = files.length; i < l; ++i) { + var buffer, name; + if (files[i].contents) { + name = path.relative(files[i].cwd, files[i].path); + buffer = files[i].contents; + } else if (!fs.statSync(files[i]).isDirectory()) { + name = files[i]; + buffer = fs.readFileSync(files[i]); + } else { + zip.folder(files[i]); + } + if (name) { + zip.file(name, buffer); + } } + fs.outputFileSync('.tmp.zip', zip.generate({type: 'nodebuffer'}), {encoding: 'base64'}); + files[0] = '.tmp.zip'; + files.length = 1; } - fs.outputFileSync('.tmp.zip', zip.generate({type: 'nodebuffer'}), {encoding: 'base64'}); - files[0] = '.tmp.zip'; - files.length = 1; }, /** * It unzips a zip file to the given destination. From e2753dfa0274a4a95a32e3f05543484c07b46546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 26 May 2014 17:07:13 +0100 Subject: [PATCH 024/127] cli support of a single config file --- bin/jscrambler | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/bin/jscrambler b/bin/jscrambler index 1238f98..b3101a5 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -18,22 +18,36 @@ commander .option('-v, --api-version [apiVersion]', 'Version') .parse(process.argv); +var filesSrc = []; +var globSrc, params; +if (commander.args.length === 1 && /^.*\.json$/.test(commander.args[0])) { + var configFile = require(path.resolve(commander.args[0], '.')); + globSrc = configFile.filesSrc; + commander.output = configFile.filesDest; + commander.accessKey = configFile.keys.accessKey; + commander.secretKey = configFile.keys.secretKey; + commander.host = configFile.host; + commander.port = configFile.port; + commander.apiVersion = configFile.apiVersion; + params = configFile.params; +} else { + globSrc = commander.args; +} + if (!commander.accessKey || !commander.secretKey) { console.error('Access and secret keys must be provided to engage with the services.'); process.exit(1); } -var filesSrc = []; -var globSrc = commander.args; -for (var i = 0, l = globSrc.length; i < l; ++i) { - filesSrc = filesSrc.concat(glob.sync(globSrc[i])); -} - if (!commander.output && filesSrc.length > 1) { console.error('Destination must be specified unless only one file is used as input.'); process.exit(1); } +for (var i = 0, l = globSrc.length; i < l; ++i) { + filesSrc = filesSrc.concat(glob.sync(globSrc[i])); +} + var dest = commander.output; var accessKey = commander.accessKey; var secretKey = commander.secretKey; @@ -41,7 +55,7 @@ var host = commander.host; var port = commander.port && parseInt(commander.port); var apiVersion = commander.apiVersion; -var config = commander.config && require(path.resolve(commander.config, '.')) || {}; +var config = commander.config && require(path.resolve(commander.config, '.')) || params || {}; config.files = filesSrc; var client = new jScrambler.Client({ From 9dbf7cf01394cb4093bfbf1f6f935f1528284cbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 26 May 2014 17:07:35 +0100 Subject: [PATCH 025/127] fix an error is now thrown when no source files were found --- jscrambler.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index 38d62b2..30a29da 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -210,7 +210,9 @@ exports = module.exports = * It zips all files inside the passed parameter into a single zip file. */ zipProject: function (files) { + var hasFiles = false; if (files.length === 1 && /^.*\.zip$/.test(files[0])) { + hasFiles = true; fs.outputFileSync('.tmp.zip', fs.readFileSync(files[0])); } else { var zip = new JSZip(); @@ -226,12 +228,17 @@ exports = module.exports = zip.folder(files[i]); } if (name) { + hasFiles = true; zip.file(name, buffer); } } - fs.outputFileSync('.tmp.zip', zip.generate({type: 'nodebuffer'}), {encoding: 'base64'}); - files[0] = '.tmp.zip'; - files.length = 1; + if (hasFiles) { + fs.outputFileSync('.tmp.zip', zip.generate({type: 'nodebuffer'}), {encoding: 'base64'}); + files[0] = '.tmp.zip'; + files.length = 1; + } else { + throw new Error('No source files found. If you intend to send a whole directory sufix your path with "**" (e.g. ./my-directory/**)'); + } } }, /** From ab4b75dd0058be733942156c49c127634ea42bf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 27 May 2014 12:02:51 +0100 Subject: [PATCH 026/127] send user agent to the services --- jscrambler-client.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jscrambler-client.js b/jscrambler-client.js index 69d5757..493826b 100644 --- a/jscrambler-client.js +++ b/jscrambler-client.js @@ -125,7 +125,8 @@ function handleFileParams (params) { function signedParams (method, path, params) { _.defaults(params, { access_key: this.options.accessKey, - timestamp: new Date().toISOString() + timestamp: new Date().toISOString(), + user_agent: 'Node' }); if (method === 'POST' && params.files) handleFileParams(params); params.signature = generateHmacSignature.apply(this, arguments); From 5f6fa22d62bf77be37bd9dbe9fa121b74ed6ad44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 30 May 2014 17:24:34 +0100 Subject: [PATCH 027/127] v0.5.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ae6d40c..e5da20f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.5.0", + "version": "0.5.1", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From a5a2233dcb1ec294d769dddcd4cc4cdf04ac621d Mon Sep 17 00:00:00 2001 From: bruno12mota Date: Thu, 5 Jun 2014 15:09:18 +0100 Subject: [PATCH 028/127] Cwd parameter added for upload code action --- jscrambler.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index 30a29da..257784b 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -106,7 +106,7 @@ exports = module.exports = */ uploadCode: function (client, params) { var deferred = Q.defer(); - this.zipProject(params.files); + this.zipProject(params.files, params.cwd); client.post('/code.json', params, function (err, res, body) { this.cleanZipProject(); try { @@ -207,9 +207,10 @@ exports = module.exports = fs.unlinkSync('.tmp.zip'); }, /** - * It zips all files inside the passed parameter into a single zip file. + * It zips all files inside the passed parameter into a single zip file. It + * accepts an optional `cwd` parameter. */ - zipProject: function (files) { + zipProject: function (files, cwd) { var hasFiles = false; if (files.length === 1 && /^.*\.zip$/.test(files[0])) { hasFiles = true; @@ -218,14 +219,20 @@ exports = module.exports = var zip = new JSZip(); for (var i = 0, l = files.length; i < l; ++i) { var buffer, name; + var path = cwd ? cwd + '/' + files[i] : files[i]; + // If buffer if (files[i].contents) { name = path.relative(files[i].cwd, files[i].path); buffer = files[i].contents; - } else if (!fs.statSync(files[i]).isDirectory()) { + } + // Else if it's a path and not a directory + else if (!fs.statSync(path).isDirectory()) { name = files[i]; - buffer = fs.readFileSync(files[i]); - } else { - zip.folder(files[i]); + buffer = fs.readFileSync(path); + } + // Else if it's a directory path + else { + zip.folder(path); } if (name) { hasFiles = true; From b25d960d0f0c45e29dfa663c3b9f8e3394fc96f3 Mon Sep 17 00:00:00 2001 From: bruno12mota Date: Thu, 5 Jun 2014 15:14:31 +0100 Subject: [PATCH 029/127] Delete cwd parameter --- jscrambler.js | 1 + 1 file changed, 1 insertion(+) diff --git a/jscrambler.js b/jscrambler.js index 257784b..0819869 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -107,6 +107,7 @@ exports = module.exports = uploadCode: function (client, params) { var deferred = Q.defer(); this.zipProject(params.files, params.cwd); + delete params.cwd; client.post('/code.json', params, function (err, res, body) { this.cleanZipProject(); try { From 0ce63d655959620afdc6f69e1b1d4e7908947b27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 23 Jun 2014 10:58:45 +0100 Subject: [PATCH 030/127] fix glob matching was ignoring hidden (dot) files --- bin/jscrambler | 2 +- jscrambler.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/jscrambler b/bin/jscrambler index b3101a5..9499f63 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -45,7 +45,7 @@ if (!commander.output && filesSrc.length > 1) { } for (var i = 0, l = globSrc.length; i < l; ++i) { - filesSrc = filesSrc.concat(glob.sync(globSrc[i])); + filesSrc = filesSrc.concat(glob.sync(globSrc[i], {dot: true})); } var dest = commander.output; diff --git a/jscrambler.js b/jscrambler.js index 0819869..d176d6b 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -176,7 +176,7 @@ exports = module.exports = var filesSrc = []; for (var i = 0, l = config.filesSrc.length; i < l; ++i) { if (typeof config.filesSrc[i] === 'string') { - filesSrc = filesSrc.concat(glob.sync(config.filesSrc[i])); + filesSrc = filesSrc.concat(glob.sync(config.filesSrc[i], {dot: true})); } else { filesSrc.push(config.filesSrc[i]); } From 35ce596f28b4780723350ab8761851138d2fdcce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 23 Jun 2014 10:59:02 +0100 Subject: [PATCH 031/127] v0.5.2 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e5da20f..8007892 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.5.1", + "version": "0.5.2", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", @@ -30,7 +30,7 @@ "commander": "^2.1.0", "fs-extra": "^0.8.1", "jszip": "^2.2.2", - "glob": "^3.2.11" + "glob": "^4.0.2" }, "main": "jscrambler", "bin": "bin/jscrambler" From 83701c85b63a5f46e78385b56a3855b8c512c3db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 4 Jul 2014 10:03:25 +0100 Subject: [PATCH 032/127] fix possibility to output to a file instead of a folder --- jscrambler.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/jscrambler.js b/jscrambler.js index d176d6b..7ead145 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -6,6 +6,7 @@ */ 'use strict'; +var _ = require('lodash'); var fs = require('fs-extra'); var glob = require('glob'); var JScramblerClient = require('./jscrambler-client'); @@ -254,13 +255,21 @@ exports = module.exports = */ unzipProject: function (zipFile, dest) { var zip = new JSZip(zipFile); + var size = _.size(zip.files); for (var file in zip.files) { if (!zip.files[file].options.dir) { var buffer = zip.file(file).asNodeBuffer(); if (typeof dest === 'function') { dest(buffer, file); } else if (dest) { - fs.outputFileSync(path.join(dest, file), buffer); + var lastDestChar = dest[dest.length - 1]; + var destPath; + if (size === 1 && lastDestChar !== '/' && lastDestChar !== '\\') { + destPath = dest; + } else { + destPath = path.join(dest, file); + } + fs.outputFileSync(destPath, buffer); } } } From 474dd581d3680915d0604dd31848f622b4415cef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 4 Jul 2014 10:03:35 +0100 Subject: [PATCH 033/127] v0.5.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8007892..61716ed 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.5.2", + "version": "0.5.3", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From 2b19fb7f680db85f86a12b23da09107b22cf86a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 15 Jul 2014 11:54:04 +0100 Subject: [PATCH 034/127] bypass known unwanted files from the zip file sent to the service --- jscrambler.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jscrambler.js b/jscrambler.js index 7ead145..36e1ed1 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -214,12 +214,17 @@ exports = module.exports = */ zipProject: function (files, cwd) { var hasFiles = false; + // If it's already a zip file if (files.length === 1 && /^.*\.zip$/.test(files[0])) { hasFiles = true; fs.outputFileSync('.tmp.zip', fs.readFileSync(files[0])); } else { var zip = new JSZip(); for (var i = 0, l = files.length; i < l; ++i) { + // Bypass unwanted patterns from `files` + if (/.*\.(git|hg)(\/.*|$)/.test(files[i].path || files[i])) { + continue; + } var buffer, name; var path = cwd ? cwd + '/' + files[i] : files[i]; // If buffer From c3e253f619135bff6a81195daf259d19a5e995ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 21 Jul 2014 11:23:52 +0100 Subject: [PATCH 035/127] sanitise and normalize files paths before sending them to the services --- jscrambler.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index 36e1ed1..648958a 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -221,25 +221,32 @@ exports = module.exports = } else { var zip = new JSZip(); for (var i = 0, l = files.length; i < l; ++i) { + // Sanitise path + if (typeof files[i] === 'string') { + files[i] = path.normalize(files[i]); + if (files[i].indexOf('../') === 0) { + files[i] = path.resolve(files[i]); + } + } // Bypass unwanted patterns from `files` if (/.*\.(git|hg)(\/.*|$)/.test(files[i].path || files[i])) { continue; } var buffer, name; - var path = cwd ? cwd + '/' + files[i] : files[i]; + var sPath = cwd ? cwd + '/' + files[i] : files[i]; // If buffer if (files[i].contents) { name = path.relative(files[i].cwd, files[i].path); buffer = files[i].contents; } // Else if it's a path and not a directory - else if (!fs.statSync(path).isDirectory()) { + else if (!fs.statSync(sPath).isDirectory()) { name = files[i]; - buffer = fs.readFileSync(path); + buffer = fs.readFileSync(sPath); } // Else if it's a directory path else { - zip.folder(path); + zip.folder(sPath); } if (name) { hasFiles = true; From c378685c9718f9fa63f96c5ff66d4506d83d044e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 22 Jul 2014 12:48:31 +0100 Subject: [PATCH 036/127] v0.5.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 61716ed..f279c0b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.5.3", + "version": "0.5.4", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From d9e4edbbb793dd3fcfff5402f529e37b3ce4874f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 8 Aug 2014 11:42:53 +0100 Subject: [PATCH 037/127] temp files paths are now unique in order to allow multiple jscrambler tasks to run at the same time --- jscrambler.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index 648958a..eca8bde 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -13,6 +13,7 @@ var JScramblerClient = require('./jscrambler-client'); var JSZip = require('jszip'); var path = require('path'); var Q = require('q'); +var temp = require('temp').track(); exports = module.exports = /** @lends jScramblerFacade */ @@ -110,7 +111,6 @@ exports = module.exports = this.zipProject(params.files, params.cwd); delete params.cwd; client.post('/code.json', params, function (err, res, body) { - this.cleanZipProject(); try { if (err) deferred.reject(err); else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); @@ -202,12 +202,6 @@ exports = module.exports = } }); }, - /** - * It cleans the temporary zip project. - */ - cleanZipProject: function () { - fs.unlinkSync('.tmp.zip'); - }, /** * It zips all files inside the passed parameter into a single zip file. It * accepts an optional `cwd` parameter. @@ -217,7 +211,7 @@ exports = module.exports = // If it's already a zip file if (files.length === 1 && /^.*\.zip$/.test(files[0])) { hasFiles = true; - fs.outputFileSync('.tmp.zip', fs.readFileSync(files[0])); + fs.outputFileSync(temp.openSync({suffix: '.zip'}).path, fs.readFileSync(files[0])); } else { var zip = new JSZip(); for (var i = 0, l = files.length; i < l; ++i) { @@ -254,8 +248,9 @@ exports = module.exports = } } if (hasFiles) { - fs.outputFileSync('.tmp.zip', zip.generate({type: 'nodebuffer'}), {encoding: 'base64'}); - files[0] = '.tmp.zip'; + var tempFile = temp.openSync({suffix: '.zip'}); + fs.outputFileSync(tempFile.path, zip.generate({type: 'nodebuffer'}), {encoding: 'base64'}); + files[0] = tempFile.path; files.length = 1; } else { throw new Error('No source files found. If you intend to send a whole directory sufix your path with "**" (e.g. ./my-directory/**)'); From 8f4be30ca626abf9b90e696e49046c01c913b601 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 8 Aug 2014 11:43:15 +0100 Subject: [PATCH 038/127] v0.5.5 --- package.json | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f279c0b..21987b0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.5.4", + "version": "0.5.5", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", @@ -24,13 +24,14 @@ "node": ">= 0.8.0" }, "dependencies": { - "q": "^1.0.1", - "lodash": "^2.4.1", - "needle": "^0.6.6", "commander": "^2.1.0", "fs-extra": "^0.8.1", + "glob": "^4.0.2", "jszip": "^2.2.2", - "glob": "^4.0.2" + "lodash": "^2.4.1", + "needle": "^0.6.6", + "q": "^1.0.1", + "temp": "^0.8.1" }, "main": "jscrambler", "bin": "bin/jscrambler" From cca1277a0db8392bca1b93a30716367fa0f93e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 11 Aug 2014 18:30:07 +0100 Subject: [PATCH 039/127] fix cli params are not overriding config file params --- bin/jscrambler | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bin/jscrambler b/bin/jscrambler index 9499f63..7117ee4 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -55,7 +55,13 @@ var host = commander.host; var port = commander.port && parseInt(commander.port); var apiVersion = commander.apiVersion; -var config = commander.config && require(path.resolve(commander.config, '.')) || params || {}; +var config; +if (commander.config) { + config = require(path.resolve(commander.config, '.')); + config = config.params || config || params || {}; +} else { + config = {}; +} config.files = filesSrc; var client = new jScrambler.Client({ From ce53d747e8117890c528e2110513b11abbcbaad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 12 Aug 2014 12:08:30 +0100 Subject: [PATCH 040/127] add debug messages when in debug mode --- jscrambler.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/jscrambler.js b/jscrambler.js index eca8bde..a9cc291 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -14,6 +14,9 @@ var JSZip = require('jszip'); var path = require('path'); var Q = require('q'); var temp = require('temp').track(); +var util = require('util'); + +var debug = !!process.env.DEBUG; exports = module.exports = /** @lends jScramblerFacade */ @@ -28,6 +31,7 @@ exports = module.exports = */ downloadCode: function (client, projectId, sourceId) { var deferred = Q.defer(); + debug && console.log('Downloading code', projectId, sourceId); this .pollProject(client, projectId) .then(function () { @@ -61,6 +65,7 @@ exports = module.exports = getInfo: function (client, projectId) { var deferred = Q.defer(); var path = projectId ? '/code/' + projectId + '.json' : '/code.json'; + debug && console.log('Getting info', projectId); client.get(path, null, function (err, res, body) { try { if (err) deferred.reject(err); @@ -78,6 +83,7 @@ exports = module.exports = pollProject: function (client, projectId) { var deferred = Q.defer(); var isFinished = function () { + debug && console.log('Polling project', projectId); this .getInfo(client, projectId) .then(function (res) { @@ -110,6 +116,7 @@ exports = module.exports = var deferred = Q.defer(); this.zipProject(params.files, params.cwd); delete params.cwd; + debug && console.log('Uploading code', util.inspect(params)); client.post('/code.json', params, function (err, res, body) { try { if (err) deferred.reject(err); @@ -129,6 +136,7 @@ exports = module.exports = */ deleteCode: function (client, projectId) { var deferred = Q.defer(); + debug && console.log('Deleting project', projectId); client.delete('/code/' + projectId + '.zip', null, function (err, res, body) { try { if (err) deferred.reject(err); @@ -207,6 +215,7 @@ exports = module.exports = * accepts an optional `cwd` parameter. */ zipProject: function (files, cwd) { + debug && console.log('Zipping files', util.inspect(files)); var hasFiles = false; // If it's already a zip file if (files.length === 1 && /^.*\.zip$/.test(files[0])) { From db2a0316790e585397501c8eade5fa55e0d2cb5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 12 Aug 2014 12:08:43 +0100 Subject: [PATCH 041/127] v0.5.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 21987b0..769faf2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.5.5", + "version": "0.5.6", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From abbdc2fe022669d9bb78e8759d42b00dee8ea4fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 18 Aug 2014 20:05:28 +0100 Subject: [PATCH 042/127] typo throw exceptions instead of errors --- jscrambler.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index a9cc291..a2fcbe2 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -159,7 +159,7 @@ exports = module.exports = var config = typeof configPathOrObject === 'string' ? require(configPathOrObject) : configPathOrObject; if (!config.keys || !config.keys.accessKey || !config.keys.secretKey) { - throw new Exception('Access key and secret key must be provided in the configuration file.'); + throw new Error('Access key and secret key must be provided in the configuration file.'); } var accessKey = config.keys.accessKey; var secretKey = config.keys.secretKey; @@ -176,11 +176,11 @@ exports = module.exports = }); // Check for source files and add them to the parameters if (!config.filesSrc) { - throw new Exception('Source files must be provided.'); + throw new Error('Source files must be provided.'); } // Check if output directory was provided if (!config.filesDest && !destCallback) { - throw new Exception('Output directory must be provided.'); + throw new Error('Output directory must be provided.'); } var filesSrc = []; for (var i = 0, l = config.filesSrc.length; i < l; ++i) { From e9081f7639077aca3a42482c5a6fabd3cc5780e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 18 Aug 2014 20:49:24 +0100 Subject: [PATCH 043/127] v0.5.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 769faf2..944f98b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.5.6", + "version": "0.5.7", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From 3b521c343afe32fbc2165382d9c5346c24520870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 19 Aug 2014 12:03:01 +0100 Subject: [PATCH 044/127] upload code should not change params by reference --- jscrambler.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jscrambler.js b/jscrambler.js index a2fcbe2..4ebecd2 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -92,7 +92,7 @@ exports = module.exports = if (res.error_id && res.error_id !== '0') { deferred.reject(res); } else { - deferred.resolve(); + deferred.resolve(res); } return; } @@ -114,8 +114,12 @@ exports = module.exports = */ uploadCode: function (client, params) { var deferred = Q.defer(); + + params = _.extend({}, params); + params.files = params.files.slice(); this.zipProject(params.files, params.cwd); delete params.cwd; + debug && console.log('Uploading code', util.inspect(params)); client.post('/code.json', params, function (err, res, body) { try { From e8aa8613cf4d05046596d505f951e1fbda717f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 19 Aug 2014 12:03:39 +0100 Subject: [PATCH 045/127] integration tests using jasmine and grunt --- .gitignore | 4 +- .npmignore | 2 + Gruntfile.js | 21 +++ package.json | 10 +- test/fixtures/multiple-files/hello-world.js | 1 + test/fixtures/multiple-files/index.html | 6 + test/fixtures/nested-files/index.html | 6 + .../nested-files/lib/a/hello-world.js | 1 + .../nested-files/lib/b/hello-world.js | 1 + test/fixtures/nested-files/lib/hello-world.js | 1 + test/fixtures/single-file/index.js | 1 + test/specs/jscrambler.js | 143 ++++++++++++++++++ 12 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 Gruntfile.js create mode 100644 test/fixtures/multiple-files/hello-world.js create mode 100644 test/fixtures/multiple-files/index.html create mode 100644 test/fixtures/nested-files/index.html create mode 100644 test/fixtures/nested-files/lib/a/hello-world.js create mode 100644 test/fixtures/nested-files/lib/b/hello-world.js create mode 100644 test/fixtures/nested-files/lib/hello-world.js create mode 100644 test/fixtures/single-file/index.js create mode 100644 test/specs/jscrambler.js diff --git a/.gitignore b/.gitignore index b9dfcf3..85e21d5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ +jscrambler_keys.json node_modules npm-debug.log +reports/ tmp -.* \ No newline at end of file +.* diff --git a/.npmignore b/.npmignore index d344ba6..5394167 100644 --- a/.npmignore +++ b/.npmignore @@ -1 +1,3 @@ config.json +jscrambler_keys.json +reports/ diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..8583b61 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,21 @@ +module.exports = function (grunt) { + grunt.initConfig({ + clean: { + test: ['results/'] + }, + jasmine_node: { + options: { + forceExit: true, + match: '.', + matchall: true, + extensions: 'js' + }, + test: ['test/specs/'] + } + }); + + grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-jasmine-node'); + + grunt.registerTask('test', ['clean', 'jasmine_node', 'clean']); +}; diff --git a/package.json b/package.json index 944f98b..feaf823 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,9 @@ "url": "https://github.com/auditmark/node-jscrambler/blob/master/LICENSE-MIT" } ], + "scripts": { + "test": "grunt test 2> /dev/null" + }, "engines": { "node": ">= 0.8.0" }, @@ -34,5 +37,10 @@ "temp": "^0.8.1" }, "main": "jscrambler", - "bin": "bin/jscrambler" + "bin": "bin/jscrambler", + "devDependencies": { + "grunt": "^0.4.5", + "grunt-contrib-clean": "^0.6.0", + "grunt-jasmine-node": "^0.2.1" + } } diff --git a/test/fixtures/multiple-files/hello-world.js b/test/fixtures/multiple-files/hello-world.js new file mode 100644 index 0000000..b9d3e23 --- /dev/null +++ b/test/fixtures/multiple-files/hello-world.js @@ -0,0 +1 @@ +console.log('Hello world!'); diff --git a/test/fixtures/multiple-files/index.html b/test/fixtures/multiple-files/index.html new file mode 100644 index 0000000..c7b67ea --- /dev/null +++ b/test/fixtures/multiple-files/index.html @@ -0,0 +1,6 @@ + + + + + + diff --git a/test/fixtures/nested-files/index.html b/test/fixtures/nested-files/index.html new file mode 100644 index 0000000..c7b67ea --- /dev/null +++ b/test/fixtures/nested-files/index.html @@ -0,0 +1,6 @@ + + + + + + diff --git a/test/fixtures/nested-files/lib/a/hello-world.js b/test/fixtures/nested-files/lib/a/hello-world.js new file mode 100644 index 0000000..b9d3e23 --- /dev/null +++ b/test/fixtures/nested-files/lib/a/hello-world.js @@ -0,0 +1 @@ +console.log('Hello world!'); diff --git a/test/fixtures/nested-files/lib/b/hello-world.js b/test/fixtures/nested-files/lib/b/hello-world.js new file mode 100644 index 0000000..b9d3e23 --- /dev/null +++ b/test/fixtures/nested-files/lib/b/hello-world.js @@ -0,0 +1 @@ +console.log('Hello world!'); diff --git a/test/fixtures/nested-files/lib/hello-world.js b/test/fixtures/nested-files/lib/hello-world.js new file mode 100644 index 0000000..b9d3e23 --- /dev/null +++ b/test/fixtures/nested-files/lib/hello-world.js @@ -0,0 +1 @@ +console.log('Hello world!'); diff --git a/test/fixtures/single-file/index.js b/test/fixtures/single-file/index.js new file mode 100644 index 0000000..b9d3e23 --- /dev/null +++ b/test/fixtures/single-file/index.js @@ -0,0 +1 @@ +console.log('Hello world!'); diff --git a/test/specs/jscrambler.js b/test/specs/jscrambler.js new file mode 100644 index 0000000..37474ca --- /dev/null +++ b/test/specs/jscrambler.js @@ -0,0 +1,143 @@ +/* global describe, beforeEach, it, expect, spyOn, Buffer, jasmine */ + +var _ = require('underscore'); +var fs = require('fs'); +var jScrambler = require('../../jscrambler'); +var jScramblerKeys = require('../../jscrambler_keys'); + +describe('JScrambler Client', function () { + var jScramblerClient, projectId, downloadedBuffer; + + beforeEach(function () { + jScramblerClient = new jScrambler.Client({ + accessKey: jScramblerKeys.accessKey, + secretKey: jScramblerKeys.secretKey + }); + jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000; + }); + + test('Single file', [ + 'test/fixtures/single-file/index.js' + ]); + test('Multiple files', [ + 'test/fixtures/multiple-files/index.html', + 'test/fixtures/multiple-files/hello-world.js' + ]); + test('Nested files', [ + 'test/fixtures/nested-files/index.html', + 'test/fixtures/nested-files/lib/hello-world.js', + 'test/fixtures/nested-files/lib/a/hello-world.js', + 'test/fixtures/nested-files/lib/b/hello-world.js' + ]); + + function test (testName, files) { + it(testName + ': uploads code', function (done) { + var zipSpy = spyOn(jScrambler, 'zipProject').andCallThrough(); + + jScrambler + .uploadCode(jScramblerClient, { + files: files + }) + .then(function (res) { + expect(zipSpy).toHaveBeenCalled(); + expect(res.id).toBeDefined(); + expect(res.extension).toEqual('zip'); + + expect(res.sources.length).toEqual(files.length); + for (var i = 0, l = files.length; i < l; ++i) { + expect(_.pluck(res.sources, 'filename').indexOf(files[i]) !== -1).toBeTruthy(); + } + + projectId = res.id; + }) + .catch(function (error) { + throw error; + }) + .fin(done); + }); + + it(testName + ': gets project info', function (done) { + expect(projectId).toBeDefined(); + + jScrambler + .getInfo(jScramblerClient, projectId) + .then(function (res) { + expect(res.error_id).toEqual(null); + expect(res.extension).toEqual('zip'); + + expect(res.sources.length).toEqual(files.length); + for (var i = 0, l = files.length; i < l; ++i) { + expect(_.pluck(res.sources, 'filename').indexOf(files[i]) !== -1).toBeTruthy(); + expect(res.sources[i].error_id).toEqual(null); + } + }) + .catch(function (error) { + throw error; + }) + .fin(done); + }); + + it(testName + ': polls project', function (done) { + expect(projectId).toBeDefined(); + + jScrambler + .pollProject(jScramblerClient, projectId) + .then(function (res) { + expect(res.error_id).toEqual('0'); + expect(res.finished_at).toBeDefined(); + + expect(res.sources.length).toEqual(files.length); + for (var i = 0, l = files.length; i < l; ++i) { + expect(_.pluck(res.sources, 'filename').indexOf(files[i]) !== -1).toBeTruthy(); + } + + var finishedAt = new Date(res.finished_at); + expect(finishedAt instanceof Date).toBeTruthy(); + }) + .catch(function (error) { + throw error; + }) + .fin(done); + }); + + it(testName + ': downloads code', function (done) { + expect(projectId).toBeDefined(); + + jScrambler + .downloadCode(jScramblerClient, projectId) + .then(function (res) { + expect(Buffer.isBuffer(res)).toBeTruthy(); + downloadedBuffer = res; + }) + .catch(function (error) { + throw error; + }) + .fin(done); + }); + + it(testName + ': unzips the project', function () { + expect(downloadedBuffer).toBeDefined(); + + jScrambler.unzipProject(downloadedBuffer, './results/'); + for (var i = 0, l = files.length; i < l; ++i) { + expect(fs.existsSync('./results/' + files[i])).toBeTruthy(); + } + }); + + it(testName + ': processes', function (done) { + jScrambler + .process({ + filesSrc: files, + filesDest: './results', + keys: { + accessKey: jScramblerKeys.accessKey, + secretKey: jScramblerKeys.secretKey, + } + }) + .catch(function (error) { + throw error; + }) + .fin(done); + }); + } +}); From 1252fe18cdbc71421b5dfbcd891132acfa90abb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 19 Aug 2014 12:06:42 +0100 Subject: [PATCH 046/127] fix use lodash instead of underscore --- test/specs/jscrambler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/specs/jscrambler.js b/test/specs/jscrambler.js index 37474ca..9532ccf 100644 --- a/test/specs/jscrambler.js +++ b/test/specs/jscrambler.js @@ -1,6 +1,6 @@ /* global describe, beforeEach, it, expect, spyOn, Buffer, jasmine */ -var _ = require('underscore'); +var _ = require('lodash'); var fs = require('fs'); var jScrambler = require('../../jscrambler'); var jScramblerKeys = require('../../jscrambler_keys'); From e846484cad28cf797047677a4aca85ccf7d618f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 19 Aug 2014 12:16:49 +0100 Subject: [PATCH 047/127] better error output on integration tests --- test/specs/jscrambler.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/test/specs/jscrambler.js b/test/specs/jscrambler.js index 9532ccf..4cc3a21 100644 --- a/test/specs/jscrambler.js +++ b/test/specs/jscrambler.js @@ -1,9 +1,10 @@ -/* global describe, beforeEach, it, expect, spyOn, Buffer, jasmine */ +/* global describe, beforeEach, it, expect, spyOn, Buffer, jasmine, console */ var _ = require('lodash'); var fs = require('fs'); var jScrambler = require('../../jscrambler'); var jScramblerKeys = require('../../jscrambler_keys'); +var util = require('util'); describe('JScrambler Client', function () { var jScramblerClient, projectId, downloadedBuffer; @@ -51,7 +52,7 @@ describe('JScrambler Client', function () { projectId = res.id; }) .catch(function (error) { - throw error; + console.log(util.inspect(error)); }) .fin(done); }); @@ -72,7 +73,7 @@ describe('JScrambler Client', function () { } }) .catch(function (error) { - throw error; + console.log(util.inspect(error)); }) .fin(done); }); @@ -95,7 +96,7 @@ describe('JScrambler Client', function () { expect(finishedAt instanceof Date).toBeTruthy(); }) .catch(function (error) { - throw error; + console.log(util.inspect(error)); }) .fin(done); }); @@ -110,7 +111,7 @@ describe('JScrambler Client', function () { downloadedBuffer = res; }) .catch(function (error) { - throw error; + console.log(util.inspect(error)); }) .fin(done); }); @@ -135,7 +136,7 @@ describe('JScrambler Client', function () { } }) .catch(function (error) { - throw error; + console.log(util.inspect(error)); }) .fin(done); }); From 5e54f32143f42689321c601a5136711b565d482e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 19 Aug 2014 23:37:52 +0100 Subject: [PATCH 048/127] fix cwd usage --- jscrambler.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index 4ebecd2..c203e03 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -240,7 +240,12 @@ exports = module.exports = continue; } var buffer, name; - var sPath = cwd ? cwd + '/' + files[i] : files[i]; + var sPath; + if (cwd && files[i].indexOf(cwd) !== 0) { + sPath = path.join(cwd, files[i]); + } else { + sPath = files[i]; + } // If buffer if (files[i].contents) { name = path.relative(files[i].cwd, files[i].path); @@ -248,7 +253,11 @@ exports = module.exports = } // Else if it's a path and not a directory else if (!fs.statSync(sPath).isDirectory()) { - name = files[i]; + if (cwd && files[i].indexOf(cwd) === 0) { + name = files[i].substring(cwd.length); + } else { + name = files[i]; + } buffer = fs.readFileSync(sPath); } // Else if it's a directory path From d9ca0bd65625ec825ffc92c47cd6d895500b6bb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 19 Aug 2014 23:38:39 +0100 Subject: [PATCH 049/127] v0.5.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index feaf823..43ca7e0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.5.7", + "version": "0.5.8", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From 09fa4ee52c0e83ce171cb30ff6216da6a2c03643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Thu, 21 Aug 2014 16:34:27 +0100 Subject: [PATCH 050/127] fix cwd path on windows --- jscrambler.js | 3 ++- package.json | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/jscrambler.js b/jscrambler.js index c203e03..d6fd71d 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -11,7 +11,7 @@ var fs = require('fs-extra'); var glob = require('glob'); var JScramblerClient = require('./jscrambler-client'); var JSZip = require('jszip'); -var path = require('path'); +var path = require('flavored-path'); var Q = require('q'); var temp = require('temp').track(); var util = require('util'); @@ -221,6 +221,7 @@ exports = module.exports = zipProject: function (files, cwd) { debug && console.log('Zipping files', util.inspect(files)); var hasFiles = false; + cwd = path.normalize(cwd); // If it's already a zip file if (files.length === 1 && /^.*\.zip$/.test(files[0])) { hasFiles = true; diff --git a/package.json b/package.json index 43ca7e0..d51a0c4 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ }, "dependencies": { "commander": "^2.1.0", + "flavored-path": "0.0.8", "fs-extra": "^0.8.1", "glob": "^4.0.2", "jszip": "^2.2.2", From d8dcc76e6d81edc90f68b209c43f114a8506527f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Thu, 21 Aug 2014 17:08:50 +0100 Subject: [PATCH 051/127] v0.5.9 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d51a0c4..216bd62 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.5.8", + "version": "0.5.9", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From eca3ae327c4352cfd305495418638c650dddd6d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 22 Aug 2014 13:48:14 +0100 Subject: [PATCH 052/127] fix cwd path sanitisation should check if variable is empty --- jscrambler.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/jscrambler.js b/jscrambler.js index d6fd71d..b9841e1 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -220,8 +220,12 @@ exports = module.exports = */ zipProject: function (files, cwd) { debug && console.log('Zipping files', util.inspect(files)); + // Flag to detect if any file was added to the zip archive var hasFiles = false; - cwd = path.normalize(cwd); + // Sanitize `cwd` + if (cwd) { + cwd = path.normalize(cwd); + } // If it's already a zip file if (files.length === 1 && /^.*\.zip$/.test(files[0])) { hasFiles = true; From f4e4e7c25a54aa29b4f347f6797b7731b7707e7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 22 Aug 2014 13:50:40 +0100 Subject: [PATCH 053/127] v0.5.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 216bd62..8bbd5fc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.5.9", + "version": "0.5.10", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From 43e916ec1f5a4f968d3af277eba36c02ff429ca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Wed, 17 Sep 2014 11:48:04 +0100 Subject: [PATCH 054/127] add globals to .jshintrc --- .jshintrc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.jshintrc b/.jshintrc index d93d275..93dde9c 100644 --- a/.jshintrc +++ b/.jshintrc @@ -15,12 +15,18 @@ "undef": true, "unused": "vars", "strict": false, + "globalstrict": true, "trailing": false, "validthis": true, + "expr": true, "globals": { "define": true, "module": true, "require": true, - "exports": true + "exports": true, + "setTimeout": true, + "console": true, + "process": true, + "escape": true } } From f9e84edbfa7a72a9eac0ac856e18c3501c1a2fbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Wed, 17 Sep 2014 11:48:26 +0100 Subject: [PATCH 055/127] getting ready for future versions of the api --- .jshintrc | 1 + jscrambler.js | 57 +++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/.jshintrc b/.jshintrc index 93dde9c..61baa00 100644 --- a/.jshintrc +++ b/.jshintrc @@ -20,6 +20,7 @@ "validthis": true, "expr": true, "globals": { + "Buffer": true, "define": true, "module": true, "require": true, diff --git a/jscrambler.js b/jscrambler.js index b9841e1..073a625 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -45,8 +45,15 @@ exports = module.exports = client.get(path, null, function (err, res, body) { try { if (err) deferred.reject(err); - else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); - else deferred.resolve(body); + else if (res.statusCode >= 400) { + if (Buffer.isBuffer(body)) { + deferred.reject(JSON.parse(body)); + } else { + deferred.reject(body); + } + } else { + deferred.resolve(body); + } } catch (ex) { deferred.reject(body); } @@ -69,8 +76,19 @@ exports = module.exports = client.get(path, null, function (err, res, body) { try { if (err) deferred.reject(err); - else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); - else deferred.resolve(JSON.parse(body)); + else if (res.statusCode >= 400) { + if (Buffer.isBuffer(body)) { + deferred.reject(JSON.parse(body)); + } else { + deferred.reject(body); + } + } else { + if (Buffer.isBuffer(body)) { + deferred.resolve(JSON.parse(body)); + } else { + deferred.resolve(body); + } + } } catch (ex) { deferred.reject(body); } @@ -124,8 +142,19 @@ exports = module.exports = client.post('/code.json', params, function (err, res, body) { try { if (err) deferred.reject(err); - else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); - else deferred.resolve(JSON.parse(body)); + else if (res.statusCode >= 400) { + if (Buffer.isBuffer(body)) { + deferred.reject(JSON.parse(body)); + } else { + deferred.reject(body); + } + } else { + if (Buffer.isBuffer(body)) { + deferred.resolve(JSON.parse(body)); + } else { + deferred.resolve(body); + } + } } catch (ex) { deferred.reject(body); } @@ -144,8 +173,20 @@ exports = module.exports = client.delete('/code/' + projectId + '.zip', null, function (err, res, body) { try { if (err) deferred.reject(err); - else if (res.statusCode >= 400) deferred.reject(JSON.parse(body)); - else deferred.resolve(JSON.parse(body)); + else if (res.statusCode >= 400) { + if (Buffer.isBuffer(body)) { + deferred.reject(JSON.parse(body)); + } else { + deferred.reject(body); + } + } + else { + if (Buffer.isBuffer(body)) { + deferred.resolve(JSON.parse(body)); + } else { + deferred.resolve(body); + } + } } catch (ex) { deferred.reject(body); } From 3a29868b29e3ab52ad9e4b23c60da534ac4c8019 Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Mon, 13 Oct 2014 08:18:41 -0700 Subject: [PATCH 056/127] added note on required API fields and shorted examples to be more readable. --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index af27631..4888428 100644 --- a/README.md +++ b/README.md @@ -15,18 +15,22 @@ npm install -g jscrambler -a, --access-key Access key -s, --secret-key Secret key +### Required Fields +When making API requests you must pass valid secret and access keys. These are each 40 characters long, alpha numeric strings, and uppercase. You can find them in your jscramber web dashboard under `My Account > Api access`. In the examples these are shortened to `XXXX` for the sake of readability. + ### Output to a single file ```shell -jscrambler input.js -a XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -s XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX > output.js +jscrambler input.js -a XXXX -s XXXX > output.js ``` ### Output multiple files to a directory ```shell -jscrambler input1.js input2.js -o dest/ -a XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -s XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +jscrambler input1.js input2.js -o dest/ -a XXXX -s XXXX ``` + ### Using minimatch ```shell -jscrambler "lib/**/*.js" -o dest/ -a XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -s XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +jscrambler "lib/**/*.js" -o dest/ -a XXXX -s XXXX ``` ## API From 3545dab333472f217860f3d877036c8fae59b3e8 Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Mon, 13 Oct 2014 08:22:14 -0700 Subject: [PATCH 057/127] changed comment block directive from shell to bash to improve highlighting --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 4888428..9f1055b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # JScrambler Client for Node.js ## CLI -```shell +```bash npm install -g jscrambler ``` Usage: jscrambler [source files] [options] @@ -19,22 +19,22 @@ npm install -g jscrambler When making API requests you must pass valid secret and access keys. These are each 40 characters long, alpha numeric strings, and uppercase. You can find them in your jscramber web dashboard under `My Account > Api access`. In the examples these are shortened to `XXXX` for the sake of readability. ### Output to a single file -```shell +```bash jscrambler input.js -a XXXX -s XXXX > output.js ``` ### Output multiple files to a directory -```shell +```bash jscrambler input1.js input2.js -o dest/ -a XXXX -s XXXX ``` ### Using minimatch -```shell +```bash jscrambler "lib/**/*.js" -o dest/ -a XXXX -s XXXX ``` ## API -```shell +```bash npm install jscrambler ``` ### Upload/download example From 6f0ccbbf81604c9cdef9cb318cdf12529bc2a349 Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Mon, 13 Oct 2014 08:28:12 -0700 Subject: [PATCH 058/127] added a configuration example to the readme. --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 9f1055b..8d4cd68 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,13 @@ jscrambler input1.js input2.js -o dest/ -a XXXX -s XXXX jscrambler "lib/**/*.js" -o dest/ -a XXXX -s XXXX ``` +### Using configuration file +```bash +jscrambler input.js -s XXXX -a XXXX -c ./config.json > output.js +``` +where `config.json` is an object optionally containing any of the JScrambler options listed below. + + ## API ```bash npm install jscrambler From 7e3510074474aa27a4378456a25c4f6e3f78b5fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Magalh=C3=A3es?= Date: Mon, 13 Oct 2014 16:41:02 +0100 Subject: [PATCH 059/127] add self_defending param to documentation --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d4cd68..ea3295d 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ Type: `String` There are some names that should never be replaced or reused to create new declarations e.g. document, toUpperCase. Public declarations existing in more than one source file should not be replaced if you submit only a part of the project where they appear. Therefore a list of irreplaceable names and the logic to make distinction between public and local names already exists on JScrambler to avoid touching those names. Use this parameter to add your own exceptions. -### expiration_date: +### expiration_date Type: `String` `date` - date format YYYY/MM/DD @@ -212,6 +212,13 @@ Type: `String` Renames local names only. The best way to replace names without worrying about name dependencies. +### self_defending +Type: `String` + +`%DEFAULT%` - enable self defending + +Obfuscates functions and objects concealing their logic and thwarting attemps of code tampering by using anti-tampering and anti-debugging techinques. Attempts to tamper the code will break its functionality and using JavaScript debuggers will trigger defenses to thwart analysis. + ### string_splitting: Type: `String` From e047189cd1ce75fafa38446112c6a967ca009f59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Magalh=C3=A3es?= Date: Mon, 13 Oct 2014 16:41:26 +0100 Subject: [PATCH 060/127] small typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ea3295d..3a707b2 100644 --- a/README.md +++ b/README.md @@ -219,7 +219,7 @@ Type: `String` Obfuscates functions and objects concealing their logic and thwarting attemps of code tampering by using anti-tampering and anti-debugging techinques. Attempts to tamper the code will break its functionality and using JavaScript debuggers will trigger defenses to thwart analysis. -### string_splitting: +### string_splitting Type: `String` `occurrences[;concatenation]` From f8bf38bc7e694452516983b450b7e574ab6567ce Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Mon, 13 Oct 2014 08:55:58 -0700 Subject: [PATCH 061/127] added browser_os_lock option description --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 8d4cd68..11afc03 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,24 @@ Type: `String` Remove function definitions and function calls with a given name. +### browser_os_lock +Type: `String` + +Locks a JavaScript application to run only on a specific Browser or Operating System. + +available values: + +* firefox +* chrome +* iexplorer +* linux +* windows +* mac_os +* tizen +* android +* ios + + ### constant_folding Type: `String` From faa75f6866234a887776aaf0719a3b4493e2c9be Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Mon, 13 Oct 2014 08:56:18 -0700 Subject: [PATCH 062/127] added nodejs mode description --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 11afc03..4e684c8 100644 --- a/README.md +++ b/README.md @@ -217,6 +217,7 @@ Type: `String` `starter` - Standard protection and optimization behavior. Enough for most JavaScript applications `mobile` - Transformations are applied having into account the limitations and needs of mobile devices `html5` - Protects your HTML5 and Web Gaming applications by targeting the new HTML5 features +`nodejs` - Protects your Node.js application ### name_prefix Type: `String` From a8fd97633789e307796b3ad6ed87160e85e8e547 Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Mon, 13 Oct 2014 08:57:51 -0700 Subject: [PATCH 063/127] added rename_all option description --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 4e684c8..4351dbf 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,13 @@ Type: `String` Set a prefix to be appended to the new names generated by JScrambler. +### rename_all +Type: `String` + +`%DEFAULT%` - enable rename all + +Renames all identifiers found at your source code. By default, there is a list of JavaScript and HTML DOM names that will not be replaced. If you need to add additional exceptions use the exceptions_list parameter. + ### rename_local Type: `String` From 0c20b0d1885769d59ea238291203bc3202fb3bad Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Mon, 13 Oct 2014 09:00:10 -0700 Subject: [PATCH 064/127] added self_defending option description --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4351dbf..a4d962e 100644 --- a/README.md +++ b/README.md @@ -238,7 +238,14 @@ Type: `String` Renames local names only. The best way to replace names without worrying about name dependencies. -### string_splitting: +### self_defending: +Type: `String` + +`%DEFAULT%` - enable self defending + +Obfuscates functions and objects concealing their logic and thwarting attempts of code tampering by using anti-tampering and anti-debugging techinques. Attempts to tamper the code will break its functionality and using JavaScript debuggers will trigger defenses to thwart analysis. + +### string_splitting Type: `String` `occurrences[;concatenation]` From 5db033f7dfa86f32f825e03396a96f35642736c5 Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Mon, 13 Oct 2014 09:01:59 -0700 Subject: [PATCH 065/127] added bulleted enumeration values --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index a4d962e..4b1a952 100644 --- a/README.md +++ b/README.md @@ -95,15 +95,15 @@ Locks a JavaScript application to run only on a specific Browser or Operating Sy available values: -* firefox -* chrome -* iexplorer -* linux -* windows -* mac_os -* tizen -* android -* ios +* `firefox` +* `chrome` +* `iexplorer` +* `linux` +* `windows` +* `mac_os` +* `tizen` +* `android` +* `ios` ### constant_folding @@ -214,9 +214,9 @@ Replaces Browser and HTML DOM objects by a member enumeration. ### mode Type: `String` -`starter` - Standard protection and optimization behavior. Enough for most JavaScript applications -`mobile` - Transformations are applied having into account the limitations and needs of mobile devices -`html5` - Protects your HTML5 and Web Gaming applications by targeting the new HTML5 features +* `starter` - Standard protection and optimization behavior. Enough for most * JavaScript applications +* `mobile` - Transformations are applied having into account the limitations and needs of mobile devices +* `html5` - Protects your HTML5 and Web Gaming applications by targeting the new HTML5 features `nodejs` - Protects your Node.js application ### name_prefix From 56d15c74172299aac326e4b5a93506e798949730 Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Mon, 13 Oct 2014 09:03:02 -0700 Subject: [PATCH 066/127] added missing bullet --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4b1a952..295df6d 100644 --- a/README.md +++ b/README.md @@ -217,7 +217,7 @@ Type: `String` * `starter` - Standard protection and optimization behavior. Enough for most * JavaScript applications * `mobile` - Transformations are applied having into account the limitations and needs of mobile devices * `html5` - Protects your HTML5 and Web Gaming applications by targeting the new HTML5 features -`nodejs` - Protects your Node.js application +* `nodejs` - Protects your Node.js application ### name_prefix Type: `String` From ea7ab0a0aa883853d39de67854a3d7203f5f2966 Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Tue, 14 Oct 2014 11:31:27 -0700 Subject: [PATCH 067/127] replaced monolithic lodash package with modular variants --- jscrambler-client.js | 15 ++++++++++----- jscrambler.js | 8 +++++--- package.json | 7 ++++++- test/specs/jscrambler.js | 8 ++++---- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/jscrambler-client.js b/jscrambler-client.js index 493826b..ad4caca 100644 --- a/jscrambler-client.js +++ b/jscrambler-client.js @@ -1,10 +1,15 @@ 'use strict'; -var _ = require('lodash'); + +var clone = require('lodash.clone'); var crypto = require('crypto'); +var defaults = require('lodash.defaults'); var fs = require('fs'); +var keys = require('lodash.keys'); var needle = require('needle'); var querystring = require('querystring'); var url = require('url'); + + /** * @class JScramblerClient * @param {Object} options @@ -20,7 +25,7 @@ function JScramblerClient (options) { /** * @member */ - this.options = _.defaults(options || {}, { + this.options = defaults(options || {}, { accessKey: null, secretKey: null, host: 'api.jscrambler.com', @@ -57,7 +62,7 @@ function buildPath (method, path, params) { */ function buildSortedQuery (params) { // Sorted keys - var keys = _.keys(params).sort(); + var keys = keys(params).sort(); var query = ''; for (var i = 0, l = keys.length; i < l; i++) query += encodeURIComponent(keys[i]) + '=' + encodeURIComponent(params[keys[i]]) + '&'; @@ -78,7 +83,7 @@ function buildSortedQuery (params) { * @returns {String} The digested signature. */ function generateHmacSignature (method, path, params) { - var paramsCopy = _.clone(params); + var paramsCopy = clone(params); for (var key in params) { if (key.indexOf('file_') !== -1) { paramsCopy[key] = crypto.createHash('md5').update( @@ -123,7 +128,7 @@ function handleFileParams (params) { properties. */ function signedParams (method, path, params) { - _.defaults(params, { + defaults(params, { access_key: this.options.accessKey, timestamp: new Date().toISOString(), user_agent: 'Node' diff --git a/jscrambler.js b/jscrambler.js index 073a625..2d2a5d9 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -6,16 +6,18 @@ */ 'use strict'; -var _ = require('lodash'); +var assign = require('lodash.assign'); var fs = require('fs-extra'); var glob = require('glob'); var JScramblerClient = require('./jscrambler-client'); var JSZip = require('jszip'); var path = require('flavored-path'); var Q = require('q'); +var size = require('lodash.size'); var temp = require('temp').track(); var util = require('util'); + var debug = !!process.env.DEBUG; exports = module.exports = @@ -133,7 +135,7 @@ exports = module.exports = uploadCode: function (client, params) { var deferred = Q.defer(); - params = _.extend({}, params); + params = assign({}, params); params.files = params.files.slice(); this.zipProject(params.files, params.cwd); delete params.cwd; @@ -330,7 +332,7 @@ exports = module.exports = */ unzipProject: function (zipFile, dest) { var zip = new JSZip(zipFile); - var size = _.size(zip.files); + var size = size(zip.files); for (var file in zip.files) { if (!zip.files[file].options.dir) { var buffer = zip.file(file).asNodeBuffer(); diff --git a/package.json b/package.json index 8bbd5fc..f266d89 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,12 @@ "fs-extra": "^0.8.1", "glob": "^4.0.2", "jszip": "^2.2.2", - "lodash": "^2.4.1", + "lodash.assign": "^2.4.1", + "lodash.clone": "^2.4.1", + "lodash.defaults": "^2.4.1", + "lodash.keys": "^2.4.1", + "lodash.pluck": "^2.4.1", + "lodash.size": "^2.4.1", "needle": "^0.6.6", "q": "^1.0.1", "temp": "^0.8.1" diff --git a/test/specs/jscrambler.js b/test/specs/jscrambler.js index 4cc3a21..178c340 100644 --- a/test/specs/jscrambler.js +++ b/test/specs/jscrambler.js @@ -1,9 +1,9 @@ /* global describe, beforeEach, it, expect, spyOn, Buffer, jasmine, console */ -var _ = require('lodash'); var fs = require('fs'); var jScrambler = require('../../jscrambler'); var jScramblerKeys = require('../../jscrambler_keys'); +var pluck = require('lodash.pluck'); var util = require('util'); describe('JScrambler Client', function () { @@ -46,7 +46,7 @@ describe('JScrambler Client', function () { expect(res.sources.length).toEqual(files.length); for (var i = 0, l = files.length; i < l; ++i) { - expect(_.pluck(res.sources, 'filename').indexOf(files[i]) !== -1).toBeTruthy(); + expect(pluck(res.sources, 'filename').indexOf(files[i]) !== -1).toBeTruthy(); } projectId = res.id; @@ -68,7 +68,7 @@ describe('JScrambler Client', function () { expect(res.sources.length).toEqual(files.length); for (var i = 0, l = files.length; i < l; ++i) { - expect(_.pluck(res.sources, 'filename').indexOf(files[i]) !== -1).toBeTruthy(); + expect(pluck(res.sources, 'filename').indexOf(files[i]) !== -1).toBeTruthy(); expect(res.sources[i].error_id).toEqual(null); } }) @@ -89,7 +89,7 @@ describe('JScrambler Client', function () { expect(res.sources.length).toEqual(files.length); for (var i = 0, l = files.length; i < l; ++i) { - expect(_.pluck(res.sources, 'filename').indexOf(files[i]) !== -1).toBeTruthy(); + expect(pluck(res.sources, 'filename').indexOf(files[i]) !== -1).toBeTruthy(); } var finishedAt = new Date(res.finished_at); From 0c6699fc363b88da9b425e890ff8ba9a7d70fb71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Wed, 15 Oct 2014 08:50:52 +0100 Subject: [PATCH 068/127] fix bugs introduced with modular lodash inclusion --- jscrambler-client.js | 6 +++--- jscrambler.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/jscrambler-client.js b/jscrambler-client.js index ad4caca..e5f337f 100644 --- a/jscrambler-client.js +++ b/jscrambler-client.js @@ -62,10 +62,10 @@ function buildPath (method, path, params) { */ function buildSortedQuery (params) { // Sorted keys - var keys = keys(params).sort(); + var _keys = keys(params).sort(); var query = ''; - for (var i = 0, l = keys.length; i < l; i++) - query += encodeURIComponent(keys[i]) + '=' + encodeURIComponent(params[keys[i]]) + '&'; + for (var i = 0, l = _keys.length; i < l; i++) + query += encodeURIComponent(_keys[i]) + '=' + encodeURIComponent(params[_keys[i]]) + '&'; query = query .replace(/\*/g, '%2A') .replace(/[!'()]/g, escape) diff --git a/jscrambler.js b/jscrambler.js index 2d2a5d9..be41bcf 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -332,7 +332,7 @@ exports = module.exports = */ unzipProject: function (zipFile, dest) { var zip = new JSZip(zipFile); - var size = size(zip.files); + var _size = size(zip.files); for (var file in zip.files) { if (!zip.files[file].options.dir) { var buffer = zip.file(file).asNodeBuffer(); @@ -341,7 +341,7 @@ exports = module.exports = } else if (dest) { var lastDestChar = dest[dest.length - 1]; var destPath; - if (size === 1 && lastDestChar !== '/' && lastDestChar !== '\\') { + if (_size === 1 && lastDestChar !== '/' && lastDestChar !== '\\') { destPath = dest; } else { destPath = path.join(dest, file); From d77f841c4a7152d2b1ca450693c889380a8064ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Wed, 15 Oct 2014 08:51:02 +0100 Subject: [PATCH 069/127] set grunt default task --- Gruntfile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/Gruntfile.js b/Gruntfile.js index 8583b61..7891a25 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -17,5 +17,6 @@ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-contrib-clean'); grunt.loadNpmTasks('grunt-jasmine-node'); + grunt.registerTask('default', ['test']); grunt.registerTask('test', ['clean', 'jasmine_node', 'clean']); }; From 31b383f5998bb50ff91a2fa67a63ab39ca6b5017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Wed, 15 Oct 2014 08:51:13 +0100 Subject: [PATCH 070/127] typo on test results folder ignore --- .gitignore | 2 +- .npmignore | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 85e21d5..4fb4f65 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ jscrambler_keys.json node_modules npm-debug.log -reports/ +results/ tmp .* diff --git a/.npmignore b/.npmignore index 5394167..006a6e9 100644 --- a/.npmignore +++ b/.npmignore @@ -1,3 +1,3 @@ config.json jscrambler_keys.json -reports/ +results/ From d4acd0ea2a4ee7595bcdfa7fb3725088a91ab3a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Magalh=C3=A3es?= Date: Thu, 23 Oct 2014 10:45:20 +0100 Subject: [PATCH 071/127] fix #15 replace literal_duplicates with duplicate_literals --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7690358..bf11ed6 100644 --- a/README.md +++ b/README.md @@ -197,10 +197,10 @@ Type: `String` Replaces literals by a randomly sized chain of ternary operators. You may configure the minimum and maximum number of predicates per literal, as the occurrence probability of the transformation. This allows you to control how big the obfuscated JavaScript grows and the potency of the transformation. -### literal_duplicates +### duplicate_literals Type: `String` -`%DEFAULT%` - enable literal duplicates +`%DEFAULT%` - enable duplicate literals Replaces literal duplicates by a symbol. From 326fac762266ee45c2c8d6ce568c4755b11d5d3e Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Sat, 25 Oct 2014 10:37:05 -0700 Subject: [PATCH 072/127] bumped module dependencies --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f266d89..9087880 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "dependencies": { "commander": "^2.1.0", "flavored-path": "0.0.8", - "fs-extra": "^0.8.1", + "fs-extra": "^0.12.0", "glob": "^4.0.2", "jszip": "^2.2.2", "lodash.assign": "^2.4.1", @@ -38,7 +38,7 @@ "lodash.keys": "^2.4.1", "lodash.pluck": "^2.4.1", "lodash.size": "^2.4.1", - "needle": "^0.6.6", + "needle": "^0.7.10", "q": "^1.0.1", "temp": "^0.8.1" }, From 482858118f8cb1a29033ec311dbade869b4dab25 Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Sat, 25 Oct 2014 11:43:37 -0700 Subject: [PATCH 073/127] added command line options for all known API options (closes #14) --- bin/jscrambler | 31 ++++++++++++++++++++++++++ bin/parse-cli-config.js | 48 +++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 3 files changed, 80 insertions(+) create mode 100644 bin/parse-cli-config.js diff --git a/bin/jscrambler b/bin/jscrambler index 7117ee4..f3e61b4 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -1,9 +1,12 @@ #!/usr/bin/env node 'use strict'; +console.log ('argv', process.argv); + var commander = require('commander'); var glob = require('glob'); var jScrambler = require('../jscrambler'); +var parseConfigOptions = require('./parse-cli-config'); var path = require('path'); commander @@ -16,6 +19,30 @@ commander .option('-h, --host [host]', 'Hostname') .option('-p, --port [port]', 'Port') .option('-v, --api-version [apiVersion]', 'Version') + .option('--asserts-elimination [assertsElimination]', 'Remove function definitions and function calls with a given name.') + .option('--browser-os-lock [browserOsLock]', 'Locks a JavaScript application to run only on a specific Browser or Operating System.') + .option('--constant-folding', 'Simplifies constant expressions at compile-time to make your code faster at run-time.') + .option('--dead-code', 'Randomly injects dead code into the source code.') + .option('--dead-code-elimination', 'Removes dead code and void code from your JavaScript.') + .option('--debugging-code-elimination [debuggingCodeElimination', 'Removes statements and public variable declarations used to control the output of debugging messages that help you debug your code.') + .option('--dictionary-compression', 'further shrink your source code') + .option('--domain-lock [domainLock]', 'Locks your project to a list of domains you specify.') + .option('--dot-notation-elimination', 'Transforms dot notation to subscript notation.') + .option('--exceptions-list [exceptionsList]', 'list of exceptions that will never be replaced or used to create new declarations') + .option('--expiration-date [expirationDate]', 'Sets your JavaScript to expire after a date (YYYY/MM/DD) of your choosing.') + .option('--function-outlining', 'Turns statements into new function declarations.') + .option('--function-reorder', 'Randomly reorders your source code\'s function declarations.') + .option('--ignore-files [ignoreFiles]', 'Define a list of files (relative paths) that JScrambler must ignore.') + .option('--literal-hooking [literalHooking]', 'Replaces literals by a randomly sized chain of ternary operators. ') + .option('--literal-duplicates', 'Replaces literal duplicates by a symbol.') + .option('--member-enumeration', 'Replaces Browser and HTML DOM objects by a member enumeration.') + .option('--mode [mode]', 'protection mode starter|mobile|html5|nodejs') + .option('--name-prefix [namePrefix]', 'Set a prefix to be appended to the new names generated by JScrambler.') + .option('--rename-all', 'Renames all identifiers found at your source code.') + .option('--rename-local', 'Renames local names only.') + .option('--self-defending', 'thwarting code tampering attempts by using anti-tampering and anti-debugging techniques.') + .option('--string-splitting [stringSplitting]', 'split strings based on percentage of occurence in the source code input') + .option('--whitespace', 'enable whitespace') .parse(process.argv); var filesSrc = []; @@ -62,6 +89,10 @@ if (commander.config) { } else { config = {}; } + +// command line options override config file options +parseConfigOptions(commander, config); + config.files = filesSrc; var client = new jScrambler.Client({ diff --git a/bin/parse-cli-config.js b/bin/parse-cli-config.js new file mode 100644 index 0000000..0663610 --- /dev/null +++ b/bin/parse-cli-config.js @@ -0,0 +1,48 @@ +/* + convert from command line option format to snake case for + the jscrambler API. It also replaces true bool flags with %DEFAULT% values +*/ + +'use strict'; + +var snakeCase = require('snake-case'); + +module.exports = function parseCLIConfig(commander, config) { + // override config file changes with any specified command line options + var name, is_bool_flag = { + assertsElimination: false, + browserOsLock: false, + constantFolding: true, + deadCode: true, + deadCodeElimination: true, + debuggingCodeElimination: false, + dictionaryCompression: true, + domainLock: false, + dotNotationElimination: true, + exceptionsList: false, + expirationDate: false, + functionOutlining: true, + functionReorder: true, + ignoreFiles: false, + literalHooking: false, + literalDuplicates: true, + memberEnumeration: true, + mode: false, + namePrefix: false, + renameAll: true, + renameLocal: true, + selfDefending: true, + stringSplitting: false, + whitespace: false + }; + + for (name in is_bool_flag) { + if (commander[name] !== undefined) { + if (is_bool_flag[name] === true) { + config[snakeCase(name)] = '%DEFAULT%' + } else { + config[snakeCase(name)] = commander[name]; + } + } + } +} diff --git a/package.json b/package.json index 9087880..ca1232e 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "lodash.size": "^2.4.1", "needle": "^0.7.10", "q": "^1.0.1", + "snake-case": "^1.0.1", "temp": "^0.8.1" }, "main": "jscrambler", From 3a8a022ef9a71548d11b52f33b19c2fc3ee3725a Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Sat, 25 Oct 2014 11:45:11 -0700 Subject: [PATCH 074/127] removed unneeded console.log --- bin/jscrambler | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/jscrambler b/bin/jscrambler index f3e61b4..09ca141 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -1,8 +1,6 @@ #!/usr/bin/env node 'use strict'; -console.log ('argv', process.argv); - var commander = require('commander'); var glob = require('glob'); var jScrambler = require('../jscrambler'); From f2fd587eb672f5484dbde490c1bfe8539aef2432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 28 Oct 2014 08:56:40 +0000 Subject: [PATCH 075/127] cleanup --- bin/jscrambler | 8 +++---- bin/parse-cli-config.js | 48 ------------------------------------- lib/cli.js | 52 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 52 deletions(-) delete mode 100644 bin/parse-cli-config.js create mode 100644 lib/cli.js diff --git a/bin/jscrambler b/bin/jscrambler index 09ca141..d80afdb 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -4,7 +4,7 @@ var commander = require('commander'); var glob = require('glob'); var jScrambler = require('../jscrambler'); -var parseConfigOptions = require('./parse-cli-config'); +var cli = require('../lib/cli'); var path = require('path'); commander @@ -88,8 +88,8 @@ if (commander.config) { config = {}; } -// command line options override config file options -parseConfigOptions(commander, config); +// Parse configuration (normalize JScrambler parameters) +config = cli.parseConfig(commander, config); config.files = filesSrc; @@ -110,7 +110,7 @@ jScrambler if (filesSrc.length === 1 && !dest) { dest = function (buffer, file) { console.log(buffer.toString()); - } + }; } return jScrambler.unzipProject(res, dest); }) diff --git a/bin/parse-cli-config.js b/bin/parse-cli-config.js deleted file mode 100644 index 0663610..0000000 --- a/bin/parse-cli-config.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - convert from command line option format to snake case for - the jscrambler API. It also replaces true bool flags with %DEFAULT% values -*/ - -'use strict'; - -var snakeCase = require('snake-case'); - -module.exports = function parseCLIConfig(commander, config) { - // override config file changes with any specified command line options - var name, is_bool_flag = { - assertsElimination: false, - browserOsLock: false, - constantFolding: true, - deadCode: true, - deadCodeElimination: true, - debuggingCodeElimination: false, - dictionaryCompression: true, - domainLock: false, - dotNotationElimination: true, - exceptionsList: false, - expirationDate: false, - functionOutlining: true, - functionReorder: true, - ignoreFiles: false, - literalHooking: false, - literalDuplicates: true, - memberEnumeration: true, - mode: false, - namePrefix: false, - renameAll: true, - renameLocal: true, - selfDefending: true, - stringSplitting: false, - whitespace: false - }; - - for (name in is_bool_flag) { - if (commander[name] !== undefined) { - if (is_bool_flag[name] === true) { - config[snakeCase(name)] = '%DEFAULT%' - } else { - config[snakeCase(name)] = commander[name]; - } - } - } -} diff --git a/lib/cli.js b/lib/cli.js new file mode 100644 index 0000000..53bd32f --- /dev/null +++ b/lib/cli.js @@ -0,0 +1,52 @@ +'use strict'; + +var clone = require('lodash.clone'); +var snakeCase = require('snake-case'); + +module.exports = { + // Convert from command line option format to snake case for the jscrambler API. + // It also replaces truthy boolean flags with %DEFAULT% values + parseConfig: function (commander, config) { + config = clone(config); + + // Override config file changes with any specified command line options + var name, is_bool_flag = { + assertsElimination: false, + browserOsLock: false, + constantFolding: true, + deadCode: true, + deadCodeElimination: true, + debuggingCodeElimination: false, + dictionaryCompression: true, + domainLock: false, + dotNotationElimination: true, + exceptionsList: false, + expirationDate: false, + functionOutlining: true, + functionReorder: true, + ignoreFiles: false, + literalHooking: false, + literalDuplicates: true, + memberEnumeration: true, + mode: false, + namePrefix: false, + renameAll: true, + renameLocal: true, + selfDefending: true, + stringSplitting: false, + whitespace: false + }; + + for (name in is_bool_flag) { + if (commander[name] !== undefined) { + if (is_bool_flag[name] === true) { + config[snakeCase(name)] = '%DEFAULT%'; + } else { + config[snakeCase(name)] = commander[name]; + } + } + } + + return config; + } +}; From 8c5adadf57d417a3e7ee75b47d2bad51dd46ff3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 28 Oct 2014 08:59:15 +0000 Subject: [PATCH 076/127] add CLI options to README.md --- README.md | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index bf11ed6..71a086c 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,40 @@ npm install -g jscrambler Options: - -h, --help output usage information - -V, --version output the version number - -c, --config [config] JScrambler configuration options - -o, --output Output directory - -a, --access-key Access key - -s, --secret-key Secret key + ---help output usage information + -V, --version output the version number + -c, --config [config] JScrambler configuration options + -o, --output [output] Output directory. If not specified the output is printed. + -a, --access-key Access key + -s, --secret-key Secret key + -h, --host [host] Hostname + -p, --port [port] Port + -v, --api-version [apiVersion] Version + --asserts-elimination [assertsElimination] Remove function definitions and function calls with a given name. + --browser-os-lock [browserOsLock] Locks a JavaScript application to run only on a specific Browser or Operating System. + --constant-folding Simplifies constant expressions at compile-time to make your code faster at run-time. + --dead-code Randomly injects dead code into the source code. + --dead-code-elimination Removes dead code and void code from your JavaScript. + --debugging-code-elimination [debuggingCodeElimination Removes statements and public variable declarations used to control the output of debugging messages that help you debug your code. + --dictionary-compression further shrink your source code + --domain-lock [domainLock] Locks your project to a list of domains you specify. + --dot-notation-elimination Transforms dot notation to subscript notation. + --exceptions-list [exceptionsList] list of exceptions that will never be replaced or used to create new declarations + --expiration-date [expirationDate] Sets your JavaScript to expire after a date (YYYY/MM/DD) of your choosing. + --function-outlining Turns statements into new function declarations. + --function-reorder Randomly reorders your source code's function declarations. + --ignore-files [ignoreFiles] Define a list of files (relative paths) that JScrambler must ignore. + --literal-hooking [literalHooking] Replaces literals by a randomly sized chain of ternary operators. + --literal-duplicates Replaces literal duplicates by a symbol. + --member-enumeration Replaces Browser and HTML DOM objects by a member enumeration. + --mode [mode] protection mode starter|mobile|html5|nodejs + --name-prefix [namePrefix] Set a prefix to be appended to the new names generated by JScrambler. + --rename-all Renames all identifiers found at your source code. + --rename-local Renames local names only. + --self-defending thwarting code tampering attempts by using anti-tampering and anti-debugging techniques. + --string-splitting [stringSplitting] split strings based on percentage of occurence in the source code input + --whitespace enable whitespace + ### Required Fields When making API requests you must pass valid secret and access keys. These are each 40 characters long, alpha numeric strings, and uppercase. You can find them in your jscramber web dashboard under `My Account > Api access`. In the examples these are shortened to `XXXX` for the sake of readability. @@ -38,7 +66,7 @@ jscrambler "lib/**/*.js" -o dest/ -a XXXX -s XXXX jscrambler input.js -s XXXX -a XXXX -c ./config.json > output.js ``` where `config.json` is an object optionally containing any of the JScrambler options listed below. - + ## API ```bash From 7fa209ec359ac4a23050ba8f4368d85cd02b74fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 28 Oct 2014 14:05:31 +0000 Subject: [PATCH 077/127] typo on README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 71a086c..89568b9 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ npm install -g jscrambler Options: - ---help output usage information + --help output usage information -V, --version output the version number -c, --config [config] JScrambler configuration options -o, --output [output] Output directory. If not specified the output is printed. From e6430216653cf43a1d1b437787ca1525cd1153bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Wed, 29 Oct 2014 15:11:50 +0000 Subject: [PATCH 078/127] v0.5.11 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ca1232e..4a60727 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.5.10", + "version": "0.5.11", "homepage": "https://github.com/auditmark/node-jscrambler", "author": { "name": "magalhas", From 1c24e77a8ea2398f8c234fbbefe7849ad948b8fe Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Thu, 20 Nov 2014 18:08:03 -0500 Subject: [PATCH 079/127] implemented .rc config file loading --- bin/jscrambler | 11 +++++++++ lib/rc-load.js | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 lib/rc-load.js diff --git a/bin/jscrambler b/bin/jscrambler index d80afdb..6cadc3e 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -6,6 +6,8 @@ var glob = require('glob'); var jScrambler = require('../jscrambler'); var cli = require('../lib/cli'); var path = require('path'); +var rc = require('../lib/rc-load'); + commander .version(require('../package.json').version) @@ -59,6 +61,15 @@ if (commander.args.length === 1 && /^.*\.json$/.test(commander.args[0])) { globSrc = commander.args; } +// load accesskey and secretkey from config file in ~/.jscramblerrc if present +var cfg = rc('jscramblerrc'); +if (cfg.secret_key) { + commander.secretKey = cfg.secret_key; +} +if (cfg.access_key) { + commander.accessKey = cfg.access_key; +} + if (!commander.accessKey || !commander.secretKey) { console.error('Access and secret keys must be provided to engage with the services.'); process.exit(1); diff --git a/lib/rc-load.js b/lib/rc-load.js new file mode 100644 index 0000000..2ca9123 --- /dev/null +++ b/lib/rc-load.js @@ -0,0 +1,63 @@ +// resource file loading +var fs = require('fs'); +var join = require('path').join; + + +var etc, home, load, rc_path, save, win, _findConfig; + +rc_path = null; + +// determine the home directory for this platform/OS +etc = '/etc'; + +win = process.platform === 'win32'; + +if (win) { + home = process.env.USERPROFILE; +} else { + home = process.env.HOME; +} + +/* + return the first found config file, looking in the common places + across different platforms + + @param string name application name + @return string full path of config file if it exists. null otherwise + */ + +_findConfig = function(name) { + var l, locs, _i, _len; + locs = [join(etc, name), join(home, '.' + name), join(home, '.' + name, 'config'), join(home, '.config', name), join(home, '.config', name, 'config')]; + if (win) { + locs.push(join(etc, name)); + join(etc, name, 'config'); + } + + for (_i = 0, _len = locs.length; _i < _len; _i++) { + l = locs[_i]; + if (fs.existsSync(l)) { + return l; + } + } + return null; +}; + +// load the configuration options. returns an empty object if no config found +module.exports = load = function(config_filename) { + var rc; + rc = {}; + + // look in common places for the app's config file + rc_path = _findConfig(config_filename); + if (rc_path && fs.existsSync(rc_path)) { + var str = fs.readFileSync(rc_path); + try { + rc = JSON.parse(str); + } catch (e) { + console.error('could not parse config file: invalid json in ' + rc_path); + process.exit(1); + } + } + return rc; +}; From 34af5c31dac3844763eb82c271b8072ff7ca21d6 Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Thu, 20 Nov 2014 18:14:58 -0500 Subject: [PATCH 080/127] only use the config file credentials if the command line options aren't present --- bin/jscrambler | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/jscrambler b/bin/jscrambler index 6cadc3e..1875da3 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -63,10 +63,10 @@ if (commander.args.length === 1 && /^.*\.json$/.test(commander.args[0])) { // load accesskey and secretkey from config file in ~/.jscramblerrc if present var cfg = rc('jscramblerrc'); -if (cfg.secret_key) { +if (cfg.secret_key && !commander.secretKey) { commander.secretKey = cfg.secret_key; } -if (cfg.access_key) { +if (cfg.access_key && !commander.accessKey) { commander.accessKey = cfg.access_key; } From 6bbc6bc28a5d7134c0ab3b4abd3584a0f709eeb2 Mon Sep 17 00:00:00 2001 From: Mike Reinstein Date: Thu, 20 Nov 2014 18:20:41 -0500 Subject: [PATCH 081/127] added documentation on .jscramblerrc --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index 89568b9..82d87a1 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,20 @@ npm install -g jscrambler --whitespace enable whitespace +### Authentication Config +You may optionally put your access and secret keys into a config file which will be read from the user's home directory when invoking jscrambler from the command line. Besides simplifying the command entry, this has the added benefit of not logging your jscrambler credentials. + +here's an example of what your `~/.jscramblerrc` file should look like: + +```javascript +{ + "secret_key": "XXXXXXXX", + "access_key": "XXXXXXXX" +} +``` +Replace the `XXXXXX` fields with your values of course. :) + + ### Required Fields When making API requests you must pass valid secret and access keys. These are each 40 characters long, alpha numeric strings, and uppercase. You can find them in your jscramber web dashboard under `My Account > Api access`. In the examples these are shortened to `XXXX` for the sake of readability. From 64765b44e48c909af5328cbbe11b9e7e046f19c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 21 Nov 2014 19:57:48 +0000 Subject: [PATCH 082/127] use rc module instead of a custom implementation --- bin/jscrambler | 18 +++++++++------ lib/rc-load.js | 63 -------------------------------------------------- package.json | 1 + 3 files changed, 12 insertions(+), 70 deletions(-) delete mode 100644 lib/rc-load.js diff --git a/bin/jscrambler b/bin/jscrambler index 1875da3..ab7987d 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -6,7 +6,7 @@ var glob = require('glob'); var jScrambler = require('../jscrambler'); var cli = require('../lib/cli'); var path = require('path'); -var rc = require('../lib/rc-load'); +var rc = require('rc'); commander @@ -61,13 +61,17 @@ if (commander.args.length === 1 && /^.*\.json$/.test(commander.args[0])) { globSrc = commander.args; } -// load accesskey and secretkey from config file in ~/.jscramblerrc if present -var cfg = rc('jscramblerrc'); -if (cfg.secret_key && !commander.secretKey) { - commander.secretKey = cfg.secret_key; +// Load RC configuration if present +var cfg = rc('jscrambler', { + keys: {} +}); +// Apply secret key if available and not overriden +if (cfg.keys.secretKey && !commander.secretKey) { + commander.secretKey = cfg.keys.secretKey; } -if (cfg.access_key && !commander.accessKey) { - commander.accessKey = cfg.access_key; +// Apply access key if available and not overriden +if (cfg.keys.accessKey && !commander.accessKey) { + commander.accessKey = cfg.keys.accessKey; } if (!commander.accessKey || !commander.secretKey) { diff --git a/lib/rc-load.js b/lib/rc-load.js deleted file mode 100644 index 2ca9123..0000000 --- a/lib/rc-load.js +++ /dev/null @@ -1,63 +0,0 @@ -// resource file loading -var fs = require('fs'); -var join = require('path').join; - - -var etc, home, load, rc_path, save, win, _findConfig; - -rc_path = null; - -// determine the home directory for this platform/OS -etc = '/etc'; - -win = process.platform === 'win32'; - -if (win) { - home = process.env.USERPROFILE; -} else { - home = process.env.HOME; -} - -/* - return the first found config file, looking in the common places - across different platforms - - @param string name application name - @return string full path of config file if it exists. null otherwise - */ - -_findConfig = function(name) { - var l, locs, _i, _len; - locs = [join(etc, name), join(home, '.' + name), join(home, '.' + name, 'config'), join(home, '.config', name), join(home, '.config', name, 'config')]; - if (win) { - locs.push(join(etc, name)); - join(etc, name, 'config'); - } - - for (_i = 0, _len = locs.length; _i < _len; _i++) { - l = locs[_i]; - if (fs.existsSync(l)) { - return l; - } - } - return null; -}; - -// load the configuration options. returns an empty object if no config found -module.exports = load = function(config_filename) { - var rc; - rc = {}; - - // look in common places for the app's config file - rc_path = _findConfig(config_filename); - if (rc_path && fs.existsSync(rc_path)) { - var str = fs.readFileSync(rc_path); - try { - rc = JSON.parse(str); - } catch (e) { - console.error('could not parse config file: invalid json in ' + rc_path); - process.exit(1); - } - } - return rc; -}; diff --git a/package.json b/package.json index 4a60727..64686e0 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "lodash.size": "^2.4.1", "needle": "^0.7.10", "q": "^1.0.1", + "rc": "^0.5.4", "snake-case": "^1.0.1", "temp": "^0.8.1" }, From 76c629dacb58ed2c32a6bdd5312cc5436a894e06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 21 Nov 2014 20:02:32 +0000 Subject: [PATCH 083/127] fix rc configuration object to have the same format as the config of all the jscrambler clients --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 82d87a1..4d6c517 100644 --- a/README.md +++ b/README.md @@ -50,10 +50,12 @@ here's an example of what your `~/.jscramblerrc` file should look like: ```javascript { - "secret_key": "XXXXXXXX", - "access_key": "XXXXXXXX" + "keys": { + "accessKey": "XXXXXX", + "secretKey": "XXXXXX" + } } -``` +``` Replace the `XXXXXX` fields with your values of course. :) From 696ab8b5158be7508f9ae2b4767114cf4673c559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 21 Nov 2014 20:16:37 +0000 Subject: [PATCH 084/127] move rc implementation into the client api so that it takes effect everywhere (grunt, gulp, atom, etc) --- bin/jscrambler | 72 ++++++++++++++++++-------------------------- jscrambler-client.js | 29 ++++++++++++------ 2 files changed, 48 insertions(+), 53 deletions(-) diff --git a/bin/jscrambler b/bin/jscrambler index ab7987d..77dde96 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -6,7 +6,6 @@ var glob = require('glob'); var jScrambler = require('../jscrambler'); var cli = require('../lib/cli'); var path = require('path'); -var rc = require('rc'); commander @@ -61,24 +60,6 @@ if (commander.args.length === 1 && /^.*\.json$/.test(commander.args[0])) { globSrc = commander.args; } -// Load RC configuration if present -var cfg = rc('jscrambler', { - keys: {} -}); -// Apply secret key if available and not overriden -if (cfg.keys.secretKey && !commander.secretKey) { - commander.secretKey = cfg.keys.secretKey; -} -// Apply access key if available and not overriden -if (cfg.keys.accessKey && !commander.accessKey) { - commander.accessKey = cfg.keys.accessKey; -} - -if (!commander.accessKey || !commander.secretKey) { - console.error('Access and secret keys must be provided to engage with the services.'); - process.exit(1); -} - if (!commander.output && filesSrc.length > 1) { console.error('Destination must be specified unless only one file is used as input.'); process.exit(1); @@ -108,28 +89,33 @@ config = cli.parseConfig(commander, config); config.files = filesSrc; -var client = new jScrambler.Client({ - accessKey: accessKey, - secretKey: secretKey, - host: host, - port: port, - apiVersion: apiVersion -}); - -jScrambler - .uploadCode(client, config) - .then(function (res) { - return jScrambler.downloadCode(client, res.id); - }) - .then(function (res) { - if (filesSrc.length === 1 && !dest) { - dest = function (buffer, file) { - console.log(buffer.toString()); - }; - } - return jScrambler.unzipProject(res, dest); - }) - .fail(function (err) { - console.error(err); - process.exit(1); +try { + var client = new jScrambler.Client({ + accessKey: accessKey, + secretKey: secretKey, + host: host, + port: port, + apiVersion: apiVersion }); + + jScrambler + .uploadCode(client, config) + .then(function (res) { + return jScrambler.downloadCode(client, res.id); + }) + .then(function (res) { + if (filesSrc.length === 1 && !dest) { + dest = function (buffer, file) { + console.log(buffer.toString()); + }; + } + return jScrambler.unzipProject(res, dest); + }) + .fail(function (err) { + console.error(err); + process.exit(1); + }); +} catch (ex) { + console.error(ex.toString()); + process.exit(1); +} diff --git a/jscrambler-client.js b/jscrambler-client.js index e5f337f..bab95c8 100644 --- a/jscrambler-client.js +++ b/jscrambler-client.js @@ -7,8 +7,16 @@ var fs = require('fs'); var keys = require('lodash.keys'); var needle = require('needle'); var querystring = require('querystring'); +var rc = require('rc'); var url = require('url'); +// Load RC configuration if present +var cfg = rc('jscrambler', { + keys: {}, + host: 'api.jscrambler.com', + port: 443, + apiVersion: 3 +}); /** * @class JScramblerClient @@ -22,17 +30,18 @@ var url = require('url'); * @license MIT */ function JScramblerClient (options) { + // Sluggish hack for backwards compatibility + if (options && !options.keys && (options.accessKey || options.secretKey)) { + options.keys = {}; + options.keys.accessKey = options.accessKey; + options.keys.secretKey = options.secretKey; + } + /** * @member */ - this.options = defaults(options || {}, { - accessKey: null, - secretKey: null, - host: 'api.jscrambler.com', - port: 443, - apiVersion: 3 - }); - if (!this.options.accessKey || !this.options.secretKey) + this.options = defaults(options || {}, cfg); + if (!this.options.keys.accessKey || !this.options.keys.secretKey) throw new Error('Missing access or secret keys'); } /** @@ -92,7 +101,7 @@ function generateHmacSignature (method, path, params) { } var signatureData = method.toUpperCase() + ';' + this.options.host.toLowerCase() + ';' + path + ';' + buildSortedQuery(paramsCopy); - var hmac = crypto.createHmac('sha256', this.options.secretKey.toUpperCase()); + var hmac = crypto.createHmac('sha256', this.options.keys.secretKey.toUpperCase()); hmac.update(signatureData); return hmac.digest('base64'); } @@ -129,7 +138,7 @@ function handleFileParams (params) { */ function signedParams (method, path, params) { defaults(params, { - access_key: this.options.accessKey, + access_key: this.options.keys.accessKey, timestamp: new Date().toISOString(), user_agent: 'Node' }); From eaa8d123d496be7b307dd0f9f1f47ff23b2f8931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 21 Nov 2014 20:29:55 +0000 Subject: [PATCH 085/127] improve documentation considering rc configuration and add a toc to README --- README.md | 76 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 56 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 4d6c517..69e4ee5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,55 @@ # JScrambler Client for Node.js +- [RC config](#rc-config) +- [CLI](#cli) + - [Required Fields](#required-fields) + - [Output to a single file](#output-to-a-single-file) + - [Output multiple files to a directory](#output-multiple-files-to-a-directory) + - [Using minimatch](#using-minimatch) + - [Using configuration file](#using-configuration-file) +- [API](#api) + - [Upload/download example](#uploaddownload-example) +- [JScrambler Options](#jscrambler-options) + - [asserts_elimination](#asserts_elimination) + - [browser_os_lock](#browser_os_lock) + - [constant_folding](#constant_folding) + - [dead_code](#dead_code) + - [dead_code_elimination](#dead_code_elimination) + - [debugging_code_elimination](#debugging_code_elimination) + - [dictionary_compression](#dictionary_compression) + - [domain_lock](#domain_lock) + - [dot_notation_elimination](#dot_notation_elimination) + - [exceptions_list](#exceptions_list) + - [expiration_date](#expiration_date) + - [function_outlining](#function_outlining) + - [function_reorder](#function_reorder) + - [ignore_files](#ignore_files) + - [literal_hooking](#literal_hooking) + - [duplicate_literals](#duplicate_literals) + - [member_enumeration](#member_enumeration) + - [mode](#mode) + - [name_prefix](#name_prefix) + - [rename_all](#rename_all) + - [rename_local](#rename_local) + - [self_defending](#self_defending) + - [string_splitting](#string_splitting) + - [whitespace](#whitespace) + +## RC configuration +You may put your access and secret keys into a config file if found in [these directories](https://github.com/dominictarr/rc#standards). Besides simplifying the command entry, this has the added benefit of not logging your JScrambler credentials. + +Here's an example of what your `.jscramblerrc` file should look like: + +```javascript +{ + "keys": { + "accessKey": "XXXXXX", + "secretKey": "XXXXXX" + } +} +``` +Replace the `XXXXXX` fields with your values of course. :) + ## CLI ```bash npm install -g jscrambler @@ -43,24 +93,8 @@ npm install -g jscrambler --whitespace enable whitespace -### Authentication Config -You may optionally put your access and secret keys into a config file which will be read from the user's home directory when invoking jscrambler from the command line. Besides simplifying the command entry, this has the added benefit of not logging your jscrambler credentials. - -here's an example of what your `~/.jscramblerrc` file should look like: - -```javascript -{ - "keys": { - "accessKey": "XXXXXX", - "secretKey": "XXXXXX" - } -} -``` -Replace the `XXXXXX` fields with your values of course. :) - - ### Required Fields -When making API requests you must pass valid secret and access keys. These are each 40 characters long, alpha numeric strings, and uppercase. You can find them in your jscramber web dashboard under `My Account > Api access`. In the examples these are shortened to `XXXX` for the sake of readability. +When making API requests you must pass valid secret and access keys, through the command line or by having a `.jscramblerrc` file. These keys are each 40 characters long, alpha numeric strings, and uppercase. You can find them in your jscramber web dashboard under `My Account > Api access`. In the examples these are shortened to `XXXX` for the sake of readability. ### Output to a single file ```bash @@ -81,7 +115,7 @@ jscrambler "lib/**/*.js" -o dest/ -a XXXX -s XXXX ```bash jscrambler input.js -s XXXX -a XXXX -c ./config.json > output.js ``` -where `config.json` is an object optionally containing any of the JScrambler options listed below. +where `config.json` is an object optionally containing any of the JScrambler options listed [here](#jscrambler-options). ## API @@ -94,8 +128,10 @@ var fs = require('fs-extra'); var jScrambler = require('jscrambler'); var client = new jScrambler.Client({ - accessKey: '', - secretKey: '' + keys: { + accessKey: '', // not needed if you have it on your `.jscramblerrc` + secretKey: '' // not needed if you have it on your `.jscramblerrc` + } }); jScrambler From 90d37d115d9d54547c39e35e0e4ba72795d33080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 21 Nov 2014 22:21:55 +0000 Subject: [PATCH 086/127] remove unneeded check preventing .jscramblerrc from being used when calling process function --- jscrambler.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index be41bcf..483ff53 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -205,9 +205,7 @@ exports = module.exports = process: function (configPathOrObject, destCallback) { var config = typeof configPathOrObject === 'string' ? require(configPathOrObject) : configPathOrObject; - if (!config.keys || !config.keys.accessKey || !config.keys.secretKey) { - throw new Error('Access key and secret key must be provided in the configuration file.'); - } + var accessKey = config.keys.accessKey; var secretKey = config.keys.secretKey; var host = config.host; From 8db28399ed50c40339e205eded2441a62f1ca896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 24 Nov 2014 13:02:59 +0000 Subject: [PATCH 087/127] make rc configuration object accessible through the facade --- jscrambler-client.js | 10 +--------- jscrambler.js | 2 ++ lib/config.js | 13 +++++++++++++ 3 files changed, 16 insertions(+), 9 deletions(-) create mode 100644 lib/config.js diff --git a/jscrambler-client.js b/jscrambler-client.js index bab95c8..5b3be2c 100644 --- a/jscrambler-client.js +++ b/jscrambler-client.js @@ -1,5 +1,6 @@ 'use strict'; +var cfg = require('./lib/config'); var clone = require('lodash.clone'); var crypto = require('crypto'); var defaults = require('lodash.defaults'); @@ -7,17 +8,8 @@ var fs = require('fs'); var keys = require('lodash.keys'); var needle = require('needle'); var querystring = require('querystring'); -var rc = require('rc'); var url = require('url'); -// Load RC configuration if present -var cfg = rc('jscrambler', { - keys: {}, - host: 'api.jscrambler.com', - port: 443, - apiVersion: 3 -}); - /** * @class JScramblerClient * @param {Object} options diff --git a/jscrambler.js b/jscrambler.js index 483ff53..c608beb 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -7,6 +7,7 @@ 'use strict'; var assign = require('lodash.assign'); +var cfg = require('./lib/config'); var fs = require('fs-extra'); var glob = require('glob'); var JScramblerClient = require('./jscrambler-client'); @@ -24,6 +25,7 @@ exports = module.exports = /** @lends jScramblerFacade */ { Client: JScramblerClient, + config: cfg, /** * Downloads code through the API. * @param {JScramblerClient} client diff --git a/lib/config.js b/lib/config.js new file mode 100644 index 0000000..18be2a9 --- /dev/null +++ b/lib/config.js @@ -0,0 +1,13 @@ +'use strict'; + +var rc = require('rc'); + +// Load RC configuration if present +var cfg = rc('jscrambler', { + keys: {}, + host: 'api.jscrambler.com', + port: 443, + apiVersion: 3 +}); + +module.exports = cfg; From 647cbce47e7c21424404ae267c0bfde0eb725d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Wed, 26 Nov 2014 12:25:16 +0000 Subject: [PATCH 088/127] github change auditmark to jscrambler --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 64686e0..f6771d7 100644 --- a/package.json +++ b/package.json @@ -2,22 +2,22 @@ "name": "jscrambler", "description": "JScrambler API client.", "version": "0.5.11", - "homepage": "https://github.com/auditmark/node-jscrambler", + "homepage": "https://github.com/jscrambler/node-jscrambler", "author": { "name": "magalhas", "email": "magalhas@gmail.com" }, "repository": { "type": "git", - "url": "git://github.com:auditmark/node-jscrambler.git" + "url": "git://github.com:jscrambler/node-jscrambler.git" }, "bugs": { - "url": "https://github.com/auditmark/node-jscrambler/issues" + "url": "https://github.com/jscrambler/node-jscrambler/issues" }, "licenses": [ { "type": "MIT", - "url": "https://github.com/auditmark/node-jscrambler/blob/master/LICENSE-MIT" + "url": "https://github.com/jscrambler/node-jscrambler/blob/master/LICENSE-MIT" } ], "scripts": { From d544d5a82c7325afe1d8d1dc1718bb6ddacd67cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 28 Nov 2014 09:32:32 +0000 Subject: [PATCH 089/127] v0.6.0 --- package.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index f6771d7..fdbd873 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.5.11", + "version": "0.6.0", "homepage": "https://github.com/jscrambler/node-jscrambler", "author": { "name": "magalhas", @@ -27,11 +27,11 @@ "node": ">= 0.8.0" }, "dependencies": { - "commander": "^2.1.0", + "commander": "^2.5.0", "flavored-path": "0.0.8", "fs-extra": "^0.12.0", - "glob": "^4.0.2", - "jszip": "^2.2.2", + "glob": "^4.2.1", + "jszip": "^2.4.0", "lodash.assign": "^2.4.1", "lodash.clone": "^2.4.1", "lodash.defaults": "^2.4.1", @@ -39,16 +39,16 @@ "lodash.pluck": "^2.4.1", "lodash.size": "^2.4.1", "needle": "^0.7.10", - "q": "^1.0.1", + "q": "^1.1.2", "rc": "^0.5.4", "snake-case": "^1.0.1", "temp": "^0.8.1" }, - "main": "jscrambler", - "bin": "bin/jscrambler", "devDependencies": { "grunt": "^0.4.5", "grunt-contrib-clean": "^0.6.0", "grunt-jasmine-node": "^0.2.1" - } + }, + "main": "jscrambler", + "bin": "bin/jscrambler" } From 5b1cd278d74d92d55a995f06b254c8680d5208b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 23 Dec 2014 13:07:06 +0000 Subject: [PATCH 090/127] bump v0.7.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fdbd873..29b7911 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.6.0", + "version": "0.7.0", "homepage": "https://github.com/jscrambler/node-jscrambler", "author": { "name": "magalhas", From 6d90371f833b5061d2f6d921a171c4542853108a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 23 Dec 2014 13:07:34 +0000 Subject: [PATCH 091/127] update dependencies --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 29b7911..c5c5914 100644 --- a/package.json +++ b/package.json @@ -27,10 +27,10 @@ "node": ">= 0.8.0" }, "dependencies": { - "commander": "^2.5.0", + "commander": "^2.5.1", "flavored-path": "0.0.8", "fs-extra": "^0.12.0", - "glob": "^4.2.1", + "glob": "^4.3.2", "jszip": "^2.4.0", "lodash.assign": "^2.4.1", "lodash.clone": "^2.4.1", From b3739a84c0632797ef3ae0b2b375e6abceccc87c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 23 Dec 2014 15:34:24 +0000 Subject: [PATCH 092/127] add warning parameters to the CLI (+1 squashed commit) Squashed commits: [240eca9] remove unneeded console.log add warning parameters to the CLI --- bin/jscrambler | 3 ++- lib/cli.js | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/bin/jscrambler b/bin/jscrambler index 77dde96..0ccd496 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -26,9 +26,11 @@ commander .option('--debugging-code-elimination [debuggingCodeElimination', 'Removes statements and public variable declarations used to control the output of debugging messages that help you debug your code.') .option('--dictionary-compression', 'further shrink your source code') .option('--domain-lock [domainLock]', 'Locks your project to a list of domains you specify.') + .option('--domain-lock-warning-function [domainLockWarningFunction]', 'Domain lock warning function.') .option('--dot-notation-elimination', 'Transforms dot notation to subscript notation.') .option('--exceptions-list [exceptionsList]', 'list of exceptions that will never be replaced or used to create new declarations') .option('--expiration-date [expirationDate]', 'Sets your JavaScript to expire after a date (YYYY/MM/DD) of your choosing.') + .option('--expiration-date-warning-function [expirationDateWarningFunction]', 'Expiration date warning function.') .option('--function-outlining', 'Turns statements into new function declarations.') .option('--function-reorder', 'Randomly reorders your source code\'s function declarations.') .option('--ignore-files [ignoreFiles]', 'Define a list of files (relative paths) that JScrambler must ignore.') @@ -86,7 +88,6 @@ if (commander.config) { // Parse configuration (normalize JScrambler parameters) config = cli.parseConfig(commander, config); - config.files = filesSrc; try { diff --git a/lib/cli.js b/lib/cli.js index 53bd32f..e4a7f35 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -19,9 +19,11 @@ module.exports = { debuggingCodeElimination: false, dictionaryCompression: true, domainLock: false, + domainLockWarningFunction: false, dotNotationElimination: true, exceptionsList: false, expirationDate: false, + expirationDateWarningFunction: false, functionOutlining: true, functionReorder: true, ignoreFiles: false, From b250afa401816b71f36c2887ef6b0294eddeaed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 23 Dec 2014 14:58:24 +0000 Subject: [PATCH 093/127] add warning function documentation to README.md --- README.md | 84 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 51 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 69e4ee5..9dfa335 100644 --- a/README.md +++ b/README.md @@ -18,9 +18,11 @@ - [debugging_code_elimination](#debugging_code_elimination) - [dictionary_compression](#dictionary_compression) - [domain_lock](#domain_lock) + - [domain_lock_warning_function](#domain_lock_warning_function) - [dot_notation_elimination](#dot_notation_elimination) - [exceptions_list](#exceptions_list) - [expiration_date](#expiration_date) + - [expiration_date_warning_function](#expiration_date_warning_function) - [function_outlining](#function_outlining) - [function_reorder](#function_reorder) - [ignore_files](#ignore_files) @@ -58,39 +60,41 @@ npm install -g jscrambler Options: - --help output usage information - -V, --version output the version number - -c, --config [config] JScrambler configuration options - -o, --output [output] Output directory. If not specified the output is printed. - -a, --access-key Access key - -s, --secret-key Secret key - -h, --host [host] Hostname - -p, --port [port] Port - -v, --api-version [apiVersion] Version - --asserts-elimination [assertsElimination] Remove function definitions and function calls with a given name. - --browser-os-lock [browserOsLock] Locks a JavaScript application to run only on a specific Browser or Operating System. - --constant-folding Simplifies constant expressions at compile-time to make your code faster at run-time. - --dead-code Randomly injects dead code into the source code. - --dead-code-elimination Removes dead code and void code from your JavaScript. - --debugging-code-elimination [debuggingCodeElimination Removes statements and public variable declarations used to control the output of debugging messages that help you debug your code. - --dictionary-compression further shrink your source code - --domain-lock [domainLock] Locks your project to a list of domains you specify. - --dot-notation-elimination Transforms dot notation to subscript notation. - --exceptions-list [exceptionsList] list of exceptions that will never be replaced or used to create new declarations - --expiration-date [expirationDate] Sets your JavaScript to expire after a date (YYYY/MM/DD) of your choosing. - --function-outlining Turns statements into new function declarations. - --function-reorder Randomly reorders your source code's function declarations. - --ignore-files [ignoreFiles] Define a list of files (relative paths) that JScrambler must ignore. - --literal-hooking [literalHooking] Replaces literals by a randomly sized chain of ternary operators. - --literal-duplicates Replaces literal duplicates by a symbol. - --member-enumeration Replaces Browser and HTML DOM objects by a member enumeration. - --mode [mode] protection mode starter|mobile|html5|nodejs - --name-prefix [namePrefix] Set a prefix to be appended to the new names generated by JScrambler. - --rename-all Renames all identifiers found at your source code. - --rename-local Renames local names only. - --self-defending thwarting code tampering attempts by using anti-tampering and anti-debugging techniques. - --string-splitting [stringSplitting] split strings based on percentage of occurence in the source code input - --whitespace enable whitespace + --help + -V, --version + -c, --config [config] + -o, --output [output] + -a, --access-key + -s, --secret-key + -h, --host [host] + -p, --port [port] + -v, --api-version [apiVersion] + --asserts-elimination [assertsElimination] + --browser-os-lock [browserOsLock] + --constant-folding + --dead-code + --dead-code-elimination + --debugging-code-elimination [debuggingCodeElimination] + --dictionary-compression + --domain-lock [domainLock] + --domain-lock-warning-function [domainLockWarningFunction] + --dot-notation-elimination + --exceptions-list [exceptionsList] + --expiration-date [expirationDate] + --expiration-date-warning-function [expirationDateWarningFunction] + --function-outlining + --function-reorder + --ignore-files [ignoreFiles] + --literal-hooking [literalHooking] + --literal-duplicates + --member-enumeration + --mode [mode] + --name-prefix [namePrefix] + --rename-all + --rename-local + --self-defending + --string-splitting [stringSplitting] + --whitespace ### Required Fields @@ -228,6 +232,13 @@ Type: `String` Locks your project to a list of domains you specify. +### domain_lock_warning_function +Type: `String` + +`name` - your domain lock warning function. + +Executes a function whenever there's a domain lock violation. + ### dot_notation_elimination Type: `String` @@ -249,6 +260,13 @@ Type: `String` Sets your JavaScript to expire after a date of your choosing. +### expiration_date_warning_function +Type: `String` + +`name` - your expiration date warning function. + +Executes a function whenever there's an expiration date violation. + ### function_outlining Type: `String` From d3af83b224d599619546b54f9b2d244535aa9190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 26 Dec 2014 19:24:19 +0000 Subject: [PATCH 094/127] don't let rc grab env variables --- lib/config.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/config.js b/lib/config.js index 18be2a9..6cc915e 100644 --- a/lib/config.js +++ b/lib/config.js @@ -2,12 +2,13 @@ var rc = require('rc'); -// Load RC configuration if present -var cfg = rc('jscrambler', { +// Load RC configuration if present. Pass `[]` as last argument to avoid +// getting variables from `argv`. +var config = rc('jscrambler', { keys: {}, host: 'api.jscrambler.com', port: 443, apiVersion: 3 -}); +}, []); -module.exports = cfg; +module.exports = config; From aaf717be106aa4f6e760d7ddb36f30dc3d755384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 26 Dec 2014 19:24:50 +0000 Subject: [PATCH 095/127] let rc config params be used as a fallback if no param is passed --- jscrambler.js | 12 ++++++++++-- package.json | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index c608beb..a186200 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -7,11 +7,13 @@ 'use strict'; var assign = require('lodash.assign'); -var cfg = require('./lib/config'); +var config = require('./lib/config'); +var defaults = require('lodash.defaults'); var fs = require('fs-extra'); var glob = require('glob'); var JScramblerClient = require('./jscrambler-client'); var JSZip = require('jszip'); +var omit = require('lodash.omit'); var path = require('flavored-path'); var Q = require('q'); var size = require('lodash.size'); @@ -25,7 +27,7 @@ exports = module.exports = /** @lends jScramblerFacade */ { Client: JScramblerClient, - config: cfg, + config: config, /** * Downloads code through the API. * @param {JScramblerClient} client @@ -138,6 +140,12 @@ exports = module.exports = var deferred = Q.defer(); params = assign({}, params); + // If there are no params fallback to `cfg` + var rawParams = omit(params, 'files', 'cwd'); + if (Object.keys(rawParams).length === 0) { + params = defaults(params, this.config.params); + } + params.files = params.files.slice(); this.zipProject(params.files, params.cwd); delete params.cwd; diff --git a/package.json b/package.json index c5c5914..4d6311a 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "lodash.clone": "^2.4.1", "lodash.defaults": "^2.4.1", "lodash.keys": "^2.4.1", + "lodash.omit": "^2.4.1", "lodash.pluck": "^2.4.1", "lodash.size": "^2.4.1", "needle": "^0.7.10", From 396511cd89bc1b9f5f7f6a69c986f94402be5841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 26 Dec 2014 19:24:19 +0000 Subject: [PATCH 096/127] don't let rc grab env variables --- lib/config.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/config.js b/lib/config.js index 18be2a9..6cc915e 100644 --- a/lib/config.js +++ b/lib/config.js @@ -2,12 +2,13 @@ var rc = require('rc'); -// Load RC configuration if present -var cfg = rc('jscrambler', { +// Load RC configuration if present. Pass `[]` as last argument to avoid +// getting variables from `argv`. +var config = rc('jscrambler', { keys: {}, host: 'api.jscrambler.com', port: 443, apiVersion: 3 -}); +}, []); -module.exports = cfg; +module.exports = config; From 1f8a1b3fd87ee3fad32551632d5aa3f083b1c6cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 26 Dec 2014 19:24:50 +0000 Subject: [PATCH 097/127] let rc config params be used as a fallback if no param is passed --- jscrambler.js | 12 ++++++++++-- package.json | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index c608beb..a186200 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -7,11 +7,13 @@ 'use strict'; var assign = require('lodash.assign'); -var cfg = require('./lib/config'); +var config = require('./lib/config'); +var defaults = require('lodash.defaults'); var fs = require('fs-extra'); var glob = require('glob'); var JScramblerClient = require('./jscrambler-client'); var JSZip = require('jszip'); +var omit = require('lodash.omit'); var path = require('flavored-path'); var Q = require('q'); var size = require('lodash.size'); @@ -25,7 +27,7 @@ exports = module.exports = /** @lends jScramblerFacade */ { Client: JScramblerClient, - config: cfg, + config: config, /** * Downloads code through the API. * @param {JScramblerClient} client @@ -138,6 +140,12 @@ exports = module.exports = var deferred = Q.defer(); params = assign({}, params); + // If there are no params fallback to `cfg` + var rawParams = omit(params, 'files', 'cwd'); + if (Object.keys(rawParams).length === 0) { + params = defaults(params, this.config.params); + } + params.files = params.files.slice(); this.zipProject(params.files, params.cwd); delete params.cwd; diff --git a/package.json b/package.json index fdbd873..df3404d 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "lodash.clone": "^2.4.1", "lodash.defaults": "^2.4.1", "lodash.keys": "^2.4.1", + "lodash.omit": "^2.4.1", "lodash.pluck": "^2.4.1", "lodash.size": "^2.4.1", "needle": "^0.7.10", From 6636362759c6d6fffa5331e72976a0560165de91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 26 Dec 2014 19:26:23 +0000 Subject: [PATCH 098/127] v0.6.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index df3404d..8c3889b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.6.0", + "version": "0.6.1", "homepage": "https://github.com/jscrambler/node-jscrambler", "author": { "name": "magalhas", From de5820721e275f3c3e64f767b401045a3c224d38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Fri, 26 Dec 2014 19:30:11 +0000 Subject: [PATCH 099/127] add params to rc file example on README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 69e4ee5..4d4eff7 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,9 @@ Here's an example of what your `.jscramblerrc` file should look like: "keys": { "accessKey": "XXXXXX", "secretKey": "XXXXXX" + }, + "params": { + "self_defending": "%DEFAULT%" } } ``` From c597fa99e7a71e81af5e4101bc64f100dc617e38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 29 Dec 2014 16:19:33 +0000 Subject: [PATCH 100/127] fix config file keys were not being used --- bin/jscrambler | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/bin/jscrambler b/bin/jscrambler index 0ccd496..72eebc2 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -7,7 +7,6 @@ var jScrambler = require('../jscrambler'); var cli = require('../lib/cli'); var path = require('path'); - commander .version(require('../package.json').version) .usage('[source files] [options]') @@ -47,18 +46,23 @@ commander .parse(process.argv); var filesSrc = []; -var globSrc, params; -if (commander.args.length === 1 && /^.*\.json$/.test(commander.args[0])) { - var configFile = require(path.resolve(commander.args[0], '.')); - globSrc = configFile.filesSrc; - commander.output = configFile.filesDest; - commander.accessKey = configFile.keys.accessKey; - commander.secretKey = configFile.keys.secretKey; - commander.host = configFile.host; - commander.port = configFile.port; - commander.apiVersion = configFile.apiVersion; - params = configFile.params; +var globSrc, params, config; + +if (commander.config) { + config = require(path.resolve(commander.config, '.')); + commander.output = commander.output || config.filesDest; + commander.accessKey = commander.accessKey || config.keys.accessKey; + commander.secretKey = commander.secretKey || config.keys.secretKey; + commander.host = commander.host || config.host; + commander.port = commander.port || config.port; + commander.apiVersion = commander.apiVersion || config.apiVersion; + globSrc = config.filesSrc; + params = config = config.params; } else { + params = config = {}; +} + +if (commander.args.length > 0) { globSrc = commander.args; } @@ -78,22 +82,16 @@ var host = commander.host; var port = commander.port && parseInt(commander.port); var apiVersion = commander.apiVersion; -var config; -if (commander.config) { - config = require(path.resolve(commander.config, '.')); - config = config.params || config || params || {}; -} else { - config = {}; -} - // Parse configuration (normalize JScrambler parameters) config = cli.parseConfig(commander, config); config.files = filesSrc; try { var client = new jScrambler.Client({ - accessKey: accessKey, - secretKey: secretKey, + keys: { + accessKey: accessKey, + secretKey: secretKey + }, host: host, port: port, apiVersion: apiVersion From 4781c42c84736ebfe75b6223185852ebcc1f0d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 30 Dec 2014 09:46:16 +0000 Subject: [PATCH 101/127] fix #28 config.keys undefined --- bin/jscrambler | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/jscrambler b/bin/jscrambler index 72eebc2..4567d5e 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -51,8 +51,8 @@ var globSrc, params, config; if (commander.config) { config = require(path.resolve(commander.config, '.')); commander.output = commander.output || config.filesDest; - commander.accessKey = commander.accessKey || config.keys.accessKey; - commander.secretKey = commander.secretKey || config.keys.secretKey; + commander.accessKey = commander.accessKey || config.keys && config.keys.accessKey; + commander.secretKey = commander.secretKey || config.keys && config.keys.secretKey; commander.host = commander.host || config.host; commander.port = commander.port || config.port; commander.apiVersion = commander.apiVersion || config.apiVersion; From ffddd8fc6dfecc5ce97ff000574358f543a5e30b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 30 Dec 2014 16:51:10 +0000 Subject: [PATCH 102/127] fix keys from rc files were being ignored on the cli --- jscrambler-client.js | 1 + 1 file changed, 1 insertion(+) diff --git a/jscrambler-client.js b/jscrambler-client.js index 5b3be2c..4d165f6 100644 --- a/jscrambler-client.js +++ b/jscrambler-client.js @@ -29,6 +29,7 @@ function JScramblerClient (options) { options.keys.secretKey = options.secretKey; } + options.keys = defaults(options || {}, cfg.keys); /** * @member */ From 61a42a3f7d345e0039db6c90c67621b315f31463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 30 Dec 2014 19:44:42 +0000 Subject: [PATCH 103/127] cleanup cli config params, code was messy --- bin/jscrambler | 46 +++++++++++++++++++++++++++++----------------- lib/cli.js | 14 +++++++------- 2 files changed, 36 insertions(+), 24 deletions(-) diff --git a/bin/jscrambler b/bin/jscrambler index 4567d5e..0bca23b 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -45,47 +45,58 @@ commander .option('--whitespace', 'enable whitespace') .parse(process.argv); -var filesSrc = []; -var globSrc, params, config; +var globSrc; + +// If -c, --config file was provided if (commander.config) { - config = require(path.resolve(commander.config, '.')); + // We're using `commander` (CLI) as the source of all truths, falling back to + // the `config` provided by the file passed as argument + var config = require(path.resolve(commander.config, '.')); commander.output = commander.output || config.filesDest; - commander.accessKey = commander.accessKey || config.keys && config.keys.accessKey; - commander.secretKey = commander.secretKey || config.keys && config.keys.secretKey; + // No need to validate if `keys` are set, later `client` will do so, but first + // will try to load to the configuration through an `rc` file + if (config.keys) { + commander.accessKey = commander.accessKey || config.keys.accessKey; + commander.secretKey = commander.secretKey || config.keys.secretKey; + } commander.host = commander.host || config.host; commander.port = commander.port || config.port; commander.apiVersion = commander.apiVersion || config.apiVersion; globSrc = config.filesSrc; - params = config = config.params; -} else { - params = config = {}; } +// If src paths have been provided if (commander.args.length > 0) { globSrc = commander.args; } +var filesSrc = []; +// Iterate `globSrc` to build a list of source files into `filesSrc` +for (var i = 0, l = globSrc.length; i < l; ++i) { + // Calling sync `glob` because async is pointless for the CLI use case + // (as of now at least) + filesSrc = filesSrc.concat(glob.sync(globSrc[i], {dot: true})); +} + +// If there's no output directory and we're handling more than one file we can't +// output to CLI so it's pointless to execute the command. if (!commander.output && filesSrc.length > 1) { console.error('Destination must be specified unless only one file is used as input.'); process.exit(1); } -for (var i = 0, l = globSrc.length; i < l; ++i) { - filesSrc = filesSrc.concat(glob.sync(globSrc[i], {dot: true})); -} - +// Setup everything var dest = commander.output; var accessKey = commander.accessKey; var secretKey = commander.secretKey; var host = commander.host; var port = commander.port && parseInt(commander.port); var apiVersion = commander.apiVersion; +var params = cli.mergeAndParseParams(commander, config && config.params); +params.files = filesSrc; -// Parse configuration (normalize JScrambler parameters) -config = cli.parseConfig(commander, config); -config.files = filesSrc; - +// Go, go, go try { var client = new jScrambler.Client({ keys: { @@ -98,7 +109,7 @@ try { }); jScrambler - .uploadCode(client, config) + .uploadCode(client, params) .then(function (res) { return jScrambler.downloadCode(client, res.id); }) @@ -111,6 +122,7 @@ try { return jScrambler.unzipProject(res, dest); }) .fail(function (err) { + // Maybe we could throw here? console.error(err); process.exit(1); }); diff --git a/lib/cli.js b/lib/cli.js index e4a7f35..6c988ed 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -4,12 +4,12 @@ var clone = require('lodash.clone'); var snakeCase = require('snake-case'); module.exports = { - // Convert from command line option format to snake case for the jscrambler API. + // Convert from command line option format to snake case for the JScrambler API. // It also replaces truthy boolean flags with %DEFAULT% values - parseConfig: function (commander, config) { - config = clone(config); + mergeAndParseParams: function (commander, params) { + params = clone(params || {}); - // Override config file changes with any specified command line options + // Override params file changes with any specified command line options var name, is_bool_flag = { assertsElimination: false, browserOsLock: false, @@ -42,13 +42,13 @@ module.exports = { for (name in is_bool_flag) { if (commander[name] !== undefined) { if (is_bool_flag[name] === true) { - config[snakeCase(name)] = '%DEFAULT%'; + params[snakeCase(name)] = '%DEFAULT%'; } else { - config[snakeCase(name)] = commander[name]; + params[snakeCase(name)] = commander[name]; } } } - return config; + return params; } }; From 21537324b0a06b37b51b1de7cc023d8f5a0e7727 Mon Sep 17 00:00:00 2001 From: Pedro Fortuna Date: Sat, 3 Jan 2015 19:17:00 +0000 Subject: [PATCH 104/127] fix small bug when no params were passed to the cli Fixed small bug when no params where passed to jscrambler.: Fixed small bug when no params were passed to the cli. --- bin/jscrambler | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bin/jscrambler b/bin/jscrambler index 0bca23b..b320015 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -71,6 +71,11 @@ if (commander.args.length > 0) { globSrc = commander.args; } +if (!globSrc) { + commander.outputHelp(); + process.exit(1); +} + var filesSrc = []; // Iterate `globSrc` to build a list of source files into `filesSrc` for (var i = 0, l = globSrc.length; i < l; ++i) { From 27af7633859f37c1629b5d9fd6542ba3aa48fa09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 5 Jan 2015 10:45:58 +0000 Subject: [PATCH 105/127] fix keys from config file or cli were not being used properly --- jscrambler-client.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jscrambler-client.js b/jscrambler-client.js index 4d165f6..59b2c70 100644 --- a/jscrambler-client.js +++ b/jscrambler-client.js @@ -29,7 +29,7 @@ function JScramblerClient (options) { options.keys.secretKey = options.secretKey; } - options.keys = defaults(options || {}, cfg.keys); + options.keys = defaults(options.keys || {}, cfg.keys); /** * @member */ From 07d030fc8c343fa9f85e66f5309a339d54db01d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 5 Jan 2015 20:37:34 +0000 Subject: [PATCH 106/127] improve documentation on -c cli arg --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index eb2a628..e557149 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # JScrambler Client for Node.js -- [RC config](#rc-config) +- [RC configuration](#rc-configuration) - [CLI](#cli) - [Required Fields](#required-fields) - [Output to a single file](#output-to-a-single-file) @@ -122,7 +122,7 @@ jscrambler "lib/**/*.js" -o dest/ -a XXXX -s XXXX ```bash jscrambler input.js -s XXXX -a XXXX -c ./config.json > output.js ``` -where `config.json` is an object optionally containing any of the JScrambler options listed [here](#jscrambler-options). +where `config.json` is an object optionally containing any of the JScrambler options listed [here](#jscrambler-options), using the structure described [in the RC configuration](#rc-config). ## API From 30bb85eddf0f353e8decec32b53116b67f4fa3a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Wed, 14 Jan 2015 16:46:02 +0000 Subject: [PATCH 107/127] update dependencies --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4d6311a..b8ab245 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "commander": "^2.5.1", "flavored-path": "0.0.8", "fs-extra": "^0.12.0", - "glob": "^4.3.2", + "glob": "^4.3.4", "jszip": "^2.4.0", "lodash.assign": "^2.4.1", "lodash.clone": "^2.4.1", @@ -42,7 +42,7 @@ "needle": "^0.7.10", "q": "^1.1.2", "rc": "^0.5.4", - "snake-case": "^1.0.1", + "snake-case": "^1.1.0", "temp": "^0.8.1" }, "devDependencies": { From ca047c751417a0ecf6c3b7dda38c64273e4a3c4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Thu, 26 Feb 2015 14:24:46 +0000 Subject: [PATCH 108/127] replace console.log with process.stdout.write due to bug on source output --- bin/jscrambler | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/jscrambler b/bin/jscrambler index b320015..e235c06 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -121,7 +121,7 @@ try { .then(function (res) { if (filesSrc.length === 1 && !dest) { dest = function (buffer, file) { - console.log(buffer.toString()); + process.stdout.write(buffer.toString()); }; } return jScrambler.unzipProject(res, dest); From 29e5a3e0603e2a833602fcc4326cadeb889b1ee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Thu, 26 Feb 2015 14:25:20 +0000 Subject: [PATCH 109/127] v0.7.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b8ab245..385a325 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.7.0", + "version": "0.7.1", "homepage": "https://github.com/jscrambler/node-jscrambler", "author": { "name": "magalhas", From 8bf073f6ecc7fd85ba7cae15650ee2f8e4464915 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Tue, 21 Apr 2015 10:38:28 +0100 Subject: [PATCH 110/127] Convert array like values to a string with joined values --- bin/jscrambler | 4 ++-- jscrambler-client.js | 8 ++++++++ lib/cli.js | 4 ++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/bin/jscrambler b/bin/jscrambler index e235c06..063d32d 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -38,9 +38,9 @@ commander .option('--member-enumeration', 'Replaces Browser and HTML DOM objects by a member enumeration.') .option('--mode [mode]', 'protection mode starter|mobile|html5|nodejs') .option('--name-prefix [namePrefix]', 'Set a prefix to be appended to the new names generated by JScrambler.') - .option('--rename-all', 'Renames all identifiers found at your source code.') + .option('--rename-all [mode]', 'Renames all identifiers found at your source code.') .option('--rename-local', 'Renames local names only.') - .option('--self-defending', 'thwarting code tampering attempts by using anti-tampering and anti-debugging techniques.') + .option('--self-defending [threshold]', 'thwarting code tampering attempts by using anti-tampering and anti-debugging techniques.') .option('--string-splitting [stringSplitting]', 'split strings based on percentage of occurence in the source code input') .option('--whitespace', 'enable whitespace') .parse(process.argv); diff --git a/jscrambler-client.js b/jscrambler-client.js index 59b2c70..4d59015 100644 --- a/jscrambler-client.js +++ b/jscrambler-client.js @@ -168,6 +168,14 @@ JScramblerClient.prototype.request = function (method, path, params, callback) { var signedData; var options = {timeout: 0}; if (!params) params = {}; + else { + var _keys = keys(params); + for (var i = 0, l = _keys.length; i < l; i++) { + if(params[_keys[i]] instanceof Array && _keys[i] !== 'files') { + params[_keys[i]] = params[_keys[i]].join(','); + } + } + } // If post sign data and set the request as multipart if (method === 'POST') { signedData = signedParams.apply(this, arguments); diff --git a/lib/cli.js b/lib/cli.js index 6c988ed..32c24a1 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -32,9 +32,9 @@ module.exports = { memberEnumeration: true, mode: false, namePrefix: false, - renameAll: true, + renameAll: false, renameLocal: true, - selfDefending: true, + selfDefending: false, stringSplitting: false, whitespace: false }; From 43851973b7c1e26454084b0ec32026ea3e1408ec Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Wed, 29 Apr 2015 16:02:50 +0100 Subject: [PATCH 111/127] Add --preserve-annotations --- bin/jscrambler | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/jscrambler b/bin/jscrambler index 063d32d..9d9fa0c 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -38,6 +38,7 @@ commander .option('--member-enumeration', 'Replaces Browser and HTML DOM objects by a member enumeration.') .option('--mode [mode]', 'protection mode starter|mobile|html5|nodejs') .option('--name-prefix [namePrefix]', 'Set a prefix to be appended to the new names generated by JScrambler.') + .option('--preserve-annotations', 'Preserve JavaScript comments containing annotations.') .option('--rename-all [mode]', 'Renames all identifiers found at your source code.') .option('--rename-local', 'Renames local names only.') .option('--self-defending [threshold]', 'thwarting code tampering attempts by using anti-tampering and anti-debugging techniques.') From d2b3b66be2a1183bb138da3f2a02c2b73e2b1dbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Thu, 30 Apr 2015 10:22:56 +0100 Subject: [PATCH 112/127] add preserve annotations to cli params --- lib/cli.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/cli.js b/lib/cli.js index 32c24a1..9820089 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -36,7 +36,8 @@ module.exports = { renameLocal: true, selfDefending: false, stringSplitting: false, - whitespace: false + whitespace: true, + preserveAnnotations: true }; for (name in is_bool_flag) { From 6549753ac5c1c132517a512925597b1fbc62f468 Mon Sep 17 00:00:00 2001 From: Pedro Fortuna Date: Fri, 29 May 2015 11:53:08 +0100 Subject: [PATCH 113/127] Update README.md Fixed fs.outputFileSync in the example to fs.writeFileSync. --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e557149..03035f4 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,10 @@ jScrambler return jScrambler.downloadCode(client, res.id); }) .then(function (res) { - fs.outputFileSync('dist.zip', res); + return fs.writeFileSync('dist.zip', res); + }) + .catch(function (error) { + console.log(error); }); ``` From 4e42a712f1b6c47691d09ede14bcba48a2da9487 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 2 Jul 2015 16:18:27 +0100 Subject: [PATCH 114/127] Add rename include list. --- bin/jscrambler | 1 + lib/cli.js | 1 + 2 files changed, 2 insertions(+) diff --git a/bin/jscrambler b/bin/jscrambler index 9d9fa0c..174aeea 100755 --- a/bin/jscrambler +++ b/bin/jscrambler @@ -40,6 +40,7 @@ commander .option('--name-prefix [namePrefix]', 'Set a prefix to be appended to the new names generated by JScrambler.') .option('--preserve-annotations', 'Preserve JavaScript comments containing annotations.') .option('--rename-all [mode]', 'Renames all identifiers found at your source code.') + .option('--rename-include [includeList]', 'list of names that you want to force renaming.') .option('--rename-local', 'Renames local names only.') .option('--self-defending [threshold]', 'thwarting code tampering attempts by using anti-tampering and anti-debugging techniques.') .option('--string-splitting [stringSplitting]', 'split strings based on percentage of occurence in the source code input') diff --git a/lib/cli.js b/lib/cli.js index 9820089..c5207d6 100644 --- a/lib/cli.js +++ b/lib/cli.js @@ -33,6 +33,7 @@ module.exports = { mode: false, namePrefix: false, renameAll: false, + renameInclude: false, renameLocal: true, selfDefending: false, stringSplitting: false, From 0ca9c27b75a91834b1e23f20b597eef2387df2c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 10 Aug 2015 16:00:31 +0100 Subject: [PATCH 115/127] update dependencies --- package.json | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 385a325..512bf2c 100644 --- a/package.json +++ b/package.json @@ -27,28 +27,28 @@ "node": ">= 0.8.0" }, "dependencies": { - "commander": "^2.5.1", + "commander": "^2.8.1", "flavored-path": "0.0.8", - "fs-extra": "^0.12.0", - "glob": "^4.3.4", - "jszip": "^2.4.0", - "lodash.assign": "^2.4.1", - "lodash.clone": "^2.4.1", - "lodash.defaults": "^2.4.1", - "lodash.keys": "^2.4.1", - "lodash.omit": "^2.4.1", - "lodash.pluck": "^2.4.1", - "lodash.size": "^2.4.1", - "needle": "^0.7.10", - "q": "^1.1.2", - "rc": "^0.5.4", - "snake-case": "^1.1.0", - "temp": "^0.8.1" + "fs-extra": "^0.23.1", + "glob": "^5.0.14", + "jszip": "^2.5.0", + "lodash.assign": "^3.2.0", + "lodash.clone": "^3.0.3", + "lodash.defaults": "^3.1.2", + "lodash.keys": "^3.1.2", + "lodash.omit": "^3.1.0", + "lodash.pluck": "^3.1.2", + "lodash.size": "^3.0.2", + "needle": "^0.10.0", + "q": "^1.4.1", + "rc": "^1.1.0", + "snake-case": "^1.1.1", + "temp": "^0.8.3" }, "devDependencies": { "grunt": "^0.4.5", "grunt-contrib-clean": "^0.6.0", - "grunt-jasmine-node": "^0.2.1" + "grunt-jasmine-node": "^0.3.1" }, "main": "jscrambler", "bin": "bin/jscrambler" From ae45b93c0e4dbc885bd8a24f51d1950a138c2620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 10 Aug 2015 16:00:48 +0100 Subject: [PATCH 116/127] increase timeouts and add debugging message to signature --- jscrambler-client.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/jscrambler-client.js b/jscrambler-client.js index 4d59015..434302a 100644 --- a/jscrambler-client.js +++ b/jscrambler-client.js @@ -10,6 +10,8 @@ var needle = require('needle'); var querystring = require('querystring'); var url = require('url'); +var debug = !!process.env.DEBUG; + /** * @class JScramblerClient * @param {Object} options @@ -94,6 +96,7 @@ function generateHmacSignature (method, path, params) { } var signatureData = method.toUpperCase() + ';' + this.options.host.toLowerCase() + ';' + path + ';' + buildSortedQuery(paramsCopy); + debug && console.log('Signature data: ' + signatureData); var hmac = crypto.createHmac('sha256', this.options.keys.secretKey.toUpperCase()); hmac.update(signatureData); return hmac.digest('base64'); @@ -166,7 +169,10 @@ JScramblerClient.prototype.get = function (path, params, callback) { */ JScramblerClient.prototype.request = function (method, path, params, callback) { var signedData; - var options = {timeout: 0}; + var options = { + open_timeout: 0, + read_timeout: 0 + }; if (!params) params = {}; else { var _keys = keys(params); From 1425cd60b198bdd6eb9425e9919b29dfec30d220 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 10 Aug 2015 16:01:18 +0100 Subject: [PATCH 117/127] 0.7.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 512bf2c..3b707a3 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.7.1", + "version": "0.7.2", "homepage": "https://github.com/jscrambler/node-jscrambler", "author": { "name": "magalhas", From d5109f57a319257aa0e92adf1c6f4af3ff70a75d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 11 Aug 2015 09:46:14 +0100 Subject: [PATCH 118/127] omit client parameters --- jscrambler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jscrambler.js b/jscrambler.js index a186200..f693e70 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -141,7 +141,7 @@ exports = module.exports = params = assign({}, params); // If there are no params fallback to `cfg` - var rawParams = omit(params, 'files', 'cwd'); + var rawParams = omit(params, ['files', 'cwd', 'apiVersion', 'port', 'deleteProject']); if (Object.keys(rawParams).length === 0) { params = defaults(params, this.config.params); } From ea479e9256955d743e72630a2ba834c13d9fbaf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Tue, 11 Aug 2015 09:47:02 +0100 Subject: [PATCH 119/127] 0.7.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3b707a3..bc6b688 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.7.2", + "version": "0.7.3", "homepage": "https://github.com/jscrambler/node-jscrambler", "author": { "name": "magalhas", From eb4cf2d7a02e5539ef837ad1b3474e7f46b0b5db Mon Sep 17 00:00:00 2001 From: Martin Bories Date: Tue, 22 Sep 2015 12:44:53 +0200 Subject: [PATCH 120/127] Update README.md Added `cwd`-option documentation --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 03035f4..ac97caa 100644 --- a/README.md +++ b/README.md @@ -203,6 +203,11 @@ Type: `String` Simplifies constant expressions at compile-time to make your code faster at run-time. +### cwd +Type: `String` + +Sets the current working directory of JScrambler. Use this to compile a project which is located under another folder. + ### dead_code Type: `String` From 6c7d379ebd190d839a57860001950aa16cd782d1 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 14 Jan 2016 11:02:40 +0000 Subject: [PATCH 121/127] Fix cwd when using gulp --- jscrambler.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jscrambler.js b/jscrambler.js index f693e70..50703fb 100644 --- a/jscrambler.js +++ b/jscrambler.js @@ -297,7 +297,7 @@ exports = module.exports = } var buffer, name; var sPath; - if (cwd && files[i].indexOf(cwd) !== 0) { + if (cwd && files[i].indexOf && files[i].indexOf(cwd) !== 0) { sPath = path.join(cwd, files[i]); } else { sPath = files[i]; @@ -309,7 +309,7 @@ exports = module.exports = } // Else if it's a path and not a directory else if (!fs.statSync(sPath).isDirectory()) { - if (cwd && files[i].indexOf(cwd) === 0) { + if (cwd && files[i].indexOf && files[i].indexOf(cwd) === 0) { name = files[i].substring(cwd.length); } else { name = files[i]; From 0b6837b04de5d09ba9b322a4839a5a7e00b7ce95 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 14 Jan 2016 12:29:36 +0000 Subject: [PATCH 122/127] 0.7.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bc6b688..b0e1e57 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.7.3", + "version": "0.7.4", "homepage": "https://github.com/jscrambler/node-jscrambler", "author": { "name": "magalhas", From f39d697f3773487402b64e77f4082d9d48612bfd Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 14 Jan 2016 12:29:39 +0000 Subject: [PATCH 123/127] 0.7.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b0e1e57..fbf6b31 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jscrambler", "description": "JScrambler API client.", - "version": "0.7.4", + "version": "0.7.5", "homepage": "https://github.com/jscrambler/node-jscrambler", "author": { "name": "magalhas", From 5d1879e36ca5dcac9294c7c5b98cddafa8027a6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=CC=81=20Magalha=CC=83es?= Date: Mon, 23 May 2016 20:08:04 +0100 Subject: [PATCH 124/127] add grunt-cli as devDependency --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index fbf6b31..7d49077 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ }, "devDependencies": { "grunt": "^0.4.5", + "grunt-cli": "^1.2.0", "grunt-contrib-clean": "^0.6.0", "grunt-jasmine-node": "^0.3.1" }, From b437a06b776057978ec7a14d1540808ec73d458c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joa=CC=83o=20Samouco?= Date: Wed, 8 Jun 2016 14:48:21 +0100 Subject: [PATCH 125/127] Fix package version required for 3.8 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ac97caa..56ec4a8 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Replace the `XXXXXX` fields with your values of course. :) ## CLI ```bash -npm install -g jscrambler +npm install -g jscrambler@0 ``` Usage: jscrambler [source files] [options] From 0217ad8b1e7864c533df9a13d7e2ba35be3954b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Magalh=C3=A3es?= Date: Thu, 1 Sep 2016 11:02:55 +0100 Subject: [PATCH 126/127] fix npm install version typo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 56ec4a8..ed5c6eb 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Replace the `XXXXXX` fields with your values of course. :) ## CLI ```bash -npm install -g jscrambler@0 +npm install -g jscrambler@^0 ``` Usage: jscrambler [source files] [options] @@ -127,7 +127,7 @@ where `config.json` is an object optionally containing any of the JScrambler opt ## API ```bash -npm install jscrambler +npm install jscrambler@^0 ``` ### Upload/download example ```js From f96a20b11626fd6707d83725b78519c8437e1ad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Magalh=C3=A3es?= Date: Mon, 20 Mar 2017 17:05:28 +0000 Subject: [PATCH 127/127] update package name to jscrambler3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7d49077..678e6dc 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "jscrambler", + "name": "jscrambler3", "description": "JScrambler API client.", "version": "0.7.5", "homepage": "https://github.com/jscrambler/node-jscrambler",