Browse Source

Merge branch 'testing'

This still has the same issues with actually removing old data as
upstream. Electron issues and other requests have gone unanswered, so
pushing to master.
pull/3202/head
TheGoddessInari 7 years ago
parent
commit
1e7cf2612f
  1. 1
      .travis.yml
  2. 2
      README.md
  3. 2
      app.js
  4. 3
      app.json
  5. 7
      app/Application.js
  6. 284
      app/package-lock.json
  7. 8
      app/package.json
  8. 256
      app/ux/Auth0.js
  9. 65
      app/ux/FileBackup.js
  10. 67
      app/view/main/Main.js
  11. 120
      app/view/main/MainController.js
  12. 1
      app/view/preferences/PreferencesController.js
  13. 2
      appveyor.yml
  14. 16
      electron/main.js
  15. 8
      electron/menu.js
  16. 4
      env-sample.js
  17. 171
      package-lock.json
  18. 15
      package.json

1
.travis.yml

@ -51,7 +51,6 @@ install:
unzip SenchaCmd-${SENCHA_VER}-osx-no_jre.app.zip;
SenchaCmd-${SENCHA_VER}-osx-no_jre.app/Contents/MacOS/JavaApplicationStub -q -Dall=true;
fi
- cp env-sample.js env.js
before_script:
- export PATH=~/bin/Sencha/Cmd/${SENCHA_VER}:${PATH}
- export CURRENT_BRANCH=${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH}

2
README.md

@ -217,8 +217,6 @@ These **need** to be added to your PATH.
```shell
git clone https://github.com/TheGoddessInari/rambox.git
cd rambox
cp env-sample.js env.js
# update env.js with your auth0 details.
npm install
npm run repack:win64
```

2
app.js

@ -1,5 +1,3 @@
var auth0, lock; // Auth0 vars
// Sencha App
Ext.setGlyphFontFamily('FontAwesome');
Ext.application({

3
app.json

@ -106,9 +106,6 @@
{
"path": "resources/js/loadscreen.js"
},
{
"path": "env.js"
},
{
"path": "app.js",
"bundle": true

7
app/Application.js

@ -4,7 +4,7 @@ Ext.define('Rambox.Application', {
,name: 'Rambox'
,requires: [
'Rambox.ux.Auth0'
'Rambox.ux.FileBackup'
,'Rambox.util.MD5'
,'Ext.window.Toast'
,'Ext.util.Cookies'
@ -27,14 +27,11 @@ Ext.define('Rambox.Application', {
,launch: function () {
// Load language for Ext JS library
Ext.Loader.loadScript({url: Ext.util.Format.format("ext/packages/ext-locale/build/ext-locale-{0}.js", localStorage.getItem('locale-auth0') || 'en')});
Ext.Loader.loadScript({url: Ext.util.Format.format("ext/packages/ext-locale/build/ext-locale-{0}.js", localStorage.getItem('locale') || 'en')});
// Initialize Auth0
if ( auth0Cfg.clientID !== '' && auth0Cfg.domain !== '' ) Rambox.ux.Auth0.init();
// Set cookies to help Tooltip.io messages segmentation
Ext.util.Cookies.set('version', require('electron').remote.app.getVersion());
if ( Ext.util.Cookies.get('auth0') === null ) Ext.util.Cookies.set('auth0', false);
// Check for updates
if ( require('electron').remote.process.argv.indexOf('--without-update') === -1 ) Rambox.app.checkUpdate(true);

284
app/package-lock.json generated

@ -0,0 +1,284 @@
{
"name": "Rambox",
"version": "0.5.18",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"applescript": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/applescript/-/applescript-1.0.0.tgz",
"integrity": "sha1-u4evVoytA0pOSMS9r2Bno6JwExc="
},
"auto-launch-patched": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/auto-launch-patched/-/auto-launch-patched-5.0.2.tgz",
"integrity": "sha1-8a5oPIwTG93Pr68YHuMsqGbwejM=",
"requires": {
"applescript": "^1.0.0",
"mkdirp": "^0.5.1",
"path-is-absolute": "^1.0.0",
"untildify": "^3.0.2",
"winreg": "1.2.2"
}
},
"conf": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/conf/-/conf-2.0.0.tgz",
"integrity": "sha512-iCLzBsGFi8S73EANsEJZz0JnJ/e5VZef/kSaxydYZLAvw0rFNAUx5R7K5leC/CXXR2mZfXWhUvcZOO/dM2D5xg==",
"requires": {
"dot-prop": "^4.1.0",
"env-paths": "^1.0.0",
"make-dir": "^1.0.0",
"pkg-up": "^2.0.0",
"write-file-atomic": "^2.3.0"
}
},
"dot-prop": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
"integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
"requires": {
"is-obj": "^1.0.0"
}
},
"electron-context-menu": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/electron-context-menu/-/electron-context-menu-0.10.0.tgz",
"integrity": "sha512-8dv+cOIpGuSmxAje3qdydd7kzfUTHBiEq6V80CqW76P5M92sEl0WpHHhNKxKFZ2L+mNr5Lp4R9qGjyfDiYI8yg==",
"requires": {
"electron-dl": "^1.2.0",
"electron-is-dev": "^0.3.0"
}
},
"electron-dl": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/electron-dl/-/electron-dl-1.12.0.tgz",
"integrity": "sha512-UMc2CL45Ybpvu66LDPYzwmDRmYK4Ivz+wdnTM0eXcNMztvQwhixAk2UPme1c7McqG8bAlKEkQpZn3epmQy4EWg==",
"requires": {
"ext-name": "^5.0.0",
"pupa": "^1.0.0",
"unused-filename": "^1.0.0"
}
},
"electron-is-dev": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz",
"integrity": "sha1-FOb9pcaOnk7L7/nM8DfL18BcWv4="
},
"electron-store": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/electron-store/-/electron-store-2.0.0.tgz",
"integrity": "sha512-1WCFYHsYvZBqDsoaS0Relnz0rd81ZkBAI0Fgx7Nq2UWU77rSNs1qxm4S6uH7TCZ0bV3LQpJFk7id/is/ZgoOPA==",
"requires": {
"conf": "^2.0.0"
}
},
"env-paths": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz",
"integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA="
},
"ext-list": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz",
"integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==",
"requires": {
"mime-db": "^1.28.0"
}
},
"ext-name": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz",
"integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==",
"requires": {
"ext-list": "^2.0.0",
"sort-keys-length": "^1.0.0"
}
},
"find-up": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
"requires": {
"locate-path": "^2.0.0"
}
},
"graceful-fs": {
"version": "4.1.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
"integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
},
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
},
"is-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
},
"is-plain-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
"integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
},
"locate-path": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
"requires": {
"p-locate": "^2.0.0",
"path-exists": "^3.0.0"
}
},
"make-dir": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
"integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
"requires": {
"pify": "^3.0.0"
}
},
"mime": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
"integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg=="
},
"mime-db": {
"version": "1.35.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz",
"integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg=="
},
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
},
"mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"requires": {
"minimist": "0.0.8"
}
},
"modify-filename": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz",
"integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE="
},
"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="
},
"p-limit": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
"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=",
"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="
},
"path-exists": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
"pify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
},
"pkg-up": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
"integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
"requires": {
"find-up": "^2.1.0"
}
},
"pupa": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/pupa/-/pupa-1.0.0.tgz",
"integrity": "sha1-mpVopa9+ZXuEYqbp1TKHQ1YM7/Y="
},
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
},
"sort-keys": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
"integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
"requires": {
"is-plain-obj": "^1.0.0"
}
},
"sort-keys-length": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz",
"integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=",
"requires": {
"sort-keys": "^1.0.0"
}
},
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
"requires": {
"os-tmpdir": "~1.0.2"
}
},
"untildify": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz",
"integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA=="
},
"unused-filename": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-1.0.0.tgz",
"integrity": "sha1-00CID3GuIRXrqhMlvvBcxmhEacY=",
"requires": {
"modify-filename": "^1.1.0",
"path-exists": "^3.0.0"
}
},
"winreg": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.2.tgz",
"integrity": "sha1-hQmvo7ccW70RCm18YkfsZ3NsWY8="
},
"write-file-atomic": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
"integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
"requires": {
"graceful-fs": "^4.1.11",
"imurmurhash": "^0.1.4",
"signal-exit": "^3.0.2"
}
}
}
}

