Compare commits

...

33 Commits

Author SHA1 Message Date
Akash Nimare
3eec4c2209 release: 🎉 new release v2.3.6. 2018-08-23 20:10:18 +05:30
Akash Nimare
debbfb6b7d electron: Update electron to v2.0.8. 2018-08-23 18:56:36 +05:30
Akash Nimare
8bd1492586 left-sidebar: Do not escape realm name.
We escape the realm name whenever user adds a realm + on app startup.
That's why we don't need to do the double escaping for already added
servers.

Fixes: #541.
2018-08-23 18:48:06 +05:30
Akash Nimare
1115c6d5c3 docs: Remove help docs from the repo.
Content is now maintained in the /help docs.

Fixes: #543.
2018-08-23 12:32:25 +05:30
Abhigyan Khaund
9ba279213c proxy: Add proxy details in request module parameters.
This commit adds proxy details to request module paramters from
the proxyRules so that the request module can use these rules while
sending a request. In case of no system proxy, set environment
variable NO_PROXY to handle all links.

Fixes: #534.
2018-08-21 00:26:37 +05:30
Akash Nimare
89c35cb1d4 electron: Update electron to v2.0.7. 2018-08-17 14:16:00 +05:30
Akash Nimare
21d6eb52c5 sentry: Update Sentry to v0.8.1.
This fixes the youtube video not playing in the lightbox issue.
Youtube video stopped playing in the lightbox when we added the
Sentry support. The exact reason behind the issue is still unknown
but we're guessing that previous version of Sentry doesn't exit
process on oncaught errors which might have caused lightbox to break.
The issue was fixed in the latest release of the Sentry v0.8.1.

Fixes: #537.
2018-08-14 18:02:10 +05:30
Akash Nimare
aa1538837b Add v2.3.5 release notes. 2018-08-03 17:39:48 +05:30
Akash Nimare
ea103380b6 release: 🎉 new release v2.3.5. 2018-08-02 20:27:29 +05:30
aashish-ak
60d10d88d1 preload: use page_params only when it exists.
This PR adds a params-util.js file which checks wheather the
page_params exists or not.

Fixes: #517.
2018-08-02 20:00:42 +05:30
Abhigyan Khaund
124a842bbd electron-bridge: Implement electron bridge.
This PR adds a bridge to communicate with the webapp in real time. As of now, the bridge listens for following events -

* When realm name changes
* When realm icon changes
* When the unread count changes

Partially fixes #425.
2018-08-02 01:05:29 +05:30
Akash Nimare
7130103999 file-attachment: Update notification message. 2018-08-02 00:11:47 +05:30
Akash Nimare
26a144e1c2 Merge branch 'master' of github.com:zulip/zulip-electron 2018-08-01 23:50:21 +05:30
Akash Nimare
a5c1ae8726 file-attachment: Add a setting option to show downloaded file in file manager. 2018-08-01 23:50:02 +05:30
Abhigyan Khaund
ed5096840d attachments: Fix failing attached file downloads.
This commit fixes the failing download files that had occurred due to the session not being the same in the browserWindow and the webview. This made the uploaded files unavailable to browserWindow for download. This fix adds the persist session to the browserWindow.

Fixes: #523.
2018-07-31 19:38:39 +05:30
Abhigyan Khaund
3f6d256910 gulpfile: Update syntax and methods for gulp v4.x.
This fixes the broken e2e-test.
2018-07-25 16:14:04 +05:30
Akash Nimare
28421992ba Update changelog.md 2018-07-24 19:31:25 +05:30
Akash Nimare
82199dd1c3 release: new beta release v2.3.4. 2018-07-23 23:16:18 +05:30
Akash Nimare
952baf1f42 electron: Downgrade electron to v2.0.1.
Looks like the latest release of electron has some
bugs and it's breaking the app. Downgrading until they
fix this in the upstream.
2018-07-23 23:12:03 +05:30
Abhigyan Khaund
3342d7da91 attachement: Handle downloading files failure.
In case of any failure, the app will fall back to the previous download
functionality which is to show a download dialog when a user clicks on 
file attachments.
2018-07-23 21:07:51 +05:30
Abhigyan Khaund
c0ec292090 fixes: Fix null of downloadPath when settings.json fails. 2018-07-23 21:04:49 +05:30
Akash Nimare
8f6fba0b97 electron: Update electron to v2.0.5. 2018-07-21 16:44:54 +05:30
Akash Nimare
d3453a3fe1 Update changelog.md 2018-07-14 21:31:24 +05:30
Akash Nimare
18e14fd3f8 Update changelog.md 2018-07-14 21:30:31 +05:30
Akash Nimare
c52bfd6a45 release: 🎉 v2.3.3. 2018-07-13 18:18:25 +05:30
Akash Nimare
428087110a tools: Add scripts to push/reset to pull request. 2018-07-13 17:05:46 +05:30
Abhigyan Khaund
781883a898 crash-reporter: Remove crash-reporter file and its use, as it is replaced by sentry. 2018-07-13 12:57:48 +05:30
Abhigyan Khaund
7299cd51e6 sentry: Initialize sentry for main and renderer process using logger-util.
captureExceptions are used to report expected exceptions from domain-util.js and
config-util.js.
All files that include logger-util automatically includes sentry for those files
and report unexpected exceptions to sentry.
2018-07-13 12:57:48 +05:30
Akash Nimare
a45254cff0 builder: Update electron-builder to v20.20.4. 2018-07-13 10:38:01 +05:30
Abhigyan Khaund
4095c121ba certificates: Make default option "No" on enter key press to reject certificate. 2018-07-12 20:32:33 +05:30
Abhigyan Khaund
6787b8d557 file-attachments: Download file-attachments to Downloads folder.
This PR adds a feature to download file-attachments to "Downloads" folder and shows a
notification when the download is complete. On clicking the notification user can
open the downloaded file with system default app. A user can set/change the download location
from the settings > general.
2018-07-12 18:39:43 +05:30
Akash Nimare
306e0f3b5e macOS: Add dock bouncing effect on macOS.
This PR adds a new setting option of controlling the
dock bouncing feature on macOS.

Fixes: #510.
2018-07-10 10:01:36 +05:30
Abhigyan Khaund
f030d5d56b package.json: Move adm dependecy to app package.json. 2018-07-06 17:00:57 +05:30
28 changed files with 1087 additions and 318 deletions

View File

@@ -1,16 +0,0 @@
'use strict';
const { crashReporter } = require('electron');
const crashHandler = () => {
crashReporter.start({
productName: 'zulip-electron',
companyName: 'Kandra Labs, Inc.',
submitURL: 'https://zulip-sentry.herokuapp.com/crashreport',
uploadToServer: true
});
};
module.exports = {
crashHandler
};

View File

