From 4d9783b33cff2722a0b8867d03f612fac285ff20 Mon Sep 17 00:00:00 2001 From: Shardul Mahadik Date: Fri, 9 Mar 2018 20:35:58 -0800 Subject: [PATCH 1/2] Implement Web Login for SSO --- .gitignore | 2 + lib/cli/index.js | 111 +++++++++++++++++++++++++++++----------- lib/safari-web/index.js | 67 ++++++++++++++++++++++++ lib/safari/index.js | 92 ++++++++++++++++++--------------- package.json | 1 + 5 files changed, 202 insertions(+), 71 deletions(-) create mode 100644 lib/safari-web/index.js diff --git a/.gitignore b/.gitignore index 8309962..95a3865 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ node_modules/ .DS_STORE .credentials +.browser-data +.cookies-file books/ .idea/ package-lock.json diff --git a/lib/cli/index.js b/lib/cli/index.js index 2b5487c..f223f30 100644 --- a/lib/cli/index.js +++ b/lib/cli/index.js @@ -5,6 +5,7 @@ const program = require('commander'); const logger = require('../logger'); const Safari = require('../safari'); +const SafariWeb = require('../safari-web'); const EbookWriter = require('../ebook-writer'); const debug = require('debug')('cli'); const fs = require('fs-promise'); @@ -16,18 +17,40 @@ program .option('-b, --bookid ','the book id of the SafariBooksOnline ePub to be generated') .option('-u, --username ','username of the SafariBooksOnline user - must have a **paid/trial membership**, otherwise will not be able to access the books') .option('-p, --password ','password of the SafariBooksOnline user') + .option('-w, --weblogin', 'use web browser to authenticate instead of username/password - useful for Single Sign On (SSO)') + .option('-c, --clear', 'clear previously cached credentials/cookies') .option('-o, --output ','output path the epub file should be saved to') .option('-d, --debug','activate request debugging') .parse(process.argv); -var username, password; +const browserDataDir = process.cwd() + '/.browser-data' +const cookiesFile = process.cwd() + '/.cookies-file' +const credentialsFile = process.cwd() + '/.credentials' + +if(program.clear) { + logger.log("Deleting cached credentials/cookies") + if(fs.existsSync(credentialsFile)) + fs.removeSync(credentialsFile); + if(fs.existsSync(cookiesFile)) + fs.removeSync(cookiesFile); + if(fs.existsSync(browserDataDir)) + fs.removeSync(browserDataDir); + logger.log("Deleted successfully") +} + +var username, password, cookies; // ## see whether .credentials already exists - if (fs.existsSync(__dirname + '/.credentials')) { - var credentials = JSON.parse(fs.readFileSync(__dirname + '/.credentials', 'utf-8')); - username = credentials.username; - password = credentials.password; - debug("there is an existing user cached with username: " + username); +if (fs.existsSync(credentialsFile)) { + var credentials = JSON.parse(fs.readFileSync(credentialsFile, 'utf-8')); + username = credentials.username; + password = credentials.password; + debug("there is an existing user cached with username: " + username); +} + +if (fs.existsSync(cookiesFile)) { + cookies = JSON.parse(fs.readFileSync(cookiesFile, 'utf-8')); + debug("there is an existing cached cookie file"); } // ## overwrite username and password if specified @@ -36,31 +59,59 @@ if(program.password) password = program.password; // ## Validate Input if(!program.bookid) return console.log("error: option '-b' missing. please consider '--help' for more information."); -if(!username) return console.log("error: option '-u' missing. please consider '--help' for more information."); -if(!password) return console.log("error: option '-p' missing. please consider '--help' for more information."); if(!program.output) return console.log("error: option '-o' missing. please consider '--help' for more information."); +if(!program.weblogin && (!username || !password)) { + console.log("warning: option '-u' and '-p' missing. please consider '--help' for more information.") + console.log("Falling back to web login..."); + program.weblogin = true +} -// ## Starting CLI -logger.log(`starting application...`); +if(program.weblogin) { + if(cookies) { + console.log("Using cached cookies") + start() + } else { + var safariWebClient = new SafariWeb(browserDataDir); + safariWebClient.login().then(fetchedCookies => { + cookies = fetchedCookies; + start() + }) + } +} else { + start() +} -// ## writing credentials to file -let json = JSON.stringify({ "username": username, "password": password }); -fs.writeFile(__dirname + '/.credentials', json).then( () => { - debug(`the username and password were successfully cached`); -}).catch( (err) => { - debug(`an error occurred trying to write the username and pass to the cache file`); -}); +function start() { + // ## Starting CLI + logger.log(`starting application...`); + // ## writing credentials to file + if(program.weblogin) { + let json = JSON.stringify(cookies); + fs.writeFile(cookiesFile, json).then(() => { + debug(`cookies were successfully cached`); + }).catch( (err) => { + debug(`an error occurred trying to write cookies to the cache file`); + }); + } else { + let json = JSON.stringify({ "username": username, "password": password }); + fs.writeFile(credentialsFile, json).then( () => { + debug(`the username and password were successfully cached`); + }).catch( (err) => { + debug(`an error occurred trying to write the username and pass to the cache file`); + }); + } -// ## Authorize User -var safariClient = new Safari(program.debug); -safariClient.fetchBookById(program.bookid, username, password).then( (bookJSON) => { - // console.log(bookJSON); - var ebook = new EbookWriter(bookJSON); - return ebook.save(program.output); -}).then( () => { - // ## finished saving - debug("the epub was successfully saved"); - logger.log("epub successfully saved. exiting..."); -}).catch( (err) => { - logger.log(err); -}); + // ## Authorize User + var safariClient = new Safari(program.debug); + safariClient.fetchBookById(program.bookid, username, password, cookies, program.weblogin).then( (bookJSON) => { + // console.log(bookJSON); + var ebook = new EbookWriter(bookJSON); + return ebook.save(program.output); + }).then( () => { + // ## finished saving + debug("the epub was successfully saved"); + logger.log("epub successfully saved. exiting..."); + }).catch( (err) => { + logger.log(err); + }); +} diff --git a/lib/safari-web/index.js b/lib/safari-web/index.js new file mode 100644 index 0000000..f9439ae --- /dev/null +++ b/lib/safari-web/index.js @@ -0,0 +1,67 @@ +'use strict'; + +const Nightmare = require('nightmare'); +const logger = require('../logger'); + +Nightmare.action( + 'flushCookies', + (name, options, parent, win, renderer, done) => { + parent.respondTo('flushCookies', done => { + win.webContents.session.cookies.flushStore(done) + }) + done() + }, + function(done) { + this.child.call('flushCookies', done) + } +) + +const SafariWeb = function SafariWeb(browserDataDir) { + this.nightmare = Nightmare({ + show: true, + waitTimeout: 180 * 1000, + pollInterval: 5000, + webPreferences: {partition: null}, + paths: {userData: browserDataDir}, + openDevTools: {mode: 'detach'} + }) +} + +SafariWeb.prototype.login = function login() { + return new Promise(function(resolve) { + this.nightmare + .on('console', (log, msg) => { + logger.log(msg) + }) + .goto('https://safaribooksonline.com') + .wait(() => { + return new Promise(function(resolveWait) { + console.log("Checking if authenticated...") + var xmlhttp = new XMLHttpRequest(); + xmlhttp.onreadystatechange = function() { + if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4 + if (xmlhttp.status == 200) { + console.log("Authentication successful") + resolveWait(this.response) + } else if (xmlhttp.status == 401) { + console.log("Not authenticated yet") + resolveWait(false) + } else { + console.log("Error while checking") + resolveWait(false) + } + } + }; + xmlhttp.open("GET", "https://www.safaribooksonline.com/api/v1", true); + xmlhttp.send(); + }) + }) + .flushCookies() + .cookies.get() + .end() + .then((fetchedCookies) => {resolve(fetchedCookies)}) + }.bind(this)) +} + +// # export for external use +module.exports = SafariWeb; \ No newline at end of file diff --git a/lib/safari/index.js b/lib/safari/index.js index abc0d34..7211eaa 100644 --- a/lib/safari/index.js +++ b/lib/safari/index.js @@ -66,43 +66,50 @@ Safari.prototype.fetchStylesheet = function fetchStylesheet(id) { * * @param {String} username - the username of the safaribooksonline account * @param {String} password - the password of the safaribooksonline account +* @param {Array} cookies - an array containing the website cookies +* @param {Boolean} weblogin - indicates if authentication was done through web login * * @return {String} accessToken - returns the access token */ -Safari.prototype.authorizeUser = function authorizeUser(username, password) { - debug(`authorizeUser called with user ${username} and password ${password}`); - if (!username || !password) return Promise.reject("username or password was not specified"); - // ## prepare options for oauth request - let options = { - method: 'POST', - uri: `${this.baseUrl}/oauth2/access_token/`, - form: { - "client_id" : this.clientId, - "client_secret" : this.clientSecret, - "grant_type" : "password", - "username" : username, - "password" : password - }, - json: true - }; - // ## make API call in order to retrieve Bearer Authorization Token - return request(options) - .then( (body) => { - // ### the token was successfully generated - let accessToken = body["access_token"]; - if (!accessToken) { - debug('the access_token is not present in the server response, even though it returned an 200 OK'); - return Promise.reject("The access_token is not present in the server response. Please contact the developer to fix this problem.") - } - this.accessToken = accessToken; - debug(`the access_token is: ${accessToken}`); - return Promise.resolve(accessToken); - }) - .catch( (err) => { - // ### an error occured - debug(`an error occured while trying to fetch authorization token (error: ${err})`); - return Promise.reject(err); - }); +Safari.prototype.authorizeUser = function authorizeUser(username, password, cookies, weblogin) { + if(weblogin) { + this.cookieString = cookies.map(c => c.name + "=" + encodeURIComponent(c.value)).join(";"); + return Promise.resolve(true) + } else { + debug(`authorizeUser called with user ${username} and password ${password}`); + if (!username || !password) return Promise.reject("username or password was not specified"); + // ## prepare options for oauth request + let options = { + method: 'POST', + uri: `${this.baseUrl}/oauth2/access_token/`, + form: { + "client_id" : this.clientId, + "client_secret" : this.clientSecret, + "grant_type" : "password", + "username" : username, + "password" : password + }, + json: true + }; + // ## make API call in order to retrieve Bearer Authorization Token + return request(options) + .then( (body) => { + // ### the token was successfully generated + let accessToken = body["access_token"]; + if (!accessToken) { + debug('the access_token is not present in the server response, even though it returned an 200 OK'); + return Promise.reject("The access_token is not present in the server response. Please contact the developer to fix this problem.") + } + this.accessToken = accessToken; + debug(`the access_token is: ${accessToken}`); + return Promise.resolve(accessToken); + }) + .catch( (err) => { + // ### an error occured + debug(`an error occured while trying to fetch authorization token (error: ${err})`); + return Promise.reject(err); + }); + } } @@ -117,13 +124,13 @@ Safari.prototype.authorizeUser = function authorizeUser(username, password) { */ Safari.prototype.fetchResource = function fetchResource(url, options) { debug(`fetchResource called with URL: ${url}`); - if(!url || !this.accessToken) return Promise.reject("url was not specified or user has not been authorized yet"); + if(!url || !this.accessToken && !this.cookieString) return Promise.reject("url was not specified or user has not been authorized yet"); // ## prepare options for resource request var uri = `${this.baseUrl}/${url}`; var json = true; - var headers = { - "authorization": `Bearer ${this.accessToken}` - }; + var headers = {} + if(this.access_token) headers["authorization"] = `Bearer ${this.accessToken}` + if(this.cookieString) headers["cookie"] = `${this.cookieString}` if(options && options.json == false) json = false; if(options && options.uri) uri = options.uri; let settings = { @@ -279,16 +286,19 @@ Safari.prototype.getBookById = function getBookById(id) { * @param {String} id - the id of the specified book * @param {String} username - the username of the safaribook user * @param {String} password - the password of the safaribook user +* @param {Array} cookies - an array containing the website cookies +* @param {Boolean} weblogin - indicates if authentication was done through web login * * @return {Object} body - returns the book json */ -Safari.prototype.fetchBookById = function fetchBookById(id, username, password) { +Safari.prototype.fetchBookById = function fetchBookById(id, username, password, cookies, weblogin) { debug(`fetchBookById called with id: ${id}`); if(!id) return Promise.reject("id was not specified"); - if(!username || !password) return Promise.reject("username or password was not specified"); + if(weblogin && !cookies) return Promise.reject("could not fetch cookies using web login") + if(!weblogin && (!username || !password)) return Promise.reject("username or password was not specified"); // ## validation successful // ## fetch required content - return this.authorizeUser(username, password).then( (accessToken) => { + return this.authorizeUser(username, password, cookies, weblogin).then( (accessToken) => { // ### user authorized, fetch meta logger.log(`the user "${username}" was successfully authorized...`); return this.fetchMeta(id); diff --git a/package.json b/package.json index 3b824a6..c6038ed 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "ejs": "^2.5.5", "fs-promise": "^1.0.0", "mime": "^1.3.4", + "nightmare": "^3.0.0", "request": "^2.79.0", "request-debug": "^0.2.0", "request-promise": "^4.1.1", From 3f65ab748edbce93a19de4ea8fee0673cd299980 Mon Sep 17 00:00:00 2001 From: azu Date: Thu, 24 Oct 2019 21:55:30 +0900 Subject: [PATCH 2/2] fix(safari-web): safaribooksonline.com -> learning.oreilly.com --- lib/safari-web/index.js | 100 +++--- package-lock.json | 714 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 765 insertions(+), 49 deletions(-) diff --git a/lib/safari-web/index.js b/lib/safari-web/index.js index f9439ae..f054f92 100644 --- a/lib/safari-web/index.js +++ b/lib/safari-web/index.js @@ -4,64 +4,66 @@ const Nightmare = require('nightmare'); const logger = require('../logger'); Nightmare.action( - 'flushCookies', - (name, options, parent, win, renderer, done) => { - parent.respondTo('flushCookies', done => { - win.webContents.session.cookies.flushStore(done) - }) - done() - }, - function(done) { - this.child.call('flushCookies', done) - } -) + 'flushCookies', + (name, options, parent, win, renderer, done) => { + parent.respondTo('flushCookies', done => { + win.webContents.session.cookies.flushStore(done) + }); + done(); + }, + function (done) { + this.child.call('flushCookies', done) + } +); const SafariWeb = function SafariWeb(browserDataDir) { this.nightmare = Nightmare({ show: true, waitTimeout: 180 * 1000, pollInterval: 5000, - webPreferences: {partition: null}, - paths: {userData: browserDataDir}, - openDevTools: {mode: 'detach'} + webPreferences: { partition: null }, + paths: { userData: browserDataDir }, + openDevTools: { mode: 'detach' } }) -} +}; SafariWeb.prototype.login = function login() { - return new Promise(function(resolve) { + return new Promise((resolve) => { this.nightmare - .on('console', (log, msg) => { - logger.log(msg) - }) - .goto('https://safaribooksonline.com') - .wait(() => { - return new Promise(function(resolveWait) { - console.log("Checking if authenticated...") - var xmlhttp = new XMLHttpRequest(); - xmlhttp.onreadystatechange = function() { - if (xmlhttp.readyState == XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4 - if (xmlhttp.status == 200) { - console.log("Authentication successful") - resolveWait(this.response) - } else if (xmlhttp.status == 401) { - console.log("Not authenticated yet") - resolveWait(false) - } else { - console.log("Error while checking") - resolveWait(false) - } - } - }; - xmlhttp.open("GET", "https://www.safaribooksonline.com/api/v1", true); - xmlhttp.send(); - }) - }) - .flushCookies() - .cookies.get() - .end() - .then((fetchedCookies) => {resolve(fetchedCookies)}) - }.bind(this)) -} + .on('console', (log, msg) => { + logger.log(msg) + }) + .goto('https://learning.oreilly.com') + .wait(() => { + return new Promise(function (resolveWait) { + console.log("Checking if authenticated..."); + var xmlhttp = new XMLHttpRequest(); + xmlhttp.onreadystatechange = function () { + if (xmlhttp.readyState === XMLHttpRequest.DONE) { // XMLHttpRequest.DONE == 4 + if (xmlhttp.status === 200) { + console.log("Authentication successful"); + resolveWait(this.response) + } else if (xmlhttp.status === 401) { + console.log("Not authenticated yet"); + resolveWait(false) + } else { + console.log("Error while checking"); + resolveWait(false) + } + } + }; + xmlhttp.open("GET", "https://learning.oreilly.com/api/v1", true); + xmlhttp.send(); + }) + }) + .flushCookies() + .cookies.get() + .end() + .then((fetchedCookies) => { + resolve(fetchedCookies) + }) + }) +}; // # export for external use -module.exports = SafariWeb; \ No newline at end of file +module.exports = SafariWeb; diff --git a/package-lock.json b/package-lock.json index 7181a1f..6914bca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,11 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/node": { + "version": "8.10.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.55.tgz", + "integrity": "sha512-iZeh1EgupfmAAOASk580R1SL5lWF3CsBVgVH0395qyNF8fhO16xy1UwAav2PdGxIIsYRn7RzJgMGjdsvam6YYg==" + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -15,6 +20,11 @@ "json-schema-traverse": "^0.3.0" } }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -49,6 +59,11 @@ "readable-stream": "^2.0.0" } }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -160,6 +175,25 @@ "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, "capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", @@ -181,11 +215,21 @@ "url-to-options": "^1.0.1" } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, "combined-stream": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", @@ -215,6 +259,17 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "config-chain": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", @@ -254,6 +309,14 @@ "capture-stack-trace": "^1.0.0" } }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -270,6 +333,11 @@ "ms": "2.0.0" } }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, "decompress": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.0.tgz", @@ -351,6 +419,27 @@ } } }, + "deep-defaults": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/deep-defaults/-/deep-defaults-1.0.5.tgz", + "integrity": "sha512-5ev/sNkiHTmeTqbDJEDgdQa/Ub0eOMQNix9l+dLLGbwOos7/in5HdvHXI014wqxsET4YeJG9Eq4qj0PJRL8rSw==", + "requires": { + "lodash": "^4.17.5" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -390,6 +479,51 @@ "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" }, + "electron": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.18.tgz", + "integrity": "sha512-PQRHtFvLxHdJzMMIwTddUtkS+Te/fZIs+PHO+zPmTUTBE76V3Od3WRGzMQwiJHxN679licmCKhJpMyxZfDEVWQ==", + "requires": { + "@types/node": "^8.0.24", + "electron-download": "^3.0.1", + "extract-zip": "^1.0.3" + } + }, + "electron-download": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz", + "integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=", + "requires": { + "debug": "^2.2.0", + "fs-extra": "^0.30.0", + "home-path": "^1.0.1", + "minimist": "^1.2.0", + "nugget": "^2.0.0", + "path-exists": "^2.1.0", + "rc": "^1.1.2", + "semver": "^5.3.0", + "sumchecker": "^1.2.0" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", @@ -398,6 +532,34 @@ "once": "^1.4.0" } }, + "enqueue": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/enqueue/-/enqueue-1.0.2.tgz", + "integrity": "sha1-kBTpvOVw7pPKlubI5jrVTBkra8g=", + "requires": { + "sliced": "0.0.5" + }, + "dependencies": { + "sliced": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", + "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" + } + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -408,6 +570,35 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "dependencies": { + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "requires": { + "pend": "~1.2.0" + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "requires": { + "fd-slicer": "~1.0.1" + } + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -451,6 +642,15 @@ "trim-repeated": "^1.0.0" } }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -507,6 +707,11 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "function-source": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/function-source/-/function-source-0.1.0.tgz", + "integrity": "sha1-2RBL8+RniLVUaMAr8bL6vPj8Ga8=" + }, "get-proxy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", @@ -515,6 +720,11 @@ "npm-conf": "^1.1.0" } }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, "get-stream": { "version": "3.0.0", "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -596,6 +806,16 @@ "has-symbol-support-x": "^1.4.1" } }, + "home-path": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.7.tgz", + "integrity": "sha512-tM1pVa+u3ZqQwIkXcWfhUlY3HWS3TsnKsfi2OHHvnhkX52s9etyktPyy1rQotkr0euWimChDq+QkQuDe8ngUlQ==" + }, + "hosted-git-info": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -611,6 +831,14 @@ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==" }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -630,6 +858,27 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, "is-natural-number": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", @@ -660,6 +909,11 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -685,6 +939,11 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "optional": true }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -719,6 +978,11 @@ "verror": "1.10.0" } }, + "keypress": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz", + "integrity": "sha1-SjGI1CkbZrT2XtuZ+AaqmuKTWSo=" + }, "klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", @@ -735,11 +999,32 @@ "readable-stream": "^2.0.5" } }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -760,6 +1045,35 @@ } } }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -791,6 +1105,24 @@ "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, + "minstache": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minstache/-/minstache-1.2.0.tgz", + "integrity": "sha1-/xzEA6woRPaNvxjGYhKb5+sO/EE=", + "requires": { + "commander": "1.0.4" + }, + "dependencies": { + "commander": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/commander/-/commander-1.0.4.tgz", + "integrity": "sha1-Xt6xruI8T7VBprcNaSq+8ZZpotM=", + "requires": { + "keypress": "0.1.x" + } + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -804,6 +1136,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "multiline": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/multiline/-/multiline-1.0.2.tgz", + "integrity": "sha1-abHyX/B00oKJBPJE3dBrfZbvbJM=", + "requires": { + "strip-indent": "^1.0.0" + } + }, "mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -814,6 +1154,38 @@ "thenify-all": "^1.0.0" } }, + "nightmare": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/nightmare/-/nightmare-3.0.2.tgz", + "integrity": "sha512-z6Sr7k71pFcNHFH0orejum9xMzrsdU1lcxlbvNGRsKgDltmu4r52sK5opDnoqfyWS+w9SNthj/4Bbt5zNofzhw==", + "requires": { + "debug": "^2.2.0", + "deep-defaults": "^1.0.3", + "defaults": "^1.0.2", + "electron": "^2.0.18", + "enqueue": "^1.0.2", + "function-source": "^0.1.0", + "jsesc": "^0.5.0", + "minstache": "^1.2.0", + "mkdirp": "^0.5.1", + "multiline": "^1.0.2", + "once": "^1.3.3", + "rimraf": "^2.4.3", + "sliced": "1.0.1", + "split2": "^2.0.1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", @@ -838,6 +1210,32 @@ } } }, + "nugget": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", + "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", + "requires": { + "debug": "^2.1.3", + "minimist": "^1.1.0", + "pretty-bytes": "^1.0.2", + "progress-stream": "^1.1.0", + "request": "^2.45.0", + "single-line-log": "^1.1.2", + "throttleit": "0.0.2" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -848,6 +1246,11 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -856,11 +1259,42 @@ "wrappy": "1" } }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -894,11 +1328,29 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.1.0" + } + }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, + "progress-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", + "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", + "requires": { + "speedometer": "~0.1.2", + "through2": "~0.2.3" + } + }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -919,6 +1371,43 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, "readable-stream": { "version": "2.3.6", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -933,11 +1422,28 @@ "util-deprecate": "~1.0.1" } }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -965,6 +1471,14 @@ "uuid": "^3.3.2" } }, + "request-debug": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/request-debug/-/request-debug-0.2.0.tgz", + "integrity": "sha1-/AVOyBcYGwTKQaBSwTb2HEirr3g=", + "requires": { + "stringify-clone": "^1.0.0" + } + }, "request-promise": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.2.tgz", @@ -984,6 +1498,14 @@ "lodash": "^4.13.1" } }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "requires": { + "path-parse": "^1.0.6" + } + }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", @@ -1020,6 +1542,81 @@ } } }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "single-line-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", + "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", + "requires": { + "string-width": "^1.0.1" + } + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" + }, + "speedometer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=" + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "requires": { + "through2": "^2.0.2" + }, + "dependencies": { + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, "sshpk": { "version": "1.14.2", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", @@ -1041,6 +1638,16 @@ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -1049,6 +1656,27 @@ "safe-buffer": "~5.1.0" } }, + "stringify-clone": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stringify-clone/-/stringify-clone-1.1.1.tgz", + "integrity": "sha1-MJojX7Ts/M19OI2+GLqQT6yvQzs=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + }, "strip-dirs": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", @@ -1057,6 +1685,19 @@ "is-natural-number": "^4.0.1" } }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, "strip-outer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", @@ -1065,6 +1706,15 @@ "escape-string-regexp": "^1.0.2" } }, + "sumchecker": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz", + "integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=", + "requires": { + "debug": "^2.2.0", + "es6-promise": "^4.0.5" + } + }, "tar-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", @@ -1095,11 +1745,56 @@ "thenify": ">= 3.1.0 < 4" } }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=" + }, "through": { "version": "2.3.8", "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" }, + "through2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", + "requires": { + "readable-stream": "~1.1.9", + "xtend": "~2.1.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, "timed-out": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", @@ -1119,6 +1814,11 @@ "punycode": "^1.4.1" } }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, "trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", @@ -1141,6 +1841,11 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "optional": true }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, "unbzip2-stream": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.0.tgz", @@ -1195,6 +1900,15 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",