8
app/package.json

@ -29,13 +29,11 @@
"author": "TheGoddessInari <[email protected]>",
"license": "GPL-3.0",
"dependencies": {
"auth0-js": "^8.12.3",
"auth0-lock": "^10.22.0",
"auto-launch-patched": "5.0.2",
"electron-store": "2.0.0",
"electron-context-menu": "0.10.0",
"electron-store": "^2.0.0",
"electron-context-menu": "^0.10.0",
"electron-is-dev": "^0.3.0",
"mime": "^2.3.1",
"tmp": "0.0.33"
"tmp": "^0.0.33"
}
}

256
app/ux/Auth0.js

@ -1,256 +0,0 @@
Ext.define('Rambox.ux.Auth0', {
singleton: true
// private
,lock: null
,auth0: null
,backupCurrent: false
,init: function() {
var me = this;
var Auth0Lock = require('auth0-lock')['default'];
var Auth0 = require('auth0-js');
// Auth0 Config
me.lock = new Auth0Lock(auth0Cfg.clientID, auth0Cfg.domain, {
autoclose: true
,autofocus: true
,auth: {
redirect: false
,params: {scope: 'openid offline_access'}
}
,theme: {
logo: 'resources/Icon.png'
,primaryColor: '#0675A0'
}
,languageDictionary: {
title: 'Rambox-OS Account'
}
,popupOptions: {
nodeIntegration: 'no'
}
,language: localStorage.getItem('locale-auth0') === null ? 'en' : localStorage.getItem('locale-auth0')
});
me.auth0 = new Auth0.WebAuth({ clientID: auth0Cfg.clientID, domain : auth0Cfg.domain });
me.defineEvents();
}
,defineEvents: function() {
var me = this;
me.lock.on("authenticated", function(authResult) {
me.lock.getProfile(authResult.idToken, function(err, profile) {
if ( err ) {
if ( err.error === 401 || err.error === 'Unauthorized' ) return me.renewToken(me.checkConfiguration);
Ext.Msg.hide();
return Ext.Msg.show({
title: 'Error'
,message: 'There was an error getting the profile: ' + err.error_description
,icon: Ext.Msg.ERROR
,buttons: Ext.Msg.OK
});
}
// Display a spinner while waiting
Ext.Msg.wait(locale['app.window[29]'], locale['app.window[28]']);
// Set cookies to help Tooltip.io messages segmentation
Ext.util.Cookies.set('auth0', true);
// User is logged in
// Save the profile and JWT.
localStorage.setItem('profile', JSON.stringify(profile));
localStorage.setItem('id_token', authResult.idToken);
localStorage.setItem('refresh_token', authResult.refreshToken);
if ( !Ext.isEmpty(profile.user_metadata) && !Ext.isEmpty(profile.user_metadata.services) && !me.backupCurrent ) {
Ext.each(profile.user_metadata.services, function(s) {
var service = Ext.create('Rambox.model.Service', s);
service.save();
Ext.getStore('Services').add(service);
});
require('electron').remote.getCurrentWindow().reload();
}
Ext.Msg.hide();
Ext.cq1('app-main').getViewModel().set('username', profile.name);
Ext.cq1('app-main').getViewModel().set('avatar', profile.picture);
});
});
}
,backupConfiguration: function(callback) {
var me = this;
Ext.Msg.wait('Saving backup...', 'Please wait...');
// Getting all services
var lastupdate = (new Date()).toJSON();
var services = [];
Ext.getStore('Services').each(function(service) {
var s = Ext.clone(service);
delete s.data.id;
delete s.data.zoomLevel;
services.push(s.data);
});
Ext.Ajax.request({
url: 'https://rambox.auth0.com/api/v2/users/'+Ext.decode(localStorage.getItem('profile')).user_id
,method: 'PATCH'
,headers: { authorization: "Bearer " + localStorage.getItem('id_token') }
,jsonData: { user_metadata: { services: services, services_lastupdate: lastupdate } }
,success: function(response) {
Ext.Msg.hide();
// Save the last update in localStorage
var profile = Ext.decode(localStorage.getItem('profile'));
if ( !profile.user_metadata ) profile.user_metadata = {};
profile.user_metadata.services_lastupdate = lastupdate;
localStorage.setItem('profile', Ext.encode(profile));
Ext.cq1('app-main').getViewModel().set('last_sync', new Date(lastupdate).toUTCString());
Ext.toast({
html: '<i class="fa fa-check fa-3x fa-pull-left" aria-hidden="true"></i> Your configuration were successfully backed up.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
});
if ( Ext.isFunction(callback) ) callback.bind(me)();
}
,failure: function(response) {
if ( response.status === 401 ) return me.renewToken(me.backupConfiguration);
Ext.Msg.hide();
Ext.toast({
html: '<i class="fa fa-times fa-3x fa-pull-left" aria-hidden="true"></i> Error occurred when trying to backup your configuration.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
});
if ( Ext.isFunction(callback) ) callback.bind(me)();
console.error(response);
}
});
}
,restoreConfiguration: function() {
var me = this;
me.lock.getProfile(localStorage.getItem('id_token'), function (err, profile) {
if ( err ) {
if ( err.error === 401 || err.error === 'Unauthorized' ) return me.renewToken(me.checkConfiguration);
return Ext.Msg.show({
title: 'Error'
,message: 'There was an error getting the profile: ' + err.error_description
,icon: Ext.Msg.ERROR
,buttons: Ext.Msg.OK
});
}
// First we remove all current services
Ext.cq1('app-main').getController().removeAllServices(false, function() {
Ext.each(profile.user_metadata.services, function(s) {
var service = Ext.create('Rambox.model.Service', s);
service.save();
Ext.getStore('Services').add(service);
});
require('electron').remote.getCurrentWindow().reload();
});
});
}
,checkConfiguration: function() {
var me = this;
me.lock.getProfile(localStorage.getItem('id_token'), function (err, profile) {
if ( err ) {
if ( err.error === 401 || err.error === 'Unauthorized' ) return me.renewToken(me.checkConfiguration);
return Ext.Msg.show({
title: 'Error'
,message: 'There was an error getting the profile: ' + err.error_description
,icon: Ext.Msg.ERROR
,buttons: Ext.Msg.OK
});
}
if ( !profile.user_metadata ) {
Ext.toast({
html: 'You don\'t have any backup yet.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
});
return;
}
if ( Math.floor(new Date(profile.user_metadata.services_lastupdate) / 1000) > Math.floor(new Date(Ext.decode(localStorage.getItem('profile')).user_metadata.services_lastupdate) / 1000) ) {
Ext.toast({
html: 'Your settings are out of date.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
});
} else {
Ext.toast({
html: 'Latest backup is already applied.'
,title: 'Synchronize Configuration'
,width: 300
,align: 't'
,closable: false
});
}
});
}
,renewToken: function(callback) {
var me = this;
Ext.Ajax.request({
url: 'https://rambox.auth0.com/delegation'
,method: 'POST'
,jsonData: {
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer'
,client_id: auth0Cfg.clientID
,refresh_token: localStorage.getItem('refresh_token')
,api_type: 'app'
}
,success: function(response) {
var json = Ext.decode(response.responseText);
localStorage.setItem('id_token', json.id_token);
if ( Ext.isFunction(callback) ) callback.bind(me)();
}
,failure: function(response) {
console.error(response);
}
});
}
,login: function() {
var me = this;
me.lock.show();
}
,logout: function() {
var me = this;
localStorage.removeItem('profile');
localStorage.removeItem('id_token');
localStorage.removeItem('refresh_token');
// Set cookies to help Tooltip.io messages segmentation
Ext.util.Cookies.set('auth0', false);
}
});