@@ -5,7 +5,6 @@ const windowStateKeeper = require('electron-window-state');
const isDev = require('electron-is-dev'); const isDev = require('electron-is-dev');
const appMenu = require('./menu'); const appMenu = require('./menu');
const { appUpdater } = require('./autoupdater'); const { appUpdater } = require('./autoupdater');
const { crashHandler } = require('./crash-reporter');
const { setAutoLaunch } = require('./startup'); const { setAutoLaunch } = require('./startup');
@@ -14,6 +13,7 @@ const { app, ipcMain } = electron;
const BadgeSettings = require('./../renderer/js/pages/preference/badge-settings.js'); const BadgeSettings = require('./../renderer/js/pages/preference/badge-settings.js');
const ConfigUtil = require('./../renderer/js/utils/config-util.js'); const ConfigUtil = require('./../renderer/js/utils/config-util.js');
const ProxyUtil = require('./../renderer/js/utils/proxy-util.js'); const ProxyUtil = require('./../renderer/js/utils/proxy-util.js');
const { sentryInit } = require('./../renderer/js/utils/sentry-util.js');
// Adds debug features like hotkeys for triggering dev tools and reload // Adds debug features like hotkeys for triggering dev tools and reload
// in development mode // in development mode
@@ -73,7 +73,8 @@ function createMainWindow() {
minHeight: 400, minHeight: 400,
webPreferences: { webPreferences: {
plugins: true, plugins: true,
nodeIntegration: true nodeIntegration: true,
partition: 'persist:webviewsession'
}, },
show: false show: false
}); });
@@ -155,6 +156,9 @@ app.on('ready', () => {
}); });
mainWindow = createMainWindow(); mainWindow = createMainWindow();
// Initialize sentry for main process
sentryInit();
const isSystemProxy = ConfigUtil.getConfigItem('useSystemProxy'); const isSystemProxy = ConfigUtil.getConfigItem('useSystemProxy');
if (isSystemProxy) { if (isSystemProxy) {
@@ -172,11 +176,10 @@ app.on('ready', () => {
}); });
page.once('did-frame-finish-load', () => { page.once('did-frame-finish-load', () => {
// Initate auto-updates on MacOS and Windows // Initiate auto-updates on MacOS and Windows
if (ConfigUtil.getConfigItem('autoUpdate')) { if (ConfigUtil.getConfigItem('autoUpdate')) {
appUpdater(); appUpdater();
} }
crashHandler();
}); });
// Temporarily remove this event // Temporarily remove this event
@@ -238,6 +241,48 @@ app.on('ready', () => {
ipcMain.on('toggleAutoLauncher', (event, AutoLaunchValue) => { ipcMain.on('toggleAutoLauncher', (event, AutoLaunchValue) => {
setAutoLaunch(AutoLaunchValue); setAutoLaunch(AutoLaunchValue);
}); });
ipcMain.on('downloadFile', (event, url, downloadPath) => {
page.downloadURL(url);
page.session.once('will-download', (event, item) => {
const filePath = path.join(downloadPath, item.getFilename());
item.setSavePath(filePath);
item.on('updated', (event, state) => {
switch (state) {
case 'interrupted' : {
// Can interrupted to due to network error, cancel download then
console.log('Download interrupted, cancelling and fallback to dialog download.');
item.cancel();
break;
}
case 'progressing': {
if (item.isPaused()) {
item.cancel();
}
// This event can also be used to show progres in percentage in future.
break;
}
default: {
console.info('Unknown updated state of download item');
}
}
});
item.once('done', (event, state) => {
if (state === 'completed') {
page.send('downloadFileCompleted', item.getSavePath(), item.getFilename());
} else {
console.log('Download failed state: ', state);
page.send('downloadFileFailed');
}
// To stop item for listening to updated events of this file
item.removeAllListeners('updated');
});
});
});
ipcMain.on('realm-icon-changed', (event, serverURL, iconURL) => {
page.send('update-realm-icon', serverURL, iconURL);
});
}); });
app.on('before-quit', () => { app.on('before-quit', () => {

View File

@@ -4,6 +4,7 @@ const { Notification } = require('electron');
const request = require('request'); const request = require('request');
const semver = require('semver'); const semver = require('semver');
const ConfigUtil = require('../renderer/js/utils/config-util'); const ConfigUtil = require('../renderer/js/utils/config-util');
const ProxyUtil = require('../renderer/js/utils/proxy-util');
const LinuxUpdateUtil = require('../renderer/js/utils/linux-update-util'); const LinuxUpdateUtil = require('../renderer/js/utils/linux-update-util');
const Logger = require('../renderer/js/utils/logger-util'); const Logger = require('../renderer/js/utils/logger-util');
@@ -15,10 +16,12 @@ const logger = new Logger({
function linuxUpdateNotification() { function linuxUpdateNotification() {
let url = 'https://api.github.com/repos/zulip/zulip-electron/releases'; let url = 'https://api.github.com/repos/zulip/zulip-electron/releases';
url = ConfigUtil.getConfigItem('betaUpdate') ? url : url + '/latest'; url = ConfigUtil.getConfigItem('betaUpdate') ? url : url + '/latest';
const proxyEnabled = ConfigUtil.getConfigItem('useManualProxy') || ConfigUtil.getConfigItem('useSystemProxy');
const options = { const options = {
url, url,
headers: {'User-Agent': 'request'} headers: {'User-Agent': 'request'},
proxy: proxyEnabled ? ProxyUtil.getProxy(url) : ''
}; };
request(options, (error, response, body) => { request(options, (error, response, body) => {

320
app/package-lock.json generated
View File

@@ -1,13 +1,13 @@
{ {
"name": "zulip", "name": "zulip",
"version": "2.3.2", "version": "2.3.6",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
"@electron-elements/send-feedback": { "@electron-elements/send-feedback": {
"version": "1.0.7", "version": "1.0.7",
"resolved": "https://registry.npmjs.org/@electron-elements/send-feedback/-/send-feedback-1.0.7.tgz", "resolved": "https://registry.npmjs.org/@electron-elements/send-feedback/-/send-feedback-1.0.7.tgz",
"integrity": "sha512-3VS5JlAkZi0Ik2xHPdO0ZT3VvtLH7fqY8UXKHiR4BJxJPdoqlPM9Z0YT0uQxSz/xfBjcfCRV1DlnuJ/S3J99ow==", "integrity": "sha1-HmTsFMvNkmZAngeu1BDoUi45deA=",
"requires": { "requires": {
"@electron-elements/utils": "1.0.3" "@electron-elements/utils": "1.0.3"
} }
@@ -15,7 +15,7 @@
"@electron-elements/utils": { "@electron-elements/utils": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/@electron-elements/utils/-/utils-1.0.3.tgz", "resolved": "https://registry.npmjs.org/@electron-elements/utils/-/utils-1.0.3.tgz",
"integrity": "sha512-SMIKfu0UrmslHVKDQhOJDE2OeynWnuznkZlhgB5X2V2h+0t00Pq+ekusxBAAXIdZSdnLPlMcH3zZ6TfDq6mbPA==" "integrity": "sha1-23sB2Zzaay/sNM+XuJcJCWnznII="
}, },
"@paulcbetts/cld": { "@paulcbetts/cld": {
"version": "2.4.6", "version": "2.4.6",
@@ -31,16 +31,108 @@
"@paulcbetts/spellchecker": { "@paulcbetts/spellchecker": {
"version": "4.0.6", "version": "4.0.6",
"resolved": "https://registry.npmjs.org/@paulcbetts/spellchecker/-/spellchecker-4.0.6.tgz", "resolved": "https://registry.npmjs.org/@paulcbetts/spellchecker/-/spellchecker-4.0.6.tgz",
"integrity": "sha512-9lhLEvWfAB00n2oOM/S08sna9AuFk+b+bPk8ficpSa2X0Ll40PahMwfFS3G54nqQBIFFZgTPrhoHtCLAao0xmg==", "integrity": "sha1-ee8fnBnFoxVpIcyqn/3D77vuR+M=",
"requires": { "requires": {
"nan": "^2.0.0" "nan": "^2.0.0"
} }
}, },
"@sentry/browser": {
"version": "4.0.0-beta.12",
"resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-4.0.0-beta.12.tgz",
"integrity": "sha512-At8qp2aM4q4KnuIQuC6wbbQ6gLykmzwZdHwWRN99GS5TNC7kXJNgO9WgiMLadA4ph12JtC1petrUIgY8t+aoSA==",
"requires": {
"@sentry/core": "4.0.0-beta.12",
"@sentry/hub": "4.0.0-beta.12",
"@sentry/minimal": "4.0.0-beta.12",
"@sentry/types": "4.0.0-beta.12",
"@sentry/utils": "4.0.0-beta.12"
}
},
"@sentry/core": {
"version": "4.0.0-beta.12",
"resolved": "https://registry.npmjs.org/@sentry/core/-/core-4.0.0-beta.12.tgz",
"integrity": "sha512-DGZqBOHejHPYP2I0MdF7APEaews7gLrfxHDh9rbwDLJJiuwPE/ridH97amxy/j2g4X4EZEc3sO3Ptv4nMaHK+Q==",
"requires": {
"@sentry/hub": "4.0.0-beta.12",
"@sentry/minimal": "4.0.0-beta.12",
"@sentry/types": "4.0.0-beta.12",
"@sentry/utils": "4.0.0-beta.12"
}
},
"@sentry/electron": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-0.8.1.tgz",
"integrity": "sha512-y3CJ7547Rhpg+6bnGP0mXLj9pgpjMLaRji704TdzTV0afr8KamBXySNhNHosHLaKm1OLg6p8U4pdVB7xQZ+X3g==",
"requires": {
"@sentry/browser": "4.0.0-beta.12",
"@sentry/core": "4.0.0-beta.12",
"@sentry/hub": "4.0.0-beta.12",
"@sentry/minimal": "4.0.0-beta.12",
"@sentry/node": "4.0.0-beta.12",
"@sentry/types": "4.0.0-beta.12",
"@sentry/utils": "4.0.0-beta.12",
"electron-fetch": "^1.1.0",
"form-data": "^2.3.2",
"util.promisify": "^1.0.0"
}
},
"@sentry/hub": {
"version": "4.0.0-beta.12",
"resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-4.0.0-beta.12.tgz",
"integrity": "sha512-fmLaPaD6F/ViWDTz3hRVnNvqgnAmX0foDsUGVVp0Dt2lT9apM5NECKV6761XFVMrbGGulCg9fguv2KV5IbQcIw==",
"requires": {
"@sentry/types": "4.0.0-beta.12",
"@sentry/utils": "4.0.0-beta.12"
}
},
"@sentry/minimal": {
"version": "4.0.0-beta.12",
"resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-4.0.0-beta.12.tgz",
"integrity": "sha512-1V3Lrm7wIOOqG+l1uyVZ7iQysPGXszwfsd6DTVDPT19PSey7+KbvPNcQfh+GqMRMz8jzyg9XlwUxckg7qbSztQ==",
"requires": {
"@sentry/hub": "4.0.0-beta.12",
"@sentry/types": "4.0.0-beta.12"
}
},
"@sentry/node": {
"version": "4.0.0-beta.12",
"resolved": "https://registry.npmjs.org/@sentry/node/-/node-4.0.0-beta.12.tgz",
"integrity": "sha512-oekXtdaaElt/lSfyKtAyTLcTofciMRuptsGOTMX4qQ7hoHESB6DUw55Or/RRMaJYm/nckM2VFzWDATd20NVV4w==",
"requires": {
"@sentry/core": "4.0.0-beta.12",
"@sentry/hub": "4.0.0-beta.12",
"@sentry/minimal": "4.0.0-beta.12",
"@sentry/types": "4.0.0-beta.12",
"@sentry/utils": "4.0.0-beta.12",
"cookie": "0.3.1",
"lsmod": "1.0.0",
"md5": "2.2.1",
"stack-trace": "0.0.10"
}
},
"@sentry/types": {
"version": "4.0.0-beta.12",
"resolved": "https://registry.npmjs.org/@sentry/types/-/types-4.0.0-beta.12.tgz",
"integrity": "sha512-xRsTfRcb8OvMbLjl64bPNv3feHiXBprtRZqTlVUbDJmSNrm8wg+tKIPYsP90dxKc50CZBk59urIbgvpPg0mCLw=="
},
"@sentry/utils": {
"version": "4.0.0-beta.12",
"resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-4.0.0-beta.12.tgz",
"integrity": "sha512-lpTE2GlaztATlFfIWMN8RSQFP0z6PkPPoDz0KKRmK4ZxjPxVX2sAGbKJGCpf9fdUG23NVg3FNiqfpUbjhvd9YA==",
"requires": {
"@sentry/types": "4.0.0-beta.12"
}
},
"@sindresorhus/is": { "@sindresorhus/is": {
"version": "0.7.0", "version": "0.7.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
"integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow=="
}, },
"adm-zip": {
"version": "0.4.11",
"resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz",
"integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA=="
},
"aggregate-error": { "aggregate-error": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-1.0.0.tgz", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-1.0.0.tgz",
@@ -69,7 +161,7 @@
"argparse": { "argparse": {
"version": "1.0.10", "version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=",
"requires": { "requires": {
"sprintf-js": "~1.0.2" "sprintf-js": "~1.0.2"
} }
@@ -109,7 +201,7 @@
"aws4": { "aws4": {
"version": "1.7.0", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
"integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" "integrity": "sha1-1NDpudv8p3vwjusKikcVUP454ok="
}, },
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
@@ -139,12 +231,12 @@
"bluebird": { "bluebird": {
"version": "3.5.1", "version": "3.5.1",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk="
}, },
"bluebird-lst": { "bluebird-lst": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.5.tgz", "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.5.tgz",
"integrity": "sha512-Ey0bDNys5qpYPhZ/oQ9vOEvD0TYQDTILMXWP2iGfvMg7rSDde+oV4aQQgqRH+CvBFNz2BSDQnPGMUl6LKBUUQA==", "integrity": "sha1-vryDAmt+kqcocaPcWZ4hnL+wAqk=",
"requires": { "requires": {
"bluebird": "^3.5.1" "bluebird": "^3.5.1"
} }
@@ -160,7 +252,7 @@
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=",
"requires": { "requires": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
@@ -223,6 +315,11 @@
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
}, },
"charenc": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
"integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
},
"clean-stack": { "clean-stack": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-1.3.0.tgz",
@@ -254,6 +351,11 @@
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
}, },
"cookie": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
"integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
},
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@@ -267,6 +369,11 @@
"capture-stack-trace": "^1.0.0" "capture-stack-trace": "^1.0.0"
} }
}, },
"crypt": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
"integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
},
"cryptiles": { "cryptiles": {
"version": "3.1.2", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
@@ -296,7 +403,7 @@
"debug": { "debug": {
"version": "2.6.9", "version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
"requires": { "requires": {
"ms": "2.0.0" "ms": "2.0.0"
} }
@@ -319,6 +426,15 @@
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz",
"integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU="
}, },
"define-properties": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
"integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
"requires": {
"foreach": "^2.0.5",
"object-keys": "^1.0.8"
}
},
"delayed-stream": { "delayed-stream": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -327,7 +443,7 @@
"dns-packet": { "dns-packet": {
"version": "1.3.1", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
"integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "integrity": "sha1-EqpCaYEHW+UAuRDu3NC0fdfe2lo=",
"requires": { "requires": {
"ip": "^1.1.0", "ip": "^1.1.0",
"safe-buffer": "^5.0.1" "safe-buffer": "^5.0.1"
@@ -355,6 +471,14 @@
"jsbn": "~0.1.0" "jsbn": "~0.1.0"
} }
}, },
"electron-fetch": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/electron-fetch/-/electron-fetch-1.2.1.tgz",
"integrity": "sha512-pQy0el/vxu30sL9JjXss8yZL+ztRnmioffPQsLL4UYnfSUFTuGBlgCPCxxKYJV7y52WfaIEZQ9tlbac1YHrH0w==",
"requires": {
"encoding": "^0.1.12"
}
},
"electron-is-dev": { "electron-is-dev": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz", "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-0.3.0.tgz",
@@ -368,7 +492,7 @@
"electron-remote": { "electron-remote": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/electron-remote/-/electron-remote-1.2.0.tgz", "resolved": "https://registry.npmjs.org/electron-remote/-/electron-remote-1.2.0.tgz",
"integrity": "sha512-Fo2wnwK2tzd81Ux4pfNhz9DwHBoooZahdWBqOh9HtESYh2jrcsjc6FAibIu2oIOk71T1USyC7OBcqE8BZw3FGQ==", "integrity": "sha1-DwDB04A852URF/b7bydNJnge+b0=",
"requires": { "requires": {
"debug": "^2.5.1", "debug": "^2.5.1",
"hashids": "^1.1.1", "hashids": "^1.1.1",
@@ -381,7 +505,7 @@
"electron-spellchecker": { "electron-spellchecker": {
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/electron-spellchecker/-/electron-spellchecker-1.1.2.tgz", "resolved": "https://registry.npmjs.org/electron-spellchecker/-/electron-spellchecker-1.1.2.tgz",
"integrity": "sha512-AdzD/Q82Svk9EDTc65vRr271UPLVIxsruKJM0iwqxEG9Y/CogNhEAJz/asV0BFWom4tpdB6cHcLbYePb11Musw==", "integrity": "sha1-X74eZdJGt35udDPuI4fZ0mAQ96g=",
"requires": { "requires": {
"@paulcbetts/cld": "^2.4.6", "@paulcbetts/cld": "^2.4.6",
"@paulcbetts/spellchecker": "^4.0.6", "@paulcbetts/spellchecker": "^4.0.6",
@@ -440,6 +564,36 @@
} }
} }
}, },
"encoding": {
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
"integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
"requires": {
"iconv-lite": "~0.4.13"
}
},
"es-abstract": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz",
"integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==",
"requires": {
"es-to-primitive": "^1.1.1",
"function-bind": "^1.1.1",
"has": "^1.0.1",
"is-callable": "^1.1.3",
"is-regex": "^1.0.4"
}
},
"es-to-primitive": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
"integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
"requires": {
"is-callable": "^1.1.1",
"is-date-object": "^1.0.1",
"is-symbol": "^1.0.1"
}
},
"escape-html": { "escape-html": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -448,12 +602,12 @@
"esprima": { "esprima": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
"integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ="
}, },
"event-kit": { "event-kit": {
"version": "2.4.0", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/event-kit/-/event-kit-2.4.0.tgz", "resolved": "https://registry.npmjs.org/event-kit/-/event-kit-2.4.0.tgz",
"integrity": "sha512-ZXd9jxUoc/f/zdLdR3OUcCzT84WnpaNWefquLyE125akIC90sDs8S3T/qihliuVsaj7Osc0z8lLL2fjooE9Z4A==" "integrity": "sha1-cYqvIt92ZwAkrWaSJIPhu6BUTzM="
}, },
"event-target-shim": { "event-target-shim": {
"version": "1.1.1", "version": "1.1.1",
@@ -481,6 +635,11 @@
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
}, },
"foreach": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
"integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
},
"forever-agent": { "forever-agent": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -529,6 +688,11 @@
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
}, },
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"get-stream": { "get-stream": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
@@ -591,6 +755,14 @@
"har-schema": "^2.0.0" "har-schema": "^2.0.0"
} }
}, },
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"requires": {
"function-bind": "^1.1.1"
}
},
"has-symbol-support-x": { "has-symbol-support-x": {
"version": "1.4.2", "version": "1.4.2",
"resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
@@ -607,7 +779,7 @@
"hashids": { "hashids": {
"version": "1.1.4", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/hashids/-/hashids-1.1.4.tgz", "resolved": "https://registry.npmjs.org/hashids/-/hashids-1.1.4.tgz",
"integrity": "sha512-U/fnTE3edW0AV92ZI/BfEluMZuVcu3MDOopsN7jS+HqDYcarQo8rXQiWlsBlm0uX48/taYSdxRsfzh2HRg5Z6w==" "integrity": "sha1-5P+SrWa2hKO9aqznwX1mYY7l+iE="
}, },
"hawk": { "hawk": {
"version": "6.0.2", "version": "6.0.2",
@@ -640,6 +812,14 @@
"sshpk": "^1.7.0" "sshpk": "^1.7.0"
} }
}, },
"iconv-lite": {
"version": "0.4.23",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
"integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3"
}
},
"indent-string": { "indent-string": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
@@ -678,6 +858,21 @@
"resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
"integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk="
}, },
"is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
},
"is-callable": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz",
"integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI="
},
"is-date-object": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
"integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY="
},
"is-ip": { "is-ip": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz", "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-2.0.0.tgz",
@@ -712,6 +907,14 @@
"resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
"integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ="
}, },
"is-regex": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
"integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
"requires": {
"has": "^1.0.1"
}
},
"is-retry-allowed": { "is-retry-allowed": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
@@ -722,6 +925,11 @@
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
}, },
"is-symbol": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
"integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI="
},
"is-typedarray": { "is-typedarray": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -803,7 +1011,7 @@
"keyboard-layout": { "keyboard-layout": {
"version": "2.0.13", "version": "2.0.13",
"resolved": "https://registry.npmjs.org/keyboard-layout/-/keyboard-layout-2.0.13.tgz", "resolved": "https://registry.npmjs.org/keyboard-layout/-/keyboard-layout-2.0.13.tgz",
"integrity": "sha512-WxVc3bBITttHozSyEYPsyr5rN2KQuXtEaXMlQfQjEze1JrkLw30yH/bcNn1IGx48b+tdOdybpnq++JFLU2FaZg==", "integrity": "sha1-W09cJYNeXSIae52ol2YxANiXSH0=",
"requires": { "requires": {
"event-kit": "^2.0.0", "event-kit": "^2.0.0",
"nan": "^2.0.0" "nan": "^2.0.0"
@@ -820,7 +1028,7 @@
"lazy-val": { "lazy-val": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.3.tgz", "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.3.tgz",
"integrity": "sha512-pjCf3BYk+uv3ZcPzEVM0BFvO9Uw58TmlrU0oG5tTrr9Kcid3+kdKxapH8CjdYmVa2nO5wOoZn2rdvZx2PKj/xg==" "integrity": "sha1-u5eyAO8AgB2UwxfincbtOeMcXtw="
}, },
"lodash.assign": { "lodash.assign": {
"version": "4.2.0", "version": "4.2.0",
@@ -840,7 +1048,7 @@
"lowercase-keys": { "lowercase-keys": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
"integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" "integrity": "sha1-b54wtHCE2XGnyCD/FabFFnt0wm8="
}, },
"lru-cache": { "lru-cache": {
"version": "4.1.3", "version": "4.1.3",
@@ -851,15 +1059,30 @@
"yallist": "^2.1.2" "yallist": "^2.1.2"
} }
}, },
"lsmod": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz",
"integrity": "sha1-mgD3bco26yP6BTUK/htYXUKZ5ks="
},
"md5": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
"integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
"requires": {
"charenc": "~0.0.1",
"crypt": "~0.0.1",
"is-buffer": "~1.1.1"
}
},
"mime-db": { "mime-db": {
"version": "1.33.0", "version": "1.33.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
"integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" "integrity": "sha1-o0kgUKXLm2NFBUHjnZeI0icng9s="
}, },
"mime-types": { "mime-types": {
"version": "2.1.18", "version": "2.1.18",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
"integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "integrity": "sha1-bzI/YKg9ERRvgx/xH9ZuL+VQO7g=",
"requires": { "requires": {
"mime-db": "~1.33.0" "mime-db": "~1.33.0"
} }
@@ -872,7 +1095,7 @@
"minimatch": { "minimatch": {
"version": "3.0.4", "version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
@@ -898,7 +1121,7 @@
"nan": { "nan": {
"version": "2.10.0", "version": "2.10.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
"integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" "integrity": "sha1-ltDNYQ69WNS03pzAxoKM2pnHVI8="
}, },
"node-json-db": { "node-json-db": {
"version": "0.7.3", "version": "0.7.3",
@@ -952,6 +1175,20 @@
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
}, },
"object-keys": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
"integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag=="
},
"object.getownpropertydescriptors": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
"integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
"requires": {
"define-properties": "^1.1.2",
"es-abstract": "^1.5.1"
}
},
"once": { "once": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -1158,7 +1395,7 @@
"uuid": { "uuid": {
"version": "3.2.1", "version": "3.2.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
"integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" "integrity": "sha1-EsUou51Y0LkmXZovbw/ovhf/HxQ="
} }
} }
}, },
@@ -1173,7 +1410,7 @@
"rimraf": { "rimraf": {
"version": "2.6.2", "version": "2.6.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=",
"requires": { "requires": {
"glob": "^7.0.5" "glob": "^7.0.5"
}, },
@@ -1181,7 +1418,7 @@
"glob": { "glob": {
"version": "7.1.2", "version": "7.1.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
"requires": { "requires": {
"fs.realpath": "^1.0.0", "fs.realpath": "^1.0.0",
"inflight": "^1.0.4", "inflight": "^1.0.4",
@@ -1196,7 +1433,7 @@
"rxjs": { "rxjs": {
"version": "5.5.8", "version": "5.5.8",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.8.tgz", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.8.tgz",
"integrity": "sha512-Bz7qou7VAIoGiglJZbzbXa4vpX5BmTTN2Dj/se6+SwADtw4SihqBIiEa7VmTXJ8pynvq0iFr5Gx9VLyye1rIxQ==", "integrity": "sha1-srCAmldhStYlTAPXRG3qDYPKN5E=",
"requires": { "requires": {
"symbol-observable": "1.0.1" "symbol-observable": "1.0.1"
} }
@@ -1214,15 +1451,20 @@
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" "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=="
},
"sax": { "sax": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk="
}, },
"semver": { "semver": {
"version": "5.4.1", "version": "5.4.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
"integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4="
}, },
"sntp": { "sntp": {
"version": "2.1.0", "version": "2.1.0",
@@ -1243,7 +1485,7 @@
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM="
}, },
"source-map-support": { "source-map-support": {
"version": "0.5.6", "version": "0.5.6",
@@ -1257,7 +1499,7 @@
"spawn-rx": { "spawn-rx": {
"version": "2.0.12", "version": "2.0.12",
"resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-2.0.12.tgz", "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-2.0.12.tgz",
"integrity": "sha512-gOPXiQQFQ9lTOLuys0iMn3jfxxv9c7zzwhbYLOEbQGvEShHVJ5sSR1oD3Daj88os7jKArDYT7rbOKdvNhe7iEg==", "integrity": "sha1-tihSlEmUJgib7qDDwewy1/xXo3Y=",
"requires": { "requires": {
"debug": "^2.5.1", "debug": "^2.5.1",
"lodash.assign": "^4.2.0", "lodash.assign": "^4.2.0",
@@ -1284,6 +1526,11 @@
"tweetnacl": "~0.14.0" "tweetnacl": "~0.14.0"
} }
}, },
"stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
"integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
},
"strict-uri-encode": { "strict-uri-encode": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
@@ -1315,7 +1562,7 @@
"tough-cookie": { "tough-cookie": {
"version": "2.3.4", "version": "2.3.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
"integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=",
"requires": { "requires": {
"punycode": "^1.4.1" "punycode": "^1.4.1"
} }
@@ -1372,6 +1619,15 @@
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
}, },
"util.promisify": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
"integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
"requires": {
"define-properties": "^1.1.2",
"object.getownpropertydescriptors": "^2.0.3"
}
},
"verror": { "verror": {
"version": "1.10.0", "version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",

View File

@@ -1,7 +1,7 @@
{ {
"name": "zulip", "name": "zulip",
"productName": "Zulip", "productName": "Zulip",
"version": "2.3.2", "version": "2.3.6",
"description": "Zulip Desktop App", "description": "Zulip Desktop App",
"license": "Apache-2.0", "license": "Apache-2.0",
"copyright": "Kandra Labs, Inc.", "copyright": "Kandra Labs, Inc.",
@@ -27,13 +27,15 @@
], ],
"dependencies": { "dependencies": {
"@electron-elements/send-feedback": "1.0.7", "@electron-elements/send-feedback": "1.0.7",
"escape-html": "1.0.3", "@sentry/electron": "0.8.1",
"adm-zip": "0.4.11",
"auto-launch": "5.0.5", "auto-launch": "5.0.5",
"electron-is-dev": "0.3.0", "electron-is-dev": "0.3.0",
"electron-log": "2.2.14", "electron-log": "2.2.14",
"electron-spellchecker": "1.1.2", "electron-spellchecker": "1.1.2",
"electron-updater": "2.23.3", "electron-updater": "2.23.3",
"electron-window-state": "4.1.1", "electron-window-state": "4.1.1",
"escape-html": "1.0.3",
"is-online": "7.0.0", "is-online": "7.0.0",
"node-json-db": "0.7.3", "node-json-db": "0.7.3",
"request": "2.85.0", "request": "2.85.0",

View File

@@ -364,7 +364,8 @@ i.open-tab-button {
} }
.reset-data-button, .reset-data-button,
.custom-css-button { .custom-css-button,
.download-folder-button {
display: inline-block; display: inline-block;
border: none; border: none;
padding: 10px; padding: 10px;
@@ -384,10 +385,10 @@ i.open-tab-button {
color: #fff; color: #fff;
} }
.selected-css-path { .selected-css-path,
.download-folder-path {
background: #eeeeee; background: #eeeeee;
padding: 10px; padding: 5px 10px;
margin-top: 10px;
margin-right: 10px; margin-right: 10px;
display: flex; display: flex;
width: 90%; width: 90%;
@@ -563,7 +564,7 @@ input.toggle-round:checked+label:after {
.certificate-input { .certificate-input {
width:100%; width:100%;
margin-top: 10px; margin-top: 10px;
display:inline-flex; display:inline-flex;
} }
@@ -602,7 +603,8 @@ input.toggle-round:checked+label:after {
/* responsive grid */ /* responsive grid */
@media (max-width: 650px) { @media (max-width: 650px) {
.selected-css-path { .selected-css-path,
.download-folder-path {
margin-right: 15px; margin-right: 15px;
} }
#css-delete-action { #css-delete-action {

View File

@@ -1,30 +1,65 @@
const { shell } = require('electron').remote; const { ipcRenderer } = require('electron');
const { shell, app } = require('electron').remote;
const LinkUtil = require('../utils/link-util'); const LinkUtil = require('../utils/link-util');
const DomainUtil = require('../utils/domain-util'); const DomainUtil = require('../utils/domain-util');
const ConfigUtil = require('../utils/config-util');
const dingSound = new Audio('../resources/sounds/ding.ogg');
function handleExternalLink(event) { function handleExternalLink(event) {
const { url } = event; const { url } = event;
const domainPrefix = DomainUtil.getDomain(this.props.index).url; const domainPrefix = DomainUtil.getDomain(this.props.index).url;
const downloadPath = ConfigUtil.getConfigItem('downloadsPath', `${app.getPath('downloads')}`);
const shouldShowInFolder = ConfigUtil.getConfigItem('showDownloadFolder', false);
// Whitelist URLs which are allowed to be opened in the app // Whitelist URLs which are allowed to be opened in the app
const { const {
isInternalUrl: isWhiteListURL, isInternalUrl: isWhiteListURL,
isUploadsUrl: isUploadsURL isUploadsUrl: isUploadsURL
} = LinkUtil.isInternal(domainPrefix, url); } = LinkUtil.isInternal(domainPrefix, url);
if (isWhiteListURL) { if (isWhiteListURL) {
event.preventDefault(); event.preventDefault();
// download txt, pdf, mp3, mp4 etc.. by using downloadURL in the // download txt, pdf, mp3, mp4 etc.. by using downloadURL in the
// main process which allows the user to save the files to their desktop // main process which allows the user to save the files to their desktop
// and not trigger webview reload while image in webview will // and not trigger webview reload while image in webview will
// do nothing and will not save it // do nothing and will not save it
if (!LinkUtil.isImage(url) && isUploadsURL) { if (!LinkUtil.isImage(url) && isUploadsURL) {
this.$el.downloadURL(url); ipcRenderer.send('downloadFile', url, downloadPath);
ipcRenderer.once('downloadFileCompleted', (event, filePath, fileName) => {
const downloadNotification = new Notification('Download Complete', {
body: shouldShowInFolder ? `Click to show ${fileName} in folder` : `Click to open ${fileName}`,
silent: true // We'll play our own sound - ding.ogg
});
// Play sound to indicate download complete
if (!ConfigUtil.getConfigItem('silent')) {
dingSound.play();
}
downloadNotification.onclick = () => {
if (shouldShowInFolder) {
// Reveal file in download folder
shell.showItemInFolder(filePath);
} else {
// Open file in the default native app
shell.openItem(filePath);
}
};
ipcRenderer.removeAllListeners('downloadFileFailed');
});
ipcRenderer.once('downloadFileFailed', () => {
// Automatic download failed, so show save dialog prompt and download
// through webview
this.$el.downloadURL(url);
ipcRenderer.removeAllListeners('downloadFileCompleted');
});
return; return;
} }
// open internal urls inside the current webview. // open internal urls inside the current webview.
this.$el.loadURL(url); this.$el.loadURL(url);
} else { } else {
event.preventDefault(); event.preventDefault();

View File

@@ -75,11 +75,16 @@ class WebView extends BaseComponent {
this.$el.addEventListener('page-favicon-updated', event => { this.$el.addEventListener('page-favicon-updated', event => {
const { favicons } = event; const { favicons } = event;
// This returns a string of favicons URL. If there is a PM counts in unread messages then the URL would be like // This returns a string of favicons URL. If there is a PM counts in unread messages then the URL would be like
// https://chat.zulip.org/static/images/favicon/favicon-pms.png // https://chat.zulip.org/static/images/favicon/favicon-pms.png
if (favicons[0].indexOf('favicon-pms') > 0 && process.platform === 'darwin') { if (favicons[0].indexOf('favicon-pms') > 0 && process.platform === 'darwin') {
// This api is only supported on macOS // This api is only supported on macOS
app.dock.setBadge('●'); app.dock.setBadge('●');
// bounce the dock
if (ConfigUtil.getConfigItem('dockBouncing')) {
app.dock.bounce();
}
} }
}); });

View File

@@ -0,0 +1,39 @@
const events = require('events');
const { ipcRenderer } = require('electron');
// we have and will have some non camelcase stuff
// while working with zulip so just turning the rule off
// for the whole file.
/* eslint-disable camelcase */
class ElectronBridge extends events {
send_event(...args) {
this.emit(...args);
}
on_event(...args) {
this.on(...args);
}
}
const electron_bridge = new ElectronBridge();
electron_bridge.on('total_unread_count', (...args) => {
ipcRenderer.send('unread-count', ...args);
});
electron_bridge.on('realm_name', (...args) => {
ipcRenderer.send('realm-name-changed', ...args);
});
electron_bridge.on('realm_icon_url', iconURL => {
const serverURL = location.origin;
iconURL = iconURL.includes('http') ? iconURL : `${serverURL}${iconURL}`;
ipcRenderer.send('realm-icon-changed', serverURL, iconURL);
});
// this follows node's idiomatic implementation of event
// emitters to make event handling more simpler instead of using
// functions zulip side will emit event using ElectronBrigde.send_event
// which is alias of .emit and on this side we can handle the data by adding
// a listener for the event.
module.exports = electron_bridge;

View File

@@ -3,7 +3,7 @@
const { ipcRenderer, remote } = require('electron'); const { ipcRenderer, remote } = require('electron');
const isDev = require('electron-is-dev'); const isDev = require('electron-is-dev');
const { session } = remote; const { session, app } = remote;
require(__dirname + '/js/tray.js'); require(__dirname + '/js/tray.js');
const DomainUtil = require(__dirname + '/js/utils/domain-util.js'); const DomainUtil = require(__dirname + '/js/utils/domain-util.js');
@@ -16,8 +16,6 @@ const ReconnectUtil = require(__dirname + '/js/utils/reconnect-util.js');
const Logger = require(__dirname + '/js/utils/logger-util.js'); const Logger = require(__dirname + '/js/utils/logger-util.js');
const { feedbackHolder } = require(__dirname + '/js/feedback.js'); const { feedbackHolder } = require(__dirname + '/js/feedback.js');
const escape = require('escape-html');
const logger = new Logger({ const logger = new Logger({
file: 'errors.log', file: 'errors.log',
timestamp: true timestamp: true
@@ -116,7 +114,9 @@ class ServerManagerView {
dndPreviousSettings: { dndPreviousSettings: {
showNotification: true, showNotification: true,
silent: false silent: false
} },
downloadsPath: `${app.getPath('downloads')}`,
showDownloadFolder: false
}; };
// Platform specific settings // Platform specific settings
@@ -127,6 +127,11 @@ class ServerManagerView {
settingOptions.dndPreviousSettings.flashTaskbarOnMessage = true; settingOptions.dndPreviousSettings.flashTaskbarOnMessage = true;
} }
if (process.platform === 'darwin') {
// Only available on macOS
settingOptions.dockBouncing = true;
}
for (const i in settingOptions) { for (const i in settingOptions) {
if (ConfigUtil.getConfigItem(i) === null) { if (ConfigUtil.getConfigItem(i) === null) {
ConfigUtil.setConfigItem(i, settingOptions[i]); ConfigUtil.setConfigItem(i, settingOptions[i]);
@@ -246,7 +251,7 @@ class ServerManagerView {
} }
onHover(index, serverName) { onHover(index, serverName) {
this.$serverIconTooltip[index].innerHTML = escape(serverName); this.$serverIconTooltip[index].innerHTML = serverName;
this.$serverIconTooltip[index].removeAttribute('style'); this.$serverIconTooltip[index].removeAttribute('style');
// To handle position of servers' tooltip due to scrolling of list of organizations // To handle position of servers' tooltip due to scrolling of list of organizations
// This could not be handled using CSS, hence the top of the tooltip is made same // This could not be handled using CSS, hence the top of the tooltip is made same
@@ -390,6 +395,22 @@ class ServerManagerView {
const webContents = webview.getWebContents(); const webContents = webview.getWebContents();
webContents.send('toggle-dnd', state, newSettings); webContents.send('toggle-dnd', state, newSettings);
}); });
ipcRenderer.on('update-realm-icon', (event, serverURL, iconURL) => {
DomainUtil.getDomains().forEach((domain, index) => {
if (domain.url.includes(serverURL)) {
DomainUtil.saveServerIcon(iconURL).then(localIconUrl => {
const serverImgsSelector = `.tab .server-icons`;
const serverImgs = document.querySelectorAll(serverImgsSelector);
serverImgs[index].src = localIconUrl;
domain.icon = localIconUrl;
DomainUtil.db.push(`/domains[${index}]`, domain, true);
DomainUtil.reloadDB();
});
}
});
});
} }
destroyTab(name, index) { destroyTab(name, index) {

View File

@@ -4,6 +4,7 @@ const {
remote: { app } remote: { app }
} = require('electron'); } = require('electron');
const params = require('../utils/params-util.js');
const DefaultNotification = require('./default-notification'); const DefaultNotification = require('./default-notification');
const { appId, loadBots } = require('./helpers'); const { appId, loadBots } = require('./helpers');
@@ -19,9 +20,8 @@ if (process.platform === 'darwin') {
} }
window.addEventListener('load', () => { window.addEventListener('load', () => {
// Call this function only when user is logged in
// eslint-disable-next-line no-undef, camelcase // eslint-disable-next-line no-undef, camelcase
if (page_params.realm_uri) { if (params.isPageParams() && page_params.realm_uri) {
loadBots(); loadBots();
} }
}); });

View File

@@ -31,6 +31,10 @@ class GeneralSection extends BaseSection {
<div class="setting-description">Show app unread badge</div> <div class="setting-description">Show app unread badge</div>
<div class="setting-control"></div> <div class="setting-control"></div>
</div> </div>
<div class="setting-row" id="dock-bounce-option" style= "display:${process.platform === 'darwin' ? '' : 'none'}">
<div class="setting-description">Bounce dock on new private message</div>
<div class="setting-control"></div>
</div>
<div class="setting-row" id="flash-taskbar-option" style= "display:${process.platform === 'win32' ? '' : 'none'}"> <div class="setting-row" id="flash-taskbar-option" style= "display:${process.platform === 'win32' ? '' : 'none'}">
<div class="setting-description">Flash taskbar on new message</div> <div class="setting-description">Flash taskbar on new message</div>
<div class="setting-control"></div> <div class="setting-control"></div>
@@ -91,6 +95,25 @@ class GeneralSection extends BaseSection {
</div> </div>
</div> </div>
</div> </div>
<div class="title">Advanced</div>
<div class="settings-card">
<div class="setting-row" id="show-download-folder">
<div class="setting-description">Show downloaded file in the file manager</div>
<div class="setting-control"></div>
</div>
<div class="setting-row" id="download-folder">
<div class="setting-description">
Default download location
</div>
<button class="download-folder-button blue">Choose</button>
</div>
<div class="setting-row">
<div class="setting-description">
<div class="download-folder-path">${ConfigUtil.getConfigItem('downloadsPath', `${app.getPath('downloads')}`)}</div>
</div>
</div>
</div>
<div class="title">Reset Application Data</div> <div class="title">Reset Application Data</div>
<div class="settings-card"> <div class="settings-card">
<div class="setting-row" id="resetdata-option"> <div class="setting-row" id="resetdata-option">
@@ -119,12 +142,19 @@ class GeneralSection extends BaseSection {
this.addCustomCSS(); this.addCustomCSS();
this.showCustomCSSPath(); this.showCustomCSSPath();
this.removeCustomCSS(); this.removeCustomCSS();
this.downloadFolder();
this.showDownloadFolder();
// Platform specific settings // Platform specific settings
// Flashing taskbar on Windows // Flashing taskbar on Windows
if (process.platform === 'win32') { if (process.platform === 'win32') {
this.updateFlashTaskbar(); this.updateFlashTaskbar();
} }
// Dock bounce on macOS
if (process.platform === 'darwin') {
this.updateDockBouncing();
}
} }
updateTrayOption() { updateTrayOption() {
@@ -153,6 +183,18 @@ class GeneralSection extends BaseSection {
}); });
} }
updateDockBouncing() {
this.generateSettingOption({
$element: document.querySelector('#dock-bounce-option .setting-control'),
value: ConfigUtil.getConfigItem('dockBouncing', true),
clickHandler: () => {
const newValue = !ConfigUtil.getConfigItem('dockBouncing');
ConfigUtil.setConfigItem('dockBouncing', newValue);
this.updateDockBouncing();
}
});
}
updateFlashTaskbar() { updateFlashTaskbar() {
this.generateSettingOption({ this.generateSettingOption({
$element: document.querySelector('#flash-taskbar-option .setting-control'), $element: document.querySelector('#flash-taskbar-option .setting-control'),
@@ -327,6 +369,40 @@ class GeneralSection extends BaseSection {
}); });
} }
downloadFolderDialog() {
const showDialogOptions = {
title: 'Select Download Location',
defaultId: 1,
properties: ['openDirectory']
};
dialog.showOpenDialog(showDialogOptions, selectedFolder => {
if (selectedFolder) {
ConfigUtil.setConfigItem('downloadsPath', selectedFolder[0]);
const downloadFolderPath = document.querySelector('.download-folder-path');
downloadFolderPath.innerText = selectedFolder[0];
}
});
}
downloadFolder() {
const downloadFolder = document.querySelector('#download-folder .download-folder-button');
downloadFolder.addEventListener('click', () => {
this.downloadFolderDialog();
});
}
showDownloadFolder() {
this.generateSettingOption({
$element: document.querySelector('#show-download-folder .setting-control'),
value: ConfigUtil.getConfigItem('showDownloadFolder', false),
clickHandler: () => {
const newValue = !ConfigUtil.getConfigItem('showDownloadFolder');
ConfigUtil.setConfigItem('showDownloadFolder', newValue);
this.showDownloadFolder();
}
});
}
} }
module.exports = GeneralSection; module.exports = GeneralSection;

View File

@@ -5,6 +5,7 @@ const SetupSpellChecker = require('./spellchecker');
const ConfigUtil = require(__dirname + '/utils/config-util.js'); const ConfigUtil = require(__dirname + '/utils/config-util.js');
const LinkUtil = require(__dirname + '/utils/link-util.js'); const LinkUtil = require(__dirname + '/utils/link-util.js');
const params = require(__dirname + '/utils/params-util.js');
// eslint-disable-next-line import/no-unassigned-import // eslint-disable-next-line import/no-unassigned-import
require('./notification'); require('./notification');
@@ -12,6 +13,9 @@ require('./notification');
// Prevent drag and drop event in main process which prevents remote code executaion // Prevent drag and drop event in main process which prevents remote code executaion
require(__dirname + '/shared/preventdrag.js'); require(__dirname + '/shared/preventdrag.js');
// eslint-disable-next-line camelcase
window.electron_bridge = require('./electron-bridge');
const logout = () => { const logout = () => {
// Create the menu for the below // Create the menu for the below
document.querySelector('.dropdown-toggle').click(); document.querySelector('.dropdown-toggle').click();
@@ -39,46 +43,44 @@ process.once('loaded', () => {
// To prevent failing this script on linux we need to load it after the document loaded // To prevent failing this script on linux we need to load it after the document loaded
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
if (params.isPageParams()) {
// Get the default language of the server // Get the default language of the server
const serverLanguage = page_params.default_language; // eslint-disable-line no-undef, camelcase const serverLanguage = page_params.default_language; // eslint-disable-line no-undef, camelcase
if (serverLanguage) {
// Set spellcheker language
ConfigUtil.setConfigItem('spellcheckerLanguage', serverLanguage);
// Init spellchecker
SetupSpellChecker.init();
}
// redirect users to network troubleshooting page
const getRestartButton = document.querySelector('.restart_get_events_button');
if (getRestartButton) {
getRestartButton.addEventListener('click', () => {
ipcRenderer.send('forward-message', 'reload-viewer');
});
}
// Open image attachment link in the lightbox instead of opening in the default browser
const { $, lightbox } = window;
$('#main_div').on('click', '.message_content p a', function (e) {
const url = $(this).attr('href');
if (serverLanguage) { if (LinkUtil.isImage(url)) {
// Set spellcheker language const $img = $(this).parent().siblings('.message_inline_image').find('img');
ConfigUtil.setConfigItem('spellcheckerLanguage', serverLanguage);
// Init spellchecker
SetupSpellChecker.init();
}
// redirect users to network troubleshooting page // prevent the image link from opening in a new page.
const getRestartButton = document.querySelector('.restart_get_events_button'); e.preventDefault();
if (getRestartButton) { // prevent the message compose dialog from happening.
getRestartButton.addEventListener('click', () => { e.stopPropagation();
ipcRenderer.send('forward-message', 'reload-viewer');
// Open image in the default browser if image preview is unavailable
if (!$img[0]) {
shell.openExternal(window.location.origin + url);
}
// Open image in lightbox
lightbox.open($img);
}
}); });
} }
// Open image attachment link in the lightbox instead of opening in the default browser
const { $, lightbox } = window;
$('#main_div').on('click', '.message_content p a', function (e) {
const url = $(this).attr('href');
if (LinkUtil.isImage(url)) {
const $img = $(this).parent().siblings('.message_inline_image').find('img');
// prevent the image link from opening in a new page.
e.preventDefault();
// prevent the message compose dialog from happening.
e.stopPropagation();
// Open image in the default browser if image preview is unavailable
if (!$img[0]) {
shell.openExternal(window.location.origin + url);
}
// Open image in lightbox
lightbox.open($img);
}
});
}); });
// Clean up spellchecker events after you navigate away from this page; // Clean up spellchecker events after you navigate away from this page;

View File

@@ -79,6 +79,7 @@ class ConfigUtil {
); );
logger.error('Error while JSON parsing settings.json: '); logger.error('Error while JSON parsing settings.json: ');
logger.error(err); logger.error(err);
logger.reportSentry(err);
} }
} }
this.db = new JsonDB(settingsJsonPath, true, true); this.db = new JsonDB(settingsJsonPath, true, true);

View File

@@ -10,6 +10,8 @@ const escape = require('escape-html');
const Logger = require('./logger-util'); const Logger = require('./logger-util');
const CertificateUtil = require(__dirname + '/certificate-util.js'); const CertificateUtil = require(__dirname + '/certificate-util.js');
const ProxyUtil = require(__dirname + '/proxy-util.js');
const ConfigUtil = require(__dirname + '/config-util.js');
const logger = new Logger({ const logger = new Logger({
file: `domain-util.log`, file: `domain-util.log`,
@@ -119,8 +121,16 @@ class DomainUtil {
logger.warn('Error while trying to get certificate: ' + err); logger.warn('Error while trying to get certificate: ' + err);
} }
} }
const proxyEnabled = ConfigUtil.getConfigItem('useManualProxy') || ConfigUtil.getConfigItem('useSystemProxy');
// If certificate for the domain exists add it as a ca key in the request's parameter else consider only domain as the parameter for request // If certificate for the domain exists add it as a ca key in the request's parameter else consider only domain as the parameter for request
const checkDomain = (certificateLocation) ? ({url: domain + '/static/audio/zulip.ogg', ca: certificateLocation}) : domain + '/static/audio/zulip.ogg'; // Add proxy as a parameter if it sbeing used.
const checkDomain = {
url: domain + '/static/audio/zulip.ogg',
ca: (certificateLocation) ? certificateLocation : '',
proxy: proxyEnabled ? ProxyUtil.getProxy(domain) : ''
};
const serverConf = { const serverConf = {
icon: defaultIconUrl, icon: defaultIconUrl,
@@ -155,6 +165,9 @@ class DomainUtil {
resolve(serverConf); resolve(serverConf);
}); });
} else { } else {
// Report error to sentry to get idea of possible certificate errors
// users get when adding the servers
logger.reportSentry(new Error(error));
const certErrorMessage = `Do you trust certificate from ${domain}? \n ${error}`; const certErrorMessage = `Do you trust certificate from ${domain}? \n ${error}`;
const certErrorDetail = `The organization you're connecting to is either someone impersonating the Zulip server you entered, or the server you're trying to connect to is configured in an insecure way. const certErrorDetail = `The organization you're connecting to is either someone impersonating the Zulip server you entered, or the server you're trying to connect to is configured in an insecure way.
\nIf you have a valid certificate please add it from Settings>Organizations and try to add the organization again. \nIf you have a valid certificate please add it from Settings>Organizations and try to add the organization again.
@@ -164,7 +177,7 @@ class DomainUtil {
dialog.showMessageBox({ dialog.showMessageBox({
type: 'warning', type: 'warning',
buttons: ['Yes', 'No'], buttons: ['Yes', 'No'],
defaultId: 0, defaultId: 1,
message: certErrorMessage, message: certErrorMessage,
detail: certErrorDetail detail: certErrorDetail
}, response => { }, response => {
@@ -190,9 +203,13 @@ class DomainUtil {
} }
getServerSettings(domain) { getServerSettings(domain) {
const serverSettingsUrl = domain + '/api/v1/server_settings'; const proxyEnabled = ConfigUtil.getConfigItem('useManualProxy') || ConfigUtil.getConfigItem('useSystemProxy');
const serverSettingsOptions = {
url: domain + '/api/v1/server_settings',
proxy: proxyEnabled ? ProxyUtil.getProxy(domain) : ''
};
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
request(serverSettingsUrl, (error, response) => { request(serverSettingsOptions, (error, response) => {
if (!error && response.statusCode === 200) { if (!error && response.statusCode === 200) {
const data = JSON.parse(response.body); const data = JSON.parse(response.body);
if (data.hasOwnProperty('realm_icon') && data.realm_icon) { if (data.hasOwnProperty('realm_icon') && data.realm_icon) {
@@ -212,15 +229,21 @@ class DomainUtil {
} }
saveServerIcon(url) { saveServerIcon(url) {
const proxyEnabled = ConfigUtil.getConfigItem('useManualProxy') || ConfigUtil.getConfigItem('useSystemProxy');
const serverIconOptions = {
url,
proxy: proxyEnabled ? ProxyUtil.getProxy(url) : ''
};
// The save will always succeed. If url is invalid, downgrade to default icon. // The save will always succeed. If url is invalid, downgrade to default icon.
return new Promise(resolve => { return new Promise(resolve => {
const filePath = this.generateFilePath(url); const filePath = this.generateFilePath(url);
const file = fs.createWriteStream(filePath); const file = fs.createWriteStream(filePath);
try { try {
request(url).on('response', response => { request(serverIconOptions).on('response', response => {
response.on('error', err => { response.on('error', err => {
logger.log('Could not get server icon.'); logger.log('Could not get server icon.');
logger.log(err); logger.log(err);
logger.reportSentry(err);
resolve(defaultIconUrl); resolve(defaultIconUrl);
}); });
response.pipe(file).on('finish', () => { response.pipe(file).on('finish', () => {
@@ -229,11 +252,13 @@ class DomainUtil {
}).on('error', err => { }).on('error', err => {
logger.log('Could not get server icon.'); logger.log('Could not get server icon.');
logger.log(err); logger.log(err);
logger.reportSentry(err);
resolve(defaultIconUrl); resolve(defaultIconUrl);
}); });
} catch (err) { } catch (err) {
logger.log('Could not get server icon.'); logger.log('Could not get server icon.');
logger.log(err); logger.log(err);
logger.reportSentry(err);
resolve(defaultIconUrl); resolve(defaultIconUrl);
} }
}); });
@@ -265,6 +290,7 @@ class DomainUtil {
); );
logger.error('Error while JSON parsing domain.json: '); logger.error('Error while JSON parsing domain.json: ');
logger.error(err); logger.error(err);
logger.reportSentry(err);
} }
} }
this.db = new JsonDB(domainJsonPath, true, true); this.db = new JsonDB(domainJsonPath, true, true);

View File

@@ -2,8 +2,10 @@ const NodeConsole = require('console').Console;
const fs = require('fs'); const fs = require('fs');
const isDev = require('electron-is-dev'); const isDev = require('electron-is-dev');
const { initSetUp } = require('./default-util'); const { initSetUp } = require('./default-util');
const { sentryInit, captureException } = require('./sentry-util');
initSetUp(); initSetUp();
sentryInit();
let app = null; let app = null;
if (process.type === 'renderer') { if (process.type === 'renderer') {
app = require('electron').remote.app; app = require('electron').remote.app;
@@ -82,6 +84,10 @@ class Logger {
`${date.getMinutes()}:${date.getSeconds()}`; `${date.getMinutes()}:${date.getSeconds()}`;
return timestamp; return timestamp;
} }
reportSentry(err) {
captureException(err);
}
} }
module.exports = Logger; module.exports = Logger;

View File

@@ -0,0 +1,15 @@
// This util function returns the page params if they're present else returns null
function isPageParams() {
let webpageParams = null;
try {
// eslint-disable-next-line no-undef, camelcase
webpageParams = page_params;
} catch (err) {
webpageParams = null;
}
return webpageParams;
}
module.exports = {
isPageParams
};

View File

@@ -1,5 +1,6 @@
'use strict'; 'use strict';
const url = require('url');
const ConfigUtil = require('./config-util.js'); const ConfigUtil = require('./config-util.js');
let instance = null; let instance = null;
@@ -15,6 +16,39 @@ class ProxyUtil {
return instance; return instance;
} }
// Return proxy to be used for a particular uri, to be used for request
getProxy(uri) {
uri = url.parse(uri);
const proxyRules = ConfigUtil.getConfigItem('proxyRules', '').split(';');
// If SPS is on and system uses no proxy then request should not try to use proxy from
// environment. NO_PROXY = '*' makes request ignore all environment proxy variables.
if (proxyRules[0] === '') {
process.env.NO_PROXY = '*';
return;
}
const proxyRule = {};
if (uri.protocol === 'http:') {
proxyRules.forEach(proxy => {
if (proxy.includes('http=')) {
proxyRule.hostname = proxy.split('http=')[1].trim().split(':')[0];
proxyRule.port = proxy.split('http=')[1].trim().split(':')[1];
}
});
return proxyRule;
}
if (uri.protocol === 'https:') {
proxyRules.forEach(proxy => {
if (proxy.includes('https=')) {
proxyRule.hostname = proxy.split('https=')[1].trim().split(':')[0];
proxyRule.port = proxy.split('https=')[1].trim().split(':')[1];
}
});
return proxyRule;
}
}
resolveSystemProxy(mainWindow) { resolveSystemProxy(mainWindow) {
const page = mainWindow.webContents; const page = mainWindow.webContents;
const ses = page.session; const ses = page.session;

View File

@@ -0,0 +1,16 @@
const { init, captureException } = require('@sentry/electron');
const isDev = require('electron-is-dev');
const sentryInit = () => {
if (!isDev) {
init({
dsn: 'SENTRY_DSN',
sendTimeout: 30 // wait 30 seconds before considering the sending capture to have failed, default is 1 second
});
}
};
module.exports = {
sentryInit,
captureException
};

Binary file not shown.

View File

@@ -5,6 +5,51 @@
All notable changes to the Zulip desktop app are documented in this file. All notable changes to the Zulip desktop app are documented in this file.
### v2.3.5 --2018-08-03
**New features**:
* Add a setting option to show downloaded file in file manager.
* Added electron bridge to communicate with webapp in real time.
**Fixes**:
* Fix failing attached file downloads.
* Fix page_params error.
* gulpfile: Update syntax and methods for gulp v4.x.
<hr>
### v2.3.4-beta --2018-07-24
**Fixes**:
* Fix downloading functionality of file attachments.
* Fix null of downloadPath when settings.json fails.
<hr>
### v2.3.3 --2018-07-14
**Enhancements**:
* Add dock bounce effect on macOS
* Add a setting option to use the system proxy settings
* Add support for self/custom signed certificate
* Add Sentry support to get the bug reports
* Show a notification when a user clicks on file attachments and open the same in default native app
**Fixes**:
* Fix auto-updates on Windows
* Fix image attachments not opening up in the app
* Security fix - Do proper HTML escaping for server data to avoid XSS attacks
* Other minor fixes
**Updated dependencies**:
electron-builder: v20.20.4
electron-updater: v2.23.3
<hr>
### v2.3.2 --2018-05-28 ### v2.3.2 --2018-05-28

View File

@@ -10,11 +10,11 @@ gulp.task('dev', () => {
// Start browser process // Start browser process
electron.start(); electron.start();
// Restart browser process // Restart browser process
gulp.watch('app/main/*.js', ['restart:browser']); gulp.watch('app/main/*.js', gulp.series('restart:browser'));
// Reload renderer process // Reload renderer process
gulp.watch('app/renderer/css/*.css', ['reload:renderer']); gulp.watch('app/renderer/css/*.css', gulp.series('reload:renderer'));
gulp.watch('app/renderer/*.html', ['reload:renderer']); gulp.watch('app/renderer/*.html', gulp.series('reload:renderer'));
gulp.watch('app/renderer/js/**/*.js', ['reload:renderer']); gulp.watch('app/renderer/js/**/*.js', gulp.series('reload:renderer'));
}); });
gulp.task('restart:browser', done => { gulp.task('restart:browser', done => {
@@ -36,4 +36,4 @@ gulp.task('test-e2e', () => {
})); }));
}); });
gulp.task('default', ['dev', 'test-e2e']); gulp.task('default', gulp.parallel('dev', 'test-e2e'));

105
help.md
View File

@@ -1,105 +0,0 @@
# User Guide
> Welcome! This guide will walk you through the basics of using Zulip Desktop.
## Get Zulip Desktop
## Connect to a Server
### Connect through a proxy
It's possible to connect to your server through a proxy.
You can enter the proxy settings in the `Network` section of App Settings.
There are three fields provided:
* `PAC script` - The URL associated with the PAC file.
* `Proxy rules` - Rules indicating which proxies to use.
* `Proxy bypass rules` - Rules indicating which URLs should
bypass the proxy settings.
For a typical setup where internet access is required to use an HTTP proxy,
but URLs on the local network should be accessed directly, configure as follows:
`Proxy rules = proxy.example.com`
Your HTTP proxy server
`Proxy bypass rules = *.example.com;10.0.0.0/8`
Directly connect to your own domain and private IP subnet
for more complex setups, read below to configure complex proxy rules and proxy bypass rules.
### Sets the proxy settings.
When `PAC script` and `Proxy rules` are provided together, the `Proxy rules`
option is ignored and `PAC script` configuration is applied.
The `Proxy rules` has to follow the rules below:
```
proxyRules = schemeProxies[";"<schemeProxies>]
schemeProxies = [<urlScheme>"="]<proxyURIList>
urlScheme = "http" | "https" | "ftp" | "socks"
proxyURIList = <proxyURL>[","<proxyURIList>]
proxyURL = [<proxyScheme>"://"]<proxyHost>[":"<proxyPort>]
```
For example:
* `http=foopy:80;ftp=foopy2` - Use HTTP proxy `foopy:80` for `http://` URLs, and
HTTP proxy `foopy2:80` for `ftp://` URLs.
* `foopy:80` - Use HTTP proxy `foopy:80` for all URLs.
* `foopy:80,bar,direct://` - Use HTTP proxy `foopy:80` for all URLs, failing
over to `bar` if `foopy:80` is unavailable, and after that using no proxy.
* `socks4://foopy` - Use SOCKS v4 proxy `foopy:1080` for all URLs.
* `http=foopy,socks5://bar.com` - Use HTTP proxy `foopy` for http URLs, and fail
over to the SOCKS5 proxy `bar.com` if `foopy` is unavailable.
* `http=foopy,direct://` - Use HTTP proxy `foopy` for http URLs, and use no
proxy if `foopy` is unavailable.
* `http=foopy;socks=foopy2` - Use HTTP proxy `foopy` for http URLs, and use
`socks4://foopy2` for all other URLs.
The `Proxy bypass rules` is a comma separated list of rules described below:
* `[ URL_SCHEME "://" ] HOSTNAME_PATTERN [ ":" <port> ]`
Match all hostnames that match the pattern HOSTNAME_PATTERN.
Examples:
"foobar.com", "*foobar.com", "*.foobar.com", "*foobar.com:99",
"https://x.*.y.com:99"
* `"." HOSTNAME_SUFFIX_PATTERN [ ":" PORT ]`
Match a particular domain suffix.
Examples:
".google.com", ".com", "http://.google.com"
* `[ SCHEME "://" ] IP_LITERAL [ ":" PORT ]`
Match URLs which are IP address literals.
Examples:
"127.0.1", "[0:0::1]", "[::1]", "http://[::1]:99"
* `IP_LITERAL "/" PREFIX_LENGHT_IN_BITS`
Match any URL that is to an IP literal that falls between the
given range. IP range is specified using CIDR notation.
Examples:
"192.168.1.1/16", "fefe:13::abc/33".
* `<local>`
Match local addresses. The meaning of `<local>` is whether the
host matches one of: "127.0.0.1", "::1", "localhost".
## Change App Preferences
## Reporting an Issue

145
package-lock.json generated
View File

@@ -1,19 +1,19 @@
{ {
"name": "zulip", "name": "zulip",
"version": "2.3.2", "version": "2.3.6",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
"7zip-bin": { "7zip-bin": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-4.0.2.tgz", "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-4.0.2.tgz",
"integrity": "sha1-arvcIvM8q3QgU3d6JtsuJcpScXk=", "integrity": "sha512-XtGk+IF57pr852UK1AhQJXqmm1WmSgS5uISL+LPs0z/iAxXouMvdlLJrHPeukP6gd7yR2rDTMSMkHNODgwIq7A==",
"dev": true "dev": true
}, },
"@types/node": { "@types/node": {
"version": "8.10.17", "version": "8.10.26",
"resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.17.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.26.tgz",
"integrity": "sha512-3N3FRd/rA1v5glXjb90YdYUa+sOB7WrkU2rAhKZnF4TKD86Cym9swtulGuH0p9nxo7fP5woRNa8b0oFTpCO1bg==", "integrity": "sha512-opk6bLLErLSwyVVJeSH5Ek7ZWOBSsN0JrvXTNVGLXLAXKB9xlTYajrplR44xVyMrmbut94H6uJ9jqzM/12jxkA==",
"dev": true "dev": true
}, },
"abbrev": { "abbrev": {
@@ -51,11 +51,6 @@
} }
} }
}, },
"adm-zip": {
"version": "0.4.11",
"resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz",
"integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA=="
},
"ajv": { "ajv": {
"version": "5.5.2", "version": "5.5.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
@@ -178,9 +173,9 @@
} }
}, },
"app-builder-bin": { "app-builder-bin": {
"version": "1.10.3", "version": "1.11.1",
"resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-1.10.3.tgz", "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-1.11.1.tgz",
"integrity": "sha512-DQva42HxatQkic4T2ybHpELsBlesj3ftMmSJkaSRP9N5q9qiQHjQO7t8o6j6nTKyKSNF7xr1jQtevyVvAPq9Wg==", "integrity": "sha512-EYzPq59A3AMAD0/a6QSSBGzrXvKCm19t5utO5qeMTSAeWx0HDZxMyUBRUoOZIFd6+uJRF1HMTofIAushLu7PhQ==",
"dev": true "dev": true
}, },
"append-buffer": { "append-buffer": {
@@ -519,7 +514,7 @@
"async-exit-hook": { "async-exit-hook": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
"integrity": "sha1-i9iwJLDsmxwBzMua+dspvXF9+vM=", "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
"dev": true "dev": true
}, },
"async-limiter": { "async-limiter": {
@@ -766,13 +761,13 @@
"bluebird": { "bluebird": {
"version": "3.5.1", "version": "3.5.1",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
"integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=", "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
"dev": true "dev": true
}, },
"bluebird-lst": { "bluebird-lst": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.5.tgz", "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.5.tgz",
"integrity": "sha1-vryDAmt+kqcocaPcWZ4hnL+wAqk=", "integrity": "sha512-Ey0bDNys5qpYPhZ/oQ9vOEvD0TYQDTILMXWP2iGfvMg7rSDde+oV4aQQgqRH+CvBFNz2BSDQnPGMUl6LKBUUQA==",
"dev": true, "dev": true,
"requires": { "requires": {
"bluebird": "^3.5.1" "bluebird": "^3.5.1"
@@ -927,13 +922,13 @@
"dev": true "dev": true
}, },
"builder-util": { "builder-util": {
"version": "5.13.2", "version": "5.16.0",
"resolved": "https://registry.npmjs.org/builder-util/-/builder-util-5.13.2.tgz", "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-5.16.0.tgz",
"integrity": "sha512-pdt5hkCS69Hhy6b8VuZbLi9fYtjkhah2QPB7Rwg7/475kFOhMEkbYhGckfDPcdT64Vk+1RHtZd2oiNiZNyaZ3w==", "integrity": "sha512-HN7EyZF+WPcncty4fy7AVZxfR8TMkX/ZxxQfsji4dWyzDZ8nAqMadXKZlqySfLr5ckEjwEsOrDqO2ZsqkVoCtg==",
"dev": true, "dev": true,
"requires": { "requires": {
"7zip-bin": "~4.0.2", "7zip-bin": "~4.0.2",
"app-builder-bin": "1.10.3", "app-builder-bin": "1.11.1",
"bluebird-lst": "^1.0.5", "bluebird-lst": "^1.0.5",
"builder-util-runtime": "^4.4.0", "builder-util-runtime": "^4.4.0",
"chalk": "^2.4.1", "chalk": "^2.4.1",
@@ -1171,7 +1166,7 @@
"cliui": { "cliui": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
"integrity": "sha1-NIQi2+gtgAswIu709qwQvy5NG0k=", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"string-width": "^2.1.1", "string-width": "^2.1.1",
@@ -1194,7 +1189,7 @@
"string-width": { "string-width": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
"integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"dev": true, "dev": true,
"requires": { "requires": {
"is-fullwidth-code-point": "^2.0.0", "is-fullwidth-code-point": "^2.0.0",
@@ -1939,14 +1934,14 @@
} }
}, },
"dmg-builder": { "dmg-builder": {
"version": "4.11.6", "version": "4.14.0",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-4.11.6.tgz", "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-4.14.0.tgz",
"integrity": "sha512-y9zc4oCp0kdXaXZxOvTbMdWv5Mmwu0NHEDQVT4AkZyufnaC+xt8YdMcsZfM9NLkMlryGVjM7+1t0oFbvqIyXzQ==", "integrity": "sha512-zTlb3VFkOGqCzsSSEVkfzCRl0Gd3LINMfplI6mCvTSU825OVG7W1IvZSp2gikLT5OJIgJzx2YuomKntWhXOJWA==",
"dev": true, "dev": true,
"requires": { "requires": {
"bluebird-lst": "^1.0.5", "bluebird-lst": "^1.0.5",
"builder-util": "^5.13.2", "builder-util": "~5.16.0",
"electron-builder-lib": "~20.19.1", "electron-builder-lib": "~20.20.4",
"fs-extra-p": "^4.6.1", "fs-extra-p": "^4.6.1",
"iconv-lite": "^0.4.23", "iconv-lite": "^0.4.23",
"js-yaml": "^3.12.0", "js-yaml": "^3.12.0",
@@ -2096,9 +2091,9 @@
"dev": true "dev": true
}, },
"electron": { "electron": {
"version": "2.0.1", "version": "2.0.8",
"resolved": "https://registry.npmjs.org/electron/-/electron-2.0.1.tgz", "resolved": "https://registry.npmjs.org/electron/-/electron-2.0.8.tgz",
"integrity": "sha512-piSwY2P7L6NWx672MNdSvtGPdQP/mhwAg8ICN6ofTTItPkd7D6kNHBPkq+DXwZcXVH1EifYR9yD/l3Xw1haVpQ==", "integrity": "sha512-pbeGFbwijb5V3Xy/KMcwIp59eA9igg2br+7EHbbwQoa3HRDF5JjTrciX7OiscCA52+ze2n4q38S4lXPqRitgIA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/node": "^8.0.24", "@types/node": "^8.0.24",
@@ -2107,46 +2102,46 @@
} }
}, },
"electron-builder": { "electron-builder": {
"version": "20.19.1", "version": "20.20.4",
"resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.19.1.tgz", "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-20.20.4.tgz",
"integrity": "sha512-izEIgCjkwHjlSsdD6hC6GUzX7jdtW7pUPfsVnYEbEuTy6899A3thmCz6U0I06yo5N/JHoqeWmEBAxmoEfUFgoQ==", "integrity": "sha512-6X2T21/v35dvt9Rd+L9Dlb3EbIVGiqePh2sirngPa2wT6QnmVdVJsvnlxKsWWYrsQzowVSGxkho5FGiCwanDiw==",
"dev": true, "dev": true,
"requires": { "requires": {
"bluebird-lst": "^1.0.5", "bluebird-lst": "^1.0.5",
"builder-util": "5.13.2", "builder-util": "5.16.0",
"builder-util-runtime": "4.4.0", "builder-util-runtime": "4.4.0",
"chalk": "^2.4.1", "chalk": "^2.4.1",
"dmg-builder": "4.11.6", "dmg-builder": "4.14.0",
"electron-builder-lib": "20.19.1", "electron-builder-lib": "20.20.4",
"fs-extra-p": "^4.6.1", "fs-extra-p": "^4.6.1",
"is-ci": "^1.1.0", "is-ci": "^1.1.0",
"lazy-val": "^1.0.3", "lazy-val": "^1.0.3",
"read-config-file": "3.0.2", "read-config-file": "3.1.0",
"sanitize-filename": "^1.6.1", "sanitize-filename": "^1.6.1",
"update-notifier": "^2.5.0", "update-notifier": "^2.5.0",
"yargs": "^12.0.1" "yargs": "^12.0.1"
} }
}, },
"electron-builder-lib": { "electron-builder-lib": {
"version": "20.19.1", "version": "20.20.4",
"resolved": "https://registry.npmjs.org/electron-builder-lib/-/electron-builder-lib-20.19.1.tgz", "resolved": "https://registry.npmjs.org/electron-builder-lib/-/electron-builder-lib-20.20.4.tgz",
"integrity": "sha512-1grL7EXtbjMQl/bjKF6X3kxaF2E3PYHuQur7mF6nLY/AVfwT/AJZNZe2j6pp4jp7FRitvPgvYs4jf92SzDICFA==", "integrity": "sha512-84n1ELXP/leF1IuDIsx2pyUJuz889Um3sb2tjBxDbEhq0oaLnp1ifB3j5iO+OV7ZfGnXKyvds6nPcNt1AYQy7A==",
"dev": true, "dev": true,
"requires": { "requires": {
"7zip-bin": "~4.0.2", "7zip-bin": "~4.0.2",
"app-builder-bin": "1.10.3", "app-builder-bin": "1.11.1",
"async-exit-hook": "^2.0.1", "async-exit-hook": "^2.0.1",
"bluebird-lst": "^1.0.5", "bluebird-lst": "^1.0.5",
"builder-util": "5.13.2", "builder-util": "5.16.0",
"builder-util-runtime": "4.4.0", "builder-util-runtime": "4.4.0",
"chromium-pickle-js": "^0.2.0", "chromium-pickle-js": "^0.2.0",
"debug": "^3.1.0", "debug": "^3.1.0",
"ejs": "^2.6.1", "ejs": "^2.6.1",
"electron-osx-sign": "0.4.10", "electron-osx-sign": "0.4.10",
"electron-publish": "20.19.0", "electron-publish": "20.22.0",
"env-paths": "^1.0.0", "env-paths": "^1.0.0",
"fs-extra-p": "^4.6.1", "fs-extra-p": "^4.6.1",
"hosted-git-info": "^2.6.1", "hosted-git-info": "^2.7.1",
"is-ci": "^1.1.0", "is-ci": "^1.1.0",
"isbinaryfile": "^3.0.2", "isbinaryfile": "^3.0.2",
"js-yaml": "^3.12.0", "js-yaml": "^3.12.0",
@@ -2154,10 +2149,9 @@
"minimatch": "^3.0.4", "minimatch": "^3.0.4",
"normalize-package-data": "^2.4.0", "normalize-package-data": "^2.4.0",
"plist": "^3.0.1", "plist": "^3.0.1",
"read-config-file": "3.0.2", "read-config-file": "3.1.0",
"sanitize-filename": "^1.6.1", "sanitize-filename": "^1.6.1",
"semver": "^5.5.0", "semver": "^5.5.0",
"stream-json": "^1.1.0",
"sumchecker": "^2.0.2", "sumchecker": "^2.0.2",
"temp-file": "^3.1.3" "temp-file": "^3.1.3"
}, },
@@ -2172,9 +2166,9 @@
} }
}, },
"hosted-git-info": { "hosted-git-info": {
"version": "2.6.1", "version": "2.7.1",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.1.tgz", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
"integrity": "sha512-Ba4+0M4YvIDUUsprMjhVTU1yN9F2/LJSAl69ZpzaLT4l4j5mwTS6jqqW9Ojvj6lKz/veqPzpJBqGbXspOb533A==", "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
"dev": true "dev": true
}, },
"js-yaml": { "js-yaml": {
@@ -2354,13 +2348,13 @@
} }
}, },
"electron-publish": { "electron-publish": {
"version": "20.19.0", "version": "20.22.0",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.19.0.tgz", "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-20.22.0.tgz",
"integrity": "sha512-S9+o2Z0PYpdVLqTZkUGYvvO/HiGpkh3k12ecHNvUDGuVir9lJkYqCxxO46iIvgRRj4yyxE/cxoRl3nS8w51KOw==", "integrity": "sha512-ZF6GV1y5l1+auMBdISOk3yrltkGxOo1DQaGXVpABuenfgXgrHen6EgkgMy6wHhvBm1tOTZnANJSUV4zDBIFewQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"bluebird-lst": "^1.0.5", "bluebird-lst": "^1.0.5",
"builder-util": "^5.13.1", "builder-util": "^5.14.0",
"builder-util-runtime": "^4.4.0", "builder-util-runtime": "^4.4.0",
"chalk": "^2.4.1", "chalk": "^2.4.1",
"fs-extra-p": "^4.6.1", "fs-extra-p": "^4.6.1",
@@ -2464,7 +2458,7 @@
"es6-promise": { "es6-promise": {
"version": "4.2.4", "version": "4.2.4",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
"integrity": "sha1-3EIhwrFlGHYL2MOaUtjzVvwA7Sk=", "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
"dev": true "dev": true
}, },
"es6-set": { "es6-set": {
@@ -4361,7 +4355,7 @@
"dev": true, "dev": true,
"requires": { "requires": {
"configstore": "^2.0.0", "configstore": "^2.0.0",
"google-translate-token": "^1.0.0", "google-translate-token": "latest",
"got": "^6.3.0", "got": "^6.3.0",
"safe-eval": "^0.3.0" "safe-eval": "^0.3.0"
}, },
@@ -5657,7 +5651,7 @@
"lazy-val": { "lazy-val": {
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.3.tgz", "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.3.tgz",
"integrity": "sha1-u5eyAO8AgB2UwxfincbtOeMcXtw=", "integrity": "sha512-pjCf3BYk+uv3ZcPzEVM0BFvO9Uw58TmlrU0oG5tTrr9Kcid3+kdKxapH8CjdYmVa2nO5wOoZn2rdvZx2PKj/xg==",
"dev": true "dev": true
}, },
"lazystream": { "lazystream": {
@@ -6088,7 +6082,7 @@
"mime": { "mime": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
"integrity": "sha1-sWIcVNY7l8R9PP5/chX31kUXw2k=", "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
"dev": true "dev": true
}, },
"mime-db": { "mime-db": {
@@ -6601,7 +6595,7 @@
"os-locale": { "os-locale": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
"integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
"dev": true, "dev": true,
"requires": { "requires": {
"execa": "^0.7.0", "execa": "^0.7.0",
@@ -6918,7 +6912,7 @@
"plist": { "plist": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz",
"integrity": "sha1-qbkx0XwwTokS7wujvdYYK68uH4w=", "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"base64-js": "^1.2.3", "base64-js": "^1.2.3",
@@ -6929,7 +6923,7 @@
"base64-js": { "base64-js": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
"integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM=", "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==",
"dev": true "dev": true
}, },
"xmlbuilder": { "xmlbuilder": {
@@ -7135,12 +7129,12 @@
} }
}, },
"read-config-file": { "read-config-file": {
"version": "3.0.2", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.0.2.tgz", "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-3.1.0.tgz",
"integrity": "sha512-FZRUejsiKH0adwfAIdaaBn+vI0j75iVMCmgXP5vB5ma9XP4AHlzMOZFwtConmSR/W97wcOpSJh8DSk/OePszEw==", "integrity": "sha512-z3VTrR9fgFu+Ll6MhTdtxbPFBKNGKgzYYnRjOcZvQeE/zwJTjPYVrps0ATgaSWU2/BnucUg3knP+Oz4zo9vEoA==",
"dev": true, "dev": true,
"requires": { "requires": {
"ajv": "^6.5.1", "ajv": "^6.5.2",
"ajv-keywords": "^3.2.0", "ajv-keywords": "^3.2.0",
"bluebird-lst": "^1.0.5", "bluebird-lst": "^1.0.5",
"dotenv": "^6.0.0", "dotenv": "^6.0.0",
@@ -7673,7 +7667,7 @@
"sax": { "sax": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"dev": true "dev": true
}, },
"semver": { "semver": {
@@ -7928,7 +7922,7 @@
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true "dev": true
}, },
"source-map-resolve": { "source-map-resolve": {
@@ -8111,12 +8105,6 @@
} }
} }
}, },
"stream-chain": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.0.3.tgz",
"integrity": "sha512-uCjJTDTAOgBrM2dLkS3mJGICUV3fL0eiTsGQ0bXiKU6et6/7dkTzZCp0eP1d8ZIwiWjthvQZlSx7NxMt7t1aFQ==",
"dev": true
},
"stream-combiner": { "stream-combiner": {
"version": "0.0.4", "version": "0.0.4",
"resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
@@ -8132,15 +8120,6 @@
"integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
"dev": true "dev": true
}, },
"stream-json": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.1.0.tgz",
"integrity": "sha512-m3J6fpe0KYw3zxkNOq3618tNMdIHvxZbyTcAtdmRTdhMFi/tKdV+PucSNMkpvDGSl5AAscIN3G67DaXIp+h+oQ==",
"dev": true,
"requires": {
"stream-chain": "^2.0.3"
}
},
"stream-shift": { "stream-shift": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
@@ -9002,7 +8981,7 @@
"uri-js": { "uri-js": {
"version": "4.2.2", "version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
"integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"punycode": "^2.1.0" "punycode": "^2.1.0"
@@ -9011,7 +8990,7 @@
"punycode": { "punycode": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true "dev": true
} }
} }

View File

@@ -1,7 +1,7 @@
{ {
"name": "zulip", "name": "zulip",
"productName": "Zulip", "productName": "Zulip",
"version": "2.3.2", "version": "2.3.6",
"main": "./app/main", "main": "./app/main",
"description": "Zulip Desktop App", "description": "Zulip Desktop App",
"license": "Apache-2.0", "license": "Apache-2.0",
@@ -123,8 +123,8 @@
"assert": "1.4.1", "assert": "1.4.1",
"cp-file": "^5.0.0", "cp-file": "^5.0.0",
"devtron": "1.4.0", "devtron": "1.4.0",
"electron": "2.0.1", "electron": "2.0.8",
"electron-builder": "20.19.1", "electron-builder": "20.20.4",
"electron-connect": "0.6.2", "electron-connect": "0.6.2",
"electron-debug": "1.4.0", "electron-debug": "1.4.0",
"google-translate-api": "2.3.0", "google-translate-api": "2.3.0",
@@ -181,8 +181,5 @@
"browser", "browser",
"mocha" "mocha"
] ]
},
"dependencies": {
"adm-zip": "^0.4.11"
} }
} }

185
tests/e2e/package.json Normal file
View File

@@ -0,0 +1,185 @@
{
"name": "zulip",
"productName": "ZulipTest",
"version": "2.3.3",
"main": "../../app/main",
"description": "Zulip Desktop App",
"license": "Apache-2.0",
"copyright": "Kandra Labs, Inc.",
"author": {
"name": "Kandra Labs, Inc.",
"email": "support@zulipchat.com"
},
"repository": {
"type": "git",
"url": "https://github.com/zulip/zulip-electron.git"
},
"bugs": {
"url": "https://github.com/zulip/zulip-electron/issues"
},
"engines": {
"node": ">=6.0.0"
},
"scripts": {
"start": "electron app --disable-http-cache --no-electron-connect",
"reinstall": "node ./tools/reinstall-node-modules.js",
"postinstall": "electron-builder install-app-deps",
"test": "xo",
"test-e2e": "gulp test-e2e",
"dev": "gulp dev & nodemon --watch app/main --watch app/renderer --exec 'npm test' -e html,css,js",
"pack": "electron-builder --dir",
"dist": "electron-builder",
"mas": "electron-builder --mac mas",
"travis": "cd ./scripts && ./travis-build-test.sh",
"build-locales": "node tools/locale-helper"
},
"pre-commit": [
"test"
],
"build": {
"appId": "org.zulip.zulip-electron",
"asar": true,
"files": [
"**/*",
"!docs${/*}",
"!node_modules/@paulcbetts/cld/deps/cld${/*}"
],
"copyright": "©2017 Kandra Labs, Inc.",
"mac": {
"category": "public.app-category.productivity",
"artifactName": "${productName}-${version}-${arch}.${ext}"
},
"linux": {
"category": "Chat;GNOME;GTK;Network;InstantMessaging",
"packageCategory": "GNOME;GTK;Network;InstantMessaging",
"description": "Zulip Desktop Client for Linux",
"target": [
"deb",
"zip",
"AppImage",
"snap"
],
"maintainer": "Akash Nimare <svnitakash@gmail.com>",
"artifactName": "${productName}-${version}-${arch}.${ext}"
},
"deb": {
"synopsis": "Zulip Desktop App",
"afterInstall": "./scripts/debian-add-repo.sh",
"afterRemove": "./scripts/debian-uninstaller.sh"
},
"snap": {
"synopsis": "Zulip Desktop App"
},
"dmg": {
"background": "build/appdmg.png",
"icon": "build/icon.icns",
"iconSize": 100,
"contents": [
{
"x": 380,
"y": 280,
"type": "link",
"path": "/Applications"
},
{
"x": 110,
"y": 280,
"type": "file"
}
],
"window": {
"width": 500,
"height": 500
}
},
"win": {
"target": [
{
"target": "nsis-web",
"arch": [
"x64",
"ia32"
]
}
],
"icon": "build/icon.ico",
"publisherName": "Kandra Labs, Inc."
},
"nsis": {
"perMachine": true,
"oneClick": false,
"allowToChangeInstallationDirectory": true
}
},
"keywords": [
"Zulip",
"Group Chat app",
"electron-app",
"electron",
"Desktop app",
"InstantMessaging"
],
"devDependencies": {
"assert": "1.4.1",
"cp-file": "^5.0.0",
"devtron": "1.4.0",
"electron": "2.0.1",
"electron-builder": "20.20.4",
"electron-connect": "0.6.2",
"electron-debug": "1.4.0",
"google-translate-api": "2.3.0",
"gulp": "^4.0.0",
"gulp-tape": "0.0.9",
"is-ci": "^1.0.10",
"nodemon": "^1.14.11",
"pre-commit": "1.2.2",
"spectron": "3.8.0",
"tap-colorize": "^1.2.0",
"tape": "^4.8.0",
"xo": "0.18.2"
},
"xo": {
"parserOptions": {
"sourceType": "script",
"ecmaFeatures": {
"globalReturn": true
}
},
"esnext": true,
"overrides": [
{
"files": "app*/**/*.js",
"rules": {
"max-lines": [
"warn",
{
"max": 500,
"skipBlankLines": true,
"skipComments": true
}
],
"no-warning-comments": 0,
"object-curly-spacing": 0,
"capitalized-comments": 0,
"no-else-return": 0,
"no-path-concat": 0,
"no-alert": 0,
"guard-for-in": 0,
"prefer-promise-reject-errors": 0,
"import/no-unresolved": 0,
"import/no-extraneous-dependencies": 0,
"no-prototype-builtins": 0
}
}
],
"ignore": [
"tests/e2e/*.js",
"tools/locale-helper/*.js"
],
"envs": [
"node",
"browser",
"mocha"
]
}
}

81
tools/push-to-pull-request Executable file
View File

@@ -0,0 +1,81 @@
#!/bin/bash
set -e
usage () {
cat >&2 <<EOF
usage: $0 PULL_REQUEST_ID [REMOTE]
Force-push our HEAD to the given GitHub pull request branch.
Useful for a maintainer to run just before pushing to master,
after tweaking the branch and/or rebasing to latest. This causes
GitHub to see the subsequent push to master as representing a
merge of the PR, rather than requiring the PR to be manually
(and to the casual observer misleadingly) closed instead.
REMOTE defaults to the value of the Git config variable
\`zulip.zulipRemote\` if set, else to \`upstream\`.
See also \`reset-to-pull-request\`.
EOF
exit 1
}
remote_default="$(git config zulip.zulipRemote || echo upstream)"
pr_id="$1"
remote="${2:-"$remote_default"}"
if [ -z "$pr_id" ]; then
usage
fi
remote_url="$(git config remote."$remote".url)"
repo_fq="$(echo "$remote_url" | perl -lne 'print $1 if (
m, ^ git\@github\.com:
([^/]+ / [^/]+?)
(?:\.git)?
$ ,x )')"
if [ -z "$repo_fq" ]; then
# We're pretty specific about what we expect the URL to look like;
# there are probably more cases we could legitimately cover, which
# we can add if/when they come up for someone.
echo "error: couldn't parse remote URL as GitHub repo" >&2
exit 1
fi
# See https://developer.github.com/v3/pulls/#get-a-single-pull-request .
# This is the old REST API; the new GraphQL API does look neat, but it
# seems to require authentication even for simple lookups of public data,
# and that'd be a pain for a simple script like this.
pr_url=https://api.github.com/repos/"${repo_fq}"/pulls/"${pr_id}"
pr_details="$(curl -s "$pr_url")"
pr_jq () {
echo "$pr_details" | jq "$@"
}
if [ "$(pr_jq -r .message)" = "Not Found" ]; then
echo "Invalid PR URL: $pr_url"
exit 1
fi
if [ "$(pr_jq .maintainer_can_modify)" != "true" ]; then
# This happens when the PR has already been merged or closed, or
# if the contributor has turned off the (default) setting to allow
# maintainers of the target repo to push to their PR branch.
#
# The latter seems to be rare (in Greg's experience doing the
# manual equivalent of this script for many different
# contributors, none have ever chosen this setting), but give a
# decent error message if it does happen.
echo "error: PR already closed, or contributor has disallowed pushing to branch" >&2
exit 1
fi
pr_head_repo_fq="$(pr_jq -r .head.repo.full_name)"
pr_head_refname="$(pr_jq -r .head.ref)"
set -x
exec git push git@github.com:"$pr_head_repo_fq" +@:"$pr_head_refname"

19
tools/reset-to-pull-request Executable file
View File

@@ -0,0 +1,19 @@
#!/bin/bash
set -e
if ! git diff-index --quiet HEAD; then
set +x
echo "There are uncommitted changes:"
git status --short
echo "Doing nothing to avoid losing your work."
exit 1
fi
remote_default="$(git config zulip.zulipRemote || echo upstream)"
request_id="$1"
remote=${2:-"$remote_default"}
set -x
git fetch "$remote" "pull/$request_id/head"
git reset --hard FETCH_HEAD