diff --git a/apps/appUtils.js b/apps/appUtils.js index 349cf71..9616477 100755 --- a/apps/appUtils.js +++ b/apps/appUtils.js @@ -1,5 +1,5 @@ /* - depends on child_process + depends on child_process */ 'use strict' @@ -8,31 +8,31 @@ var spawn = require('child_process').spawn; // Export module.exports.spawn = function( cmd, opts, cwd ){ - if( !cmd ){ - throw new Error('Spawner fucked up'); - } - if( !opts ){ - opts = []; - }else if( !(opts instanceof Array) ){ - opts = [opts]; - } - Logger.log('[UTILS] Spawning', cmd, 'with options', opts); - var child = spawn(cmd, opts, { - detached: true, - stdio: [ 'ignore', 'ignore', 'ignore' ], - cwd: cwd?cwd:process.cwd() - }); - child.unref(); + if( !cmd ){ + throw new Error('Spawner fucked up'); + } + if( !opts ){ + opts = []; + }else if( !(opts instanceof Array) ){ + opts = [opts]; + } + Logger.log('[UTILS] Spawning', cmd, 'with options', opts); + var child = spawn(cmd, opts, { + detached: true, + stdio: [ 'ignore', 'ignore', 'ignore' ], + cwd: cwd?cwd:process.cwd() + }); + child.unref(); } module.exports.strSearch = function( str, query ){ - - if( typeof str !== 'string' || typeof query !== 'string' ){ - return -1; - } - str = str.toLowerCase(); - query = query.toLowerCase(); - return str.indexOf(query); + + if( typeof str !== 'string' || typeof query !== 'string' ){ + return -1; + } + str = str.toLowerCase(); + query = query.toLowerCase(); + return str.indexOf(query); } @@ -40,36 +40,36 @@ module.exports.strSearch = function( str, query ){ // out of it, if no match is found null is returned module.exports.cleanQuery = function( regexArr, query ){ - //Logger.log('[APP_UTILS]', 'cleanQuery', 'regexArr', regexArr, 'query', query) - var ret = null; - if( regexArr instanceof Array ){ - - regexArr.forEach(function( reg ){ - - if( ret ) return; - if( reg instanceof RegExp ){ - ret = reg.exec( query ); - } - - }); + //Logger.log('[APP_UTILS]', 'cleanQuery', 'regexArr', regexArr, 'query', query) + var ret = null; + if( regexArr instanceof Array ){ + + regexArr.forEach(function( reg ){ + + if( ret ) return; + if( reg instanceof RegExp ){ + ret = reg.exec( query ); + } + + }); - if( ret && ret[1] !== undefined ){ - - ret = ret[1].trim(); - - } - } + if( ret && ret[1] !== undefined ){ + + ret = ret[1].trim(); + + } + } - Logger.log('[APP_UTILS]', 'cleanQuery', 'result', ret) + Logger.log('[APP_UTILS]', 'cleanQuery', 'result', ret) - return ret; + return ret; } module.exports.wrapRegex = function( reg ){ - reg || (reg = ''); - if( reg instanceof RegExp ){ - return reg.source.replace(/\^|\(\.\*\)/g, ''); - } - // Todo: Non regexp case - return ''; + reg || (reg = ''); + if( reg instanceof RegExp ){ + return reg.source.replace(/\^|\(\.\*\)/g, ''); + } + // Todo: Non regexp case + return ''; } diff --git a/apps/index.js b/apps/index.js index 00ec3d7..c22d46b 100755 --- a/apps/index.js +++ b/apps/index.js @@ -1,115 +1,107 @@ /* - depends on lodash, electron-router, systemApps, nativeApps - globals upath, db, async - globalizes app{ utils, URL_REGEX } + depends on lodash, electron-router, systemApps, nativeApps + globals upath, db, async + globalizes app{ utils, URL_REGEX } */ 'use strict'; -let _ = require('lodash') -let _systemApps = require( global.upath.join( __dirname, 'system', 'index' ) ) -let _nativeApps = require( global.upath.join( __dirname, 'native', 'index' ) ) +const { uniqBy } = require('lodash') +const _systemApps = require( global.upath.join( __dirname, 'system', 'index' ) ) +const _nativeApps = require( global.upath.join( __dirname, 'native', 'index' ) ) +const BrowserHistory = require( global.upath.join( __dirname, 'system', 'BrowserHistory' ) ) // Apps namespace global.app = { - utils: require('./appUtils'), - URL_REGEX: new RegExp(/^(?:http(?:s)?\:\/\/(?:www\.)?)([^ ]+)$/gi) + utils: require('./appUtils'), + URL_REGEX: new RegExp(/^(?:http(?:s)?\:\/\/(?:www\.)?)([^ ]+)$/gi) } -let _searchBrowserHistory = function( query, callback ){ - - global.db.query('browsers', query, ( err, results ) => { - - if( err ){ - return callback( err ); - } - callback( null, _.uniqBy(results, ( a ) => a.title ).map(( result ) => { - // Deep copy - let aux = _systemApps.getInternalApp('browserHistory') - // Come in the form: - // url: ... - // title: ... - // browser: ... - aux.name = result.title - aux.text = result.url - return aux - })) - - }) +function _searchBrowserHistory( query, callback ){ + + global.db.query('browsers', query, ( err, results ) => { -} - -let _lateAppend = function( err, results ){ + if( err ){ + return callback( err ); + } - if( !err && results && results.length){ - // Send data back to UI - //Logger.log('[APP LOADER]', 'Late Append', results.length, results); - router.send('UI::AppendToView', results); - }else{ - Logger.log('[APP LOADER]', 'Late Append failed', err); - } + const ret = uniqBy(results, ( a ) => a.title ) + .map(( result ) => new BrowserHistory({ + name: result.title, text: result.url + }).getWrapper()) + callback( null, ret ) + }) } -let _registerEvents = function( callback ){ - - router.on('launchApp', ( data ) => { - //Logger.log('[APP LOADER]', data.app); - // TODO => Type check should not be against undefined but a type - if( '_native_' === data.app.type ){ - Logger.log('[APP LOADER] for spawner', data.app, data.query); - global.app.utils.spawn( data.app.exec ); - }else{ - _systemApps.launchApp( data.app.exec, data.app, data.query ); - } - }); - - router.get('query', ( req, res ) => { - Logger.log('[APP LOADER]', 'query', req.params[0]) - let query = req.params[0]; - let matches = []; - - if( query !== '' && query !== ' '){ - - // Internal apps: Preferences, Quit, Url - matches = matches.concat( _systemApps.searchApp( query, _lateAppend ) ); - // Native apps: User installed applications - matches = matches.concat( _nativeApps.searchApp( query, _lateAppend ) ); - // Broswser History files - _searchBrowserHistory( query, _lateAppend) - - } - // If nothing was found, just insert netSearch option - if( matches.length < 2 ){ - matches.push( _systemApps.getInternalApp('netSearch') ); - } - Logger.log('[APP LOADER]', 'Sending back', matches.length) - res.json( null, matches ); - - matches = null; - - }) - - callback(); +function _lateAppend( err, results ){ + + if( !err && results && results.length){ + // Send data back to UI + //Logger.log('[APP LOADER]', 'Late Append', results.length, results); + router.send('UI::AppendToView', results); + }else{ + Logger.log('[APP LOADER]', 'Late Append failed', err); + } +} +function _registerEvents( callback ){ + + router.on('launchApp', ( data ) => { + //Logger.log('[APP LOADER]', data.app); + // TODO => Type check should not be against undefined but a type + if( '_native_' === data.app.type ){ + Logger.log('[APP LOADER] for spawner', data.app, data.query); + global.app.utils.spawn( data.app.exec ); + }else{ + _systemApps.launchApp( data.app.exec, data.app, data.query ); + } + }); + + router.get('query', ( req, res ) => { + Logger.log('[APP LOADER]', 'query', req.params[0]) + let query = req.params[0]; + let matches = []; + + if( query !== '' && query !== ' '){ + + // Internal apps: Preferences, Quit, Url + matches = matches.concat( _systemApps.searchApp( query, _lateAppend ) ); + // Native apps: User installed applications + matches = matches.concat( _nativeApps.searchApp( query, _lateAppend ) ); + // Broswser History files + _searchBrowserHistory( query, _lateAppend) + + } + // If nothing was found, just insert netSearch option + if( matches.length < 2 ){ + matches.push( _systemApps.getInternalApp('netSearch') ); + } + Logger.log('[APP LOADER]', 'Sending back', matches.length) + res.json( null, matches ); + + matches = null; + + }) + + callback(); } -let _start = function( callback ){ +function _start( callback ){ - global.async.parallel([ - - _systemApps.start, - _nativeApps.start, - _registerEvents + global.async.parallel([ - ], ( err ) => { + _systemApps.start, + _nativeApps.start, + _registerEvents - Logger.log('[APP LOADER] Done starting modules', (err?err:'')); - callback( err ); + ], ( err ) => { - }); + Logger.log('[APP LOADER] Done starting modules', (err?err:'')); + callback( err ); + }); } module.exports = { - start: _start + start: _start } diff --git a/apps/native/index.js b/apps/native/index.js index 0645835..d1dd257 100755 --- a/apps/native/index.js +++ b/apps/native/index.js @@ -20,7 +20,7 @@ const GTK_ICON_LOOKUP_FORCE_SIZE = 16; const GTK_ICON_LOOKUP_USE_BUILTIN = 4; const GTK_ICON_LOOKUP_NO_SVG = 1; -var processApp = function( dstDir, app, callback ){ +function _processApp( dstDir, app, callback ){ if( app.icon !== '__unknown__' ){ // Check svg @@ -68,7 +68,7 @@ var processApp = function( dstDir, app, callback ){ } } -var dumpApps = function( file, apps, callback ){ +function _dumpApps( file, apps, callback ){ Logger.log(`[NATIVE APPS] Found -> ${apps.length} apps`) Logger.log(`[NATIVE APPS] Saving to -> ${file}`) fs.writeFile( file, JSON.stringify(apps, null, 4), ( err ) => { @@ -80,7 +80,7 @@ var dumpApps = function( file, apps, callback ){ }) } -var cacheFiles = function( cmd, callback ){ +function _cacheFiles( cmd, callback ){ var args = [ appsFile ]; if( cmd.trim() !== '' ){ @@ -114,17 +114,17 @@ var cacheFiles = function( cmd, callback ){ if( global.progOpts.indexOf('--noSvg') !== -1 ){ - dumpApps( appsFile, apps, callback ); + _dumpApps( appsFile, apps, callback ); }else{ global.async.map(apps, ( app, callback ) => { - processApp( dstDir, app, callback ); + _processApp( dstDir, app, callback ); }, function( err, apps ){ //Logger.log('done processing', 'changes', changes, arguments); - dumpApps( appsFile, apps, callback ); + _dumpApps( appsFile, apps, callback ); }) } @@ -134,14 +134,14 @@ var cacheFiles = function( cmd, callback ){ }) } -var cacheAndUpdate = function( firstTime, callback ){ +function _cacheAndUpdate( firstTime, callback ){ // If its not first time, apps are yet on cache, callback => list => update cache => update db // Else, list => cache => callback => save db if( !firstTime ) callback() // List apps - cacheFiles( global.settings.get('theme'), ( err, apps ) => { + _cacheFiles( global.settings.get('theme'), ( err, apps ) => { if( err ){ Logger.log('[NATIVE APPS] Error listing apps', err) if( firstTime ) callback( err ) @@ -196,7 +196,7 @@ var cacheAndUpdate = function( firstTime, callback ){ }) } -var _start = function( callback ){ +function _start( callback ){ global.db.getMainDB().find({ type: '_native_' }, ( err, docs ) => { //Logger.log('[NATIVE APPS]', 'from DB', err, docs); @@ -210,17 +210,16 @@ var _start = function( callback ){ } // callback( null ) - cacheAndUpdate( !(!!docs.length), callback ) + _cacheAndUpdate( !(!!docs.length), callback ) }) } -var _searchApp = function( query, callback ){ +function _searchApp( query, callback ){ return nativeApps.filter(( app ) => { return ( global.app.utils.strSearch( app.name, query ) !== -1 ); }) - } module.exports = { diff --git a/apps/system/AppBase.js b/apps/system/AppBase.js new file mode 100644 index 0000000..dcb939f --- /dev/null +++ b/apps/system/AppBase.js @@ -0,0 +1,119 @@ +'use strict' + +const properties = ['name', 'text', 'exec', 'icon', 'type'] + +class AppBase { + constructor(options, overLoadOptions) { + if( !this._checkProperties(options) ){ + throw new Error('Bad app instantiation', options) + } + this.wrapper = {} + this._mergeOptions(options) + this._mergeOptions(overLoadOptions) + this.regex = [/^(\?)$/] + } + + _observe() { + if( this.observer && this.observer.dispose ){ + // just one observer + this.observer.dispose() + } + return global.settings.watch(`shortcuts.${this.wrapper.exec}.regex1`, this._addRegex.bind(this)) + } + + _addRegex(newValue, oldValue) { + if( !this.regex instanceof Array ){ + this.regex = [this.regex] + } + let idx = this.regex.indexOf(oldValue) + if( idx !== -1 ){ + this.regex.splice(idx, 1) + } + this.regex.push(newValue) + } + + _checkProperties(options) { + let i = 0 + for(; i < properties.length && options.hasOwnProperty(properties[i]); i++); + return (i <= properties.length) + } + + _cloneWrapper(wrap) { + let ret = {} + for(let prop in wrap){ + ret[prop] = wrap[prop] + } + return ret + } + + _mergeOptions(options) { + if( options instanceof Object ){ + for(let prop in options){ + this.wrapper[prop] = options[prop] + } + } + } + + mergeOptions(options) { + this._mergeOptions(options) + // just in case... + this.observer = this._observe() + } + + setup() { + let r = global.settings.get(`shortcuts.${this.wrapper.exec}.regex1`) + if( r !== undefined && r !== '_unset_' ){ + this._addRegex(r, null) + } + this.observer = this._observe() + } + + getWrapper() { + return this._cloneWrapper(this.wrapper) + } + + exec(ex, query) { + throw new Error('Uninplemented') + } + + match(query) { + let ret = null + // Search by regex + let regs = this.regex + if( regs instanceof RegExp ){ + regs = [regs] + } + if( regs ){ + const allRegex = regs.filter(r => r instanceof RegExp) + + if( allRegex.length ){ + for(let i = 0; i < allRegex.length && !ret; i++){ + ret = allRegex[i].exec(query) + } + } + } + // Search by app name + if( !ret ){ + ret = global.app.utils.strSearch(this.wrapper.exec, query) !== -1 + } + return ret + } + + getName() { + return this.wrapper.name + } + + shouldReload() { + return false + } + + preLoad(cb) { + return (typeof cb === 'function' ? cb : () => {})() + } + + postLoad(cb) { + return (typeof cb === 'function' ? cb : () => {})() + } +} + +module.exports = AppBase \ No newline at end of file diff --git a/apps/system/BrowserHistory.js b/apps/system/BrowserHistory.js new file mode 100644 index 0000000..49326bf --- /dev/null +++ b/apps/system/BrowserHistory.js @@ -0,0 +1,37 @@ +'use strict' + +const AppBase = require(global.upath.joinSafe(__dirname, 'AppBase')) + +const defaultWrapper = { + name: '', + text: '', + exec: 'browserHistory', + icon: 'link.png', + type: '_internal_' +} + +class BrowserHistory extends AppBase { + constructor(options) { + super(defaultWrapper, options) + // super.setup() + } + + exec( ex, query ) { + // Unwrap object, link is on subtext + let q = exec.text + let reg = /((http|ftp|https)\:\/\/)(www\.)?|(www\.)([^\.]*)/i + if( !reg.test( q ) ){ + // Lack starting www.... + q = 'http://' + q; + } + + global.app.utils.spawn( 'xdg-open', [q] ) + } + + match(query) { + // Never match, searched apart + return null + } +} + +module.exports = BrowserHistory \ No newline at end of file diff --git a/apps/system/Calculator.js b/apps/system/Calculator.js new file mode 100644 index 0000000..054c676 --- /dev/null +++ b/apps/system/Calculator.js @@ -0,0 +1,64 @@ +'use strict'; + +const { clipboard } = require('electron') +const AppBase = require(global.upath.joinSafe(__dirname, 'AppBase')) + +const _queryRegex = /^calc:?([-+\.\/*\(\)\s\d])+$/ +const _numberRegex = /^([-+\.\/*\(\)\s\d])+$/ +const _defaultText = 'Fast math calculations.' + +const defaultWrapper = { + name: 'Calculator', + text: _defaultText, + exec: 'calculator', + icon: 'calculator.png', + type: '_internal_' +} + +class Calculator extends AppBase { + constructor(options) { + super(defaultWrapper, options) + this.regex = [_queryRegex, _numberRegex] + super.setup() + this.currentCalc = { + leftSide: null, + rightSide: null + } + } + + getWrapper() { + let text = _defaultText + if( this.currentCalc.leftSide && this.currentCalc.rightSide ){ + text = `${this.currentCalc.leftSide} = ${this.currentCalc.rightSide} | enter -> clipboard` + } + global.Logger.log('[CALC] Modifying text', text) + this.wrapper.text = text + return super.getWrapper() + } + + exec( ex, query ) { + global.Logger.log('[CALC] Copying calculations to clipboard:', query) + clipboard.writeText(query) + } + + match( query ) { + const anyMatch = super.match(query) + if( anyMatch ){ + // horrible hack + global.Logger.log('[CALC] Evaluating... ', anyMatch) + let res = null + try{ + res = eval(anyMatch[0]) + }catch(e){ + res = null + } + if( res ){ + this.currentCalc.leftSide = anyMatch[0] + this.currentCalc.rightSide = res + } + } + return !!(anyMatch) + } +} + +module.exports = Calculator diff --git a/apps/system/NetGo.js b/apps/system/NetGo.js new file mode 100644 index 0000000..2d474b0 --- /dev/null +++ b/apps/system/NetGo.js @@ -0,0 +1,32 @@ +'use strict'; + +const AppBase = require(global.upath.joinSafe(__dirname, 'AppBase')) + +const matchRegex = /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]+)?(\/|\/([\da-z\.-]+)?(\?[\da-z\.-_]+\=([\da-z\.-_]+)?(\&[\da-z\.-_]+\=([\da-z\.-_]+)?)?))?$/i +const http = /((http|ftp|https)\:\/\/)/i +const defaultWrapper = { + name: 'Open Url', + text: 'Open given Url', + exec: 'netGo', + icon: 'openurl.png', + type: '_internal_' +} + +class NetGo extends AppBase { + constructor(options) { + super(defaultWrapper, options) + this.regex = [matchRegex] + super.setup() + } + + exec( ex, query ){ + if( !httpReg.test( query ) ){ + // Lack starting http(s)... xdg-open needs it to work + query = 'https://' + query + } + + global.app.utils.spawn( 'xdg-open', [query] ) + } +} + +module.exports = NetGo \ No newline at end of file diff --git a/apps/system/NetSearch.js b/apps/system/NetSearch.js new file mode 100644 index 0000000..a7d0394 --- /dev/null +++ b/apps/system/NetSearch.js @@ -0,0 +1,25 @@ +'use strict'; + +const AppBase = require(global.upath.joinSafe(__dirname, 'AppBase')) + +const defaultWrapper = { + name: 'Google Search', + text: 'Search whatever on the net', + exec: 'netSearch', + icon: 'google.png', + type: '_internal_' +} + +class NetSearch extends AppBase { + constructor(options) { + super(defaultWrapper, options) + super.setup() + } + + exec( ex, query ){ + query = 'https://www.google.com/search?q=' + query + global.app.utils.spawn( 'xdg-open', [query] ) + } +} + +module.exports = NetSearch diff --git a/apps/system/Preferences.js b/apps/system/Preferences.js new file mode 100644 index 0000000..c4a6406 --- /dev/null +++ b/apps/system/Preferences.js @@ -0,0 +1,144 @@ +'use strict' + +const AppBase = require(global.upath.joinSafe(__dirname, 'AppBase')) + +const ipc = require('electron').ipcMain +const BrowserWindow = require('electron').BrowserWindow +const Router = require('electron-router') +const view = global.upath.joinSafe(global.DIRS.INTERNAL_ROOT, 'ui/html/settings.html') + +const defaultWrapper = { + name: 'Preferences', + text: 'Launch Preferences Tab', + exec: 'preferences', + icon: 'setting.png', + type: '_internal_' +} + +const windowSettings = { + width: 800, + height: 600, + center: true, + resizable: true, + darkTheme: true, + frame: true, + show: true, + title: 'The Mutant - Preferences' +} + +class Preferences extends AppBase { + constructor(options) { + super(defaultWrapper, options) + this.regex = [/preferences/i] + super.setup() + this.router = Router('PREFERENCES') + this.window = null + } + + _registerEvents() { + this.router.get('settings', ( req, res ) => { + this._fetchApps( req, res ) + }) + + this.router.post('settings', ( req, res ) => { + // ToDo + global.Logger.log('[PREFERENCES APP] settings save', req) + res.json(null, 'OK') + }) + + this.router.post('changeAppShortcut', ( req, res ) => { + global.Logger.log('[PREFERENCES APP]', 'changeAppShortcut', req.params) + if( !req.params.length ){ + global.Logger.log('[PREFERENCES APP]', 'changeAppShortcut', 1) + return res.json( 'NO_OK' ) + } + this._changeAppShortcut( req, res ) + }) + + this.router.post('changeAppLocation', ( req, res ) => { + // ToDo + global.Logger.log('[PREFERENCES APP]', 'changeAppLocation', req.params) + res.json(null, 'OK') + }) + } + + _fetchApps( req, res ) { + this.router.routes.get('getAllApps', ( err, data ) => { + if( err ){ + return res.json( err ) + } + res.json(null, data.filter(a => { + return a.type !== '_system_' && a.type !== '_native_' + }).map(a => { + a.location = a.data + return a + })) + }) + } + + _changeAppShortcut( req, res ) { + let toReload = [] + global.async.each( req.params, ( _app, cb ) => { + + let reg = '' + // Permit user to unset shortcut (ie setting it to '') + if( !_app.scut ){ + _app.scut = null + reg = new RegExp('(?!)') + }else{ + // Replace possible bad regex + _app.scut = _app.scut.replace(/\(\.\*\)/gi, '') + _app.scut = _app.scut.trim() + reg = new RegExp( `^${_app.scut} (.*)`, 'i' ) + } + + this._updateAppRegex( _app, reg, ( err ) => { + global.Logger.log('[PREFERENCES APP]', 'updateRegex', 3, 'saved err', err, `shortcuts.${_app.exec}`, { type: _app.type, regex1: reg }) + if( !err ){ + global.settings.set(`shortcuts.${_app.exec}`, { type: _app.type, regex1: reg }) + toReload.push( _app.exec ) + } + cb( err ) + }) + }, ( err, result ) => { + global.Logger.log('[PREFERENCES APP] changeAppShortcut end', 'err', err, 'result', result) + if( err ){ + res.json( err ) + }else{ + res.json( null, 'OK' ) + } + this.router.send('reloadApplications', toReload) + }) + } + + _updateAppRegex( app, reg, callback ) { + // query main db for saving new shortcut + let db = global.db.getMainDB() + db.findOne({ type: app.type, exec: app.exec }, ( err, doc ) => { + global.Logger.log('[PREFERENCES APP]', 'query', app, reg) + global.Logger.log('[PREFERENCES APP]', 'query', app.type, app.exec, 'retrieve', doc, doc.regex1) + if( err ){ + return callback( err ) + } + global.Logger.log('[PREFERENCES APP]', 'updateRegex', 1, 'reg pre', reg, doc.regex1) + doc.regex1 = reg + global.Logger.log('[PREFERENCES APP]', 'updateRegex', 2, 'reg post', reg, doc.regex1) + db.save( doc, callback ) + }) + } + + exec( ex, query ) { + // Launch Preferences window + global.Logger.log('[PREFERENCES APP] Launch') + + this.window = new BrowserWindow(windowSettings) + this.window.loadURL('file://' + view) + this._registerEvents() + this.window.on('close', function( evt ){ + global.Logger.log('[PREFERENCES APP] Closing preferences') + // router unregister + }) + } +} + +module.exports = Preferences diff --git a/apps/system/Quit.js b/apps/system/Quit.js new file mode 100644 index 0000000..e45159b --- /dev/null +++ b/apps/system/Quit.js @@ -0,0 +1,26 @@ +'use strict'; + +const router = require('electron-router')('QUIT_APP') +const AppBase = require(global.upath.joinSafe(__dirname, 'AppBase')) + +const defaultWrapper = { + name: 'Quit Mutant', + text: 'Quit the App', + exec: 'quit', + icon: 'quit.png', + type: '_internal_' +} + +class Quit extends AppBase { + constructor(options) { + super(defaultWrapper, options) + this.regex = [ /QUIT/i ] + super.setup() + } + + exec( ex, query ){ + router.send('quit') + } +} + +module.exports = Quit diff --git a/apps/system/Refresh.js b/apps/system/Refresh.js new file mode 100644 index 0000000..57159cb --- /dev/null +++ b/apps/system/Refresh.js @@ -0,0 +1,26 @@ +'use strict'; + +let router = require('electron-router')('REFRESH_APP') +const AppBase = require(global.upath.joinSafe(__dirname, 'AppBase')) + +const defaultWrapper = { + name: 'Refresh Mutant', + text: 'Refresh Apps index, useful when a new application has been installed and you want it to be catched by Mutant', + exec: 'refresh', + icon: 'refresh.png', + type: '_internal_' +} + +class Refresh extends AppBase { + constructor(options) { + super(defaultWrapper, options) + this.regex = [/REFRESH/i] + super.setup() + } + + exec( ex, query ){ + router.send('refreshApps') + } +} + +module.exports = Refresh diff --git a/apps/system/browserHistoryApp.js b/apps/system/browserHistoryApp.js deleted file mode 100755 index 76e033a..0000000 --- a/apps/system/browserHistoryApp.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict' - -var _browserLaunch = function( exec, query ){ - // Unwrap object, link is on subtext - query = exec.text; - var reg = /((http|ftp|https)\:\/\/)(www\.)?|(www\.)([^\.]*)/i; - if( !reg.test( query ) ){ - // Lack starting www.... - query = 'http://' + query; - } - - global.app.utils.spawn( 'xdg-open', [query] ); - -} - -var exp = { - fn: _browserLaunch, - wrapper: { - name: '', - text: '', - exec: 'browserHistory', - icon: 'link.png', - type: '_internal_' - } -} - -module.exports = { - getRegex: function(){ - return (exp.regex)?exp.regex:null; - }, - getUserRegex: function(){ - return (exp.regex && exp.regex.length > 1)?exp.regex[1]:null; - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length)?exp.regex[0]:null; - }, - getWrapper: function(){ - return exp; - } -} diff --git a/apps/system/calculatorApp.js b/apps/system/calculatorApp.js deleted file mode 100644 index a9fb30a..0000000 --- a/apps/system/calculatorApp.js +++ /dev/null @@ -1,80 +0,0 @@ -'use strict'; - -var { clipboard } = require('electron') -var _numberRegex = /^([-+\.\/*\d\(\)\s]+)$/ -// make a regex out of the name for searching strings -var _queryRegex = /^calc ([-+\.\/*\d\(\)\s]+)$/i -var _fn = function( exec, query ){ - - Logger.log('[CALC] Copying calculations to clipboard:', query) - clipboard.writeText(query) -} - -var _defaultText = 'Fast math calculations.' -var _currentCalc = { - leftSide: null, - rightSide: null -} - -var exp = { - fn: _fn, - wrapper: { - name: 'Calculator', - text: _defaultText, - exec: 'calculator', - icon: 'calculator.png', - type: '_internal_' - }, - regex: [ _queryRegex, _numberRegex ] -} - -if( global.settings.get('shortcuts.calculator') ){ - // Avoid bad regex - var r = global.settings.get('shortcuts.calculator').regex1 - if( r !== '_unset_' ){ - // Set default regex (index 0) and name search (index 1), - // setting to null avoids default behaviour, - // which goes to the name of the application - exp.regex = [ _queryRegex, _numberRegex, r ] - } -} - -module.exports = { - getWrapper: function(){ - var text = _defaultText - if( _currentCalc.leftSide && _currentCalc.rightSide ){ - text = `${_currentCalc.leftSide} = ${_currentCalc.rightSide} | enter -> clipboard` - } - Logger.log('[CALC] Modifying text', text) - exp.wrapper.text = text - return exp - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length) ? exp.regex[0] : null - }, - testQuery: function( query ){ - var allRegex = exp.regex.filter(r => r instanceof RegExp) - var anyMatch = null - - if( allRegex.length ){ - for(var i = 0; i < allRegex.length && !anyMatch; i++){ - anyMatch = allRegex[i].exec(query) - } - if( anyMatch ){ - // horrible hack - Logger.log('[CALC] Evaluating... ', anyMatch) - var res = null - try{ - res = eval(anyMatch[1]) - }catch(e){ - res = null - } - if( res ){ - _currentCalc.leftSide = anyMatch[1] - _currentCalc.rightSide = res - } - } - } - return anyMatch !== null - } -} diff --git a/apps/system/index.js b/apps/system/index.js index 8bdb1f4..a83570a 100755 --- a/apps/system/index.js +++ b/apps/system/index.js @@ -1,215 +1,156 @@ 'use strict'; -let router = require('electron-router')('SYSTEMS_APPS') -// Apps index -let _appIndex = require( upath.joinSafe(__dirname, './index.json') ); +const router = require('electron-router')('SYSTEMS_APPS') +const requireNoCache = require('require-no-cache') // Real applications -let _internalApps = {}; -// Regex for each application -let APP_NAMES = []; +let _internalApps = {} // *************** Util *************** -let _searchApp = function( query ){ +function _searchApp( query ){ - let matches = []; - if( !APP_NAMES.length ){ - _loadApplications(); + let matches = [] + if( !Object.keys(_internalApps).length ){ + _loadApplications() } - // For each application, - // search by name, - // search by regex - // As name regex almost always mathces - // Net search does not get append, - // better approach, let each app match or not - // or, at least return its own name regex, - // based on if it needs text append or is just a launchable - // Currently: As an app may process input text or not, meaning - // that it may accept input text, let it decide with its own regex - // by now may not be very useful, in the future may serve for flags - APP_NAMES.forEach(function( name, idx ){ - //Logger.log('_searchApp', Q); - // search by name - let reg = _internalApps[ name ].getRegex?_internalApps[ name ].getRegex():null; - if( - (global.app.utils.strSearch( name, query ) !== -1) || - ((reg !== null) && reg instanceof RegExp && reg.test( query )) || - (_internalApps[ name ].testQuery && _internalApps[ name ].testQuery( query )) - ){ - matches.push( _internalApps[ name ].getWrapper().wrapper ); + for(let appName in _internalApps){ + let app = _internalApps[appName] + if( app.match(query) ){ + matches.push(app.getWrapper()) } - - }) - return matches; - + } + return matches } -// Wrapper for deep copy, returns a new allocated object -// avoiding overwrittings, call exceptionally -let _getInternalApp = function( app ){ +function _getInternalApp( app ){ - let ret = {}; - if( _appIndex.hasOwnProperty( app ) ){ - let wrapper = _internalApps[ app ].getWrapper().wrapper; - for(let i in wrapper){ - ret[i] = wrapper[ i ]; - } + let ret = {} + if( _internalApps[ app ] !== undefined ){ + ret = _internalApps[app].getWrapper() } - return ret; - + return ret } -let _reloadApplication = function( app ){ +function _reloadApplication( app ){ - Logger.log('[LOADER] Reloading application "' + app + '"'); - //, global.settings.get('shortcuts'), _appIndex); + global.Logger.log('[LOADER] Reloading application "' + app + '"'); // Reload index, just in case... - // require.cache['./index.json'] = undefined; - _appIndex = require( upath.joinSafe( __dirname, './index.json') ); + const _appIndex = requireNoCache( upath.joinSafe( __dirname, 'index.json') ) if( _appIndex.hasOwnProperty( app ) ){ - // Invalidate cache to ensure it's required again - require.cache[require.resolve(_appIndex[ app ])] = undefined; - - // Avoid duplicates on regex: - // Find regex - // Splice that slot - let idx = APP_NAMES.indexOf( app ); - if( undefined !== idx && 0 <= idx && APP_NAMES.length > idx ){ - APP_NAMES.splice( idx, 1 ); - } - _loadApplication( app ); + _loadApplication( app ) }else{ - Logger.log('[LOADER] Unknown application "' + app + '"'); + global.Logger.log('[LOADER] Unknown application "' + app + '"') } - } + // ************************************ // *************** Main *************** // API: -// Every application must expose at least -// a getWrapper returning the wrapper and -// function to call upon execution -// Additionally, it can expose: -// - shouldReload: Called before everything else, if it returns true, we follow default behaviour -// preLoad - getRegex - getWrapper - postLoad, else, we skip this and just get the Wrapper -// - preLoad [ async, receive a callback ]: Called before assignments, useful for initialization (DB...) -// - getRegex: Called to get the Regex used to match against queries -// - postLoad [ async, receive a callback ]: Called after assignment, letiables setup, reload? -// - testQuery: Called on matching, lets the app choose whether to match or not given query -let _loadApplication = function( mod, callback ){ - - callback || ( callback = ()=>{} ); - Logger.log('[LOADER] Loading application "' + mod + '"', upath.joinSafe(__dirname, _appIndex[ mod ]) ); +// Every application must expose: +// - getWrapper : returns the wrapper +// - exec : to call +// - shouldReload: if it loads async or not +// - preLoad : async preLoad call +// - postLoad : async postLoad call +function _loadApplication( mod, callback ){ + callback || ( callback = ()=>{} ) + + const _appIndex = requireNoCache( upath.joinSafe( __dirname, './index.json') ) + global.Logger.log('[LOADER] Loading application "' + mod + '"', global.upath.joinSafe(__dirname, _appIndex[ mod ]) ) + try{ // Load each module - let _app = require( upath.joinSafe( __dirname, _appIndex[ mod ] ) ); + const _appClass = requireNoCache( global.upath.joinSafe( __dirname, _appIndex[ mod ] ) ) + const _app = new _appClass() + _internalApps[ mod ] = _app + if( !_app.shouldReload() ){ + return callback() + } global.async.waterfall([ - - function( callback ){ - if( !_app.shouldReload || _app.shouldReload() ){ - if( _app.preLoad ){ - return _app.preLoad( callback ); - } - } - callback( null ); - }, - function( callback ){ - - if( _app.getStdRegex() ){ - APP_NAMES.push( mod ); - } - _internalApps[ mod ] = _app; - callback( null ); - }, - function( callback ){ - if( !_internalApps[ mod ].shouldReload || _internalApps[ mod ].shouldReload() ){ - if( _internalApps[ mod ].postLoad ){ - return _internalApps[ mod ].postLoad( callback ); - } - } - callback( null ); - } - - ], function( err ){ + _app.preLoad.bind(_app), + _app.postLoad.bind(_app) + ], ( err ) => { if( err ){ - Logger.log('[LOADER] ERROR Loading application "' + mod + '"', err); + global.Logger.log('[LOADER] ERROR Loading application "' + mod + '"', err) } - callback( err ); + callback( err ) }) - }catch(e){ - Logger.log('[LOADER] ERROR Failed loading application "' + mod + '"', e); - callback( e ); + global.Logger.log('[LOADER] ERROR Failed loading application "' + mod + '"', e) + callback( e ) } - } -let _loadApplications = function(){ +function _loadApplications(){ // Reload index - let _appIndex = require( upath.joinSafe(__dirname, './index.json') ); + const _appIndex = requireNoCache( global.upath.joinSafe(__dirname, './index.json') ) // Load applications for( let mod in _appIndex ){ - _loadApplication( mod, function(){} ); + _loadApplication( mod, function(){} ) } - } -let _launchApp = function( cmd, exec, query ){ +function _launchApp( cmd, exec, query ){ if( _internalApps[ cmd ] !== undefined ){ - _internalApps[ cmd ].getWrapper().fn( exec, query ); + _internalApps[ cmd ].exec( exec, query ) }else{ - Logger.log('[LOADER] LaunchApp unknown application "' + cmd + '"'); + global.Logger.log('[LOADER] LaunchApp unknown application "' + cmd + '"') } - } -let _isDefaultRegex = function( reg ){ - return ( (new RegExp('(?!)')).toString() === reg.toString() || (new RegExp().toString()) === reg.toString() ); +function _isDefaultRegex( reg ){ + + return ( (new RegExp('(?!)')).toString() === reg.toString() || (new RegExp().toString()) === reg.toString() ) } -let _getApps = function( callback ){ +function _getApps( callback ){ - let i = 0; + let i = 0 global.db.getMainDB().find({}) .sort({ type: '_system_' }) .map((app) => { - app.id = i++; - app.scut = _isDefaultRegex( app.regex1 ) ? '_unset_' : global.app.utils.wrapRegex( app.regex1 ); + app.id = i++ + app.scut = _isDefaultRegex( app.regex1 ) ? '_unset_' : global.app.utils.wrapRegex( app.regex1 ) //Logger.log('_getApps', 'map', app); - return app; + return app }) - .exec( callback ); - + .exec( callback ) } // ************************************ // ************* Interface ************ -router.on('newAppShortcut', _reloadApplication); -router.on('reloadApplication', _reloadApplication); -router.get('getAllApps', function( req, res ){ +router.on('newAppShortcut', _reloadApplication) +router.on('reloadApplication', _reloadApplication) +router.on('reloadApplications', ( apps ) => { + if( apps instanceof Array ){ + for(let app of apps){ + _reloadApplication(app) + } + } +}) +router.get('getAllApps', ( req, res ) => { _getApps(( err, data ) => { //Logger.log('[APP LOADER]', 'getApps', err, data); - if( err ) res.json( err ); - else res.json( null, data ); + if( err ) res.json( err ) + else res.json( null, data ) }) -}); +}) // ************************************ -let _start = function( callback ){ +function _start( callback ){ // Locate applications // Load index (cache) // TODO => Better setup DB?? - let _appIndex = require( upath.joinSafe(__dirname, './index.json') ); - Logger.log('[SYSTEM APPS] Loading modules...'); + const _appIndex = requireNoCache( global.upath.joinSafe(__dirname, './index.json') ) + global.Logger.log('[SYSTEM APPS] Loading modules...') // Load applications - global.async.each( Object.keys(_appIndex), _loadApplication, callback ); - + global.async.each( Object.keys(_appIndex), _loadApplication, callback ) } module.exports = { diff --git a/apps/system/index.json b/apps/system/index.json index de2a9e4..006cb19 100755 --- a/apps/system/index.json +++ b/apps/system/index.json @@ -1,15 +1,15 @@ { - "preference": "./preferenceApp", - "netGo": "./netGoApp", - "netSearch": "./netSearchApp", - "browserHistory": "./browserHistoryApp", - "quit": "./quitApp", - "refresh": "./refreshApp", - "calculator": "./calculatorApp", - "webSearch": "./webSearchApp/webSearchApp", - "bitbucketSearch": "./webSearchApp/bitbucketSearch", - "githubSearch": "./webSearchApp/githubSearch", - "wikiSearch": "./webSearchApp/wikiSearch", - "youtubeSearch": "./webSearchApp/youtubeSearch", - "aurSearch": "./webSearchApp/aurSearch" + "webSearch": "./webSearchApp/WebSearch", + "netGo": "./NetGo", + "netSearch": "./NetSearch", + "browserHistory": "./BrowserHistory", + "quit": "./Quit", + "refresh": "./Refresh", + "calculator": "./Calculator", + "preferences": "./Preferences", + "githubSearch": "webSearchApp/githubSearch", + "wikiSearch": "webSearchApp/wikiSearch", + "youtubeSearch": "webSearchApp/youtubeSearch", + "bitbucketSearch": "webSearchApp/bitbucketSearch", + "aurSearch": "webSearchApp/aurSearch" } \ No newline at end of file diff --git a/apps/system/netGoApp.js b/apps/system/netGoApp.js deleted file mode 100755 index 5bbca8c..0000000 --- a/apps/system/netGoApp.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -var _netGo = function( exec, query ){ - - var http = /((http|ftp|https)\:\/\/)/i - if( !http.test( query ) ){ - // Lack starting http(s)... xdg-open needs it to work - query = 'https://' + query; - } - - global.app.utils.spawn( 'xdg-open', [query] ); - -} - -var exp = { - fn: _netGo, - wrapper: { - name: 'Open Url', - text: 'Open given Url', - exec: 'netGo', - icon: 'openurl.png', - type: '_internal_' - }, - regex: [ - /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]+)?(\/|\/([\da-z\.-]+)?(\?[\da-z\.-_]+\=([\da-z\.-_]+)?(\&[\da-z\.-_]+\=([\da-z\.-_]+)?)?))?$/i - ] -} - -module.exports = { - getRegex: function(){ - return (exp.regex)?exp.regex[0]:null; - }, - getUserRegex: function(){ - return (exp.regex && exp.regex.length > 1)?exp.regex[1]:null; - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length)?exp.regex[0]:null; - }, - getWrapper: function(){ - return exp; - } -} \ No newline at end of file diff --git a/apps/system/netSearchApp.js b/apps/system/netSearchApp.js deleted file mode 100755 index 21183bc..0000000 --- a/apps/system/netSearchApp.js +++ /dev/null @@ -1,34 +0,0 @@ -'use strict'; - -var _netSearch = function( exec, query ){ - - query = 'https://www.google.com/search?q=' + query; - global.app.utils.spawn( 'xdg-open', [query] ); - -} - -var exp = { - fn: _netSearch, - wrapper: { - name: 'Google Search', - text: 'Search whatever on the net', - exec: 'netSearch', - icon: 'google.png', - type: '_internal_' - } -} - -module.exports = { - getRegex: function(){ - return (exp.regex)?exp.regex:null; - }, - getUserRegex: function(){ - return (exp.regex && exp.regex.length > 1)?exp.regex[1]:null; - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length)?exp.regex[0]:null; - }, - getWrapper: function(){ - return exp; - } -} diff --git a/apps/system/preferenceApp.js b/apps/system/preferenceApp.js deleted file mode 100755 index cb8d949..0000000 --- a/apps/system/preferenceApp.js +++ /dev/null @@ -1,138 +0,0 @@ -'use strict'; - -let ipc = require('electron').ipcMain; -let BrowserWindow = require('electron').BrowserWindow; - -let _launchPreferences = function(){ - // Launch Preferences window - Logger.log('[PREFERENCE APP] Launch'); - - let applications = []; - - let settingsWindow = new BrowserWindow({ - width: 800, - height: 600, - center: true, - resizable: true, - darkTheme: true, - frame: true, - show: true, - title: 'The Mutant - Preferences' - }); - - settingsWindow.loadURL('file://' + global.upath.join( global.DIRS.INTERNAL_ROOT, 'ui/html/settings.html' ) ); - - let router = require('electron-router')('PREFERENCE') - - router.get('settings', function( req, res ){ - if( applications.length ){ - return res.json( null, applications ); - } - router.routes.get('getAllApps', function( err, data ){ - if( err ){ - return res.json( err ); - } - res.json(null, data.filter(a => { - return a.type !== '_system_' && a.type !== '_native_' - }).map(a => { - a.location = a.data; - return a; - })) - }) - }) - - router.post('settings', function( req, res ){ - Logger.log('[PREFERENCE APP] settings save', req); - res.json(null, 'OK'); - }) - router.post('changeAppShortcut', function( req, res ){ - Logger.log('[PREFERENCE APP]', 'changeAppShortcut', req.params); - if( !req.params.length ){ - - Logger.log('[PREFERENCE APP]', 'changeAppShortcut', 1); - return res.json( 'NO_OK' ); - - } - - global.async.each( req.params, ( _app, cb ) => { - - let reg = '' - // Permit user to unset shortcut (ie setting it to '') - if( !_app.scut ){ - _app.scut = null - reg = new RegExp('(?!)'); - }else{ - // Replace possible bad regex - _app.scut = _app.scut.replace(/\(\.\*\)/gi, ''); - _app.scut = _app.scut.trim(); - reg = new RegExp( `^${_app.scut} (.*)`, 'i' ); - } - // query main db for saving new shortcut - let db = global.db.getMainDB(); - db.findOne({ type: _app.type, exec: _app.exec }, ( err, doc ) => { - Logger.log('[PREFERENCE APP]', 'query', _app.type, _app.exec, 'retrieve', doc, doc.regex1); - if( err ){ - cb( err ); - }else{ - Logger.log('[PREFERENCE APP]', 'updateRegex', 1, 'reg pre', reg, doc.regex1); - doc.regex1 = reg - Logger.log('[PREFERENCE APP]', 'updateRegex', 2, 'reg post', reg, doc.regex1); - db.save( doc, ( err ) => { - Logger.log('[PREFERENCE APP]', 'updateRegex', 3, 'saved', err, `shortcuts.${_app.exec}`, { type: _app.type, regex1: reg }); - if( !err ){ - global.settings.set(`shortcuts.${_app.exec}`, { type: _app.type, regex1: reg }); - router.send('reloadApplication', _app.exec); - } - cb( err ); - }) - } - }) - - // Response the result of each save - }, ( err, result ) => { - Logger.log('[PREFERENCE APP] changeAppShortcut end', 'err', err, 'result', result) - if( err ) res.json( err ) - else res.json( null, 'OK' ) - }) - - }) - router.post('changeAppLocation', function( req, res ){ - Logger.log('[PREFERENCE APP]', 'changeAppLocation', req.params); - }) - - settingsWindow.on('close', function( evt ){ - // nullify - Logger.log('[PREFERENCE APP] Closing preferences'); - // ipc.removeListener( 'prefsReady', _send ); - // ipc.removeListener( 'shortcutChange', _sendToBack ); - //settingsWindow = _send = _prepare = null; - }) - -} - -let exp = { - fn: _launchPreferences, - wrapper: { - name: 'Preferences', - text: 'Launch Preferences Tab', - exec: 'preference', - icon: 'setting.png', - type: '_internal_' - }, - regex: [ /preference/i, 'preference' ] -} - -module.exports = { - getRegex: function(){ - return (exp.regex)?exp.regex:null; - }, - getUserRegex: function(){ - return (exp.regex && exp.regex.length > 1)?exp.regex[1]:null; - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length)?exp.regex[0]:null; - }, - getWrapper: function(){ - return exp; - } -} diff --git a/apps/system/quitApp.js b/apps/system/quitApp.js deleted file mode 100755 index 3683db7..0000000 --- a/apps/system/quitApp.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict'; - -let router = require('electron-router')('QUIT_APP') - -let exp = { - fn: router.send.bind( router, 'quit' ), - wrapper: { - name: 'Quit Mutant', - text: 'Quit the App', - exec: 'quit', - icon: 'quit.png', - type: '_internal_' - }, - regex: [ /QUIT/i, 'quit' ] -} - -if( global.settings.get('shortcuts.Quit') ){ - - // Set default regex (index 0) and name search (index 1), - // setting to null avoids default behaviour, - // which goes to the name of the application - exp.regex.splice(0, 1, global.settings.get('shortcuts.Quit')); - -} - -module.exports = { - getRegex: function(){ - return (exp.regex)?exp.regex:null; - }, - getUserRegex: function(){ - return (exp.regex && exp.regex.length > 1)?exp.regex[1]:null; - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length)?exp.regex[0]:null; - }, - getWrapper: function(){ - return exp; - } -} diff --git a/apps/system/refreshApp.js b/apps/system/refreshApp.js deleted file mode 100755 index 1589afd..0000000 --- a/apps/system/refreshApp.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -let router = require('electron-router')('REFRESH_APP') - -let exp = { - fn: router.send.bind( router, 'refreshApps' ), - wrapper: { - name: 'Refresh Mutant', - text: 'Refresh Apps index, useful when a new application has been installed and you want it to be catched by Mutant', - exec: 'refresh', - icon: 'refresh.png', - type: '_internal_' - }, - regex: [ - /REFRESH/i, 'refresh' - ] - -} - -if( global.settings.get('shortcuts.RefreshApps') ){ - - // Set default regex (index 0) and name search (index 1), - // setting to null avoids default behaviour, - // which goes to the name of the application - exp.regex.splice(0, 1, global.settings.get('shortcuts.RefreshApps')); - -} - -module.exports = { - getRegex: function(){ - return (exp.regex)?exp.regex:null; - }, - getUserRegex: function(){ - return (exp.regex && exp.regex.length > 1)?exp.regex[1]:null; - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length)?exp.regex[0]:null; - }, - getWrapper: function(){ - return exp; - } -} diff --git a/apps/system/webSearchApp/WebSearch.js b/apps/system/webSearchApp/WebSearch.js new file mode 100644 index 0000000..f73e14d --- /dev/null +++ b/apps/system/webSearchApp/WebSearch.js @@ -0,0 +1,233 @@ +'use strict' + +const router = require('electron-router')('WEB_SEARCH') +const { flatten } = require('lodash') +const { exists, writeFile } = require('fs') + +const preCwd = global.upath.resolve(__dirname, '..') +const tpl = require(global.upath.joinSafe(__dirname, 'tpl')) +const AppBase = require(global.upath.joinSafe(preCwd, 'AppBase')) +const indexPath = global.upath.joinSafe(preCwd, 'index.json') + +// Handle apps save - Not Used Yet +/*router.post('registerWebApp', function( req, res ){ + Logger.log('registerWebApp', req.params) + if( !req.params.length ){ + + Logger.log('[WEBSEARCHAPP]', 'changeAppLocation', 1) + return res.json( 'NO_OK') + } + + global.async.each( req.params, ( _app, cb ) => { + + if( !_app.name || !_app.exec ){ + return callback('BAD_PARAMS') + } + + let insert = { + exec: _app.exec, + name: _app.name + } + if( _app.scut ){ + insert[ 'regex1' ] = _app.scut + } + if( _app.icon ){ + insert[ 'icon' ] = _app.icon + } + if( _app.location || _app.data || _app.url ){ + insert[ 'data' ] = _app.data || _app.url + } + + global.async.waterfall([ + ( callback ) => { + // Insert on db + global.db.query({ + phrase: 'INSERT INTO apps SET ?', + values: insert + }, cb ) + }, + // Create template + ( callback ) => { + writeFile( global.upath.join( global.settings.get('appsDir'), 'webSearchApp', _app.exec + '.js'), tpl( _app ), callback ) + }, + // Update index + ( callback ) => { + let index = require('../index.json') + index[ app.exec ] = './webSearchApp/' + app.exec + writeFile( global.upath.join(__dirname, '/../index.json'), JSON.stringify( index, null, 4 ), callback ) + }, + // Save shortcut if any + ( callback ) => { + if( app.shortcut ){ + global.settings.set(`shortcut.${exec}`, app.shortcut) + } + callback( null ) + } + ], cb ) + }, res.json) +})*/ + +// Does not really matter, just for completness +const defaultWrapper = { + name: 'Open search on webSearch', + text: 'Search whatever on webSearch', + exec: 'webSearch', + icon: null, + internal: true +} + +class WebSearch extends AppBase { + constructor(options) { + super(defaultWrapper, options) + super.setup() + this.appIndex = require(indexPath) + this.firstTime = true + this.webApps = [] + this._registerEvents() + } + + _addWebApp( app ) { + // Check index + if( !this.appIndex.hasOwnProperty( app.exec ) ){ + // save as relative path, resolved on load + this.appIndex[ app.exec ] = global.upath.joinSafe('webSearchApp', app.exec) + } + + // Check shortcut + if( global.settings.get(`shortcut.${app.exec}.regex1`) ){ + app['shortcut'] = global.settings.get(`shortcut.${app.exec}.regex1`) + } + + // TODO => Review array data per application, later, on appRetrieval, other data maybe requested + // Save on cache + this.webApps.push({ + name: `Open search on ${app.name}`, + text: app.text || `Search whatever on ${app.name}`, + exec: app.exec, + icon: app.icon, + type: '_web_app_' + }) + } + + _createWebApp( app, callback ){ + // Check template + const template = tpl({ name: app.name, exec: app.exec, url: app.data, icon: app.icon }) + if( !template ){ + return callback( null, 0 ) + } + // Write file + writeFile( + global.upath.join(__dirname, '/', `${app.exec}.js`), + template, + ( err ) => { + if( err ){ + return callback( err ) + } + this._addWebApp( app ) + callback( null, 1 ) + } + ) + } + + _dumpIndex( callback ) { + writeFile(indexPath, JSON.stringify( this.appIndex, null, 2 ), callback ) + } + + _registerEvents() { + // Handle apps request + router.get('webApps', ( req, res ) => { + res.json( null, this.webApps) + }) + // Save web app url, maybe reload app? + router.get('WEB_APP_URL', ( req, res ) => { + global.Logger.log('WEB_APP_URL', req.params) + if( !req.params.length ){ + global.Logger.log('[WEBSEARCHAPP]', 'changeAppLocation', 1) + return res.json( null ) + } + + global.async.map( req.params, ( _app, cb ) => { + // query main db for saving new shortcut + global.db.query({ + phrase: 'SELECT data FROM apps WHERE name = ?', + values: [ _app.exec ] + }, ( err, result ) => { + if( !err && result.length ){ + cb( null ) + }else{ + cb( null, { app: _app, url: result[0] }) + } + }) + // Response the result of each save + }, (err, result) => { + res.json( null, flatten( result ) ) + }) + }) + } + + match( ex, query ) { + // never match + return null + } + + preLoad( callback ) { + let created = 0 + global.async.waterfall([ + // Load web apps + ( callback ) => { + global.db.getMainDB().find({ type: '_web_app_' }, callback) + }, + // Setup every app + ( rows, callback ) => { + //Logger.log('[WEBSEARCHAPP] loader', rows) + // For each row, check that it is present on + // the application index and that it has its template + global.async.eachSeries( rows, ( app, callback ) => { + // If the app exists, check the index, update acordingly + // Else, create template, write file, check the index, update acordingly + // Check exists + exists( global.upath.joinSafe(__dirname, `${app.exec}.js`), ( exists, stat ) => { + Logger.log('[WEBSEARCHAPP]', app.exec, exists) + if( exists ){ + app.hasFile = true + this._addWebApp( app ) + callback() + }else{ + this._createWebApp( app, ( err, added ) => { + if( err ){ + callback( err ) + }else{ + created += added + callback() + } + }) + } + }) + }, callback) + } + ], ( err, result ) => { + this.firstTime = (created > 0) + if( created > 0 ){ + this._dumpIndex( callback ) + }else{ + callback() + } + }) + } + + shouldReload() { + return this.firstTime + } + + postLoad( callback ) { + + callback() + if( this.firstTime ){ + if( this.webApps.length ){ + router.send('reloadApplications', this.webApps.map(app => app.exec) ) + } + } + } +} + +module.exports = WebSearch diff --git a/apps/system/webSearchApp/aurSearch.js b/apps/system/webSearchApp/aurSearch.js index 40eca1f..efb4490 100644 --- a/apps/system/webSearchApp/aurSearch.js +++ b/apps/system/webSearchApp/aurSearch.js @@ -1,65 +1,42 @@ /************** AUTO GENERATED ***************/ 'use strict'; + const AppBase = require(global.upath.joinSafe(global.upath.resolve(__dirname, '..'), 'AppBase')) - var _utils = global.app.utils; - var _url = 'https://aur.archlinux.org/packages/?K=|https://www.archlinux.org/packages/?q='; + const _utils = global.app.utils + const _url = 'https://aur.archlinux.org/packages/?K=|https://www.archlinux.org/packages/?q=' // make a regex out of the name for searching strings - var _queryRegex = /^Aur (.*)/i; - var _fn = function( exec, query ){ + const _queryRegex = /^Aur (.*)/i - var search = null; - if( exp.regex ){ - search = _utils.cleanQuery(exp.regex.filter(r => r !== null), query); - if( search ){ - query = search; - } - } - // url can have various values - _url.split('|') - .map(str => str + (query.split(' ')).join('+')) - .forEach(q => _utils.spawn('xdg-open', [q])) - } - - var exp = { - fn: _fn, - wrapper: { - name: 'Open search on Aur', - text: 'Search whatever on Aur', - exec: 'aurSearch', - icon: 'aur.png', - url: _url, - type: '_web_app_' - }, - regex: [ _queryRegex, null ] + const defaultWrapper = { + name: 'Open search on Aur', + text: 'Search whatever on Aur', + exec: 'aurSearch', + icon: 'aur.png', + url: _url, + type: '_web_app_' } - if( global.settings.get('shortcuts.aurSearch') ){ - // Avoid bad regex - var r = global.settings.get('shortcuts.aurSearch').regex1; - if( r !== '_unset_' ){ - // Set default regex (index 0) and name search (index 1), - // setting to null avoids default behaviour, - // which goes to the name of the application - exp.regex = [ _queryRegex, r ]; - } - } + class aurSearch extends AppBase { + constructor(options) { + super(defaultWrapper, options) + this.regex = [_queryRegex] + super.setup() + } - module.exports = { - getRegex: function(){ - return (exp.regex)?exp.regex:null; - }, - getUserRegex: function(){ - return (exp.regex && exp.regex.length > 1)?exp.regex[1]:null; - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length)?exp.regex[0]:null; - }, - getWrapper: function(){ - return exp; - }, - testQuery: function( query ){ - // Search by name regexp and by user custom regex - return exp.regex.filter(r =>{ return r instanceof RegExp }).some(r =>{ return r.test( query ) }); + exec( ex, query ) { + let search = null + if( this.regex ){ + search = _utils.cleanQuery(this.regex.filter(r => r !== null), query) + if( search ){ + query = search + } + } + // url can have various values + _url.split('|') + .map(str => str + (query.split(' ')).join('+')) + .forEach(q => _utils.spawn('xdg-open', [q])) } } + + module.exports = aurSearch \ No newline at end of file diff --git a/apps/system/webSearchApp/bitbucketSearch.js b/apps/system/webSearchApp/bitbucketSearch.js index 04f88dc..c42aaf7 100644 --- a/apps/system/webSearchApp/bitbucketSearch.js +++ b/apps/system/webSearchApp/bitbucketSearch.js @@ -1,65 +1,42 @@ /************** AUTO GENERATED ***************/ 'use strict'; + const AppBase = require(global.upath.joinSafe(global.upath.resolve(__dirname, '..'), 'AppBase')) - var _utils = global.app.utils; - var _url = 'https://www.bitbucket.com/search?q='; + const _utils = global.app.utils + const _url = 'https://www.bitbucket.com/search?q=' // make a regex out of the name for searching strings - var _queryRegex = /^BitBucket (.*)/i; - var _fn = function( exec, query ){ + const _queryRegex = /^BitBucket (.*)/i - var search = null; - if( exp.regex ){ - search = _utils.cleanQuery(exp.regex.filter(r => r !== null), query); - if( search ){ - query = search; - } - } - // url can have various values - _url.split('|') - .map(str => str + (query.split(' ')).join('+')) - .forEach(q => _utils.spawn('xdg-open', [q])) - } - - var exp = { - fn: _fn, - wrapper: { - name: 'Open search on BitBucket', - text: 'Search whatever on BitBucket', - exec: 'bitbucketSearch', - icon: 'bitbucket.png', - url: _url, - type: '_web_app_' - }, - regex: [ _queryRegex, null ] + const defaultWrapper = { + name: 'Open search on BitBucket', + text: 'Search whatever on BitBucket', + exec: 'bitbucketSearch', + icon: 'bitbucket.png', + url: _url, + type: '_web_app_' } - if( global.settings.get('shortcuts.bitbucketSearch') ){ - // Avoid bad regex - var r = global.settings.get('shortcuts.bitbucketSearch').regex1; - if( r !== '_unset_' ){ - // Set default regex (index 0) and name search (index 1), - // setting to null avoids default behaviour, - // which goes to the name of the application - exp.regex = [ _queryRegex, r ]; - } - } + class bitbucketSearch extends AppBase { + constructor(options) { + super(defaultWrapper, options) + this.regex = [_queryRegex] + super.setup() + } - module.exports = { - getRegex: function(){ - return (exp.regex)?exp.regex:null; - }, - getUserRegex: function(){ - return (exp.regex && exp.regex.length > 1)?exp.regex[1]:null; - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length)?exp.regex[0]:null; - }, - getWrapper: function(){ - return exp; - }, - testQuery: function( query ){ - // Search by name regexp and by user custom regex - return exp.regex.filter(r =>{ return r instanceof RegExp }).some(r =>{ return r.test( query ) }); + exec( ex, query ) { + let search = null + if( this.regex ){ + search = _utils.cleanQuery(this.regex.filter(r => r !== null), query) + if( search ){ + query = search + } + } + // url can have various values + _url.split('|') + .map(str => str + (query.split(' ')).join('+')) + .forEach(q => _utils.spawn('xdg-open', [q])) } } + + module.exports = bitbucketSearch \ No newline at end of file diff --git a/apps/system/webSearchApp/githubSearch.js b/apps/system/webSearchApp/githubSearch.js index e464e55..8d90959 100644 --- a/apps/system/webSearchApp/githubSearch.js +++ b/apps/system/webSearchApp/githubSearch.js @@ -1,65 +1,42 @@ /************** AUTO GENERATED ***************/ 'use strict'; + const AppBase = require(global.upath.joinSafe(global.upath.resolve(__dirname, '..'), 'AppBase')) - var _utils = global.app.utils; - var _url = 'https://www.github.com/search?q='; + const _utils = global.app.utils + const _url = 'https://www.github.com/search?q=' // make a regex out of the name for searching strings - var _queryRegex = /^Github (.*)/i; - var _fn = function( exec, query ){ + const _queryRegex = /^Github (.*)/i - var search = null; - if( exp.regex ){ - search = _utils.cleanQuery(exp.regex.filter(r => r !== null), query); - if( search ){ - query = search; - } - } - // url can have various values - _url.split('|') - .map(str => str + (query.split(' ')).join('+')) - .forEach(q => _utils.spawn('xdg-open', [q])) - } - - var exp = { - fn: _fn, - wrapper: { - name: 'Open search on Github', - text: 'Search whatever on Github', - exec: 'githubSearch', - icon: 'github.png', - url: _url, - type: '_web_app_' - }, - regex: [ _queryRegex, null ] + const defaultWrapper = { + name: 'Open search on Github', + text: 'Search whatever on Github', + exec: 'githubSearch', + icon: 'github.png', + url: _url, + type: '_web_app_' } - if( global.settings.get('shortcuts.githubSearch') ){ - // Avoid bad regex - var r = global.settings.get('shortcuts.githubSearch').regex1; - if( r !== '_unset_' ){ - // Set default regex (index 0) and name search (index 1), - // setting to null avoids default behaviour, - // which goes to the name of the application - exp.regex = [ _queryRegex, r ]; - } - } + class githubSearch extends AppBase { + constructor(options) { + super(defaultWrapper, options) + this.regex = [_queryRegex] + super.setup() + } - module.exports = { - getRegex: function(){ - return (exp.regex)?exp.regex:null; - }, - getUserRegex: function(){ - return (exp.regex && exp.regex.length > 1)?exp.regex[1]:null; - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length)?exp.regex[0]:null; - }, - getWrapper: function(){ - return exp; - }, - testQuery: function( query ){ - // Search by name regexp and by user custom regex - return exp.regex.filter(r =>{ return r instanceof RegExp }).some(r =>{ return r.test( query ) }); + exec( ex, query ) { + let search = null + if( this.regex ){ + search = _utils.cleanQuery(this.regex.filter(r => r !== null), query) + if( search ){ + query = search + } + } + // url can have various values + _url.split('|') + .map(str => str + (query.split(' ')).join('+')) + .forEach(q => _utils.spawn('xdg-open', [q])) } } + + module.exports = githubSearch \ No newline at end of file diff --git a/apps/system/webSearchApp/tpl.js b/apps/system/webSearchApp/tpl.js index a4a4d64..46832e4 100755 --- a/apps/system/webSearchApp/tpl.js +++ b/apps/system/webSearchApp/tpl.js @@ -13,82 +13,53 @@ module.exports = function( app ){ return null } - var name = app.name; - var exec = app.exec; - var url = app.url; - var icon = app.icon || null; + const name = app.name + const exec = app.exec + const url = app.url + const icon = app.icon || null - var tpl = `/************** AUTO GENERATED ***************/ + let tpl = `/************** AUTO GENERATED ***************/ 'use strict'; + const AppBase = require(global.upath.joinSafe(global.upath.resolve(__dirname, '..'), 'AppBase')) - var _utils = global.app.utils; - var _url = '${url}'; + const _utils = global.app.utils + const _url = '${url}' // make a regex out of the name for searching strings - var _queryRegex = /^${name} (\.*)/i; - var _fn = function( exec, query ){ + const _queryRegex = /^${name} (\.*)/i - var search = null; - if( exp.regex ){ - search = _utils.cleanQuery(exp.regex.filter(r => r !== null), query); - if( search ){ - query = search; - } - } - // url can have various values - _url.split('|') - .map(str => str + (query.split(' ')).join('+')) - .forEach(q => _utils.spawn('xdg-open', [q])) - } - - var exp = { - fn: _fn, - wrapper: { - name: 'Open search on ${name}', - text: 'Search whatever on ${name}', - exec: '${exec}', - icon: '${icon}', - url: _url, - type: '_web_app_' - }, - regex: [ _queryRegex, null ] + const defaultWrapper = { + name: 'Open search on ${name}', + text: 'Search whatever on ${name}', + exec: '${exec}', + icon: '${icon}', + url: _url, + type: '_web_app_' } - if( global.settings.get('shortcuts.${exec}') ){ - // Avoid bad regex - var r = global.settings.get('shortcuts.${exec}').regex1; - if( r !== '_unset_' ){ - // Set default regex (index 0) and name search (index 1), - // setting to null avoids default behaviour, - // which goes to the name of the application - exp.regex = [ _queryRegex, r ]; - } - } + class ${exec} extends AppBase { + constructor(options) { + super(defaultWrapper, options) + this.regex = [_queryRegex] + super.setup() + } - module.exports = { - getRegex: function(){ - return (exp.regex)?exp.regex:null; - }, - getUserRegex: function(){ - return (exp.regex && exp.regex.length > 1)?exp.regex[1]:null; - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length)?exp.regex[0]:null; - }, - getWrapper: function(){ - return exp; - }, - testQuery: function( query ){ - // Search by name regexp and by user custom regex - return exp.regex.filter(r =>{ return r instanceof RegExp }).some(r =>{ return r.test( query ) }); + exec( ex, query ) { + let search = null + if( this.regex ){ + search = _utils.cleanQuery(this.regex.filter(r => r !== null), query) + if( search ){ + query = search + } + } + // url can have various values + _url.split('|') + .map(str => str + (query.split(' ')).join('+')) + .forEach(q => _utils.spawn('xdg-open', [q])) } } - ` - return tpl; + module.exports = ${exec} + ` + return tpl } - - - - - diff --git a/apps/system/webSearchApp/webSearchApp.js b/apps/system/webSearchApp/webSearchApp.js deleted file mode 100755 index b4fafc7..0000000 --- a/apps/system/webSearchApp/webSearchApp.js +++ /dev/null @@ -1,363 +0,0 @@ -'use strict'; - -let _spawner = global.spawner; -let _utils = global.app.utils; -let _ = require('lodash'); -let sqlite = require('sqlite3').verbose(); -let router = require('electron-router')('WEB_SEARCH'); -let DB = null; -let fs = require('fs'); -let tpl = require('./tpl'); -let webApps = []; -let firstTime = false; - -// Load every registered web. -let _loader = function( callback ){ - - let created = 0; - - global.async.waterfall([ - - // Load web apps - function( callback ){ - - global.db.getMainDB().find({ type: '_web_app_' }, callback) - - }, - // Setup every app - function( rows, callback ){ - //Logger.log('[WEBSEARCHAPP] loader', rows); - // For each row, check that it is present on - // the application index and that it has its template - let appIndex = require('../index.json'); - - let end = function( app, callback ){ - // Check index - if( app.hasFile ){ - - if( !appIndex.hasOwnProperty( app.exec ) ){ - created++; - appIndex[ app.exec ] = './webSearchApp/' + app.exec; - } - - // Check shortcut - if( global.settings.get(`shortcut.${app.exec}`) ){ - app['shortcut'] = global.settings.get(`shortcut.${app.exec}`); - } - - // TODO => Review array data per application, later, on appRetrieval, other data maybe requested - // Save on cache - webApps.push({ - name: `Open search on ${app.name}`, - text: app.text || `Search whatever on ${app.name}`, - exec: app.exec, - icon: app.icon, - type: '_web_app_' - }); - - } - callback(); - } - - global.async.eachSeries( rows, function( app, callback ){ - // If the app exists, check the index, update acordingly - // Else, create template, write file, check the index, update acordingly - app.hasFile = false; - - // Check exists - fs.exists( __dirname + '/' + app.exec + '.js', function( exists, stat ){ - - if( exists ){ - app.hasFile = true; - return end( app, callback ); - } - - // Check template - let template = tpl({ name: app.name, exec: app.exec, url: app.data, icon: app.icon }); - if( template ){ - // Write file - fs.writeFile( - global.upath.join(__dirname, '/', app.exec + '.js'), - template, - function( err ){ - if( !err ){ - app.hasFile = true; - } - end( app, callback ); - } - ); - - }else{ - end( app, callback ); - } - - }) - - }, function(){ - fs.writeFile( global.upath.join(__dirname, '/../index.json'), JSON.stringify( appIndex, null, 4 ), callback ); - }) - } - - ], function( err, result ) { - firstTime = (created === 0); - callback(); - }) - -} - -let _shouldReload = function(){ - return !firstTime; -} - -let _makeLoad = function( callback ){ - - callback(); - - if( webApps.length ){ - webApps.forEach( app => { - router.send('reloadApplication', app.exec ) - }) - } - -} - -// Handle apps save - Not Used Yet -router.post('registerWebApp', function( req, res ){ - Logger.log('registerWebApp', req.params); - if( !req.params.length ){ - - Logger.log('[WEBSEARCHAPP]', 'changeAppLocation', 1); - return res.json( 'NO_OK'); - - } - - global.async.each( req.params, ( _app, cb ) => { - - if( !_app.name || !_app.exec ){ - return callback('BAD_PARAMS'); - } - - let insert = { - exec: _app.exec, - name: _app.name - } - if( _app.scut ){ - insert[ 'regex1' ] = _app.scut; - } - if( _app.icon ){ - insert[ 'icon' ] = _app.icon; - } - if( _app.location || _app.data || _app.url ){ - insert[ 'data' ] = _app.data || _app.url; - } - - global.async.waterfall([ - ( callback ) => { - // Insert on db - global.db.query({ - phrase: 'INSERT INTO apps SET ?', - values: insert - }, cb ) - }, - // Create template - ( callback ) => { - fs.writeFile( global.upath.join( global.settings.get('appsDir'), 'webSearchApp', _app.exec + '.js'), tpl( _app ), callback ); - }, - // Update index - ( callback ) => { - let index = require('../index.json'); - index[ app.exec ] = './webSearchApp/' + app.exec; - fs.writeFile( global.upath.join(__dirname, '/../index.json'), JSON.stringify( index, null, 4 ), callback ); - }, - // Save shortcut if any - ( callback ) => { - if( app.shortcut ){ - global.settings.set(`shortcut.${exec}`, app.shortcut); - } - callback( null ); - } - ], cb ) - - }, res.json) - - /*let app = req.params[0]; - if( !app.textName || !app.exec || !app.url ){ - return callback('BAD PARAMS'); - } - - global.async.waterfall([ - - // Init DB - function( callback ){ - if( !DB ){ - DB = new sqlite.Database( global.settings.get('db_location'), sqlite.OPEN_READWRITE, callback); - }else{ - callback( null ); - } - }, - // Check item on db - function( callback ){ - DB.all('SELECT * FROM apps WHERE name = ? ', [app.exec], callback); - }, - function( rows, callback ){ - callback( rows.length?'APP ALREADY EXISTS':null ); - }, - // Insert on DB - function( callback ){ - DB.all( - 'INSERT INTO apps VALUES( ?, ?, ?, ?, ?, ? ) ', - [app.exec, app.textName, app.text || ('Search whatever on ' + app.textName), app.data || app.url, app.icon || null, '/' + app.textName.trim() + ' (.*)/i', null], - callback - ); - }, - // Create template - function( id, callback ){ - fs.writeFile( global.upath.join(__dirname, '/', app.exec + '.js'), tpl( app ), callback ); - }, - // Update index - function( callback ){ - let index = require('../index.json'); - index[ app.exec ] = './webSearchApp/' + app.exec; - fs.writeFile( global.upath.join(__dirname, '/../index.json'), JSON.stringify( index, null, 4 ), callback ); - }, - // Save shortcut if any - function( callback ){ - if( app.shortcut ){ - global.settings.set(`shortcut.${exec}`, app.shortcut); - } - callback( null ); - }, - // Reload Application - function( callback ){ - router.send('reloadApplication', app.exec); - callback( null ); - } - ], function( err ){ - Logger.log('[WEB_SEARCH APP] END ', arguments); - res.json( null, 'OK' ); - // res.json( err?err:null, err?undefined:'OK' ); - })*/ - -}) - -router.get('WEB_APP_URL', function( req, res ){ - Logger.log('WEB_APP_URL', req.params); - if( !req.params.length ){ - - Logger.log('[WEBSEARCHAPP]', 'changeAppLocation', 1); - return res.json( null ); - - } - - global.async.map( req.params, ( _app, cb ) => { - - // query main db for saving new shortcut - global.db.query({ - phrase: 'SELECT data FROM apps WHERE name = ?', - values: [ _app.exec ] - }, ( err, result ) => { - if( !err && result.length ){ - cb( null ); - }else{ - cb( null, { app: _app, url: result[0] }) - } - }) - - // Response the result of each save - }, (err, result) => { - res.json( null, _.flatten( result ) ); - }) - -}) - -// Handle apps request -router.get('webApps', function( req, res ){ - res.json( null, webApps); -}) - -// TODO => Compose shortcut (ie, regex...), save to shortcut??DB??, reload application, send OK -/*router.post('changeAppShortcut', function( req, res ){ - - if( !req.params.length ){ - - Logger.log('[WEBSEARCHAPP]', 'changeAppLocation', 1); - return res.json( 'NO_OK'); - - } - - global.async.each( req.params, ( _app, cb ) => { - - if( !_app.scut ){ - return callback('BAD_REGEX'); - } - // Replace possible bad regex - _app.scut = _app.scut.replace(/\(\.\*\)/gi, ''); - _app.scut = _app.scut.trim(); - // query main db for saving new shortcut - global.db.query({ - phrase: 'UPDATE apps SET regex1 = ? WHERE exec = ?', - values: [ new RegExp( `^${_app.scut} (.*)`, 'i' ), _app.exec ] - }, cb ) - - // Response the result of each save - }, res.json ) - -}) -// TODO => Compose shortcut (ie, regex...), save to shortcut??DB??, reload application, send OK -router.post('changeAppLocation', function( req, res ){ - Logger.log('[WEBSEARCHAPP] changeAppShortcut save', req); - - if( !req.params.length ){ - - Logger.log('[WEBSEARCHAPP]', 'changeAppLocation', 1); - return res.json( 'NO_OK'); - - } - - global.async.each( req.params, ( _app, cb ) => { - - if( !global.app.URL_REGEX.test( _app.location ) ){ - return callback('BAD_REGEX'); - } - // Replace possible bad regex - _app.location = _app.location.trim(); - // query main db for saving new shortcut - global.db.query({ - phrase: 'UPDATE apps SET data = ? WHERE exec = ?', - values: [ new RegExp( `^${_app.location}`, 'i' ), _app.exec ] - }, cb ) - - // Response the result of each save - }, res.json ) - -})*/ - -// Does not really matter, just for completness -let exp = { - fn: function(){}, - wrapper: { - name: 'Open search on webSearch', - text: 'Search whatever on webSearch', - exec: 'webSearch', - icon: null, - internal: true - } -} - -module.exports = { - preLoad: _loader, - shouldReload: _shouldReload, - postLoad: _makeLoad, - getRegex: function(){ - return (exp.regex)?exp.regex:null; - }, - getUserRegex: function(){ - return (exp.regex && exp.regex.length > 1)?exp.regex[1]:null; - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length)?exp.regex[0]:null; - }, - getWrapper: function(){ - return exp; - } -} diff --git a/apps/system/webSearchApp/wikiSearch.js b/apps/system/webSearchApp/wikiSearch.js index 28109f1..c78c167 100644 --- a/apps/system/webSearchApp/wikiSearch.js +++ b/apps/system/webSearchApp/wikiSearch.js @@ -1,65 +1,42 @@ /************** AUTO GENERATED ***************/ 'use strict'; + const AppBase = require(global.upath.joinSafe(global.upath.resolve(__dirname, '..'), 'AppBase')) - var _utils = global.app.utils; - var _url = 'https://en.wikipedia.org/w/index.php?search='; + const _utils = global.app.utils + const _url = 'https://en.wikipedia.org/w/index.php?search=' // make a regex out of the name for searching strings - var _queryRegex = /^Wikipedia (.*)/i; - var _fn = function( exec, query ){ + const _queryRegex = /^Wikipedia (.*)/i - var search = null; - if( exp.regex ){ - search = _utils.cleanQuery(exp.regex.filter(r => r !== null), query); - if( search ){ - query = search; - } - } - // url can have various values - _url.split('|') - .map(str => str + (query.split(' ')).join('+')) - .forEach(q => _utils.spawn('xdg-open', [q])) - } - - var exp = { - fn: _fn, - wrapper: { - name: 'Open search on Wikipedia', - text: 'Search whatever on Wikipedia', - exec: 'wikiSearch', - icon: 'wikipedia.png', - url: _url, - type: '_web_app_' - }, - regex: [ _queryRegex, null ] + const defaultWrapper = { + name: 'Open search on Wikipedia', + text: 'Search whatever on Wikipedia', + exec: 'wikiSearch', + icon: 'wikipedia.png', + url: _url, + type: '_web_app_' } - if( global.settings.get('shortcuts.wikiSearch') ){ - // Avoid bad regex - var r = global.settings.get('shortcuts.wikiSearch').regex1; - if( r !== '_unset_' ){ - // Set default regex (index 0) and name search (index 1), - // setting to null avoids default behaviour, - // which goes to the name of the application - exp.regex = [ _queryRegex, r ]; - } - } + class wikiSearch extends AppBase { + constructor(options) { + super(defaultWrapper, options) + this.regex = [_queryRegex] + super.setup() + } - module.exports = { - getRegex: function(){ - return (exp.regex)?exp.regex:null; - }, - getUserRegex: function(){ - return (exp.regex && exp.regex.length > 1)?exp.regex[1]:null; - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length)?exp.regex[0]:null; - }, - getWrapper: function(){ - return exp; - }, - testQuery: function( query ){ - // Search by name regexp and by user custom regex - return exp.regex.filter(r =>{ return r instanceof RegExp }).some(r =>{ return r.test( query ) }); + exec( ex, query ) { + let search = null + if( this.regex ){ + search = _utils.cleanQuery(this.regex.filter(r => r !== null), query) + if( search ){ + query = search + } + } + // url can have various values + _url.split('|') + .map(str => str + (query.split(' ')).join('+')) + .forEach(q => _utils.spawn('xdg-open', [q])) } } + + module.exports = wikiSearch \ No newline at end of file diff --git a/apps/system/webSearchApp/youtubeSearch.js b/apps/system/webSearchApp/youtubeSearch.js index 9113982..8ae5892 100644 --- a/apps/system/webSearchApp/youtubeSearch.js +++ b/apps/system/webSearchApp/youtubeSearch.js @@ -1,65 +1,42 @@ /************** AUTO GENERATED ***************/ 'use strict'; + const AppBase = require(global.upath.joinSafe(global.upath.resolve(__dirname, '..'), 'AppBase')) - var _utils = global.app.utils; - var _url = 'https://www.youtube.com/results?search_query='; + const _utils = global.app.utils + const _url = 'https://www.youtube.com/results?search_query=' // make a regex out of the name for searching strings - var _queryRegex = /^YouTube (.*)/i; - var _fn = function( exec, query ){ + const _queryRegex = /^YouTube (.*)/i - var search = null; - if( exp.regex ){ - search = _utils.cleanQuery(exp.regex.filter(r => r !== null), query); - if( search ){ - query = search; - } - } - // url can have various values - _url.split('|') - .map(str => str + (query.split(' ')).join('+')) - .forEach(q => _utils.spawn('xdg-open', [q])) - } - - var exp = { - fn: _fn, - wrapper: { - name: 'Open search on YouTube', - text: 'Search whatever on YouTube', - exec: 'youtubeSearch', - icon: 'youtube.png', - url: _url, - type: '_web_app_' - }, - regex: [ _queryRegex, null ] + const defaultWrapper = { + name: 'Open search on YouTube', + text: 'Search whatever on YouTube', + exec: 'youtubeSearch', + icon: 'youtube.png', + url: _url, + type: '_web_app_' } - if( global.settings.get('shortcuts.youtubeSearch') ){ - // Avoid bad regex - var r = global.settings.get('shortcuts.youtubeSearch').regex1; - if( r !== '_unset_' ){ - // Set default regex (index 0) and name search (index 1), - // setting to null avoids default behaviour, - // which goes to the name of the application - exp.regex = [ _queryRegex, r ]; - } - } + class youtubeSearch extends AppBase { + constructor(options) { + super(defaultWrapper, options) + this.regex = [_queryRegex] + super.setup() + } - module.exports = { - getRegex: function(){ - return (exp.regex)?exp.regex:null; - }, - getUserRegex: function(){ - return (exp.regex && exp.regex.length > 1)?exp.regex[1]:null; - }, - getStdRegex: function(){ - return (exp.regex && exp.regex.length)?exp.regex[0]:null; - }, - getWrapper: function(){ - return exp; - }, - testQuery: function( query ){ - // Search by name regexp and by user custom regex - return exp.regex.filter(r =>{ return r instanceof RegExp }).some(r =>{ return r.test( query ) }); + exec( ex, query ) { + let search = null + if( this.regex ){ + search = _utils.cleanQuery(this.regex.filter(r => r !== null), query) + if( search ){ + query = search + } + } + // url can have various values + _url.split('|') + .map(str => str + (query.split(' ')).join('+')) + .forEach(q => _utils.spawn('xdg-open', [q])) } } + + module.exports = youtubeSearch \ No newline at end of file diff --git a/db/dbMain.js b/db/dbMain.js index 9bff5cc..16738b4 100755 --- a/db/dbMain.js +++ b/db/dbMain.js @@ -1,23 +1,23 @@ /* - depends on electron, Database, linvodb3, medeadown - global upath, settings, DIRS, Logger + depends on electron, Database, linvodb3, medeadown + global upath, settings, DIRS, Logger */ 'use strict' const exp = { - name : 'mainDb', - dir : settings.get('db_location'), - schema: { - name: { type: String, index: true }, - text: { type: String, default: '' }, - exec: { type: String, index: true, default: '' }, - icon: { type: String, default: '' }, - data: { type: String, default: '' }, - type: { type: String, index: true, default: '_system_' }, - regex0: { type: RegExp, default: new RegExp('(?!)') }, - regex1: { type: RegExp, default: new RegExp('(?!)') } - } + name : 'mainDb', + dir : global.settings.get('db_location'), + schema: { + name: { type: String, index: true }, + text: { type: String, default: '' }, + exec: { type: String, index: true, default: '' }, + icon: { type: String, default: '' }, + data: { type: String, default: '' }, + type: { type: String, index: true, default: '_system_' }, + regex0: { type: RegExp, default: new RegExp('(?!)') }, + regex1: { type: RegExp, default: new RegExp('(?!)') } + } } const LinvoDB = require('linvodb3') @@ -27,34 +27,34 @@ LinvoDB.dbPath = exp.dir var AppSchema = null module.exports = { - init: function( callback ){ - Logger.log('[DB MAIN] Start') - if( AppSchema ){ - callback( null, AppSchema ) - }else{ - AppSchema = new LinvoDB('apps', exp.schema, {}) - if( AppSchema ){ - Logger.log('[DB MAIN] Registered on Database', exp.name, exp.dir + '/apps.db') - if( !settings.get('first_time') ){ - callback( null, AppSchema ) - }else{ - // Load default apps data - var defaultData = require( upath.join(DIRS.INTERNAL_ROOT, 'misc', 'settings.json') ).apps - var toSave = Object.keys( defaultData ).map(( key ) => new AppSchema( defaultData[ key ] ) ) - // Logger.log('[DB MAIN]', 'toSave', JSON.stringify(toSave, null, 2)) - AppSchema.save(toSave, function( err ){ - if( err ){ - Logger.log('[DB MAIN] Unable to save default data on Database', this.name, err) - callback( err ) - }else{ - callback( null, AppSchema ) - } - }) - } - }else{ - Logger.log('[DB MAIN] Unable to register on Database', this.name, err) - callback( 'BAD_INIT' ) - } - } - } + init: function( callback ){ + Logger.log('[DB MAIN] Start') + if( AppSchema ){ + callback( null, AppSchema ) + }else{ + AppSchema = new LinvoDB('apps', exp.schema, {}) + if( AppSchema ){ + Logger.log('[DB MAIN] Registered on Database', exp.name, exp.dir + '/apps.db') + if( !global.settings.get('first_time') ){ + callback( null, AppSchema ) + }else{ + // Load default apps data + var defaultData = require( upath.joinSafe(global.DIRS.INTERNAL_ROOT, 'misc', 'settings.json') ).apps + var toSave = Object.keys( defaultData ).map(( key ) => new AppSchema( defaultData[ key ] ) ) + // Logger.log('[DB MAIN]', 'toSave', JSON.stringify(toSave, null, 2)) + AppSchema.save(toSave, function( err ){ + if( err ){ + Logger.log('[DB MAIN] Unable to save default data on Database', this.name, err) + callback( err ) + }else{ + callback( null, AppSchema ) + } + }) + } + }else{ + Logger.log('[DB MAIN] Unable to register on Database', this.name, err) + callback( 'BAD_INIT' ) + } + } + } } \ No newline at end of file diff --git a/main.js b/main.js index d8e8c35..c8a7bb4 100755 --- a/main.js +++ b/main.js @@ -1,39 +1,43 @@ 'use strict' +const mainApp = require('electron').app + +mainApp.on('ready', () => { + // Entry point, set globals // DEPS +// DECLS{ upath } + global.upath = require('upath') // Load utils - const util = require( __dirname + '/system/utils' ) + const util = require( upath.joinSafe(__dirname, '/system/utils' ) ) // DECLS{ progOpts, DIRS, upath, async, Logger, settings } global.progOpts = Array.prototype.slice.call( process.argv, 2 ) - global.upath = require('upath') - global.settings = (() => { let s = require('electron-settings'); return new s({debouncedSaveTime: 1}) })() - global.async = require( __dirname + '/async' ) + global.settings = require('electron-settings') + global.async = require( upath.joinSafe(__dirname, 'async' ) ) global.router = require('electron-router')('MAIN') global.DIRS = { - DB: upath.join( util.getBasePath(), 'database' ), - LOG: upath.join( util.getBasePath(), 'log' ), + DB: upath.join( util.getConfigPath(), 'database' ), + LOG: upath.join( util.getConfigPath(), 'log' ), APPS: upath.join( util.getConfigPath(), 'apps' ), INTERNAL_ROOT: __dirname } - global.Logger = require( __dirname + '/system/Logger' ).Logger( global.DIRS.LOG, '*' ) + global.Logger = require( upath.joinSafe(__dirname, '/system/Logger' ) ).Logger( global.DIRS.LOG, '*' ) global.settings.on('save', function(){ Logger.log('[GLOBAL SETTINGS]', 'SAVE ->', arguments) }) global.settings.on('err', function(){ Logger.log('[GLOBAL SETTINGS]', 'ERR ->', arguments) }) // Save refs - const db = require( __dirname + '/db/db' ) - const UI = require( __dirname + '/ui/index') - const apps = require( __dirname + '/apps/index' ) - const mainApp = require('electron').app - let appReady = false - mainApp.on('ready', () => { appReady = true }) + const db = require( upath.joinSafe(__dirname, '/db/db' ) ) + const UI = require( upath.joinSafe(__dirname, '/ui/index') ) + const apps = require( upath.joinSafe(__dirname, '/apps/index' ) ) // Allow only one instance - const shouldQuit = mainApp.makeSingleInstance( UI.handleSingleton ) - if( shouldQuit ){ mainApp.quit(); return; } + if( !mainApp.requestSingleInstanceLock() ){ + UI.handleSingleton() + mainApp.quit() + return + } -// Handle Interruption - process.on('SIGINT', () => { Logger.log('SIGINT'); UI.end(); }); + mainApp.on('second-instance', UI.handleSingleton) // Start working global.async.waterfall([ @@ -41,7 +45,7 @@ ( callback ) => { let localSettings = require( upath.join(__dirname, 'misc', 'settings.json') ) - if( Object.keys( settings.get() ).length === 0 ){ + if( Object.keys( settings.getAll() ).length <= 2 ){ // First launch // TODO => default config for rsvg // default theme @@ -68,6 +72,10 @@ mkdir.sync( upath.join( DIRS.APPS, 'system' ) ) mkdir.sync( upath.join( DIRS.APPS, 'native' ) ) + Logger.log('[MAIN] Created dir', DIRS.DB) + Logger.log('[MAIN] Created dir', DIRS.APPS + '/system') + Logger.log('[MAIN] Created dir', DIRS.APPS + '/native') + callback( null, localSettings ) }, @@ -85,14 +93,12 @@ async.parallel([ // User Interface start ( callback ) => { - if( appReady ){ - UI.start( mainApp, callback ) - }else{ - mainApp.on('ready', () => { - appReady = true - UI.start( mainApp, callback ) - }) - } + // Handle Interruption + process.on('SIGINT', () => { + Logger.log('SIGINT') + router.send('quit') + }) + UI.start( mainApp, callback ) }, // Applications modules start ( callback ) => { @@ -120,3 +126,4 @@ result = result || 'OK' Logger.log('[MAIN] End ->', err ? err : result ) }) +}) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9cfd8d1..d3a6499 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,24 @@ { "name": "Mutant", +<<<<<<< HEAD "version": "0.1.11", +||||||| merged common ancestors + "version": "0.1.10", +======= + "version": "1.0.0", +>>>>>>> develop "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/node": { + "version": "10.12.26", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.26.tgz", + "integrity": "sha512-nMRqS+mL1TOnIJrL6LKJcNZPB8V3eTfRo9FQA2b5gDvrHurC8XbSA86KNe0dShlEL7ReWJv/OU9NL7Z0dnqWTg==" + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "abstract-leveldown": { "version": "2.6.3", @@ -18,17 +28,21 @@ "xtend": "~4.0.0" } }, + "ajv": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "append-stream": { "version": "1.2.2", @@ -38,30 +52,31 @@ "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "are-we-there-yet": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "dev": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" }, "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -76,7 +91,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -86,66 +100,38 @@ "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=", - "dev": true + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" }, "asar": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/asar/-/asar-0.8.3.tgz", - "integrity": "sha1-wuA/kFRRbbv1Z1noVOnOjRqdOdM=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-1.0.0.tgz", + "integrity": "sha512-MBiDU5cDr9UWuY2F0zq2fZlnyRq1aOPmJGMas22Qa14K1odpRXL3xkMHPN3uw2hAK5mD89Q+/KidOUtpi4V0Cg==", "dev": true, "requires": { - "chromium-pickle-js": "0.1.0", - "commander": "2.3.0", - "cuint": "0.1.5", - "glob": "^5.0.5", - "minimatch": "2.0.4", - "mkdirp": "^0.5.0", - "mksnapshot": "0.1.0" + "chromium-pickle-js": "^0.2.0", + "commander": "^2.19.0", + "cuint": "^0.2.2", + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "pify": "^4.0.1", + "tmp-promise": "^1.0.5" }, "dependencies": { "commander": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", - "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", "dev": true }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "minimatch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.4.tgz", - "integrity": "sha1-g76hFYA+egl6eAIkJyh+23Yvr+0=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true } } }, - "asn1": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", - "dev": true - }, - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", - "dev": true - }, "async": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", @@ -154,12 +140,22 @@ "lodash": "^4.14.0" } }, - "aws-sign2": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", - "integrity": "sha1-xXED96F/wDfwLXwuZLYC6iI/fWM=", + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "author-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz", + "integrity": "sha1-0IiFvmubv5Q5/gh8dihyRfCoFFA=", "dev": true }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, "backbone": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.3.3.tgz", @@ -172,13 +168,7 @@ "version": "github:Ivshti/bagpipe#328cc576d682539d635af3a8c360696af353e44a", "from": "github:Ivshti/bagpipe", "requires": { - "inherits": "github:Ivshti/inherits#0c5b02ddc4172bf2e55460916401ac37cfe6f9d3" - }, - "dependencies": { - "inherits": { - "version": "github:Ivshti/inherits#0c5b02ddc4172bf2e55460916401ac37cfe6f9d3", - "from": "github:Ivshti/inherits" - } + "inherits": "github:Ivshti/inherits" } }, "balanced-match": { @@ -187,19 +177,17 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base64-js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", - "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dev": true, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" + "tweetnacl": "^0.14.3" } }, "binary-search-tree": { @@ -222,29 +210,6 @@ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=" }, - "bl": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", - "dev": true, - "requires": { - "readable-stream": "~1.0.26" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - } - } - }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -252,23 +217,22 @@ "dev": true, "requires": { "inherits": "~2.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } } }, "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", "dev": true }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -278,6 +242,22 @@ "concat-map": "0.0.1" } }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -288,66 +268,40 @@ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", "dev": true }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true + "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=", - "dev": true, "requires": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" } }, - "caseless": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.9.0.tgz", - "integrity": "sha1-t7Zc5r8UE4hlOc/VM/CzDv+pz4g=", - "dev": true - }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dev": true, - "requires": { - "traverse": ">=0.3.0 <0.4" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" }, "chromium-pickle-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.1.0.tgz", - "integrity": "sha1-HUixB9ghJqLz4hHC6iX4A7pVGyE=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=", "dev": true }, "cli-cursor": { @@ -376,11 +330,15 @@ "wrap-ansi": "^2.0.0" } }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + }, "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=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "color-convert": { "version": "1.9.1", @@ -398,25 +356,22 @@ "dev": true }, "colors": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.4.tgz", - "integrity": "sha512-6Y+iBnWmXL+AWtlOp2Vr6R2w5MUlNJRwR0ShVFaAb1CqWzhPOpQg4L0jxD+xpw/Nc8QJwaq3KM79QUCriY8CWQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", "dev": true }, - "combined-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", - "dev": true, - "requires": { - "delayed-stream": "0.0.5" - } - }, "commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -426,24 +381,26 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, "requires": { "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" }, "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -458,7 +415,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -468,40 +424,23 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "requires": { - "boom": "2.x.x" - } - }, - "ctype": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", - "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", - "dev": true - }, "cuint": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.1.5.tgz", - "integrity": "sha1-uEixhGbz8YD5bR624HzLfs8Sai4=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", "dev": true }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, "requires": { "array-find-index": "^1.0.1" } @@ -514,6 +453,21 @@ "es5-ext": "^0.10.9" } }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -525,45 +479,12 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decompress-zip": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.1.0.tgz", - "integrity": "sha1-vOYMEWZPLWYPykvPY0r23l1sFMc=", - "dev": true, - "requires": { - "binary": "^0.3.0", - "graceful-fs": "^3.0.0", - "mkpath": "^0.1.0", - "nopt": "^3.0.1", - "q": "^1.1.2", - "readable-stream": "^1.1.8", - "touch": "0.0.3" - }, - "dependencies": { - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, - "requires": { - "natives": "^1.1.0" - } - } - } - }, - "deep-diff": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", - "integrity": "sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "deep-extend": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", - "dev": true + "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==" }, "deferred-leveldown": { "version": "1.2.2", @@ -573,164 +494,419 @@ "abstract-leveldown": "~2.6.0" } }, - "delayed-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", - "dev": true - }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "dev": true + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, - "electron-download": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-1.4.1.tgz", - "integrity": "sha1-T5G6vypVbxReP7hT32qWwoJeGM0=", - "dev": true, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { - "debug": "^2.2.0", - "home-path": "^1.0.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.0", - "mv": "^2.0.3", - "nugget": "^1.5.1", - "path-exists": "^1.0.0", - "rc": "^1.1.2" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-4.0.5.tgz", + "integrity": "sha512-UWFH6SrzNtzfvusGUFYxXDrgsUEbtBXkH/66hpDWxjA2Ckt7ozcYIujZpshbr7LPy8kV3ZRxIvoyCMdaS5DkVQ==", + "requires": { + "@types/node": "^10.12.18", + "electron-download": "^4.1.0", + "extract-zip": "^1.0.3" }, "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "electron-download": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", + "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==", + "requires": { + "debug": "^3.0.0", + "env-paths": "^1.0.0", + "fs-extra": "^4.0.1", + "minimist": "^1.2.0", + "nugget": "^2.0.1", + "path-exists": "^3.0.0", + "rc": "^1.2.1", + "semver": "^5.4.1", + "sumchecker": "^2.0.2" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "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": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "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" + } } } }, - "electron-packager": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-5.2.0.tgz", - "integrity": "sha1-4baqaDtlj707+cDMHdrNlw+LCVg=", + "electron-download": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", + "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==", "dev": true, "requires": { - "asar": "^0.8.2", - "electron-download": "^1.0.0", - "extract-zip": "^1.0.3", - "minimist": "^1.1.1", - "mkdirp": "^0.5.0", - "mv": "^2.0.3", - "ncp": "^2.0.0", - "plist": "^1.1.0", - "rcedit": "^0.3.0", - "rimraf": "^2.3.2", - "run-series": "^1.1.1" + "debug": "^3.0.0", + "env-paths": "^1.0.0", + "fs-extra": "^4.0.1", + "minimist": "^1.2.0", + "nugget": "^2.0.1", + "path-exists": "^3.0.0", + "rc": "^1.2.1", + "semver": "^5.4.1", + "sumchecker": "^2.0.2" }, "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, - "electron-rebuild": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-1.7.3.tgz", - "integrity": "sha1-JK4GrZ3WHLfk1oiWH0kRjEChEOs=", + "electron-notarize": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/electron-notarize/-/electron-notarize-0.0.5.tgz", + "integrity": "sha512-YzrqZ6RDQ7Wt2RWlxzRoQUuxnTeXrfp7laH7XKcmQqrZ6GaAr50DMPvFMpqDKdrZSHSbcgZgB7ktIQbjvITmCQ==", "dev": true, "requires": { - "colors": "^1.1.2", - "debug": "^2.6.3", - "detect-libc": "^1.0.3", - "fs-extra": "^3.0.1", - "node-abi": "^2.0.0", - "node-gyp": "^3.6.0", - "ora": "^1.2.0", - "rimraf": "^2.6.1", - "spawn-rx": "^2.0.10", - "yargs": "^7.0.2" + "debug": "^4.1.0", + "fs-extra": "^7.0.0" }, "dependencies": { - "fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" + "ms": "^2.1.1" } }, - "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, - "electron-router": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/electron-router/-/electron-router-0.4.1.tgz", - "integrity": "sha1-tfNrD6RaMfHpooUHoBTBP96e2fU=", + "electron-osx-sign": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.11.tgz", + "integrity": "sha512-VVd40nrnVqymvFrY9ZkOYgHJOvexHHYTR3di/SN+mjJ0OWhR1I8BRVj3U+Yamw6hnkZZNKZp52rqL5EFAAPFkQ==", + "dev": true, "requires": { - "eventemitter3": "git+https://github.com/m0n0l0c0/eventemitter3.git#85bc9317cb6edfc43d185ee8e099b7379b08f645", - "lodash": "^4.13.1", - "uuid": "^3.0.0" + "bluebird": "^3.5.0", + "compare-version": "^0.1.2", + "debug": "^2.6.8", + "isbinaryfile": "^3.0.2", + "minimist": "^1.2.0", + "plist": "^3.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } } }, - "electron-settings": { - "version": "git+https://github.com/m0n0l0c0/electron-settings.git#40e4e1353500bc4f834b2797b92891f7b2166063", - "from": "git+https://github.com/m0n0l0c0/electron-settings.git", + "electron-packager": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-13.1.0.tgz", + "integrity": "sha512-XHoDqgG90NGBfgUJ3NcOmELAuvHucOIYzi7AhZKIC8FivRR45PDs0pXSf53OqTXXOkdL/1xSveogvJLjKJwkAQ==", + "dev": true, "requires": { - "debug": "^2.2.0", - "deep-diff": "^0.3.3", - "ensure-array": "0.0.5", - "fs-extra": "^0.26.0", - "key-mirror": "^1.0.1", - "lodash": "^3.10.1", - "minimatch": "^3.0.0" + "asar": "^1.0.0", + "debug": "^4.0.1", + "electron-download": "^4.1.1", + "electron-notarize": "^0.0.5", + "electron-osx-sign": "^0.4.11", + "extract-zip": "^1.0.3", + "fs-extra": "^7.0.0", + "galactus": "^0.2.1", + "get-package-info": "^1.0.0", + "parse-author": "^2.0.0", + "pify": "^4.0.0", + "plist": "^3.0.0", + "rcedit": "^1.0.0", + "resolve": "^1.1.6", + "sanitize-filename": "^1.6.0", + "semver": "^5.3.0", + "yargs-parser": "^13.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "yargs-parser": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "electron-rebuild": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-1.7.3.tgz", + "integrity": "sha1-JK4GrZ3WHLfk1oiWH0kRjEChEOs=", + "dev": true, + "requires": { + "colors": "^1.1.2", + "debug": "^2.6.3", + "detect-libc": "^1.0.3", + "fs-extra": "^3.0.1", + "node-abi": "^2.0.0", + "node-gyp": "^3.6.0", + "ora": "^1.2.0", + "rimraf": "^2.6.1", + "spawn-rx": "^2.0.10", + "yargs": "^7.0.2" }, "dependencies": { "fs-extra": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", - "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, "requires": { "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" } }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "^7.0.5" + } + } + } + }, + "electron-router": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/electron-router/-/electron-router-0.4.2.tgz", + "integrity": "sha512-kexZOVfuc0lky2Zm31+R6Mo8WLWdTcyrgyZoei+Wkpk+wx2/Am08va+yYzZ5GpgsT4skxr6acKUbp8Lx67Rs5g==", + "requires": { + "eventemitter3": "git+https://github.com/m0n0l0c0/eventemitter3.git", + "lodash": "^4.17.11", + "uuid": "^3.0.0" + }, + "dependencies": { "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" } } }, - "ensure-array": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/ensure-array/-/ensure-array-0.0.5.tgz", - "integrity": "sha1-NVvsw4LI65nWikm0UK6eboEQJxU=" + "electron-settings": { + "version": "git+https://github.com/m0n0l0c0/electron-settings.git#97e1f55022b3447714c096c268c04199b553828f", + "from": "git+https://github.com/m0n0l0c0/electron-settings.git", + "requires": { + "clone": "^2.1.1", + "jsonfile": "^4.0.0" + } + }, + "env-paths": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=" }, "erbs": { - "version": "git+https://github.com/m0n0l0c0/erbs.git#d26813fe63fa17f0495ff14f20dd91ba2107b895", + "version": "git+https://github.com/m0n0l0c0/erbs.git#07694bdafab23087d9685f155ac011288d435cbb", "from": "git+https://github.com/m0n0l0c0/erbs.git", "requires": { "electron-router": "*" @@ -748,7 +924,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -826,11 +1001,15 @@ "version": "git+https://github.com/m0n0l0c0/eventemitter3.git#85bc9317cb6edfc43d185ee8e099b7379b08f645", "from": "git+https://github.com/m0n0l0c0/eventemitter3.git" }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "extract-zip": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", - "dev": true, "requires": { "concat-stream": "1.6.0", "debug": "2.6.9", @@ -842,13 +1021,27 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", - "dev": true, "requires": { "minimist": "0.0.8" } } } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, "fastfall": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/fastfall/-/fastfall-1.5.1.tgz", @@ -887,7 +1080,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true, "requires": { "pend": "~1.2.0" } @@ -896,7 +1088,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, "requires": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -906,56 +1097,71 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, "requires": { "pinkie-promise": "^2.0.0" } } } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, - "form-data": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", - "integrity": "sha1-Jvi8JtpkQOKZy9z7aQNcT3em5GY=", + "flora-colossus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-1.0.0.tgz", + "integrity": "sha1-VHKcNh7ezuAU3UQWeeGjfB13OkU=", "dev": true, "requires": { - "async": "~0.9.0", - "combined-stream": "~0.0.4", - "mime-types": "~2.0.3" + "debug": "^3.1.0", + "fs-extra": "^4.0.0" }, "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true } } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, "fs-extra": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.0.tgz", - "integrity": "sha512-lk2cUCo8QzbiEWEbt7Cw3m27WMiRG321xsssbcIpfMhpRjrlC08WBOVQqj1/nQYYNnPtyIhP1oqLO3QwT2tPCw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", "requires": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", "universalify": "^0.1.0" - }, - "dependencies": { - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "requires": { - "graceful-fs": "^4.1.6" - } - } + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "requires": { + "minipass": "^2.2.1" } }, "fs.realpath": { @@ -973,13 +1179,59 @@ "inherits": "~2.0.0", "mkdirp": ">=0.5 0", "rimraf": "2" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "galactus": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/galactus/-/galactus-0.2.1.tgz", + "integrity": "sha1-y+0tIKQMH1Z5o1kI4rlBVzPnjbk=", + "dev": true, + "requires": { + "debug": "^3.1.0", + "flora-colossus": "^1.0.0", + "fs-extra": "^4.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } } }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -991,44 +1243,123 @@ "wide-align": "^1.1.0" } }, - "generate-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", - "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", - "dev": true - }, - "generate-object-property": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", - "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true, - "requires": { - "is-property": "^1.0.0" - } - }, "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", "dev": true }, + "get-package-info": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz", + "integrity": "sha1-ZDJ5ZWPigRPNlHTbvQAFKYWkmZw=", + "dev": true, + "requires": { + "bluebird": "^3.1.1", + "debug": "^2.2.0", + "lodash.get": "^4.0.0", + "read-pkg-up": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "^2.0.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", + "assert-plus": "^1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } } }, "graceful-fs": { @@ -1036,26 +1367,10 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, - "har-validator": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-1.8.0.tgz", - "integrity": "sha1-2DhCsOtMQ1lgrrEIoGejqpTA7rI=", - "dev": true, - "requires": { - "bluebird": "^2.9.30", - "chalk": "^1.0.0", - "commander": "^2.8.1", - "is-my-json-valid": "^2.12.0" - } - }, - "has-ansi": { + "har-schema": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "has-flag": { "version": "3.0.0", @@ -1066,60 +1381,48 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "hat": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", "integrity": "sha1-uwFKnmSzeIrtgAWRdBPU/z1QLYo=" }, - "hawk": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-2.3.1.tgz", - "integrity": "sha1-HnMc45RH+h0PbXB/e87r7A/R7B8=", - "dev": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true - }, - "home-path": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.5.tgz", - "integrity": "sha1-eIspgVsS1Tus9XVkhHbm+QQdEz8=", - "dev": true - }, "hosted-git-info": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" }, - "http-signature": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", - "dev": true, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "requires": { - "asn1": "0.1.11", - "assert-plus": "^0.1.5", - "ctype": "0.5.3" + "minimatch": "^3.0.4" + }, + "dependencies": { + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, "requires": { "repeating": "^2.0.0" } @@ -1134,15 +1437,13 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "github:Ivshti/inherits#0c5b02ddc4172bf2e55460916401ac37cfe6f9d3", + "from": "github:Ivshti/inherits" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "invert-kv": { "version": "1.0.0", @@ -1153,14 +1454,12 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-builtin-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, "requires": { "builtin-modules": "^1.0.0" } @@ -1169,7 +1468,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1178,47 +1476,34 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } }, - "is-my-ip-valid": { + "is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", - "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", - "dev": true - }, - "is-my-json-valid": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", - "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", - "dev": true, - "requires": { - "generate-function": "^2.0.0", - "generate-object-property": "^1.1.0", - "is-my-ip-valid": "^1.0.0", - "jsonpointer": "^4.0.0", - "xtend": "^4.0.0" - } - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1228,38 +1513,58 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, "jquery": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "requires": { "graceful-fs": "^4.1.6" } }, - "jsonpointer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", - "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", - "dev": true - }, - "key-mirror": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/key-mirror/-/key-mirror-1.0.1.tgz", - "integrity": "sha1-ChMtXIqCo6T8199zL/lRDQSrNms=" + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } }, "keydir": { "version": "2.1.1", @@ -1269,14 +1574,6 @@ "ltgt": "^1.0.2" } }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "^4.1.9" - } - }, "lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -1308,6 +1605,13 @@ "level-errors": "^1.0.3", "readable-stream": "^1.0.33", "xtend": "^4.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } }, "leveldown-open": { @@ -1343,13 +1647,13 @@ "from": "git+https://github.com/m0n0l0c0/linvodb3.git", "requires": { "async": "1.x.x", - "bagpipe": "github:Ivshti/bagpipe#328cc576d682539d635af3a8c360696af353e44a", + "bagpipe": "github:Ivshti/bagpipe", "binary-search-tree": "0.2.6", "hat": "0.0.3", "levelup": "^1.2.1", "path": "^0.12.7", "underscore": "1.8.x", - "util": "github:Ivshti/node-util#97b6beed8e0e478cd4184965ac94bf316f94e5f5" + "util": "github:Ivshti/node-util" }, "dependencies": { "async": { @@ -1368,7 +1672,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -1377,10 +1680,20 @@ "strip-bom": "^2.0.0" } }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, "lodash": { - "version": "4.17.10", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", - "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, "lodash.assign": { "version": "4.2.0", @@ -1388,6 +1701,12 @@ "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -1432,7 +1751,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, "requires": { "currently-unhandled": "^0.4.1", "signal-exit": "^3.0.0" @@ -1446,8 +1764,7 @@ "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" }, "medea": { "version": "1.0.3", @@ -1470,11 +1787,6 @@ "version": "0.9.2", "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" } } }, @@ -1503,7 +1815,6 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, "requires": { "camelcase-keys": "^2.0.0", "decamelize": "^1.1.2", @@ -1520,26 +1831,10 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, - "mime-db": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", - "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=", - "dev": true - }, - "mime-types": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", - "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", - "dev": true, - "requires": { - "mime-db": "~1.12.0" - } - }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", @@ -1550,6 +1845,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1559,6 +1855,23 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "requires": { + "minipass": "^2.2.1" + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -1567,45 +1880,6 @@ "minimist": "0.0.8" } }, - "mkpath": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", - "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=", - "dev": true - }, - "mksnapshot": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/mksnapshot/-/mksnapshot-0.1.0.tgz", - "integrity": "sha1-99CavKgGrYw3gNpwG7GHeNfOaaw=", - "dev": true, - "requires": { - "decompress-zip": "0.1.0", - "fs-extra": "0.18.2", - "request": "2.55.0" - }, - "dependencies": { - "fs-extra": { - "version": "0.18.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.18.2.tgz", - "integrity": "sha1-rwXKcCsLbfp96AOh96tHnsXCFSU=", - "dev": true, - "requires": { - "graceful-fs": "^3.0.5", - "jsonfile": "^2.0.0", - "rimraf": "^2.2.8" - } - }, - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true, - "requires": { - "natives": "^1.1.0" - } - } - } - }, "monotonic-timestamp": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/monotonic-timestamp/-/monotonic-timestamp-0.0.8.tgz", @@ -1616,57 +1890,20 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "dev": true, - "requires": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "rimraf": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", - "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "dev": true, - "requires": { - "glob": "^6.0.1" - } - } - } - }, "nan": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" }, - "natives": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.3.tgz", - "integrity": "sha512-BZGSYV4YOLxzoTK73l0/s/0sH9l8SHs2ocReMH1f8JYSh5FUWu4ZrKCpJdRkWXV6HFR/pZDz7bwWOVAY07q77g==", - "dev": true - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "dev": true + "needle": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", + "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } }, "next-tick": { "version": "1.0.0", @@ -1703,6 +1940,35 @@ "which": "1" }, "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "semver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", @@ -1711,6 +1977,82 @@ } } }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + } + } + }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", @@ -1724,7 +2066,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, "requires": { "hosted-git-info": "^2.1.4", "is-builtin-module": "^1.0.0", @@ -1732,11 +2073,24 @@ "validate-npm-package-license": "^3.0.1" } }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==" + }, + "npm-packlist": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -1745,9 +2099,9 @@ } }, "nugget": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/nugget/-/nugget-1.6.2.tgz", - "integrity": "sha1-iMpuA7pXBqmRc/XaCQJZPWvK4Qc=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", + "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", "dev": true, "requires": { "debug": "^2.1.3", @@ -1755,7 +2109,7 @@ "pretty-bytes": "^1.0.2", "progress-stream": "^1.1.0", "request": "^2.45.0", - "single-line-log": "^0.4.1", + "single-line-log": "^1.1.2", "throttleit": "0.0.2" }, "dependencies": { @@ -1770,26 +2124,17 @@ "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=", - "dev": true - }, - "oauth-sign": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.6.0.tgz", - "integrity": "sha1-fb6uRPbKRU4fFoRR1jB0ZzWBPOM=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "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=", - "dev": true + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" }, "once": { "version": "1.4.0", @@ -1854,8 +2199,7 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { "version": "1.4.0", @@ -1869,24 +2213,54 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" } }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-author": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz", + "integrity": "sha1-00YL8d3Q367tQtp1QkLmX7aEqB8=", + "dev": true, + "requires": { + "author-regex": "^1.0.0" + } + }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, "requires": { "error-ex": "^1.2.0" } @@ -1898,12 +2272,27 @@ "requires": { "process": "^0.11.1", "util": "^0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + } + } } }, "path-exists": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", - "integrity": "sha1-1aiZjrce83p0w06w2eum6HjuoIE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-is-absolute": { @@ -1911,11 +2300,16 @@ "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==", + "dev": true + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -1925,8 +2319,12 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pidlockfile": { "version": "1.1.1", @@ -1936,33 +2334,29 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, "requires": { "pinkie": "^2.0.0" } }, "plist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-1.2.0.tgz", - "integrity": "sha1-CEtQk93JJQbiWfh0uNmxr7jHlZM=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", "dev": true, "requires": { - "base64-js": "0.0.8", - "util-deprecate": "1.0.2", - "xmlbuilder": "4.0.0", + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", "xmldom": "0.1.x" } }, @@ -1970,7 +2364,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", - "dev": true, "requires": { "get-stdin": "^4.0.1", "meow": "^3.1.0" @@ -1984,14 +2377,12 @@ "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==", - "dev": true + "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=", - "dev": true, "requires": { "speedometer": "~0.1.2", "through2": "~0.2.3" @@ -2002,29 +2393,20 @@ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "qs": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-2.4.2.tgz", - "integrity": "sha1-9854jld33wtQENp/fE5zujJHD1o=", - "dev": true + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, "rc": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", - "dev": true, "requires": { "deep-extend": "^0.5.1", "ini": "~1.3.0", @@ -2035,22 +2417,20 @@ "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, "rcedit": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-0.3.0.tgz", - "integrity": "sha1-y17uGF5Ub57aWXwkjJkGGG+pa84=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-1.1.1.tgz", + "integrity": "sha512-6NjOhOpkvbc/gpMEfk2hpXuWyHfbLFN8as5jx3jf4bhELvouRoYvc8d/W3NVVPwEBF1ICfbpwp1oRm8OJ2WDWw==", "dev": true }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, "requires": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -2061,7 +2441,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, "requires": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -2076,13 +2455,19 @@ "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, "requires": { "indent-string": "^2.1.0", "strip-indent": "^1.0.1" @@ -2092,597 +2477,337 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.55.0.tgz", - "integrity": "sha1-11wc32eddrsQD5v/4f5VG1wk6T0=", - "dev": true, - "requires": { - "aws-sign2": "~0.5.0", - "bl": "~0.9.0", - "caseless": "~0.9.0", - "combined-stream": "~0.0.5", - "forever-agent": "~0.6.0", - "form-data": "~0.2.0", - "har-validator": "^1.4.0", - "hawk": "~2.3.0", - "http-signature": "~0.10.0", - "isstream": "~0.1.1", - "json-stringify-safe": "~5.0.0", - "mime-types": "~2.0.1", - "node-uuid": "~1.4.0", - "oauth-sign": "~0.6.0", - "qs": "~2.4.0", - "stringstream": "~0.0.4", - "tough-cookie": ">=0.12.0", - "tunnel-agent": "~0.4.0" - }, - "dependencies": { - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "^7.0.5" - } - }, - "run-parallel": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", - "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" - }, - "run-series": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.8.tgz", - "integrity": "sha512-+GztYEPRpIsQoCSraWHDBs9WVy4eVME16zhOtDB4H9J4xN0XRhknnmLOl+4gRgZtu8dpp9N/utSPjKH/xmDzXg==", - "dev": true - }, - "rxjs": { - "version": "5.5.10", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", - "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", - "dev": true, - "requires": { - "symbol-observable": "1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "single-line-log": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-0.4.1.tgz", - "integrity": "sha1-h6VWSfdJ14PsDc2AToFA2Yc8fO4=", - "dev": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "requires": { - "hoek": "2.x.x" - } - }, - "spawn-rx": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-2.0.12.tgz", - "integrity": "sha512-gOPXiQQFQ9lTOLuys0iMn3jfxxv9c7zzwhbYLOEbQGvEShHVJ5sSR1oD3Daj88os7jKArDYT7rbOKdvNhe7iEg==", - "dev": true, - "requires": { - "debug": "^2.5.1", - "lodash.assign": "^4.2.0", - "rxjs": "^5.1.1" - } - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "speedometer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", - "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", - "dev": true - }, - "sqlite3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.0.tgz", - "integrity": "sha512-6OlcAQNGaRSBLK1CuaRbKwlMFBb9DEhzmZyQP+fltNRF6XcIMpVIfXCBEcXPe1d4v9LnhkQUYkknDbA5JReqJg==", - "requires": { - "nan": "~2.9.2", - "node-pre-gyp": "~0.9.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true - }, - "iconv-lite": { - "version": "0.4.19", - "bundled": true - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "minipass": { - "version": "2.2.1", - "bundled": true, - "requires": { - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true - }, - "nan": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.9.2.tgz", - "integrity": "sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw==" - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.9.0", - "bundled": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "delayed-stream": "~1.0.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, - "rc": { - "version": "1.2.6", - "bundled": true, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { - "deep-extend": "~0.4.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true - } + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, - "readable-stream": { - "version": "2.3.5", - "bundled": true, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, - "rimraf": { - "version": "2.6.2", - "bundled": true, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "glob": "^7.0.5" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true - }, - "sax": { - "version": "1.2.4", - "bundled": true - }, - "semver": { - "version": "5.5.0", - "bundled": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } + "mime-db": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==" }, - "string_decoder": { - "version": "1.0.3", - "bundled": true, + "mime-types": { + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "requires": { - "safe-buffer": "~5.1.0" + "mime-db": "~1.38.0" } }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { - "ansi-regex": "^2.0.0" + "psl": "^1.1.24", + "punycode": "^1.4.1" } }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true - }, - "tar": { - "version": "4.4.0", - "bundled": true, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.3", - "minipass": "^2.2.1", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "yallist": "^3.0.2" + "safe-buffer": "^5.0.1" } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-no-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/require-no-cache/-/require-no-cache-0.2.1.tgz", + "integrity": "sha1-8Rxu/uD9kaBH4FcbMdBu0wdf+mg=", + "requires": { + "stack-trace": "0.0.9" + } + }, + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==" + }, + "rxjs": { + "version": "5.5.10", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", + "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sanitize-filename": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.1.tgz", + "integrity": "sha1-YS2hyWRz+gLczaktzVtKsWSmdyo=", + "dev": true, + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "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=", + "dev": true, + "requires": { + "string-width": "^1.0.1" + } + }, + "spawn-rx": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-2.0.12.tgz", + "integrity": "sha512-gOPXiQQFQ9lTOLuys0iMn3jfxxv9c7zzwhbYLOEbQGvEShHVJ5sSR1oD3Daj88os7jKArDYT7rbOKdvNhe7iEg==", + "dev": true, + "requires": { + "debug": "^2.5.1", + "lodash.assign": "^4.2.0", + "rxjs": "^5.1.1" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + }, + "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.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" + }, + "speedometer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=" + }, + "sqlite3": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.6.tgz", + "integrity": "sha512-EqBXxHdKiwvNMRCgml86VTL5TK1i0IKiumnfxykX0gh6H6jaKijAXvE9O1N7+omfNSawR2fOmIyJZcfe8HYWpw==", + "requires": { + "nan": "~2.10.0", + "node-pre-gyp": "^0.11.0", + "request": "^2.87.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "string-width": "^1.0.2" + "safer-buffer": "~2.1.0" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" } } }, + "stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" + }, "steed": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/steed/-/steed-1.1.3.tgz", @@ -2699,7 +2824,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2711,17 +2835,10 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2730,7 +2847,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, "requires": { "is-utf8": "^0.2.0" } @@ -2739,7 +2855,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, "requires": { "get-stdin": "^4.0.1" } @@ -2747,14 +2862,15 @@ "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=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true + "sumchecker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "requires": { + "debug": "^2.2.0" + } }, "symbol-observable": { "version": "1.0.1", @@ -2771,19 +2887,25 @@ "block-stream": "*", "fstream": "^1.0.2", "inherits": "2" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } } }, "throttleit": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", - "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", - "dev": true + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=" }, "through2": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", - "dev": true, "requires": { "readable-stream": "~1.1.9", "xtend": "~2.1.1" @@ -2793,65 +2915,54 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, "requires": { "object-keys": "~0.4.0" } } } }, - "touch": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz", - "integrity": "sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0=", + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "nopt": "~1.0.10" - }, - "dependencies": { - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - } + "os-tmpdir": "~1.0.2" } }, - "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "tmp-promise": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-1.0.5.tgz", + "integrity": "sha512-hOabTz9Tp49wCozFwuJe5ISrOqkECm6kzw66XTP23DuzNU7QS/KiZq5LC9Y7QSy8f1rPSLy4bKaViP0OwGI1cA==", "dev": true, "requires": { - "punycode": "^1.4.1" + "bluebird": "^3.5.0", + "tmp": "0.0.33" } }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true - }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" }, - "tunnel-agent": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", - "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", - "dev": true + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "dev": true, + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "underscore": { "version": "1.9.0", @@ -2868,40 +2979,70 @@ "resolved": "https://registry.npmjs.org/upath/-/upath-1.0.5.tgz", "integrity": "sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww==" }, - "util": { - "version": "github:Ivshti/node-util#97b6beed8e0e478cd4184965ac94bf316f94e5f5", - "from": "github:Ivshti/node-util", + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "requires": { - "inherits": "github:Ivshti/inherits#0c5b02ddc4172bf2e55460916401ac37cfe6f9d3" + "punycode": "^2.1.0" }, "dependencies": { - "inherits": { - "version": "github:Ivshti/inherits#0c5b02ddc4172bf2e55460916401ac37cfe6f9d3", - "from": "github:Ivshti/inherits" + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" } } }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=", + "dev": true + }, + "util": { + "version": "github:Ivshti/node-util#97b6beed8e0e478cd4184965ac94bf316f94e5f5", + "from": "github:Ivshti/node-util", + "requires": { + "inherits": "github:Ivshti/inherits" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, "validate-npm-package-license": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, "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", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", @@ -2921,7 +3062,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "dev": true, "requires": { "string-width": "^1.0.2" } @@ -2942,21 +3082,10 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "xmlbuilder": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.0.0.tgz", - "integrity": "sha1-mLj2UcowqmJANvEn0RzGbce5B6M=", - "dev": true, - "requires": { - "lodash": "^3.5.0" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } - } + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true }, "xmldom": { "version": "0.1.27", @@ -2975,6 +3104,11 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + }, "yargs": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", @@ -3025,7 +3159,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, "requires": { "fd-slicer": "~1.0.1" } diff --git a/package.json b/package.json index 7d398a6..e4b5adc 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "Mutant", - "version": "0.1.11", + "version": "1.0.0", "license": "MIT", "description": "Productivity launcher", "author": "Guillermo Blanco", @@ -17,23 +17,25 @@ "async": "~2.6.0", "backbone": "~1.3.3", "commander": "~2.15.1", - "electron-router": "~0.4.1", + "electron": "^4.0.5", + "electron-router": "^0.4.2", "electron-settings": "git+https://github.com/m0n0l0c0/electron-settings.git", "erbs": "git+https://github.com/m0n0l0c0/erbs.git", "fs-extra": "~6.0.0", "jquery": "~3.3.1", "librsvg": "~0.7.0", "linvodb3": "git+https://github.com/m0n0l0c0/linvodb3.git", - "lodash": "~4.17.10", + "lodash": "^4.17.11", "medeadown": "~1.1.9", "mkdirp": "~0.5.1", - "sqlite3": "~4.0", + "require-no-cache": "^0.2.1", + "sqlite3": "^4.0.6", "steed": "~1.1.3", "underscore": "~1.9.0", "upath": "~1.0.5" }, "devDependencies": { - "electron-packager": "^5.1.0", + "electron-packager": "^13.1.0", "electron-rebuild": "^1.6.0" }, "scripts": { diff --git a/system/Logger.js b/system/Logger.js index ec05982..f5a6f81 100755 --- a/system/Logger.js +++ b/system/Logger.js @@ -1,74 +1,76 @@ 'use strict' -const fs = require('fs') const mkdir = require('mkdirp') -const utils = require( __dirname + '/utils' ) +const utils = require( global.upath.joinSafe(__dirname, 'utils') ) +const { existsSync, createWriteStream } = require('fs') + const extractor = /^\[(.*)\]/ +const marker = '\n\n================ START ================\n' -let _pickUntakenName = ( baseDir ) => { - let dir = null - if( baseDir ){ - let today = (new Date().toLocaleDateString()).replace(/\//g, '-') - let tries = 0 - let dotExt = '.log' - dir = `${baseDir}/${today}${dotExt}` - while( fs.existsSync( `${dir}` )) dir = `${baseDir}/${today} (${++tries})${dotExt}` - }else{ - console.log('[LOGGER] Err -> Could not find config path') +class Logger { + constructor(baseDir, filter) { + // Ensure dir and exists + baseDir = baseDir || `${util.getConfigPath()}/log` + mkdir.sync( baseDir ) + // Setup filter + this.filterStr = filter || '*' + // Ensure log name + this.logFile = this._pickName( baseDir ) + if( this.logFile ){ + let streamer = createWriteStream(this.logFile, { flags: 'a' }) + this.ownLogger = new console.Console( streamer, streamer ) + }else{ + // Dummy object, just in case... + this.ownLogger = { log: () => { console.log('[LOGGER] ERR: NO_LOG_DIR') } } + } + this.ownLogger.log(marker) } - return dir -} -let _prettyDate = () => { - let date = new Date() - let ret = `${date.getHours()}` - if( date.getHours() < 100 ){ - ret = `0${date.getHours()}` - } - ret += `:${date.getMinutes()}` - if( date.getMilliseconds() < 100 ){ - ret += `:0${date.getMilliseconds()}` - }else{ - ret += `:${date.getMilliseconds()}` + _prettyDate() { + let date = new Date() + let hours = `${date.getHours()}` + let minutes = `${date.getMinutes()}` + let seconds = `${date.getSeconds()}` + let millis = `${date.getMilliseconds()}` + if( hours < 10 ){ + hours = `0${date.getHours()}` + } + if( minutes < 10 ){ + minutes = `0${date.getMinutes()}` + } + if( seconds < 10 ){ + seconds = `0${date.getSeconds()}` + } + if( millis < 100 ){ + millis = `0${date.getMilliseconds()}` + } + return `[${hours}:${minutes}:${seconds}.${millis}]` } - return `[${ret}]` -} -let Logger = function( baseDir, filter ){ - // Ensure dir and exists - baseDir = baseDir || `${util.getBasePath()}/log` - mkdir.sync( baseDir ) - // Setup filter - this.filterStr = filter || '*' - // Ensure log name - this.logDir = _pickUntakenName( baseDir ) - if( this.logDir ){ - let streamer = fs.createWriteStream( this.logDir ) - this.ownLogger = new console.Console( streamer, streamer ) - }else{ - // Dummy object, just in case... - this.ownLogger = { log: ()=>{ console.log('[LOGGER] ERR: NO_LOG_DIR') } } + _pickName( baseDir ) { + let today = (new Date().toLocaleDateString()).replace(/\//g, '_') + return `${baseDir}/${today}.log` } -} -Logger.prototype.log = function(){ - let args = [ _prettyDate() ].concat( Array.prototype.slice.call( arguments, 0 ) ) - // console.log.apply( console, ['[LOGGER CALLED]'].concat( args ) ) - if( this.filterInput( args[ 0 ] ) ){ - console.log.apply( console, args ) - this.ownLogger.log.apply( this.ownLogger, args ) + log() { + let args = [ this._prettyDate() ].concat( Array.prototype.slice.call( arguments, 0 ) ) + // console.log.apply( console, ['[LOGGER CALLED]'].concat( args ) ) + if( this.filterInput( args[ 0 ] ) ){ + console.log.apply( console, args ) + this.ownLogger.log.apply( this.ownLogger, args ) + } } -} -Logger.prototype.filterInput = function( str ){ - let ret = true - if( this.filterStr !== '*' ){ - let source = str.match( extractor ) - if( !source || this.filterStr.toLowerCase() !== source[ 1 ].toLowerCase() ){ - ret = false + filterInput( str ) { + let ret = true + if( this.filterStr !== '*' ){ + let source = str.match( extractor ) + if( !source || this.filterStr.toLowerCase() !== source[ 1 ].toLowerCase() ){ + ret = false + } } + return ret } - return ret } module.exports.Logger = ( baseDir, filter ) => new Logger( baseDir, filter ) \ No newline at end of file diff --git a/system/utils.js b/system/utils.js index d661e3c..88decba 100755 --- a/system/utils.js +++ b/system/utils.js @@ -4,7 +4,7 @@ let _getConfigPath = () => { let conf = null if( global.settings ){ // => /Users/Nathan/Library/Application Support/Electron/electron-settings/settings.json - conf = global.settings.getConfigFilePath() + conf = global.settings.file() conf = conf.split('/') // => /Users/Nathan/Library/Application Support/Electron/electron-settings/ conf.pop() @@ -13,19 +13,4 @@ let _getConfigPath = () => { return conf } -let _getBasePath = () => { - // => /Users/Nathan/Library/Application Support/Electron/electron-settings/ - let baseDir = _getConfigPath() - if( baseDir ){ - baseDir = baseDir.split('/') - baseDir.pop() - // => /Users/Nathan/Library/Application Support/Electron/ - baseDir = baseDir.join('/') - // => /Users/Nathan/Library/Application Support/Electron - // baseDir = baseDir.replace(/\/$/, '') - } - return baseDir -} - module.exports.getConfigPath = _getConfigPath -module.exports.getBasePath = _getBasePath \ No newline at end of file diff --git a/ui/html/settings.html b/ui/html/settings.html index 377019d..8973c82 100755 --- a/ui/html/settings.html +++ b/ui/html/settings.html @@ -2,62 +2,62 @@ - - - - - - - - - - The Mutant - Settings + + + + + + + + + + The Mutant - Settings -
-
- Preferences - -
- - - - - - - - - - -
IconCommandURL/LocationShortcut
-
- - - - - - - - - - - - +
+
+ Preferences + +
+ + + + + + + + + + +
IconCommandURL/LocationShortcut
+
+ + + + + + + + + + + + diff --git a/ui/index.js b/ui/index.js index 6774d29..c65f35d 100755 --- a/ui/index.js +++ b/ui/index.js @@ -25,7 +25,7 @@ let windowParams = { } // ******** WINDOW HANDLES ********* -let _requestSize = function( noElems, size ){ +function _requestSize( noElems, size ){ //Logger.log('requestSize', 1, arguments) Logger.log('[UI MAIN WINDOW] Requested size change', noElems, size) let dim = mainWindow.getContentSize() @@ -35,7 +35,7 @@ let _requestSize = function( noElems, size ){ // ********************************* // ******** VISUAL HANDLES ********* -let _showWindow = function(){ +function _showWindow(){ // Locate display mouse let displ = screen.getDisplayNearestPoint( screen.getCursorScreenPoint() ); // Get dimensions @@ -58,20 +58,20 @@ let _showWindow = function(){ mainWindow.focus(); } -let _handleShortcut = function( evt ){ - //Logger.log('Handle', evt); - function _shut(){ - //Logger.log('_shut'); - if( mainWindow.isVisible() ){ - //Logger.log('InVisible'); - mainWindow.hide(); - mainWindow.send('halt'); - } - if( globalShortcut.isRegistered('Esc') ){ - globalShortcut.unregister('Esc'); - } - router.send('UI::hide'); +function _shut(){ + //Logger.log('_shut'); + if( mainWindow.isVisible() ){ + //Logger.log('InVisible'); + mainWindow.hide(); + mainWindow.send('halt'); + } + if( globalShortcut.isRegistered('Esc') ){ + globalShortcut.unregister('Esc'); } + router.send('UI::hide'); +} + +function _handleShortcut( evt ){ if( evt === 'TOGGLE' ){ //Logger.log('TOGGLE'); if( mainWindow.isVisible() ){ @@ -92,7 +92,7 @@ let _handleShortcut = function( evt ){ // ********************************* // ************* SETUP ************* -let _createWindow = function(){ +function _createWindow(){ // General Setup screen = electron.screen; Logger.log('[UI MAIN WINDOW] Create window'); @@ -120,12 +120,12 @@ let _createWindow = function(){ // Load the main window. Logger.log('[UI MAIN WINDOW] Load index'); - mainWindow.loadURL('file://' + upath.join( __dirname, 'html/index.html' )); + mainWindow.loadURL('file://' + global.upath.joinSafe( __dirname, 'html/index.html' )); // mainWindow.openDevTools(); } -let _registerShortcutEvents = function(){ - let launchShortcut = settings.get('shortcuts')['launch'].cmd; +function _registerShortcutEvents(){ + let launchShortcut = global.settings.get('shortcuts')['launch'].cmd; // Register shortcut Logger.log('[UI MAIN WINDOW] Register shortcut 1/2'); let reg = globalShortcut.register( launchShortcut, () => { _handleShortcut('TOGGLE') }); @@ -136,7 +136,7 @@ let _registerShortcutEvents = function(){ if(!reg) Logger.log('[UI MAIN WINDOW] Failed registering Esc') } -let _registerWindowClose = function( callback ){ +function _registerWindowClose( callback ){ mainWindow.on('blur', _handleShortcut); Logger.log('[UI MAIN WINDOW] Register close 1/2'); let closeTries = 0; @@ -150,7 +150,7 @@ let _registerWindowClose = function( callback ){ mainWindow.on('closed', callback); } -let _registerWindowEvents = function( callback ){ +function _registerWindowEvents( callback ){ // Setup bindings for duplex communication. // Pass a function to the bridge so that it can call it when it needs anything, // by now just hide and quit @@ -164,10 +164,10 @@ let _registerWindowEvents = function( callback ){ router.on('requestSize', _requestSize ); - router.on('launch', ( app ) => { - Logger.log('[UI MAIN WINDOW] launch', app.name); + router.on('launch', ( data ) => { + Logger.log('[UI MAIN WINDOW] launch', data.app.name); router.send('hide'); - router.send('launchApp', app) + router.send('launchApp', data) }) router.on('hide', () => { @@ -179,10 +179,9 @@ let _registerWindowEvents = function( callback ){ Logger.log('[UI MAIN WINDOW] Received `quit` evt') callback() }); - } -let _registerEvents = function( callback ){ +function _registerEvents( callback ){ let cb = callback // Register evts and shortcuts _registerShortcutEvents(); @@ -201,12 +200,12 @@ let _registerEvents = function( callback ){ } // ********************************* -let _main = function( callback ) { +function _main( callback ) { _createWindow(); _registerEvents( callback ); } -let _ready = function( elApp, callback ){ +function _ready( elApp, callback ){ Logger.log('[UI MAIN WINDOW] Start'); // Quit when all windows are closed. app = elApp; @@ -222,17 +221,20 @@ let _ready = function( elApp, callback ){ }) } -let _clean = function( callback ){ - Logger.log('[UI MAIN WINDOW] Quit evt'); +function _clean( callback ){ + Logger.log('[UI MAIN WINDOW] Quit evt') // mainWindow.removeAllListeners(); // ipc.removeAllListeners(); // globalShortcut.unregisterAll(); - Logger.log('[UI MAIN WINDOW] Killing window'); + Logger.log('[UI MAIN WINDOW] Killing window') // mainWindow = null; - callback(); + if( typeof callback !== 'function' ){ + callback = () => {} + } + callback() } -let _singleton = function(){ +function _singleton(){ // Someone tried to run a second instance, we should focus our window. Logger.log('[UI MAIN WINDOW] ShouldQuit, an instance is already running') if( mainWindow ){ diff --git a/ui/js/app-settings.js b/ui/js/app-settings.js index 62dafe4..ad8cfab 100755 --- a/ui/js/app-settings.js +++ b/ui/js/app-settings.js @@ -1,24 +1,24 @@ 'use strict' -var app = app || {}; -var buffer = []; +var app = app || {} +var buffer = [] const STATES = { - IDLE : 'IDLE', - REC : 'REC' + IDLE : 'IDLE', + REC : 'REC' }; app.STATE = STATES.IDLE; $(function(){ - var r = Router('UI::PREFERENCES') - new app.AppView(); + var r = Router('UI::PREFERENCES') + new app.AppView() }).keydown(function( event ){ - if( app.STATE === STATES.REC ){ - var key = keys.getCharFromCode( event.which ); - if( key !== null ){ - //console.log('This should be recorded', event.which, keys.getCharFromCode( event.which )); - app.Items.selected().trigger('appendShortcut', key, event); - } - } + if( app.STATE === STATES.REC ){ + var key = keys.getCharFromCode( event.which ) + if( key !== null ){ + //console.log('This should be recorded', event.which, keys.getCharFromCode( event.which )); + app.Items.selected().trigger('appendShortcut', key, event) + } + } }) diff --git a/ui/js/lib/keyboard.js b/ui/js/lib/keyboard.js index 5b6b50b..1f5f01e 100755 --- a/ui/js/lib/keyboard.js +++ b/ui/js/lib/keyboard.js @@ -1,4 +1,4 @@ -'use strict'; +'use strict' // From https://github.com/atom/electron/blob/master/docs/api/accelerator.md /* @@ -34,134 +34,134 @@ // Taken partially from http://stackoverflow.com/questions/1772179/get-character-value-from-keycode-in-javascript-then-trim // names of known key codes registrable on electron(0-255) var map = new Map([ - [NaN, null] - , [17, 'Ctrl'] - , [91, 'Super'] - , [18, 'Alt'] - , [16, 'Shift'] - , [9, 'Tab'] - , [48, '0'] - , [49, '1'] - , [50, '2'] - , [51, '3'] - , [52, '4'] - , [53, '5'] - , [54, '6'] - , [55, '7'] - , [56, '8'] - , [57, '9'] - , [65, 'A'] - , [66, 'B'] - , [67, 'C'] - , [68, 'D'] - , [69, 'E'] - , [70, 'F'] - , [71, 'G'] - , [72, 'H'] - , [73, 'I'] - , [74, 'J'] - , [75, 'K'] - , [76, 'L'] - , [77, 'M'] - , [78, 'N'] - , [79, 'O'] - , [80, 'P'] - , [81, 'Q'] - , [82, 'R'] - , [83, 'S'] - , [84, 'T'] - , [85, 'U'] - , [86, 'V'] - , [87, 'W'] - , [88, 'X'] - , [89, 'Y'] - , [90, 'Z'] - , [112, 'F1'] - , [113, 'F2'] - , [114, 'F3'] - , [115, 'F4'] - , [116, 'F5'] - , [117, 'F6'] - , [118, 'F7'] - , [119, 'F8'] - , [120, 'F9'] - , [121, 'F10'] - , [122, 'F11'] - , [123, 'F12'] - , [124, 'F13'] - , [125, 'F14'] - , [126, 'F15'] - , [127, 'F16'] - , [128, 'F17'] - , [129, 'F18'] - , [130, 'F19'] - , [131, 'F20'] - , [132, 'F21'] - , [133, 'F22'] - , [134, 'F23'] - , [135, 'F24'] - , [171, 'Plus'] - , [32, 'Space'] - , [8, 'Backspace'] - , [46, 'Delete'] - , [45, 'Insert'] - , [13, 'Enter'] - , [38, 'Up'] - , [40, 'Down'] - , [37, 'Left'] - , [39, 'Right'] - , [36, 'Home'] - , [35, 'End'] - , [33, 'PageUp'] - , [34, 'PageDown'] - , [27, 'Esc'] - , [183, 'VolumeUp'] - , [182, 'VolumeDown'] - , [181, 'VolumeMute'] - , [250, 'Play'] - , [19, 'Pause'] - , [58, ':'] - , [60, '<'] - , [62, '>'] - , [63, '?'] - , [64, '@'] - , [161, '!'] - , [162, '"'] - , [164, '$'] - , [165, '%'] - , [166, '&'] - , [167, '_'] - , [168, '('] - , [169, ')'] - , [170, '*'] - , [171, '+'] - , [172, '|'] - , [174, '{'] - , [175, '}'] - , [176, '~'] - , [186, ';'] - , [187, '='] - , [188, ','] - , [189, '-'] - , [190, '.'] - , [191, '/'] - , [192, '`'] - , [219, '['] - , [220, '\\'] - , [221, ']'] - , [222, '\''] -]); + [NaN, null] + , [17, 'Ctrl'] + , [91, 'Super'] + , [18, 'Alt'] + , [16, 'Shift'] + , [9, 'Tab'] + , [48, '0'] + , [49, '1'] + , [50, '2'] + , [51, '3'] + , [52, '4'] + , [53, '5'] + , [54, '6'] + , [55, '7'] + , [56, '8'] + , [57, '9'] + , [65, 'A'] + , [66, 'B'] + , [67, 'C'] + , [68, 'D'] + , [69, 'E'] + , [70, 'F'] + , [71, 'G'] + , [72, 'H'] + , [73, 'I'] + , [74, 'J'] + , [75, 'K'] + , [76, 'L'] + , [77, 'M'] + , [78, 'N'] + , [79, 'O'] + , [80, 'P'] + , [81, 'Q'] + , [82, 'R'] + , [83, 'S'] + , [84, 'T'] + , [85, 'U'] + , [86, 'V'] + , [87, 'W'] + , [88, 'X'] + , [89, 'Y'] + , [90, 'Z'] + , [112, 'F1'] + , [113, 'F2'] + , [114, 'F3'] + , [115, 'F4'] + , [116, 'F5'] + , [117, 'F6'] + , [118, 'F7'] + , [119, 'F8'] + , [120, 'F9'] + , [121, 'F10'] + , [122, 'F11'] + , [123, 'F12'] + , [124, 'F13'] + , [125, 'F14'] + , [126, 'F15'] + , [127, 'F16'] + , [128, 'F17'] + , [129, 'F18'] + , [130, 'F19'] + , [131, 'F20'] + , [132, 'F21'] + , [133, 'F22'] + , [134, 'F23'] + , [135, 'F24'] + , [171, 'Plus'] + , [32, 'Space'] + , [8, 'Backspace'] + , [46, 'Delete'] + , [45, 'Insert'] + , [13, 'Enter'] + , [38, 'Up'] + , [40, 'Down'] + , [37, 'Left'] + , [39, 'Right'] + , [36, 'Home'] + , [35, 'End'] + , [33, 'PageUp'] + , [34, 'PageDown'] + , [27, 'Esc'] + , [183, 'VolumeUp'] + , [182, 'VolumeDown'] + , [181, 'VolumeMute'] + , [250, 'Play'] + , [19, 'Pause'] + , [58, ':'] + , [60, '<'] + , [62, '>'] + , [63, '?'] + , [64, '@'] + , [161, '!'] + , [162, '"'] + , [164, '$'] + , [165, '%'] + , [166, '&'] + , [167, '_'] + , [168, '('] + , [169, ')'] + , [170, '*'] + , [171, '+'] + , [172, '|'] + , [174, '{'] + , [175, '}'] + , [176, '~'] + , [186, ';'] + , [187, '='] + , [188, ','] + , [189, '-'] + , [190, '.'] + , [191, '/'] + , [192, '`'] + , [219, '['] + , [220, '\\'] + , [221, ']'] + , [222, '\''] +]) var no_metas = [ - 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90 -]; + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90 +] module.exports.getCharFromCode = function( code ){ - return (map.get( parseInt(code, 10) ) || null); + return (map.get( parseInt(code, 10) ) || null) } module.exports.isMeta = function( key ){ - // Key can be the positional code or it's key counterpart - return (map.has( key )?(no_metas.indexOf( key ) !== -1):(no_metas.indexOf(Object.keys(map.values())[ key ]))) + // Key can be the positional code or it's key counterpart + return (map.has( key )?(no_metas.indexOf( key ) !== -1):(no_metas.indexOf(Object.keys(map.values())[ key ]))) } \ No newline at end of file diff --git a/ui/js/models/Model.js b/ui/js/models/Model.js index 8bbe9fe..f10fb6a 100755 --- a/ui/js/models/Model.js +++ b/ui/js/models/Model.js @@ -2,85 +2,85 @@ var _statOrNull = function( path ){ - let ret = null; - try{ ret = FS.lstatSync( path ) } - catch( e ){} - finally{ return ret } + let ret = null; + try{ ret = FS.lstatSync( path ) } + catch( e ){} + finally{ return ret } } var _getAbsolutePath = function( defaultPath, path ){ - let ret = null; - let stat = null; - // Check if its absolute yet - if( path.indexOf('/') === 0 ){ - // If it does not exist - ret = path; - }else{ - ret = upath.join( defaultPath, path ); - } - stat = _statOrNull( ret ); - if( stat === null ){ - ret = null; - } - - return ret; + let ret = null + let stat = null + // Check if its absolute yet + if( path.indexOf('/') === 0 ){ + // If it does not exist + ret = path + }else{ + ret = upath.joinSafe( defaultPath, path ) + } + stat = _statOrNull( ret ) + if( stat === null ){ + ret = null + } + return ret } var proto = { - defaults: { - name: '', - text: '', - icon: 'application.png', - exec: '', - location: '', - type: '_system_', - scut: '', - selected: false, - launching: false - }, + defaults: { + name: '', + text: '', + icon: 'application.png', + exec: '', + location: '', + type: '_system_', + scut: '', + selected: false, + launching: false + }, - initialize: function( model ){ - // Validate icon - var path = _getAbsolutePath( ASSETS_PATH, model.icon ) || upath.join( ASSETS_PATH + 'application.png'); - this.set('icon', path) - }, + initialize: function( model ){ + // Validate icon + var path = _getAbsolutePath( ASSETS_PATH, model.icon ) || upath.join( ASSETS_PATH + 'application.png') + this.set('icon', path) + }, - select: function(){ - this.set({ selected: !this.get('selected') }); - }, + select: function(){ + this.set({ selected: !this.get('selected') }) + }, - launch: function( query ){ - this.save({ - selected: true, - launching: true - }, { data: { req: 'launch', data: { app: this.extract(), query: query } }}); - console.log('launch on model'); - }, + launch: function( query ){ + this.save({ + selected: true, + launching: true + }, { data: { req: 'launch', data: { app: this.extract(), query: query } }}) + console.log('launch on model') + }, - // TODO => Validation on object extension - validate: function(){}, + // TODO => Validation on object extension + validate: function(){}, - extract: function(){ - return ({ - name: this.get('name'), - text: this.get('text'), - icon: this.get('icon'), - exec: this.get('exec'), - type: this.get('type'), - location: this.get('location') - }); - } + extract: function(){ + return ({ + name: this.get('name'), + text: this.get('text'), + icon: this.get('icon'), + exec: this.get('exec'), + type: this.get('type'), + location: this.get('location') + }) + } } + module.exports = function( obj ){ - var ret = {} - _.extend( ret, proto ); - for( var prop in obj ){ - if( ret.hasOwnProperty( prop ) ){ - ret[ prop ] = obj[ prop ]; - } - } - return ret; + let ret = {} + _.extend( ret, proto ) + for( let prop in obj ){ + if( ret.hasOwnProperty( prop ) ){ + ret[ prop ] = obj[ prop ] + } + } + return ret } diff --git a/ui/js/models/item-model.js b/ui/js/models/item-model.js index 5a84bc6..90e4471 100755 --- a/ui/js/models/item-model.js +++ b/ui/js/models/item-model.js @@ -1,17 +1,17 @@ 'use strict' -var app = app || {}; -var Model = require(JS_PATH + '/models/Model'); +var app = app || {} +var Model = require(JS_PATH + '/models/Model') var item = new Model({ - validate: function( values, xhr ){ - console.log('Model validate', values); - // We don't update if there was no change on the - // 'recordable' fields, in this case, the shortcut. - // Also, we only update on settings screen. - if( xhr.req && xhr.req === 'settings' ){ - return values.scut === this.get('scut'); - } - } + validate: function( values, xhr ){ + // console.log('Model validate', values) + // We don't update if there was no change on the + // 'recordable' fields, in this case, the shortcut. + // Also, we only update on settings screen. + if( xhr.req && xhr.req === 'settings' ){ + return values.scut === this.get('scut') + } + } }) -app.Item = Backbone.Model.extend( item ); \ No newline at end of file +app.Item = Backbone.Model.extend( item ) \ No newline at end of file diff --git a/ui/js/models/item-settings-model.js b/ui/js/models/item-settings-model.js index 267dd4d..66612de 100755 --- a/ui/js/models/item-settings-model.js +++ b/ui/js/models/item-settings-model.js @@ -1,20 +1,20 @@ 'use strict' -var app = app || {}; -var Model = require('./Model'); -var item = Model.use({ - validate: function( values, xhr ){ - //console.log('Model validate' ); - // We don't update if there was no change on the - // 'recordable' fields, in this case, the shortcut or the url. - // Also, we only update on settings screen. - if( xhr.data && xhr.data.req ){ - if( xhr.data.req === 'changeAppShortcut' ){ - return (values.scut === this.get('scut')); - }else if( xhr.data.req === 'changeAppLocation' ){ - return (values.location === this.get('location')); - } - } - } +var app = app || {} +var Model = require(JS_PATH + '/models/Model') +var item = new Model({ + validate: function( values, xhr ){ + // console.log('Item settings Model validate' ); + // We don't update if there was no change on the + // 'recordable' fields, in this case, the shortcut or the url. + // Also, we only update on settings screen. + if( xhr.data && xhr.data.req ){ + if( xhr.data.req === 'changeAppShortcut' ){ + return (values.scut === this.get('scut')) + }else if( xhr.data.req === 'changeAppLocation' ){ + return (values.location === this.get('location')) + } + } + } }) app.Item = Backbone.Model.extend( item ) \ No newline at end of file diff --git a/ui/js/views/app-settings-view.js b/ui/js/views/app-settings-view.js index 0461fb8..45f9b9f 100755 --- a/ui/js/views/app-settings-view.js +++ b/ui/js/views/app-settings-view.js @@ -4,79 +4,78 @@ var app = app || {}; app.AppView = Backbone.View.extend({ - el: '#pref-panel', - - events:{ - 'click #cancel-rec-btn': '_stopRecording' - }, - - initialize: function(){ - this.$table = $('#item-list'); - this.$prefPanel = $('#pref-panel'); - this.$prefPanelHeadTxt = $('#pref-panel-heading-txt'); - this.$cancelRecBtn = $('#cancel-rec-btn'); - this.$cancelRecBtn.hide(); - - this.baseText = this.$prefPanelHeadTxt.text(); - this.rectText = 'Press keys for the new shortcut'; - - this.listenTo( app.Items, 'add', this.addOne ); - this.listenTo( app.Items, 'reset', this.addAll ); - - this.listenTo( app.Items, 'change:state', this.stateChange ); - this.listenTo( app.Items, 'change:launching', this.clearAll ); - this.listenTo( app.Items, 'all', this.render ); - - app.Items.fetch({ data: { req: 'settings' }}); - }, - - addOne: function( item ){ - var view = new app.ItemView({ model: item }); - this.$table.append( view.render().el ); - }, - - addAll: function(){ - this.$table.html(''); - app.Items.each( this.addOne, this ); - }, - - stateChange: function(){ - var selected = app.Items.selected(); - if( selected !== undefined ){ - if( app.STATE === STATES.IDLE ){ - this._startRecording(); - }else{ - this._stopRecording(); - } - } - }, - - _startRecording: function(){ - this.$prefPanel.removeClass('panel-default'); - this.$prefPanel.addClass('panel-danger'); - this.$prefPanelHeadTxt.text( this.rectText ); - this.$cancelRecBtn.show(); - app.STATE = STATES.REC; - }, - - _stopRecording: function( cancel ){ - app.STATE = STATES.IDLE; - this.$prefPanel.removeClass('panel-danger'); - this.$prefPanel.addClass('panel-default'); - this.$prefPanelHeadTxt.text( this.baseText ); - this.$cancelRecBtn.hide(); - if( cancel !== undefined ){ - app.Items.selected().set({ selected: false, state: STATES.IDLE }); - } - }, - - clearAll: function(){ - // We are launching an application - // 1. Send launch command to backend - // 2. Reset search keyword (maybe set tooltip to previous search??) - // 3. Hide all UI - app.Items.reset( null ); - return false; - } - + el: '#pref-panel', + + events:{ + 'click #cancel-rec-btn': '_stopRecording' + }, + + initialize: function(){ + this.$table = $('#item-list') + this.$prefPanel = $('#pref-panel') + this.$prefPanelHeadTxt = $('#pref-panel-heading-txt') + this.$cancelRecBtn = $('#cancel-rec-btn') + this.$cancelRecBtn.hide() + + this.baseText = this.$prefPanelHeadTxt.text() + this.rectText = 'Press keys for the new shortcut' + + this.listenTo( app.Items, 'add', this.addOne ) + this.listenTo( app.Items, 'reset', this.addAll ) + + this.listenTo( app.Items, 'change:state', this.stateChange ) + this.listenTo( app.Items, 'change:launching', this.clearAll ) + this.listenTo( app.Items, 'all', this.render ) + + app.Items.fetch({ data: { req: 'settings' }}) + }, + + addOne: function( item ){ + var view = new app.ItemView({ model: item }) + this.$table.append( view.render().el ) + }, + + addAll: function(){ + this.$table.html('') + app.Items.each( this.addOne, this ) + }, + + stateChange: function(){ + var selected = app.Items.selected() + if( selected !== undefined ){ + if( app.STATE === STATES.IDLE ){ + this._startRecording() + }else{ + this._stopRecording() + } + } + }, + + _startRecording: function(){ + this.$prefPanel.removeClass('panel-default') + this.$prefPanel.addClass('panel-danger') + this.$prefPanelHeadTxt.text( this.rectText ) + this.$cancelRecBtn.show() + app.STATE = STATES.REC + }, + + _stopRecording: function( cancel ){ + app.STATE = STATES.IDLE + this.$prefPanel.removeClass('panel-danger') + this.$prefPanel.addClass('panel-default') + this.$prefPanelHeadTxt.text( this.baseText ) + this.$cancelRecBtn.hide() + if( cancel !== undefined ){ + app.Items.selected().set({ selected: false, state: STATES.IDLE }) + } + }, + + clearAll: function(){ + // We are launching an application + // 1. Send launch command to backend + // 2. Reset search keyword (maybe set tooltip to previous search??) + // 3. Hide all UI + app.Items.reset( null ) + return false + } }) \ No newline at end of file diff --git a/ui/js/views/items-settings-view.js b/ui/js/views/items-settings-view.js index 4fc5c20..f900dd5 100755 --- a/ui/js/views/items-settings-view.js +++ b/ui/js/views/items-settings-view.js @@ -1,174 +1,156 @@ 'use strict' -var app = app || {}; +var app = app || {} app.ItemView = Backbone.View.extend({ - tagName: 'tr', - - template: _.template( $('#item-template').html() ), - - events: { - 'click .btn': 'click' - }, - - initialize: function(){ - - this.listenTo( this.model, 'change', this.render ); - this.listenTo( this.model, 'destroy', this.remove ); - this.listenTo( this.model, 'appendShortcut', this.appendShortcut ); - this.listenTo( this.model, 'saveShortcut', this.saveShortcut ); - - }, - - render: function(){ - - this.$el.html( this.template(this.model.toJSON()) ); - this.$el.toggleClass('selected', this.model.get('selected')); - - // Reverse alt input and normal input if we are on alt rec type - //this.$input = this.$('.in'); - //this.$altIn = this.$('.altIn'); - var onRec = this.model.get('recording'); - if( onRec ){ - this.$recBtn = this.$('#' + onRec); - }else{ - this.$recBtn = this.$('.in'); - } - - var state = this.model.get('state'); - if( - state !== undefined && - this.$recBtn.length > 0 && - state === STATES.REC - ){ - this.$recBtn.removeClass('btn-default'); - this.$recBtn.addClass('btn-danger'); - this.$recBtn.text('...'); - } - - return this; - - }, - - appendShortcut: function( key, event ){ - //console.log('appendShortcut', key); - // Validate shortcut, - // if we are on an internal app shortcut will come from a button, - // else it'll come from an input text - // on button input we allow meta keys, on input text we do not - // also, as text input handles adding data itself, no need to do anything - if( key !== null ){ - if( this.model.get('type') === '_system_' ){ - event.preventDefault(); - var prev = this.$recBtn.text().trim(); - if( prev.indexOf( key ) === -1 ){ - // Only append if we not present on shortcut - this.$recBtn.text( ((prev !== '' && prev !== '...')?prev + ' + ':'') + key ); - } - }else if( event.which === ENTER_KEY || event.which === ESCAPE_KEY ){ - // Exit rec - event.preventDefault(); - if( event.which === ENTER_KEY ){ - this.model.trigger('saveShortcut'); - } - this.model.set({ state: STATES.IDLE, recording: null }); - } - } - - }, - - saveShortcut: function(){ - - var toSave = { - selected: false, - state: STATES.IDLE - }; - var opts = { - patch: true, - wait: true, - data: { req: '' } - }; - var saveValue = this.$recBtn.text() || this.$recBtn.val(); - var type = this.getRecType(); - - if( type === 'normal' ){ - toSave['scut'] = saveValue; - opts.data.req = 'changeAppShortcut'; - }else{ - toSave['location'] = saveValue; - opts.data.req = 'changeAppLocation'; - } - - console.log('Saving', toSave); - this.model.save( toSave, opts ); - - }, - - getRecType: function(){ - if( this.$recBtn.attr('id') === ('btn-' + this.model.get('id')) ){ - return 'normal'; - }else{ - return 'alt'; - } - }, - - click: function( event ){ - - // Unselect previous recording view - function unselect(){ - - var sel = app.Items.selected(); - - if( sel ){ - - sel.set({ selected: false, state: STATES.IDLE }); - app.STATE = STATES.IDLE; - - } - - } - - if( this.$('.in').attr('id') === event.target.id || this.$('.altIn').attr('id') === event.target.id ){ - - unselect(); - - if( this.$('.in').attr('id') === event.target.id ){ - this.$recBtn = this.$('.in'); - }else{ - this.$recBtn = this.$('.altIn'); - } - - if( app.STATE === STATES.IDLE ){ - var btnId = this.$recBtn.attr('id'); - this.model.set({ selected: true, state: STATES.REC, 'recording': btnId }); - - if( this.model.get('type') !== '_system_' ){ - - this.$recBtn.replaceWith($('', { - "type": 'text', - 'placeholder': 'Shortcut', - 'id': this.$recBtn.attr('id'), - 'class': this.$recBtn.attr('class') - })); - this.$recBtn = this.$('#' + btnId); - this.$recBtn.focus(); - - } - }else if( this.model.get('type') === '_system_' ){ - - this.model.set({ state: STATES.IDLE, recording: null }); - - } - - } - - }, - - clear: function(){ - - this.model.destroy(); - - } - + tagName: 'tr', + + template: _.template( $('#item-template').html() ), + + events: { + 'click .btn': 'click' + }, + + initialize: function(){ + + this.listenTo( this.model, 'change', this.render ) + this.listenTo( this.model, 'destroy', this.remove ) + this.listenTo( this.model, 'appendShortcut', this.appendShortcut ) + this.listenTo( this.model, 'saveShortcut', this.saveShortcut ) + }, + + render: function(){ + + this.$el.html( this.template(this.model.toJSON()) ) + this.$el.toggleClass('selected', this.model.get('selected')) + + // Reverse alt input and normal input if we are on alt rec type + //this.$input = this.$('.in'); + //this.$altIn = this.$('.altIn'); + var onRec = this.model.get('recording') + if( onRec ){ + this.$recBtn = this.$('#' + onRec) + }else{ + this.$recBtn = this.$('.in') + } + + var state = this.model.get('state') + if( + state !== undefined && + this.$recBtn.length > 0 && + state === STATES.REC + ){ + this.$recBtn.removeClass('btn-default') + this.$recBtn.addClass('btn-danger') + this.$recBtn.text('...') + } + + return this + }, + + appendShortcut: function( key, event ){ + //console.log('appendShortcut', key); + // Validate shortcut, + // if we are on an internal app shortcut will come from a button, + // else it'll come from an input text + // on button input we allow meta keys, on input text we do not + // also, as text input handles adding data itself, no need to do anything + if( key !== null ){ + if( this.model.get('type') === '_system_' ){ + event.preventDefault() + var prev = this.$recBtn.text().trim() + if( prev.indexOf( key ) === -1 ){ + // Only append if we not present on shortcut + this.$recBtn.text( ((prev !== '' && prev !== '...')?prev + ' + ':'') + key ) + } + }else if( event.which === ENTER_KEY || event.which === ESCAPE_KEY ){ + // Exit rec + event.preventDefault() + if( event.which === ENTER_KEY ){ + this.model.trigger('saveShortcut') + } + this.model.set({ state: STATES.IDLE, recording: null }) + } + } + }, + + saveShortcut: function(){ + + let toSave = this.model.extract() + let opts = { + patch: true, + wait: true, + data: { req: '' } + } + let saveValue = this.$recBtn.text() || this.$recBtn.val() + let type = this.getRecType() + + if( type === 'normal' ){ + toSave['scut'] = saveValue + opts.data.req = 'changeAppShortcut' + }else{ + toSave['location'] = saveValue + opts.data.req = 'changeAppLocation' + } + + opts.data.data = toSave + + this.model.save( toSave, opts ) + }, + + getRecType: function(){ + if( this.$recBtn.attr('id') === ('btn-' + this.model.get('id')) ){ + return 'normal' + }else{ + return 'alt' + } + }, + + click: function( event ){ + + // Unselect previous recording view + function unselect(){ + + var sel = app.Items.selected() + + if( sel ){ + sel.set({ selected: false, state: STATES.IDLE }) + app.STATE = STATES.IDLE + } + } + + if( this.$('.in').attr('id') === event.target.id || this.$('.altIn').attr('id') === event.target.id ){ + + unselect() + + if( this.$('.in').attr('id') === event.target.id ){ + this.$recBtn = this.$('.in') + }else{ + this.$recBtn = this.$('.altIn') + } + + if( app.STATE === STATES.IDLE ){ + var btnId = this.$recBtn.attr('id') + this.model.set({ selected: true, state: STATES.REC, 'recording': btnId }) + + if( this.model.get('type') !== '_system_' ){ + this.$recBtn.replaceWith($('', { + "type": 'text', + 'placeholder': 'Shortcut', + 'id': this.$recBtn.attr('id'), + 'class': this.$recBtn.attr('class') + })); + this.$recBtn = this.$('#' + btnId) + this.$recBtn.focus() + } + }else if( this.model.get('type') === '_system_' ){ + this.model.set({ state: STATES.IDLE, recording: null }) + } + } + }, + + clear: function(){ + this.model.destroy() + } }) \ No newline at end of file