65
app/ux/FileBackup.js

@ -0,0 +1,65 @@
const remote = require('electron').remote;
const dialog = remote.dialog;
const app = remote.app;
const fs = require('fs');
const path = require('path');
const userPath = app.getPath('userData');
const defaultFileName = 'rambox-backup.json';
const myDefaultPath = userPath + path.sep + defaultFileName;
Ext.define('Rambox.ux.FileBackup', {
singleton: true,
BackupConfiguration: function (callback) {
var me = this;
let services = [];
Ext.getStore('Services').each(function(service) {
const s = Ext.clone(service);
delete s.data.id;
delete s.data.zoomLevel;
services.push(s.data);
});
const json_string = JSON.stringify(services, null, 4);
dialog.showSaveDialog({
defaultPath: myDefaultPath
}, function(filename, bookmark) {
if (!filename) return;
fs.writeFile(filename, json_string, function(err) {
if (err) {
console.log(err);
}
});
});
if (Ext.isFunction(callback)) callback.bind(me)();
},
restoreConfiguration: function () {
var me = this;
dialog.showOpenDialog({
defaultPath: myDefaultPath,
properties: ['openFile']
}, function(filePaths, bookmarks) {
if (filePaths.length === 1) {
const filePath = filePaths[0];
console.log(filePath);
fs.readFile(filePath, function (err, data) {
if (err) {
console.log(err);
}
const services = JSON.parse(data);
if (services) {
console.dir(services);
Ext.cq1('app-main').getController().removeAllServices(true, function() {
Ext.each(services, function(s) {
const service = Ext.create('Rambox.model.Service', s);
service.save();
Ext.getStore('Services').add(service);
});
remote.getCurrentWindow().reload();
});
}
});
}
});
}
});

67
app/view/main/Main.js

@ -265,61 +265,22 @@ Ext.define('Rambox.view.main.Main', {
,style: 'border-radius: 50%;border:2px solid #d8d8d8;'
}
,{
id: 'usernameBtn'
,bind: {
text: '{username}'
,hidden: '{!username}'
}
,menu: [
{
text: 'Synchronize Configuration'
,glyph: 'xf0c2@FontAwesome'
,menu: [
{
xtype: 'label'
,bind: {
html: '<b class="menu-title">Last Sync: {last_sync}</b>'
}
}
,{
text: 'Backup'
,glyph: 'xf0ee@FontAwesome'
,scope: Rambox.ux.Auth0
,handler: Rambox.ux.Auth0.backupConfiguration
}
,{
text: 'Restore'
,glyph: 'xf0ed@FontAwesome'
,scope: Rambox.ux.Auth0
,handler: Rambox.ux.Auth0.restoreConfiguration
}
,{
text: 'Check for updated backup'
,glyph: 'xf021@FontAwesome'
,scope: Rambox.ux.Auth0
,handler: Rambox.ux.Auth0.checkConfiguration
}
]
}
,'-'
,{
text: locale['app.main[21]']
,glyph: 'xf08b@FontAwesome'
,handler: 'logout'
}
]
}
,{
text: locale['app.main[22]']
,icon: 'resources/auth0.png'
,id: 'loginBtn'
,tooltip: locale['app.main[23]']+'<br /><br /><i>'+locale['app.main[24]']+' Auth0 (https://auth0.com)</i>'
,bind: {
hidden: '{username}'
}
,handler: 'login'
text: 'Backup'
,glyph: 'xf0c7@FontAwesome'
,id: 'backupBtn'
,tooltip: 'Backup services to disk'
,scope: Rambox.ux.FileBackup
,handler: Rambox.ux.FileBackup.backupConfiguration
}
,{
text: 'Restore'
,glyph: 'xf115@FontAwesome'
,id: 'restoreBtn'
,tooltip: 'Restore services from disk'
,scope: Rambox.ux.FileBackup
,handler: Rambox.ux.FileBackup.restoreConfiguration
}
,{
tooltip: locale['preferences[0]']
,glyph: 'xf013@FontAwesome'
,handler: 'openPreferences'

120
app/view/main/MainController.js

@ -9,7 +9,9 @@ Ext.define('Rambox.view.main.MainController', {
tabPanel.setTabPosition(config.tabbar_location);
tabPanel.setTabRotation(0);
let reorderer = tabPanel.plugins.find((plugin) => plugin.ptype === "tabreorderer");
let reorderer = tabPanel.plugins.find(function(plugin) {
return plugin.ptype === "tabreorderer";
});
if ( reorderer !== undefined ) {
const names = reorderer.container.getLayout().names;
@ -56,7 +58,7 @@ Ext.define('Rambox.view.main.MainController', {
var store = Ext.getStore('Services');
var align = 'left';
store.suspendEvent('remove');
store.suspendEvent('childmove');
Ext.each(tabPanel.items.items, function(t, i) {
if ( t.id !== 'ramboxTab' && t.id !== 'tbfill' && t.record.get('enabled') ) {
var rec = store.getById(t.record.get('id'));
@ -72,7 +74,7 @@ Ext.define('Rambox.view.main.MainController', {
});
store.load();
store.resumeEvent('remove');
store.resumeEvent('childmove');
}
,showServiceTab: function( grid, record, tr, rowIndex, e ) {
@ -125,47 +127,44 @@ Ext.define('Rambox.view.main.MainController', {
});
}
,removeServiceFn: function(serviceId, total, actual) {
,removeServiceFn: function(serviceId, total, actual, resolve) {
var me = this;
if ( !serviceId ) return false;
// Get Record
var rec = Ext.getStore('Services').getById(serviceId);
const rec = Ext.getStore('Services').getById(serviceId);
if ( !rec.get('enabled') ) {
rec.set('enabled', true);
me.onEnableDisableService(null, Ext.getStore('Services').indexOf(rec), true, null, true);
Ext.defer(function() {
// Get Tab
var tab = Ext.getCmp('tab_'+serviceId);
// Clear all trash data
const webview = tab.getWebView();
webview.addEventListener("did-start-loading", function() {
clearData(webview, tab);
});
}, 1000);
const tab = Ext.getCmp('tab_'+serviceId);
const webview = tab.getWebView();
webview.addEventListener("did-start-loading", function() {
clearData(webview, tab, resolve);
});
} else {
// Get Tab
var tab = Ext.getCmp('tab_'+serviceId);
// Clear all trash data
const tab = Ext.getCmp('tab_'+serviceId);
const webview = tab.getWebView();
clearData(webview, tab);
clearData(webview, tab, resolve);
}
const config = ipc.sendSync('getConfig');
if ( config.default_service === rec.get('id') ) ipc.send('setConfig', Ext.apply(config, { default_service: 'ramboxTab' }));
function clearData(webview, tab) {
function clearData(webview, tab, resolve) {
webview.getWebContents().clearHistory();
webview.getWebContents().session.flushStorageData();
webview.getWebContents().session.clearCache(function() {
webview.getWebContents().session.clearStorageData(function() {
webview.getWebContents().session.clearCache(function () {
webview.getWebContents().session.clearStorageData(function () {
webview.getWebContents().session.cookies.flushStore(function() {
// Remove record from localStorage
Ext.getStore('Services').remove(rec);
// Close tab
tab.close();
if ( Ext.isFunction(resolve) ) resolve();
// Close waiting message
if ( total === actual ) Ext.Msg.hide();
});
@ -191,33 +190,44 @@ Ext.define('Rambox.view.main.MainController', {
// Clear counter for unread messaging
document.title = 'Rambox-OS';
const store = Ext.getStore('Services');
if ( btn ) {
Ext.Msg.confirm(locale['app.window[12]'], locale['app.window[14]'], function(btnId) {
if ( btnId === 'yes' ) {
Ext.cq1('app-main').suspendEvent('remove');
Ext.getStore('Services').load();
Ext.Msg.wait('Please wait until we clear all.', 'Removing...');
const count = Ext.getStore('Services').getCount();
var i = 1;
Ext.Array.each(Ext.getStore('Services').collect('id'), function(serviceId) {
me.removeServiceFn(serviceId, count, i++);
});
if ( Ext.isFunction(callback) ) callback();
Ext.cq1('app-main').resumeEvent('remove');
document.title = 'Rambox-OS';
_removeAllServices(callback);
}
});
} else {
Ext.cq1('app-main').suspendEvent('remove');
Ext.getStore('Services').load();
const count = Ext.getStore('Services').getCount();
var i = 1;
Ext.Array.each(Ext.getStore('Services').collect('id'), function(serviceId) {
me.removeServiceFn(serviceId, count, i++);
_removeAllServices(callback);
}
function _removeAllServices (callback) {
store.load(function(records, operation, success) {
store.suspendEvent('remove');
store.suspendEvent('childmove');
const count = store.getCount();
let i = 1;
let promises = [];
Ext.Array.each(store.collect('id'), function(serviceId) {
promises.push(new Promise(function(resolve) {
me.removeServiceFn(serviceId, count, i++, resolve);
}));
});
Promise.all(promises)
.then(function(value) {
if ( Ext.isFunction(callback) ) callback();
})
.catch(function(err) {
console.error('Error removing services: ' + err);
Ext.Msg.alert('Error!','Error removing services: ' + err);
})
.then(function() { // Replace when Promise.finally when available.
store.resumeEvent('childmove');
store.resumeEvent('remove');
document.title = 'Rambox-OS';
});
});
if ( Ext.isFunction(callback) ) callback();
Ext.cq1('app-main').resumeEvent('remove');
document.title = 'Rambox-OS';
}
}
@ -458,36 +468,4 @@ Ext.define('Rambox.view.main.MainController', {
Ext.create('Rambox.view.preferences.Preferences').show();
}
,login: function(btn) {
var me = this;
Rambox.ux.Auth0.login();
}
,logout: function(btn) {
var me = this;
var logoutFn = function(callback) {
Ext.Msg.wait(locale['app.window[37]'], locale['app.main[21]']);
// Logout from Auth0
Rambox.ux.Auth0.logout();
Ext.cq1('app-main').getViewModel().set('username', '');
Ext.cq1('app-main').getViewModel().set('avatar', '');
if ( Ext.isFunction(callback) ) callback();
};
if ( btn ) {
Ext.Msg.confirm(locale['app.main[21]'], locale['app.window[38]'], function(btnId) {
if ( btnId === 'yes' ) {
logoutFn(me.removeAllServices.bind(me));
}
});
} else {
logoutFn();
}
}
});

1
app/view/preferences/PreferencesController.js

@ -48,7 +48,6 @@ Ext.define('Rambox.view.preferences.PreferencesController', {
// Locale
if ( values.locale !== ipc.sendSync('getConfig').locale ) {
localStorage.setItem('locale', values.locale);
localStorage.setItem('locale-auth0', me.getView().down('form').down('combo[name="locale"]').getSelection().get('auth0'));
Ext.Msg.confirm('Action required', 'To change the language of Rambox, you need to reload the app. Do you want to do it now?', function(btnId) {
if ( btnId === 'yes' ) ipc.send('relaunchApp');
});

2
appveyor.yml

@ -43,8 +43,6 @@ install:
$env:PATH = "${env:HOME}/bin/Sencha/Cmd:${env:PATH}"
}
Copy-Item env-sample.js env.js
git reset --hard HEAD
npm i npm@latest -g

16
electron/main.js

@ -49,8 +49,8 @@ const config = new Config({
// Fix issues with HiDPI scaling on Windows platform
if (config.get('enable_hidpi_support') && (process.platform === 'win32')) {
app.commandLine.appendSwitch('high-dpi-support', 'true')
app.commandLine.appendSwitch('force-device-scale-factor', '1')
app.commandLine.appendSwitch('high-dpi-support', 'true');
app.commandLine.appendSwitch('force-device-scale-factor', '1');
}
// This must match the package name in package.json
@ -205,7 +205,7 @@ function createMasterPasswordWindow() {
if ( isDev ) mainMasterPasswordWindow.webContents.openDevTools();
mainMasterPasswordWindow.loadURL('file://' + __dirname + '/../masterpassword.html');
mainMasterPasswordWindow.on('close', function() { mainMasterPasswordWindow = null });
mainMasterPasswordWindow.on('close', function() { mainMasterPasswordWindow = null; });
}
function updateBadge(title) {
@ -284,13 +284,13 @@ ipcMain.on('validateMasterPassword', function(event, pass) {
ipcMain.on('setServiceNotifications', function(event, partition, op) {
session.fromPartition(partition).setPermissionRequestHandler(function(webContents, permission, callback) {
if (permission === 'notifications') return callback(op);
callback(true)
callback(true);
});
});
ipcMain.on('setDontDisturb', function(event, arg) {
config.set('dont_disturb', arg);
})
});
// Reload app
ipcMain.on('reloadApp', function(event) {
@ -407,9 +407,9 @@ if ( config.get('proxy') ) {
if(!authInfo.isProxy)
return;
event.preventDefault()
callback(config.get('proxyLogin'), config.get('proxyPassword'))
})
event.preventDefault();
callback(config.get('proxyLogin'), config.get('proxyPassword'));
});
}
// Disable GPU Acceleration for Linux

8
electron/menu.js

@ -211,7 +211,7 @@ module.exports = function(config) {
{
label: locale['preferences[0]'],
click() {
sendAction('showPreferences')
sendAction('showPreferences');
}
},
{
@ -226,7 +226,7 @@ module.exports = function(config) {
{
label: locale['menu.help[6]'],
click() {
sendAction('showAbout')
sendAction('showAbout');
}
},
{
@ -270,7 +270,7 @@ module.exports = function(config) {
{
label: locale['preferences[0]'],
click() {
sendAction('showPreferences')
sendAction('showPreferences');
}
},
{
@ -297,7 +297,7 @@ module.exports = function(config) {
helpSubmenu.push({
label: `&`+locale['menu.help[6]'],
click() {
sendAction('showAbout')
sendAction('showAbout');
}
});
}

4
env-sample.js

@ -1,4 +0,0 @@
var auth0Cfg = {
clientID: ''
,domain: ''
};

171
package-lock.json generated

@ -24,6 +24,12 @@
"integrity": "sha512-LAQ1d4OPfSJ/BMbI2DuizmYrrkD9JMaTdi2hQTlI53lQ4kRQPyZQRS4CYQ7O66bnBBnP/oYdRxbk++X0xuFU6A==",
"dev": true
},
"@types/node": {
"version": "8.10.24",
"resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.24.tgz",
"integrity": "sha512-5YaBKa6oFuWy7ptIFMATyftIcpZTZtvgrzPThEbs+kl4Uu41oUxiRunG0k32QZjD6MXMELls//ry/epNxc11aQ==",
"dev": true
},
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@ -126,33 +132,32 @@
}
},
"app-builder-bin": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-2.0.0.tgz",
"integrity": "sha512-JUJ1Wiaig1589MxF110HHh5I5v9hn2Qu4ZeleNwSZHfD1S2LrCxm4H+q7Snr/rWlWdEChFoWM2lj11Cdl4LP0Q==",
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-2.1.1.tgz",
"integrity": "sha512-ye0fQcG/msVKJcHBOZOfXf8kIkHoY+1ZYpWyFH/jyeNRwlsdBQCmg0A+pbbTyvjiet9XQzPVA7s21oyRhUixRQ==",
"dev": true
},
"app-builder-lib": {
"version": "20.26.1",
"resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-20.26.1.tgz",
"integrity": "sha512-tLRC9bU3f7TgeK//jjDfhwzQymmLACkcs6vC/5VZLstVigg0G55RejsD4cCP3YA7fdUNNH6MaOAUh4l9FblCMg==",
"version": "20.27.1",
"resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-20.27.1.tgz",
"integrity": "sha512-nuGl5s6dGp0lbLfM3Ef/tst3ZAeKznBb+SB0zNjHR8chbU7338451y7TfDXkcLQVkvMivfhwIRlUCyN/sH5KKA==",
"dev": true,
"requires": {
"7zip-bin": "~4.0.2",
"app-builder-bin": "2.0.0",
"app-builder-bin": "2.1.1",
"async-exit-hook": "^2.0.1",
"bluebird-lst": "^1.0.5",
"builder-util": "5.20.1",
"builder-util": "6.0.0",
"builder-util-runtime": "4.4.1",
"chromium-pickle-js": "^0.2.0",
"debug": "^3.1.0",
"ejs": "^2.6.1",
"electron-osx-sign": "0.4.10",
"electron-publish": "20.26.0",
"env-paths": "^1.0.0",
"electron-publish": "20.27.0",
"fs-extra-p": "^4.6.1",
"hosted-git-info": "^2.7.1",
"is-ci": "^1.1.0",
"isbinaryfile": "^3.0.2",
"isbinaryfile": "^3.0.3",
"js-yaml": "^3.12.0",
"lazy-val": "^1.0.3",
"minimatch": "^3.0.4",
@ -161,7 +166,6 @@
"read-config-file": "3.1.0",
"sanitize-filename": "^1.6.1",
"semver": "^5.5.0",
"sumchecker": "^2.0.2",
"temp-file": "^3.1.3"
},
"dependencies": {
@ -781,13 +785,13 @@
"dev": true
},
"builder-util": {
"version": "5.20.1",
"resolved": "https://registry.npmjs.org/builder-util/-/builder-util-5.20.1.tgz",
"integrity": "sha512-rqSl3Tbi/sECIVWAys8Blic4UEzUpZkGgmVXR2mZwdVPreNnfY3MHqSGSxlJRMTqxSsO0SgxnAEnanBNw4212g==",
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/builder-util/-/builder-util-6.0.0.tgz",
"integrity": "sha512-PPwBEQa8zNcgd0ht2IozdD9QDdrADSl/TkceGcErkT7By1v8LLcomBAThm+t+0Ebm7q6JJbdL2SShM6wbXRCUg==",
"dev": true,
"requires": {
"7zip-bin": "~4.0.2",
"app-builder-bin": "2.0.0",
"app-builder-bin": "2.1.1",
"bluebird-lst": "^1.0.5",
"builder-util-runtime": "^4.4.1",
"chalk": "^2.4.1",
@ -2002,14 +2006,14 @@
}
},
"dmg-builder": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-5.1.0.tgz",
"integrity": "sha512-Pyi64um0eZMwwyZeKM2ckhwuCQCvudcRXDwREHm7m9hYzzfKVWmExYXIV0+a9aaeqHesqxwfWyTwl3lwThW+Bw==",
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-5.2.0.tgz",
"integrity": "sha512-0doOlH/Lew4St3X5UwEyuj763sDa4GIJPBDr/0hDywPn06atclRO36Bf6oEy9BEp7YaNV5aoaOfH3l8SBBacYQ==",
"dev": true,
"requires": {
"app-builder-lib": "~20.26.0",
"app-builder-lib": "~20.27.0",
"bluebird-lst": "^1.0.5",
"builder-util": "~5.20.0",
"builder-util": "~6.0.0",
"fs-extra-p": "^4.6.1",
"iconv-lite": "^0.4.23",
"js-yaml": "^3.12.0",
@ -2071,18 +2075,29 @@
"integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==",
"dev": true
},
"electron": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/electron/-/electron-2.0.7.tgz",
"integrity": "sha512-MRrDE6mrp+ZrIBpZM27pxbO2yEDKYfkmc6Ll79BtedMNEZsY4+oblupeDJL6RM6meUIp82KMo63W7fP65Tb89Q==",
"dev": true,
"requires": {
"@types/node": "^8.0.24",
"electron-download": "^3.0.1",
"extract-zip": "^1.0.3"
}
},
"electron-builder": {
"version": "20.26.1",
"resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.26.1.tgz",
"integrity": "sha512-WEqb8BVdcc8uSfWW9TA9WrltG4TDydwhlUIINkyXVOz68ckV56dSt383unTT9Awo+6oFsjABZdMMYtAjLAuDEw==",
"version": "20.27.1",
"resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.27.1.tgz",
"integrity": "sha512-jsrUX2t8Yx8n5lVzIZ7AOMGlSYSb2iZhD+BX1DQ9H0O2FNDhWBNRfQQyj0mM2slNsk+5RWpK8FpOOsn5Z8BIqw==",
"dev": true,
"requires": {
"app-builder-lib": "20.26.1",
"app-builder-lib": "20.27.1",
"bluebird-lst": "^1.0.5",
"builder-util": "5.20.1",
"builder-util": "6.0.0",
"builder-util-runtime": "4.4.1",
"chalk": "^2.4.1",
"dmg-builder": "5.1.0",
"dmg-builder": "5.2.0",
"fs-extra-p": "^4.6.1",
"is-ci": "^1.1.0",
"lazy-val": "^1.0.3",
@ -2137,6 +2152,63 @@
}
}
},
"electron-download": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/electron-download/-/electron-download-3.3.0.tgz",
"integrity": "sha1-LP1U1pZsAZxNSa1l++Zcyc3vaMg=",
"dev": true,
"requires": {
"debug": "^2.2.0",
"fs-extra": "^0.30.0",
"home-path": "^1.0.1",
"minimist": "^1.2.0",
"nugget": "^2.0.0",
"path-exists": "^2.1.0",
"rc": "^1.1.2",
"semver": "^5.3.0",
"sumchecker": "^1.2.0"
},
"dependencies": {
"fs-extra": {
"version": "0.30.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
"integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=",
"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"
}
},
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true
},
"path-exists": {
"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"
}
},
"sumchecker": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-1.3.1.tgz",
"integrity": "sha1-ebs7RFbdBPGOvbwNcDodHa7FEF0=",
"dev": true,
"requires": {
"debug": "^2.2.0",
"es6-promise": "^4.0.5"
}
}
}
},
"electron-osx-sign": {
"version": "0.4.10",
"resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.4.10.tgz",
@ -2177,26 +2249,18 @@
}
},
"electron-publish": {
"version": "20.26.0",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.26.0.tgz",
"integrity": "sha512-CPh/U+qyyG8HXrS3s/E2JAgrmysIMDij9VTqz2QAUAwExH1e5V06iII0eMn47BFRRVqw4yF8VMzefuugpwAbkg==",
"version": "20.27.0",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.27.0.tgz",
"integrity": "sha512-bmyA9PbXeYDoh2S3Q5Rcs/AT3XUKxPnx0aChfy/qbsPBc/DtZirKuHh8B9SVjo8nK9wqm531rempyEOh3LAkDw==",
"dev": true,
"requires": {
"bluebird-lst": "^1.0.5",
"builder-util": "~5.20.0",
"builder-util": "~6.0.0",
"builder-util-runtime": "^4.4.1",
"chalk": "^2.4.1",
"fs-extra-p": "^4.6.1",
"lazy-val": "^1.0.3",
"mime": "^2.3.1"
},
"dependencies": {
"mime": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
"integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
"dev": true
}
}
},
"end-of-stream": {
@ -2223,6 +2287,12 @@
"is-arrayish": "^0.2.1"
}
},
"es6-promise": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
"integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
"dev": true
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
@ -2881,6 +2951,12 @@
"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
"dev": true
},
"home-path": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/home-path/-/home-path-1.0.6.tgz",
"integrity": "sha512-wo+yjrdAtoXt43Vy92a+0IPCYViiyLAHyp0QVS4xL/tfvVz5sXIW1ubLZk3nhVkD92fQpUMKX+fzMjr5F489vw==",
"dev": true
},
"hosted-git-info": {
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
@ -3263,10 +3339,13 @@
"dev": true
},
"isbinaryfile": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz",
"integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=",
"dev": true
"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",
@ -3606,6 +3685,12 @@
"to-regex": "^3.0.2"
}
},
"mime": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
"integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
"dev": true
},
"mime-types": {
"version": "2.1.19",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz",

15
package.json

@ -5,7 +5,7 @@
"start:debug": "electron electron/main.js --enable-logging",
"test": "./node_modules/.bin/mocha test/tests/**/*.spec.js",
"clean": "rimraf ./build/production",
"compile": "sencha app build && cpy app/package.json build/production/Rambox/",
"compile": "sencha app build && cpy app/package.json app/package-lock.json build/production/Rambox/",
"recompile": "npm run distclean && npm run compile",
"distclean": "rimraf ./dist",
"distclean:win": "rimraf ./dist/win-{ia32-,}unpacked",
@ -102,13 +102,14 @@
},
"devDependencies": {
"asar": "^0.14.3",
"chai": "4.1.2",
"cpy-cli": "2.0.0",
"crowdin": "1.0.0",
"csvjson": "5.1.0",
"electron-builder": "^20.26.1",
"chai": "^4.1.2",
"cpy-cli": "^2.0.0",
"crowdin": "^1.0.0",
"csvjson": "^5.1.0",
"electron": "^2.0.7",
"electron-builder": "^20.27.1",
"mocha": "^5.2.0",
"rimraf": "2.6.2",
"rimraf": "^2.6.2",
"spectron": "^3.8.0"
}
}

Loading…
Cancel
Save