diff --git a/.dockerignore b/.dockerignore
index 45ead65e15..ced02564a8 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -3,7 +3,6 @@ test/
webapp/
lib/
node_modules/
-electron_app/
karma-reports/
.idea/
.tmp/
diff --git a/.gitignore b/.gitignore
index 4dd3a26213..c7f99f6925 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,9 +4,6 @@
/key.pem
/lib
/node_modules
-/electron_app/node_modules
-/electron_app/dist
-/electron_app/pub
/packages/
/webapp
/.npmrc
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a5bc6cda88..d0871d5f8e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,99 @@
+Changes in [1.6.0](https://github.com/vector-im/riot-web/releases/tag/v1.6.0) (2020-05-05)
+==========================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v1.6.0-rc.6...v1.6.0)
+
+ * Cross-signing and E2EE by default for DMs and private rooms enabled
+ * Upgrade to React SDK 2.5.0 and JS SDK 6.0.0
+
+Changes in [1.6.0-rc.6](https://github.com/vector-im/riot-web/releases/tag/v1.6.0-rc.6) (2020-05-01)
+====================================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v1.6.0-rc.5...v1.6.0-rc.6)
+
+ * Upgrade to React SDK 2.5.0-rc.6 and JS SDK 6.0.0-rc.2
+
+Changes in [1.6.0-rc.5](https://github.com/vector-im/riot-web/releases/tag/v1.6.0-rc.5) (2020-04-30)
+====================================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v1.6.0-rc.4...v1.6.0-rc.5)
+
+ * Upgrade to React SDK 2.5.0-rc.5 and JS SDK 6.0.0-rc.1
+ * Remove feature flag docs from docs on release
+ [\#13375](https://github.com/vector-im/riot-web/pull/13375)
+
+Changes in [1.6.0-rc.4](https://github.com/vector-im/riot-web/releases/tag/v1.6.0-rc.4) (2020-04-23)
+====================================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v1.6.0-rc.3...v1.6.0-rc.4)
+
+ * Upgrade to React SDK 2.5.0-rc.4 and JS SDK 5.3.1-rc.4
+
+Changes in [1.6.0-rc.3](https://github.com/vector-im/riot-web/releases/tag/v1.6.0-rc.3) (2020-04-17)
+====================================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v1.6.0-rc.2...v1.6.0-rc.3)
+
+ * Upgrade to React SDK 2.5.0-rc.3 and JS SDK 5.3.1-rc.3
+
+Changes in [1.6.0-rc.2](https://github.com/vector-im/riot-web/releases/tag/v1.6.0-rc.2) (2020-04-16)
+====================================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v1.6.0-rc.1...v1.6.0-rc.2)
+
+ * Upgrade to React SDK 2.5.0-rc.2 and JS SDK 5.3.1-rc.2
+ * Enable cross-signing / E2EE by default for DM without config changes
+
+Changes in [1.6.0-rc.1](https://github.com/vector-im/riot-web/releases/tag/v1.6.0-rc.1) (2020-04-15)
+====================================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v1.5.16-rc.1...v1.6.0-rc.1)
+
+ * Enable cross-signing / E2EE by default for DM on release
+ [\#13179](https://github.com/vector-im/riot-web/pull/13179)
+ * Upgrade to React SDK 2.5.0-rc.1 and JS SDK 5.3.1-rc.1
+ * Add instruction to resolve the inotify watch limit issue
+ [\#13128](https://github.com/vector-im/riot-web/pull/13128)
+ * docs: labs: add a pointer to config.md
+ [\#13149](https://github.com/vector-im/riot-web/pull/13149)
+ * Fix Electron SSO handling to support multiple profiles
+ [\#13028](https://github.com/vector-im/riot-web/pull/13028)
+ * Add riot-desktop shortcuts for forward/back matching browsers&slack
+ [\#13133](https://github.com/vector-im/riot-web/pull/13133)
+ * Allow rageshake to fail in init
+ [\#13164](https://github.com/vector-im/riot-web/pull/13164)
+ * Fix broken yarn install link in README.md
+ [\#13125](https://github.com/vector-im/riot-web/pull/13125)
+ * fix build:jitsi scripts crash caused by a missing folder
+ [\#13122](https://github.com/vector-im/riot-web/pull/13122)
+ * App load order changes to catch errors better
+ [\#13095](https://github.com/vector-im/riot-web/pull/13095)
+ * Upgrade deps
+ [\#13080](https://github.com/vector-im/riot-web/pull/13080)
+
+Changes in [1.5.16-rc.1](https://github.com/vector-im/riot-web/releases/tag/v1.5.16-rc.1) (2020-04-08)
+======================================================================================================
+[Full Changelog](https://github.com/vector-im/riot-web/compare/v1.5.15...v1.5.16-rc.1)
+
+ * Upgrade React SDK to 2.4.0-rc.1 and JS SDK to 5.3.0-rc.1
+ * Update from Weblate
+ [\#13078](https://github.com/vector-im/riot-web/pull/13078)
+ * Mention Jitsi support at the .well-known level in Jitsi docs
+ [\#13047](https://github.com/vector-im/riot-web/pull/13047)
+ * Add new default home page fallback
+ [\#13049](https://github.com/vector-im/riot-web/pull/13049)
+ * App load order tweaks for code splitting
+ [\#13032](https://github.com/vector-im/riot-web/pull/13032)
+ * Add some docs about Jitsi widgets and Jitsi configuration
+ [\#13027](https://github.com/vector-im/riot-web/pull/13027)
+ * Bump minimist from 1.2.2 to 1.2.3 in /electron_app
+ [\#13030](https://github.com/vector-im/riot-web/pull/13030)
+ * Fix Electron mac-specific shortcut being registered on Web too.
+ [\#13020](https://github.com/vector-im/riot-web/pull/13020)
+ * Add a console warning that errors from Jitsi Meet are fine
+ [\#12968](https://github.com/vector-im/riot-web/pull/12968)
+ * Fix popout support for jitsi widgets
+ [\#12975](https://github.com/vector-im/riot-web/pull/12975)
+ * Some grammar and clarifications
+ [\#12925](https://github.com/vector-im/riot-web/pull/12925)
+ * Don't immediately remove notifications from notification trays
+ [\#12861](https://github.com/vector-im/riot-web/pull/12861)
+ * Remove welcome user from config
+ [\#12894](https://github.com/vector-im/riot-web/pull/12894)
+
Changes in [1.5.15](https://github.com/vector-im/riot-web/releases/tag/v1.5.15) (2020-04-01)
============================================================================================
[Full Changelog](https://github.com/vector-im/riot-web/compare/v1.5.14...v1.5.15)
diff --git a/README.md b/README.md
index 51cdb0eef7..0f4a304e0d 100644
--- a/README.md
+++ b/README.md
@@ -108,40 +108,7 @@ Riot can also be run as a desktop app, wrapped in Electron. You can download a
pre-built version from https://riot.im/download/desktop/ or, if you prefer,
build it yourself.
-To build it yourself, follow the instructions below.
-
-1. Follow the instructions in 'Building From Source' above, but run
- `yarn build` instead of `yarn dist` (since we don't need the tarball).
-2. Install Electron and run it:
-
- ```bash
- yarn electron
- ```
-
-To build packages, use `electron-builder`. This is configured to output:
- * `dmg` + `zip` for macOS
- * `exe` + `nupkg` for Windows
- * `deb` for Linux
-But this can be customised by editing the `build` section of package.json
-as per https://github.com/electron-userland/electron-builder/wiki/Options
-
-See https://github.com/electron-userland/electron-builder/wiki/Multi-Platform-Build
-for dependencies required for building packages for various platforms.
-
-The only platform that can build packages for all three platforms is macOS:
-```bash
-brew install mono
-yarn install
-yarn build:electron
-```
-
-For other packages, use `electron-builder` manually. For example, to build a
-package for 64 bit Linux:
-
- 1. Follow the instructions in 'Building From Source' above
- 2. `node_modules/.bin/build -l --x64`
-
-All Electron packages go into `electron_app/dist/`
+To build it yourself, follow the instructions at https://github.com/vector-im/riot-desktop.
Many thanks to @aviraldg for the initial work on the Electron integration.
@@ -310,7 +277,7 @@ modifying it. See the [configuration docs](docs/config.md) for details.
Open http://127.0.0.1:8080/ in your browser to see your newly built Riot.
-**Note**: The build script uses inotify by default on Linux to monitor directories
+**Note**: The build script uses inotify by default on Linux to monitor directories
for changes. If the inotify watch limit is too low your build will silently fail.
To avoid this issue, we recommend a limit of at least 128M.
diff --git a/__mocks__/cssMock.js b/__mocks__/cssMock.js
new file mode 100644
index 0000000000..9b5d9b3476
--- /dev/null
+++ b/__mocks__/cssMock.js
@@ -0,0 +1 @@
+module.exports = "css-file-stub";
diff --git a/docs/config.md b/docs/config.md
index cb501da02a..e781211945 100644
--- a/docs/config.md
+++ b/docs/config.md
@@ -136,24 +136,11 @@ If none of these sources have an identity server set, then Riot will prompt the
user to set an identity server first when attempting to use features that
require one.
-Currently the only two public identity servers are https://vector.im and
+Currently, the only two public identity servers are https://vector.im and
https://matrix.org, however in the future identity servers will be
decentralised.
Desktop app configuration
=========================
-To run multiple instances of the desktop app for different accounts, you can
-launch the executable with the `--profile` argument followed by a unique
-identifier, e.g `riot-web --profile Work` for it to run a separate profile and
-not interfere with the default one.
-
-Alternatively, a custom location for the profile data can be specified using the
-`--profile-dir` flag followed by the desired path.
-
-+ `%APPDATA%\$NAME\config.json` on Windows
-+ `$XDG_CONFIG_HOME\$NAME\config.json` or `~/.config/$NAME/config.json` on Linux
-+ `~Library/Application Support/$NAME/config.json` on macOS
-
-In the paths above, `$NAME` is typically `Riot`, unless you use `--profile
-$PROFILE` in which case it becomes `Riot-$PROFILE`.
+See https://github.com/vector-im/riot-desktop#user-specified-configjson
diff --git a/electron_app/build/entitlements.mac.plist b/electron_app/build/entitlements.mac.plist
deleted file mode 100644
index 3fdab97494..0000000000
--- a/electron_app/build/entitlements.mac.plist
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
- com.apple.security.cs.allow-jit
-
- com.apple.security.cs.allow-unsigned-executable-memory
-
-
- com.apple.security.cs.disable-library-validation
-
-
-
- com.apple.security.device.camera
-
- com.apple.security.device.audio-input
-
-
-
diff --git a/electron_app/build/icon.icns b/electron_app/build/icon.icns
deleted file mode 100644
index eba95ecf4f..0000000000
Binary files a/electron_app/build/icon.icns and /dev/null differ
diff --git a/electron_app/build/icon.ico b/electron_app/build/icon.ico
deleted file mode 100644
index 1305b7dd9a..0000000000
Binary files a/electron_app/build/icon.ico and /dev/null differ
diff --git a/electron_app/build/icons/128x128.png b/electron_app/build/icons/128x128.png
deleted file mode 100644
index 3684017853..0000000000
Binary files a/electron_app/build/icons/128x128.png and /dev/null differ
diff --git a/electron_app/build/icons/16x16.png b/electron_app/build/icons/16x16.png
deleted file mode 100644
index 0403a514c8..0000000000
Binary files a/electron_app/build/icons/16x16.png and /dev/null differ
diff --git a/electron_app/build/icons/24x24.png b/electron_app/build/icons/24x24.png
deleted file mode 100644
index 804559fd62..0000000000
Binary files a/electron_app/build/icons/24x24.png and /dev/null differ
diff --git a/electron_app/build/icons/256x256.png b/electron_app/build/icons/256x256.png
deleted file mode 100644
index ab8a33a333..0000000000
Binary files a/electron_app/build/icons/256x256.png and /dev/null differ
diff --git a/electron_app/build/icons/48x48.png b/electron_app/build/icons/48x48.png
deleted file mode 100644
index b872420a5d..0000000000
Binary files a/electron_app/build/icons/48x48.png and /dev/null differ
diff --git a/electron_app/build/icons/512x512.png b/electron_app/build/icons/512x512.png
deleted file mode 100644
index a7d2a3198e..0000000000
Binary files a/electron_app/build/icons/512x512.png and /dev/null differ
diff --git a/electron_app/build/icons/64x64.png b/electron_app/build/icons/64x64.png
deleted file mode 100644
index be276e16ea..0000000000
Binary files a/electron_app/build/icons/64x64.png and /dev/null differ
diff --git a/electron_app/build/icons/96x96.png b/electron_app/build/icons/96x96.png
deleted file mode 100644
index 11f0bd9183..0000000000
Binary files a/electron_app/build/icons/96x96.png and /dev/null differ
diff --git a/electron_app/build/install-spinner.gif b/electron_app/build/install-spinner.gif
deleted file mode 100644
index 4a685294b6..0000000000
Binary files a/electron_app/build/install-spinner.gif and /dev/null differ
diff --git a/electron_app/img/riot.ico b/electron_app/img/riot.ico
deleted file mode 100644
index 1305b7dd9a..0000000000
Binary files a/electron_app/img/riot.ico and /dev/null differ
diff --git a/electron_app/img/riot.png b/electron_app/img/riot.png
deleted file mode 100644
index ab8a33a333..0000000000
Binary files a/electron_app/img/riot.png and /dev/null differ
diff --git a/electron_app/package.json b/electron_app/package.json
deleted file mode 100644
index 390b61d8d3..0000000000
--- a/electron_app/package.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "name": "riot-web",
- "productName": "Riot",
- "main": "src/electron-main.js",
- "version": "1.5.15",
- "description": "A feature-rich client for Matrix.org",
- "author": "New Vector Ltd.",
- "dependencies": {
- "auto-launch": "^5.0.1",
- "electron-store": "^2.0.0",
- "electron-window-state": "^4.1.0",
- "minimist": "^1.2.0",
- "png-to-ico": "^1.0.2"
- }
-}
diff --git a/electron_app/riot.im/New_Vector_Ltd.pem b/electron_app/riot.im/New_Vector_Ltd.pem
deleted file mode 100644
index 1a34127210..0000000000
--- a/electron_app/riot.im/New_Vector_Ltd.pem
+++ /dev/null
@@ -1,34 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIF0jCCBLqgAwIBAgIRAISYBqZi3VvCUeSfHXF+cbwwDQYJKoZIhvcNAQELBQAw
-gZExCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
-BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMTcwNQYD
-VQQDEy5DT01PRE8gUlNBIEV4dGVuZGVkIFZhbGlkYXRpb24gQ29kZSBTaWduaW5n
-IENBMB4XDTE3MDgyMzAwMDAwMFoXDTIwMDgyMjIzNTk1OVowgdgxETAPBgNVBAUT
-CDEwODczNjYxMRMwEQYLKwYBBAGCNzwCAQMTAkdCMR0wGwYDVQQPExRQcml2YXRl
-IE9yZ2FuaXphdGlvbjELMAkGA1UEBhMCR0IxETAPBgNVBBEMCFdDMVIgNEFHMQ8w
-DQYDVQQIDAZMb25kb24xDzANBgNVBAcMBkxvbmRvbjEbMBkGA1UECQwSMjYgUmVk
-IExpb24gU3F1YXJlMRcwFQYDVQQKDA5OZXcgVmVjdG9yIEx0ZDEXMBUGA1UEAwwO
-TmV3IFZlY3RvciBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7
-X0HP3oM/SVr6PboD03ndtYTONZDcJ/GJ3EyYi6UNrcbKjuDHwPktx9hjAhNjcVkG
-lmuTEPluPj9DbvjaTrers0cQsAS1vJ0RHjLfA93Flg1ys9Q6OThUMw77FtFPtiJU
-z5cSYzfFAhn/4dv7BcgGptn+Mv/8CaTu+RUZJUgoSlRWcT1TREmxkzWotbblqsHO
-zjDmUg20tL5/qpt6BSWsNespf5udKQFXMtqkczBcLvBLmql0vurVcQy8BibB+Q89
-QKwRzwLgaIa7O8WEssFcW8uJe9s0SNtUy8ehbuoSxpA/DbHFwsiDbNA78vp7HrqM
-qY6t6OIgLtDYBFCfe/btAgMBAAGjggHaMIIB1jAfBgNVHSMEGDAWgBTfj/MgDOnK
-pgTYW1g3Kj2rRtyDSTAdBgNVHQ4EFgQUH+mDOdRkF3bYDxCWEaGB4lxiCxcwDgYD
-VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMw
-EQYJYIZIAYb4QgEBBAQDAgQQMEYGA1UdIAQ/MD0wOwYMKwYBBAGyMQECAQYBMCsw
-KQYIKwYBBQUHAgEWHWh0dHBzOi8vc2VjdXJlLmNvbW9kby5jb20vQ1BTMFUGA1Ud
-HwROMEwwSqBIoEaGRGh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0NPTU9ET1JTQUV4
-dGVuZGVkVmFsaWRhdGlvbkNvZGVTaWduaW5nQ0EuY3JsMIGGBggrBgEFBQcBAQR6
-MHgwUAYIKwYBBQUHMAKGRGh0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JT
-QUV4dGVuZGVkVmFsaWRhdGlvbkNvZGVTaWduaW5nQ0EuY3J0MCQGCCsGAQUFBzAB
-hhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wJgYDVR0RBB8wHaAbBggrBgEFBQcI
-A6APMA0MC0dCLTEwODczNjYxMA0GCSqGSIb3DQEBCwUAA4IBAQBJ2aH4aixh0aiz
-4WKlK+LMVLHpQ2POE3FZYNpAW7o1q2YDGEADXdGrygPE9NCGNBXKo0CAemCYNWfX
-Ov/jdoiMfeqW3vrZ66oEy8OqbvJSwK1xmomWuYw3wYPWcPVG+YbWYD2CGdQu8jTz
-fzAJCpvAuY3Wji3fQjiecAC7JCSB4fBHa0ALJOmiSqKQUUpkXs5kW7O0lPBnHzNF
-2tQGltXMSIrq1QfFtcreMyKlwDOxPIh360dv5aHhaeSRDRKxq7uq5ikQF2gjKx4k
-ieg2HRbAW6fVPpFr4zRS5umpeZV3i06i11VQQPS/mA/OBEXyaqzx4mr6B7U6ptrp
-jMqiUv2w
------END CERTIFICATE-----
diff --git a/electron_app/riot.im/README b/electron_app/riot.im/README
deleted file mode 100644
index 8e463c25ec..0000000000
--- a/electron_app/riot.im/README
+++ /dev/null
@@ -1,6 +0,0 @@
-This directory contains the config file for the official riot.im distribution
-of Riot Desktop.
-
-You probably do not want to build with this config unless you're building the
-official riot.im distribution, or you'll find your builds will replace
-themselves with the riot.im build.
diff --git a/electron_app/riot.im/config.json b/electron_app/riot.im/config.json
deleted file mode 100644
index 86631130bd..0000000000
--- a/electron_app/riot.im/config.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
- "update_base_url": "https://packages.riot.im/desktop/update/",
- "default_server_name": "matrix.org",
- "brand": "Riot",
- "integrations_ui_url": "https://scalar.vector.im/",
- "integrations_rest_url": "https://scalar.vector.im/api",
- "integrations_widgets_urls": [
- "https://scalar.vector.im/_matrix/integrations/v1",
- "https://scalar.vector.im/api",
- "https://scalar-staging.vector.im/_matrix/integrations/v1",
- "https://scalar-staging.vector.im/api",
- "https://scalar-staging.riot.im/scalar/api"
- ],
- "hosting_signup_link": "https://modular.im/?utm_source=riot-web&utm_medium=web",
- "bug_report_endpoint_url": "https://riot.im/bugreports/submit",
- "roomDirectory": {
- "servers": [
- "matrix.org"
- ]
- },
- "piwik": {
- "url": "https://piwik.riot.im/",
- "siteId": 1,
- "policyUrl": "https://matrix.org/legal/riot-im-cookie-policy"
- },
- "features": {
- "feature_cross_signing": "enable"
- },
- "enable_presence_by_hs_url": {
- "https://matrix.org": false,
- "https://matrix-client.matrix.org": false
- }
-}
diff --git a/electron_app/riot.im/env.sh b/electron_app/riot.im/env.sh
deleted file mode 100644
index 0ee810521d..0000000000
--- a/electron_app/riot.im/env.sh
+++ /dev/null
@@ -1 +0,0 @@
-export OSSLSIGNCODE_SIGNARGS='-pkcs11module /Library/Frameworks/eToken.framework/Versions/Current/libeToken.dylib -pkcs11engine /usr/local/lib/engines/engine_pkcs11.so -certs electron_app/riot.im/New_Vector_Ltd.pem -key 0a3271cbc1ec0fd8afb37f6bbe0cd65ba08d3b4d -t http://timestamp.comodoca.com -verbose'
diff --git a/electron_app/src/electron-main.js b/electron_app/src/electron-main.js
deleted file mode 100644
index 62f1fb385e..0000000000
--- a/electron_app/src/electron-main.js
+++ /dev/null
@@ -1,658 +0,0 @@
-/*
-Copyright 2016 Aviral Dasgupta
-Copyright 2016 OpenMarket Ltd
-Copyright 2018, 2019 New Vector Ltd
-Copyright 2017, 2019 Michael Telatynski <7t3chguy@gmail.com>
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-// Squirrel on windows starts the app with various flags
-// as hooks to tell us when we've been installed/uninstalled
-// etc.
-const checkSquirrelHooks = require('./squirrelhooks');
-if (checkSquirrelHooks()) return;
-
-const argv = require('minimist')(process.argv, {
- alias: {help: "h"},
-});
-
-const {app, ipcMain, powerSaveBlocker, BrowserWindow, Menu, autoUpdater, protocol} = require('electron');
-const AutoLaunch = require('auto-launch');
-const path = require('path');
-
-const tray = require('./tray');
-const vectorMenu = require('./vectormenu');
-const webContentsHandler = require('./webcontents-handler');
-const updater = require('./updater');
-const {getProfileFromDeeplink, protocolInit, recordSSOSession} = require('./protocol');
-
-const windowStateKeeper = require('electron-window-state');
-const Store = require('electron-store');
-
-const fs = require('fs');
-const afs = fs.promises;
-
-let Seshat = null;
-
-try {
- Seshat = require('matrix-seshat');
-} catch (e) {
- if (e.code === "MODULE_NOT_FOUND") {
- console.log("Seshat isn't installed, event indexing is disabled.");
- } else {
- console.warn("Seshat unexpected error:", e);
- }
-}
-
-if (argv["help"]) {
- console.log("Options:");
- console.log(" --profile-dir {path}: Path to where to store the profile.");
- console.log(" --profile {name}: Name of alternate profile to use, allows for running multiple accounts.");
- console.log(" --devtools: Install and use react-devtools and react-perf.");
- console.log(" --no-update: Disable automatic updating.");
- console.log(" --hidden: Start the application hidden in the system tray.");
- console.log(" --help: Displays this help message.");
- console.log("And more such as --proxy, see:" +
- "https://electronjs.org/docs/api/chrome-command-line-switches#supported-chrome-command-line-switches");
- app.exit();
-}
-
-// check if we are passed a profile in the SSO callback url
-const userDataPathInProtocol = getProfileFromDeeplink(argv["_"]);
-if (userDataPathInProtocol) {
- app.setPath('userData', userDataPathInProtocol);
-} else if (argv['profile-dir']) {
- app.setPath('userData', argv['profile-dir']);
-} else if (argv['profile']) {
- app.setPath('userData', `${app.getPath('userData')}-${argv['profile']}`);
-}
-
-let vectorConfig = {};
-try {
- vectorConfig = require('../../webapp/config.json');
-} catch (e) {
- // it would be nice to check the error code here and bail if the config
- // is unparseable, but we get MODULE_NOT_FOUND in the case of a missing
- // file or invalid json, so node is just very unhelpful.
- // Continue with the defaults (ie. an empty config)
-}
-
-try {
- // Load local config and use it to override values from the one baked with the build
- const localConfig = require(path.join(app.getPath('userData'), 'config.json'));
-
- // If the local config has a homeserver defined, don't use the homeserver from the build
- // config. This is to avoid a problem where Riot thinks there are multiple homeservers
- // defined, and panics as a result.
- const homeserverProps = ['default_is_url', 'default_hs_url', 'default_server_name', 'default_server_config'];
- if (Object.keys(localConfig).find(k => homeserverProps.includes(k))) {
- // Rip out all the homeserver options from the vector config
- vectorConfig = Object.keys(vectorConfig)
- .filter(k => !homeserverProps.includes(k))
- .reduce((obj, key) => {obj[key] = vectorConfig[key]; return obj;}, {});
- }
-
- vectorConfig = Object.assign(vectorConfig, localConfig);
-} catch (e) {
- // Could not load local config, this is expected in most cases.
-}
-
-const eventStorePath = path.join(app.getPath('userData'), 'EventStore');
-const store = new Store({ name: "electron-config" });
-
-let eventIndex = null;
-
-let mainWindow = null;
-global.appQuitting = false;
-
-// It's important to call `path.join` so we don't end up with the packaged asar in the final path.
-const iconFile = `riot.${process.platform === 'win32' ? 'ico' : 'png'}`;
-const iconPath = path.join(__dirname, "..", "..", "img", iconFile);
-const trayConfig = {
- icon_path: iconPath,
- brand: vectorConfig.brand || 'Riot',
-};
-
-// handle uncaught errors otherwise it displays
-// stack traces in popup dialogs, which is terrible (which
-// it will do any time the auto update poke fails, and there's
-// no other way to catch this error).
-// Assuming we generally run from the console when developing,
-// this is far preferable.
-process.on('uncaughtException', function(error) {
- console.log('Unhandled exception', error);
-});
-
-let focusHandlerAttached = false;
-ipcMain.on('setBadgeCount', function(ev, count) {
- app.setBadgeCount(count);
- if (count === 0 && mainWindow) {
- mainWindow.flashFrame(false);
- }
-});
-
-ipcMain.on('loudNotification', function() {
- if (process.platform === 'win32' && mainWindow && !mainWindow.isFocused() && !focusHandlerAttached) {
- mainWindow.flashFrame(true);
- mainWindow.once('focus', () => {
- mainWindow.flashFrame(false);
- focusHandlerAttached = false;
- });
- focusHandlerAttached = true;
- }
-});
-
-let powerSaveBlockerId = null;
-ipcMain.on('app_onAction', function(ev, payload) {
- switch (payload.action) {
- case 'call_state':
- if (powerSaveBlockerId !== null && powerSaveBlocker.isStarted(powerSaveBlockerId)) {
- if (payload.state === 'ended') {
- powerSaveBlocker.stop(powerSaveBlockerId);
- powerSaveBlockerId = null;
- }
- } else {
- if (powerSaveBlockerId === null && payload.state === 'connected') {
- powerSaveBlockerId = powerSaveBlocker.start('prevent-display-sleep');
- }
- }
- break;
- }
-});
-
-autoUpdater.on('update-downloaded', (ev, releaseNotes, releaseName, releaseDate, updateURL) => {
- if (!mainWindow) return;
- // forward to renderer
- mainWindow.webContents.send('update-downloaded', {
- releaseNotes,
- releaseName,
- releaseDate,
- updateURL,
- });
-});
-
-ipcMain.on('ipcCall', async function(ev, payload) {
- if (!mainWindow) return;
-
- const args = payload.args || [];
- let ret;
-
- switch (payload.name) {
- case 'getUpdateFeedUrl':
- ret = autoUpdater.getFeedURL();
- break;
- case 'getAutoLaunchEnabled':
- ret = await launcher.isEnabled();
- break;
- case 'setAutoLaunchEnabled':
- if (args[0]) {
- launcher.enable();
- } else {
- launcher.disable();
- }
- break;
- case 'getMinimizeToTrayEnabled':
- ret = tray.hasTray();
- break;
- case 'setMinimizeToTrayEnabled':
- if (args[0]) {
- // Create trayIcon icon
- tray.create(trayConfig);
- } else {
- tray.destroy();
- }
- store.set('minimizeToTray', args[0]);
- break;
- case 'getAutoHideMenuBarEnabled':
- ret = global.mainWindow.isMenuBarAutoHide();
- break;
- case 'setAutoHideMenuBarEnabled':
- store.set('autoHideMenuBar', args[0]);
- global.mainWindow.setAutoHideMenuBar(args[0]);
- global.mainWindow.setMenuBarVisibility(!args[0]);
- break;
- case 'getAppVersion':
- ret = app.getVersion();
- break;
- case 'focusWindow':
- if (mainWindow.isMinimized()) {
- mainWindow.restore();
- } else if (!mainWindow.isVisible()) {
- mainWindow.show();
- } else {
- mainWindow.focus();
- }
- break;
- case 'getConfig':
- ret = vectorConfig;
- break;
- case 'navigateBack':
- if (mainWindow.webContents.canGoBack()) {
- mainWindow.webContents.goBack();
- }
- break;
- case 'navigateForward':
- if (mainWindow.webContents.canGoForward()) {
- mainWindow.webContents.goForward();
- }
- break;
- case 'startSSOFlow':
- recordSSOSession(args[0]);
- break;
-
- default:
- mainWindow.webContents.send('ipcReply', {
- id: payload.id,
- error: "Unknown IPC Call: " + payload.name,
- });
- return;
- }
-
- mainWindow.webContents.send('ipcReply', {
- id: payload.id,
- reply: ret,
- });
-});
-
-ipcMain.on('seshat', async function(ev, payload) {
- if (!mainWindow) return;
-
- const sendError = (id, e) => {
- const error = {
- message: e.message
- }
-
- mainWindow.webContents.send('seshatReply', {
- id:id,
- error: error
- });
- }
-
- const args = payload.args || [];
- let ret;
-
- switch (payload.name) {
- case 'supportsEventIndexing':
- if (Seshat === null) ret = false;
- else ret = true;
- break;
-
- case 'initEventIndex':
- if (eventIndex === null) {
- try {
- await afs.mkdir(eventStorePath, {recursive: true});
- eventIndex = new Seshat(eventStorePath, {passphrase: "DEFAULT_PASSPHRASE"});
- } catch (e) {
- sendError(payload.id, e);
- return;
- }
- }
- break;
-
- case 'closeEventIndex':
- eventIndex = null;
- break;
-
- case 'deleteEventIndex':
- const deleteFolderRecursive = async(p) => {
- for (let entry of await afs.readdir(p)) {
- const curPath = path.join(p, entry);
- await afs.unlink(curPath);
- }
- }
-
- try {
- await deleteFolderRecursive(eventStorePath);
- } catch (e) {
- }
-
- break;
-
- case 'isEventIndexEmpty':
- if (eventIndex === null) ret = true;
- else ret = await eventIndex.isEmpty();
- break;
-
- case 'addEventToIndex':
- try {
- eventIndex.addEvent(args[0], args[1]);
- } catch (e) {
- sendError(payload.id, e);
- return;
- }
- break;
-
- case 'commitLiveEvents':
- try {
- ret = await eventIndex.commit();
- } catch (e) {
- sendError(payload.id, e);
- return;
- }
- break;
-
- case 'searchEventIndex':
- try {
- ret = await eventIndex.search(args[0]);
- } catch (e) {
- sendError(payload.id, e);
- return;
- }
- break;
-
- case 'addHistoricEvents':
- if (eventIndex === null) ret = false;
- else {
- try {
- ret = await eventIndex.addHistoricEvents(
- args[0], args[1], args[2]);
- } catch (e) {
- sendError(payload.id, e);
- return;
- }
- }
- break;
-
- case 'getStats':
- if (eventIndex === null) ret = 0;
- else {
- try {
- ret = await eventIndex.getStats();
- } catch (e) {
- sendError(payload.id, e);
- return;
- }
- }
- break;
-
- case 'removeCrawlerCheckpoint':
- if (eventIndex === null) ret = false;
- else {
- try {
- ret = await eventIndex.removeCrawlerCheckpoint(args[0]);
- } catch (e) {
- sendError(payload.id, e);
- return;
- }
- }
- break;
-
- case 'addCrawlerCheckpoint':
- if (eventIndex === null) ret = false;
- else {
- try {
- ret = await eventIndex.addCrawlerCheckpoint(args[0]);
- } catch (e) {
- sendError(payload.id, e);
- return;
- }
- }
- break;
-
- case 'loadFileEvents':
- if (eventIndex === null) ret = [];
- else {
- try {
- ret = await eventIndex.loadFileEvents(args[0]);
- } catch (e) {
- sendError(payload.id, e);
- return;
- }
- }
- break;
-
- case 'loadCheckpoints':
- if (eventIndex === null) ret = [];
- else {
- try {
- ret = await eventIndex.loadCheckpoints();
- } catch (e) {
- ret = [];
- }
- }
- break;
-
- default:
- mainWindow.webContents.send('seshatReply', {
- id: payload.id,
- error: "Unknown IPC Call: " + payload.name,
- });
- return;
- }
-
- mainWindow.webContents.send('seshatReply', {
- id: payload.id,
- reply: ret,
- });
-});
-
-app.commandLine.appendSwitch('--enable-usermedia-screen-capturing');
-
-const gotLock = app.requestSingleInstanceLock();
-if (!gotLock) {
- console.log('Other instance detected: exiting');
- app.exit();
-}
-
-// do this after we know we are the primary instance of the app
-protocolInit();
-
-const launcher = new AutoLaunch({
- name: vectorConfig.brand || 'Riot',
- isHidden: true,
- mac: {
- useLaunchAgent: true,
- },
-});
-
-// Register the scheme the app is served from as 'standard'
-// which allows things like relative URLs and IndexedDB to
-// work.
-// Also mark it as secure (ie. accessing resources from this
-// protocol and HTTPS won't trigger mixed content warnings).
-protocol.registerSchemesAsPrivileged([{
- scheme: 'vector',
- privileges: {
- standard: true,
- secure: true,
- supportFetchAPI: true,
- },
-}]);
-
-app.on('ready', () => {
- if (argv['devtools']) {
- try {
- const { default: installExt, REACT_DEVELOPER_TOOLS, REACT_PERF } = require('electron-devtools-installer');
- installExt(REACT_DEVELOPER_TOOLS)
- .then((name) => console.log(`Added Extension: ${name}`))
- .catch((err) => console.log('An error occurred: ', err));
- installExt(REACT_PERF)
- .then((name) => console.log(`Added Extension: ${name}`))
- .catch((err) => console.log('An error occurred: ', err));
- } catch (e) {
- console.log(e);
- }
- }
-
- protocol.registerFileProtocol('vector', (request, callback) => {
- if (request.method !== 'GET') {
- callback({error: -322}); // METHOD_NOT_SUPPORTED from chromium/src/net/base/net_error_list.h
- return null;
- }
-
- const parsedUrl = new URL(request.url);
- if (parsedUrl.protocol !== 'vector:') {
- callback({error: -302}); // UNKNOWN_URL_SCHEME
- return;
- }
- if (parsedUrl.host !== 'vector') {
- callback({error: -105}); // NAME_NOT_RESOLVED
- return;
- }
-
- const target = parsedUrl.pathname.split('/');
-
- // path starts with a '/'
- if (target[0] !== '') {
- callback({error: -6}); // FILE_NOT_FOUND
- return;
- }
-
- if (target[target.length - 1] == '') {
- target[target.length - 1] = 'index.html';
- }
-
- let baseDir;
- // first part of the path determines where we serve from
- if (target[1] === 'webapp') {
- baseDir = __dirname + "/../../webapp";
- } else {
- callback({error: -6}); // FILE_NOT_FOUND
- return;
- }
-
- // Normalise the base dir and the target path separately, then make sure
- // the target path isn't trying to back out beyond its root
- baseDir = path.normalize(baseDir);
-
- const relTarget = path.normalize(path.join(...target.slice(2)));
- if (relTarget.startsWith('..')) {
- callback({error: -6}); // FILE_NOT_FOUND
- return;
- }
- const absTarget = path.join(baseDir, relTarget);
-
- callback({
- path: absTarget,
- });
- }, (error) => {
- if (error) console.error('Failed to register protocol');
- });
-
- if (argv['no-update']) {
- console.log('Auto update disabled via command line flag "--no-update"');
- } else if (vectorConfig['update_base_url']) {
- console.log(`Starting auto update with base URL: ${vectorConfig['update_base_url']}`);
- updater.start(vectorConfig['update_base_url']);
- } else {
- console.log('No update_base_url is defined: auto update is disabled');
- }
-
- // Load the previous window state with fallback to defaults
- const mainWindowState = windowStateKeeper({
- defaultWidth: 1024,
- defaultHeight: 768,
- });
-
- const preloadScript = path.normalize(`${__dirname}/preload.js`);
- mainWindow = global.mainWindow = new BrowserWindow({
- icon: iconPath,
- show: false,
- autoHideMenuBar: store.get('autoHideMenuBar', true),
-
- x: mainWindowState.x,
- y: mainWindowState.y,
- width: mainWindowState.width,
- height: mainWindowState.height,
- webPreferences: {
- preload: preloadScript,
- nodeIntegration: false,
- sandbox: true,
- enableRemoteModule: false,
- // We don't use this: it's useful for the preload script to
- // share a context with the main page so we can give select
- // objects to the main page. The sandbox option isolates the
- // main page from the background script.
- contextIsolation: false,
- webgl: false,
- },
- });
- mainWindow.loadURL('vector://vector/webapp/');
- Menu.setApplicationMenu(vectorMenu);
-
- // Create trayIcon icon
- if (store.get('minimizeToTray', true)) tray.create(trayConfig);
-
- mainWindow.once('ready-to-show', () => {
- mainWindowState.manage(mainWindow);
-
- if (!argv['hidden']) {
- mainWindow.show();
- } else {
- // hide here explicitly because window manage above sometimes shows it
- mainWindow.hide();
- }
- });
-
- mainWindow.on('closed', () => {
- mainWindow = global.mainWindow = null;
- });
- mainWindow.on('close', (e) => {
- // If we are not quitting and have a tray icon then minimize to tray
- if (!global.appQuitting && (tray.hasTray() || process.platform === 'darwin')) {
- // On Mac, closing the window just hides it
- // (this is generally how single-window Mac apps
- // behave, eg. Mail.app)
- e.preventDefault();
- mainWindow.hide();
- return false;
- }
- });
-
- if (process.platform === 'win32') {
- // Handle forward/backward mouse buttons in Windows
- mainWindow.on('app-command', (e, cmd) => {
- if (cmd === 'browser-backward' && mainWindow.webContents.canGoBack()) {
- mainWindow.webContents.goBack();
- } else if (cmd === 'browser-forward' && mainWindow.webContents.canGoForward()) {
- mainWindow.webContents.goForward();
- }
- });
- }
-
- webContentsHandler(mainWindow.webContents);
-});
-
-app.on('window-all-closed', () => {
- app.quit();
-});
-
-app.on('activate', () => {
- mainWindow.show();
-});
-
-app.on('before-quit', () => {
- global.appQuitting = true;
- if (mainWindow) {
- mainWindow.webContents.send('before-quit');
- }
-});
-
-app.on('second-instance', (ev, commandLine, workingDirectory) => {
- // If other instance launched with --hidden then skip showing window
- if (commandLine.includes('--hidden')) return;
-
- // Someone tried to run a second instance, we should focus our window.
- if (mainWindow) {
- if (!mainWindow.isVisible()) mainWindow.show();
- if (mainWindow.isMinimized()) mainWindow.restore();
- mainWindow.focus();
- }
-});
-
-// Set the App User Model ID to match what the squirrel
-// installer uses for the shortcut icon.
-// This makes notifications work on windows 8.1 (and is
-// a noop on other platforms).
-app.setAppUserModelId('com.squirrel.riot-web.Riot');
diff --git a/electron_app/src/preload.js b/electron_app/src/preload.js
deleted file mode 100644
index 0862ec67a2..0000000000
--- a/electron_app/src/preload.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
-Copyright 2018, 2019 New Vector Ltd
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-const { ipcRenderer } = require('electron');
-
-// expose ipcRenderer to the renderer process
-window.ipcRenderer = ipcRenderer;
diff --git a/electron_app/src/protocol.js b/electron_app/src/protocol.js
deleted file mode 100644
index 48247fef98..0000000000
--- a/electron_app/src/protocol.js
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
-Copyright 2020 The Matrix.org Foundation C.I.C.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-const {app} = require("electron");
-const path = require("path");
-const fs = require("fs");
-
-const PROTOCOL = "riot://";
-const SEARCH_PARAM = "riot-desktop-ssoid";
-const STORE_FILE_NAME = "sso-sessions.json";
-
-// we getPath userData before electron-main changes it, so this is the default value
-const storePath = path.join(app.getPath("userData"), STORE_FILE_NAME);
-
-const processUrl = (url) => {
- if (!global.mainWindow) return;
- console.log("Handling link: ", url);
- global.mainWindow.loadURL(url.replace(PROTOCOL, "vector://"));
-};
-
-const readStore = () => {
- try {
- const s = fs.readFileSync(storePath, { encoding: "utf8" });
- const o = JSON.parse(s);
- return typeof o === "object" ? o : {};
- } catch (e) {
- return {};
- }
-};
-
-const writeStore = (data) => {
- fs.writeFileSync(storePath, JSON.stringify(data));
-};
-
-module.exports = {
- recordSSOSession: (sessionID) => {
- const userDataPath = app.getPath('userData');
- const store = readStore();
- for (const key in store) {
- // ensure each instance only has one (the latest) session ID to prevent the file growing unbounded
- if (store[key] === userDataPath) {
- delete store[key];
- break;
- }
- }
- store[sessionID] = userDataPath;
- writeStore(store);
- },
- getProfileFromDeeplink: (args) => {
- // check if we are passed a profile in the SSO callback url
- const deeplinkUrl = args.find(arg => arg.startsWith('riot://'));
- if (deeplinkUrl && deeplinkUrl.includes(SEARCH_PARAM)) {
- const parsedUrl = new URL(deeplinkUrl);
- if (parsedUrl.protocol === 'riot:') {
- const ssoID = parsedUrl.searchParams.get(SEARCH_PARAM);
- const store = readStore();
- console.log("Forwarding to profile: ", store[ssoID]);
- return store[ssoID];
- }
- }
- },
- protocolInit: () => {
- // get all args except `hidden` as it'd mean the app would not get focused
- // XXX: passing args to protocol handlers only works on Windows, so unpackaged deep-linking
- // --profile/--profile-dir are passed via the SEARCH_PARAM var in the callback url
- const args = process.argv.slice(1).filter(arg => arg !== "--hidden" && arg !== "-hidden");
- if (app.isPackaged) {
- app.setAsDefaultProtocolClient('riot', process.execPath, args);
- } else if (process.platform === 'win32') { // on Mac/Linux this would just cause the electron binary to open
- // special handler for running without being packaged, e.g `electron .` by passing our app path to electron
- app.setAsDefaultProtocolClient('riot', process.execPath, [app.getAppPath(), ...args]);
- }
-
- if (process.platform === 'darwin') {
- // Protocol handler for macos
- app.on('open-url', function(ev, url) {
- ev.preventDefault();
- processUrl(url);
- });
- } else {
- // Protocol handler for win32/Linux
- app.on('second-instance', (ev, commandLine) => {
- const url = commandLine[commandLine.length - 1];
- if (!url.startsWith(PROTOCOL)) return;
- processUrl(url);
- });
- }
- },
-};
-
-
diff --git a/electron_app/src/squirrelhooks.js b/electron_app/src/squirrelhooks.js
deleted file mode 100644
index 728c9cfb2c..0000000000
--- a/electron_app/src/squirrelhooks.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
-Copyright 2017 OpenMarket Ltd
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-const path = require('path');
-const spawn = require('child_process').spawn;
-const {app} = require('electron');
-
-function runUpdateExe(args, done) {
- // Invokes Squirrel's Update.exe which will do things for us like create shortcuts
- // Note that there's an Update.exe in the app-x.x.x directory and one in the parent
- // directory: we need to run the one in the parent directory, because it discovers
- // information about the app by inspecting the directory it's run from.
- const updateExe = path.resolve(path.dirname(process.execPath), '..', 'Update.exe');
- console.log(`Spawning '${updateExe}' with args '${args}'`);
- spawn(updateExe, args, {
- detached: true,
- }).on('close', done);
-}
-
-function checkSquirrelHooks() {
- if (process.platform !== 'win32') return false;
-
- const cmd = process.argv[1];
- const target = path.basename(process.execPath);
- if (cmd === '--squirrel-install' || cmd === '--squirrel-updated') {
- runUpdateExe(['--createShortcut=' + target + ''], app.quit);
- return true;
- } else if (cmd === '--squirrel-uninstall') {
- runUpdateExe(['--removeShortcut=' + target + ''], app.quit);
- return true;
- } else if (cmd === '--squirrel-obsolete') {
- app.quit();
- return true;
- }
- return false;
-}
-
-module.exports = checkSquirrelHooks;
diff --git a/electron_app/src/tray.js b/electron_app/src/tray.js
deleted file mode 100644
index 04aaa1f179..0000000000
--- a/electron_app/src/tray.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
-Copyright 2017 Karl Glatz
-Copyright 2017 OpenMarket Ltd
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-const {app, Tray, Menu, nativeImage} = require('electron');
-const pngToIco = require('png-to-ico');
-const path = require('path');
-const fs = require('fs');
-
-let trayIcon = null;
-
-exports.hasTray = function hasTray() {
- return (trayIcon !== null);
-};
-
-exports.destroy = function() {
- if (trayIcon) {
- trayIcon.destroy();
- trayIcon = null;
- }
-};
-
-exports.create = function(config) {
- // no trays on darwin
- if (process.platform === 'darwin' || trayIcon) return;
-
- const toggleWin = function() {
- if (global.mainWindow.isVisible() && !global.mainWindow.isMinimized()) {
- global.mainWindow.hide();
- } else {
- if (global.mainWindow.isMinimized()) global.mainWindow.restore();
- if (!global.mainWindow.isVisible()) global.mainWindow.show();
- global.mainWindow.focus();
- }
- };
-
- const contextMenu = Menu.buildFromTemplate([
- {
- label: `Show/Hide ${config.brand}`,
- click: toggleWin,
- },
- { type: 'separator' },
- {
- label: 'Quit',
- click: function() {
- app.quit();
- },
- },
- ]);
-
- const defaultIcon = nativeImage.createFromPath(config.icon_path);
-
- trayIcon = new Tray(defaultIcon);
- trayIcon.setToolTip(config.brand);
- trayIcon.setContextMenu(contextMenu);
- trayIcon.on('click', toggleWin);
-
- let lastFavicon = null;
- global.mainWindow.webContents.on('page-favicon-updated', async function(ev, favicons) {
- if (!favicons || favicons.length <= 0 || !favicons[0].startsWith('data:')) {
- if (lastFavicon !== null) {
- global.mainWindow.setIcon(defaultIcon);
- trayIcon.setImage(defaultIcon);
- lastFavicon = null;
- }
- return;
- }
-
- // No need to change, shortcut
- if (favicons[0] === lastFavicon) return;
- lastFavicon = favicons[0];
-
- let newFavicon = nativeImage.createFromDataURL(favicons[0]);
-
- // Windows likes ico's too much.
- if (process.platform === 'win32') {
- try {
- const icoPath = path.join(app.getPath('temp'), 'win32_riot_icon.ico');
- fs.writeFileSync(icoPath, await pngToIco(newFavicon.toPNG()));
- newFavicon = nativeImage.createFromPath(icoPath);
- } catch (e) {
- console.error("Failed to make win32 ico", e);
- }
- }
-
- trayIcon.setImage(newFavicon);
- global.mainWindow.setIcon(newFavicon);
- });
-
- global.mainWindow.webContents.on('page-title-updated', function(ev, title) {
- trayIcon.setToolTip(title);
- });
-};
diff --git a/electron_app/src/updater.js b/electron_app/src/updater.js
deleted file mode 100644
index 49fa4e0419..0000000000
--- a/electron_app/src/updater.js
+++ /dev/null
@@ -1,84 +0,0 @@
-const { app, autoUpdater, ipcMain } = require('electron');
-
-const UPDATE_POLL_INTERVAL_MS = 60 * 60 * 1000;
-const INITIAL_UPDATE_DELAY_MS = 30 * 1000;
-
-function installUpdate() {
- // for some reason, quitAndInstall does not fire the
- // before-quit event, so we need to set the flag here.
- global.appQuitting = true;
- autoUpdater.quitAndInstall();
-}
-
-function pollForUpdates() {
- try {
- autoUpdater.checkForUpdates();
- } catch (e) {
- console.log('Couldn\'t check for update', e);
- }
-}
-
-module.exports = {};
-module.exports.start = function startAutoUpdate(updateBaseUrl) {
- if (updateBaseUrl.slice(-1) !== '/') {
- updateBaseUrl = updateBaseUrl + '/';
- }
- try {
- let url;
- // For reasons best known to Squirrel, the way it checks for updates
- // is completely different between macOS and windows. On macOS, it
- // hits a URL that either gives it a 200 with some json or
- // 204 No Content. On windows it takes a base path and looks for
- // files under that path.
- if (process.platform === 'darwin') {
- // include the current version in the URL we hit. Electron doesn't add
- // it anywhere (apart from the User-Agent) so it's up to us. We could
- // (and previously did) just use the User-Agent, but this doesn't
- // rely on NSURLConnection setting the User-Agent to what we expect,
- // and also acts as a convenient cache-buster to ensure that when the
- // app updates it always gets a fresh value to avoid update-looping.
- url = `${updateBaseUrl}macos/?localVersion=${encodeURIComponent(app.getVersion())}`;
-
- } else if (process.platform === 'win32') {
- url = `${updateBaseUrl}win32/${process.arch}/`;
- } else {
- // Squirrel / electron only supports auto-update on these two platforms.
- // I'm not even going to try to guess which feed style they'd use if they
- // implemented it on Linux, or if it would be different again.
- console.log('Auto update not supported on this platform');
- }
-
- if (url) {
- autoUpdater.setFeedURL(url);
- // We check for updates ourselves rather than using 'updater' because we need to
- // do it in the main process (and we don't really need to check every 10 minutes:
- // every hour should be just fine for a desktop app)
- // However, we still let the main window listen for the update events.
- // We also wait a short time before checking for updates the first time because
- // of squirrel on windows and it taking a small amount of time to release a
- // lock file.
- setTimeout(pollForUpdates, INITIAL_UPDATE_DELAY_MS);
- setInterval(pollForUpdates, UPDATE_POLL_INTERVAL_MS);
- }
- } catch (err) {
- // will fail if running in debug mode
- console.log('Couldn\'t enable update checking', err);
- }
-}
-
-ipcMain.on('install_update', installUpdate);
-ipcMain.on('check_updates', pollForUpdates);
-
-function ipcChannelSendUpdateStatus(status) {
- if (global.mainWindow) {
- global.mainWindow.webContents.send('check_updates', status);
- }
-}
-
-autoUpdater.on('update-available', function() {
- ipcChannelSendUpdateStatus(true);
-}).on('update-not-available', function() {
- ipcChannelSendUpdateStatus(false);
-}).on('error', function(error) {
- ipcChannelSendUpdateStatus(error.message);
-});
diff --git a/electron_app/src/vectormenu.js b/electron_app/src/vectormenu.js
deleted file mode 100644
index b6e00d509d..0000000000
--- a/electron_app/src/vectormenu.js
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
-Copyright 2016 OpenMarket Ltd
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-const {app, shell, Menu} = require('electron');
-
-// Menu template from http://electron.atom.io/docs/api/menu/, edited
-const template = [
- {
- label: '&Edit',
- submenu: [
- { role: 'undo' },
- { role: 'redo' },
- { type: 'separator' },
- { role: 'cut' },
- { role: 'copy' },
- { role: 'paste' },
- { role: 'pasteandmatchstyle' },
- { role: 'delete' },
- { role: 'selectall' },
- ],
- },
- {
- label: '&View',
- submenu: [
- { type: 'separator' },
- { role: 'resetzoom' },
- { role: 'zoomin', accelerator: 'CommandOrControl+=' },
- { role: 'zoomout' },
- { type: 'separator' },
- {
- label: 'Preferences',
- accelerator: 'Command+,', // Mac-only accelerator
- click() { global.mainWindow.webContents.send('preferences'); },
- },
- { role: 'togglefullscreen' },
- { role: 'toggledevtools' },
- ],
- },
- {
- label: '&Window',
- role: 'window',
- submenu: [
- { role: 'minimize' },
- { role: 'close' },
- ],
- },
- {
- label: '&Help',
- role: 'help',
- submenu: [
- {
- label: 'Riot Help',
- click() { shell.openExternal('https://about.riot.im/help'); },
- },
- ],
- },
-];
-
-// macOS has specific menu conventions...
-if (process.platform === 'darwin') {
- // first macOS menu is the name of the app
- const name = app.getName();
- template.unshift({
- label: name,
- submenu: [
- { role: 'about' },
- { type: 'separator' },
- {
- role: 'services',
- submenu: [],
- },
- { type: 'separator' },
- { role: 'hide' },
- { role: 'hideothers' },
- { role: 'unhide' },
- { type: 'separator' },
- { role: 'quit' },
- ],
- });
- // Edit menu.
- // This has a 'speech' section on macOS
- template[1].submenu.push(
- { type: 'separator' },
- {
- label: 'Speech',
- submenu: [
- { role: 'startspeaking' },
- { role: 'stopspeaking' },
- ],
- });
-
- // Window menu.
- // This also has specific functionality on macOS
- template[3].submenu = [
- {
- label: 'Close',
- accelerator: 'CmdOrCtrl+W',
- role: 'close',
- },
- {
- label: 'Minimize',
- accelerator: 'CmdOrCtrl+M',
- role: 'minimize',
- },
- {
- label: 'Zoom',
- role: 'zoom',
- },
- {
- type: 'separator',
- },
- {
- label: 'Bring All to Front',
- role: 'front',
- },
- ];
-} else {
- template.unshift({
- label: '&File',
- submenu: [
- // For some reason, 'about' does not seem to work on windows.
- /*{
- role: 'about'
- },*/
- { role: 'quit' },
- ],
- });
-}
-
-module.exports = Menu.buildFromTemplate(template);
-
diff --git a/electron_app/src/webcontents-handler.js b/electron_app/src/webcontents-handler.js
deleted file mode 100644
index 782d12e56b..0000000000
--- a/electron_app/src/webcontents-handler.js
+++ /dev/null
@@ -1,191 +0,0 @@
-const {clipboard, nativeImage, Menu, MenuItem, shell, dialog} = require('electron');
-const url = require('url');
-const fs = require('fs');
-const request = require('request');
-
-const MAILTO_PREFIX = "mailto:";
-
-const PERMITTED_URL_SCHEMES = [
- 'http:',
- 'https:',
- MAILTO_PREFIX,
-];
-
-function safeOpenURL(target) {
- // openExternal passes the target to open/start/xdg-open,
- // so put fairly stringent limits on what can be opened
- // (for instance, open /bin/sh does indeed open a terminal
- // with a shell, albeit with no arguments)
- const parsedUrl = url.parse(target);
- if (PERMITTED_URL_SCHEMES.indexOf(parsedUrl.protocol) > -1) {
- // explicitly use the URL re-assembled by the url library,
- // so we know the url parser has understood all the parts
- // of the input string
- const newTarget = url.format(parsedUrl);
- shell.openExternal(newTarget);
- }
-}
-
-function onWindowOrNavigate(ev, target) {
- // always prevent the default: if something goes wrong,
- // we don't want to end up opening it in the electron
- // app, as we could end up opening any sort of random
- // url in a window that has node scripting access.
- ev.preventDefault();
- safeOpenURL(target);
-}
-
-function onLinkContextMenu(ev, params) {
- let url = params.linkURL || params.srcURL;
-
- if (url.startsWith('vector://vector/webapp')) {
- url = "https://riot.im/app/" + url.substring(23);
- }
-
- const popupMenu = new Menu();
- // No point trying to open blob: URLs in an external browser: it ain't gonna work.
- if (!url.startsWith('blob:')) {
- popupMenu.append(new MenuItem({
- label: url,
- click() {
- safeOpenURL(url);
- },
- }));
- }
-
- let addSaveAs = false;
- if (params.mediaType && params.mediaType === 'image' && !url.startsWith('file://')) {
- popupMenu.append(new MenuItem({
- label: '&Copy image',
- click() {
- if (url.startsWith('data:')) {
- clipboard.writeImage(nativeImage.createFromDataURL(url));
- } else {
- ev.sender.copyImageAt(params.x, params.y);
- }
- },
- }));
-
- // We want the link to be ordered below the copy stuff, but don't want to duplicate
- // the `if` statement, so use a flag.
- addSaveAs = true;
- }
-
- // No point offering to copy a blob: URL either
- if (!url.startsWith('blob:')) {
- // Special-case e-mail URLs to strip the `mailto:` like modern browsers do
- if (url.startsWith(MAILTO_PREFIX)) {
- popupMenu.append(new MenuItem({
- label: 'Copy email &address',
- click() {
- clipboard.writeText(url.substr(MAILTO_PREFIX.length));
- },
- }));
- } else {
- popupMenu.append(new MenuItem({
- label: 'Copy link &address',
- click() {
- clipboard.writeText(url);
- },
- }));
- }
- }
-
- if (addSaveAs) {
- popupMenu.append(new MenuItem({
- label: 'Sa&ve image as...',
- click() {
- const targetFileName = params.titleText || "image.png";
- const filePath = dialog.showSaveDialog({
- defaultPath: targetFileName,
- });
-
- if (!filePath) return; // user cancelled dialog
-
- try {
- if (url.startsWith("data:")) {
- fs.writeFileSync(filePath, nativeImage.createFromDataURL(url));
- } else {
- request.get(url).pipe(fs.createWriteStream(filePath));
- }
- } catch (err) {
- console.error(err);
- dialog.showMessageBox({
- type: "error",
- title: "Failed to save image",
- message: "The image failed to save",
- });
- }
- },
- }));
- }
-
- // popup() requires an options object even for no options
- popupMenu.popup({});
- ev.preventDefault();
-}
-
-function _CutCopyPasteSelectContextMenus(params) {
- return [{
- role: 'cut',
- label: 'Cu&t',
- enabled: params.editFlags.canCut,
- }, {
- role: 'copy',
- label: '&Copy',
- enabled: params.editFlags.canCopy,
- }, {
- role: 'paste',
- label: '&Paste',
- enabled: params.editFlags.canPaste,
- }, {
- role: 'pasteandmatchstyle',
- enabled: params.editFlags.canPaste,
- }, {
- role: 'selectall',
- label: "Select &All",
- enabled: params.editFlags.canSelectAll,
- }];
-}
-
-function onSelectedContextMenu(ev, params) {
- const items = _CutCopyPasteSelectContextMenus(params);
- const popupMenu = Menu.buildFromTemplate(items);
-
- // popup() requires an options object even for no options
- popupMenu.popup({});
- ev.preventDefault();
-}
-
-function onEditableContextMenu(ev, params) {
- const items = [
- { role: 'undo' },
- { role: 'redo', enabled: params.editFlags.canRedo },
- { type: 'separator' },
- ].concat(_CutCopyPasteSelectContextMenus(params));
-
- const popupMenu = Menu.buildFromTemplate(items);
-
- // popup() requires an options object even for no options
- popupMenu.popup({});
- ev.preventDefault();
-}
-
-
-module.exports = (webContents) => {
- webContents.on('new-window', onWindowOrNavigate);
- webContents.on('will-navigate', (ev, target) => {
- if (target.startsWith("vector://")) return;
- return onWindowOrNavigate(ev, target);
- });
-
- webContents.on('context-menu', function(ev, params) {
- if (params.linkURL || params.srcURL) {
- onLinkContextMenu(ev, params);
- } else if (params.selectionText) {
- onSelectedContextMenu(ev, params);
- } else if (params.isEditable) {
- onEditableContextMenu(ev, params);
- }
- });
-};
diff --git a/electron_app/yarn.lock b/electron_app/yarn.lock
deleted file mode 100644
index eb4b54caa1..0000000000
--- a/electron_app/yarn.lock
+++ /dev/null
@@ -1,837 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@types/node@^9.4.0":
- version "9.6.45"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.45.tgz#a9e5cfd026a3abaaf17e3c0318a470da9f2f178e"
- integrity sha512-9scD7xI1kpIoMs3gVFMOWsWDyRIQ1AOZwe56i1CQPE6N/P4POYkn9UtW5F66t8C2AIoPtVfOFycQ2r11t3pcyg==
-
-ajv@^6.5.5:
- version "6.10.0"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1"
- integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==
- dependencies:
- fast-deep-equal "^2.0.1"
- fast-json-stable-stringify "^2.0.0"
- json-schema-traverse "^0.4.1"
- uri-js "^4.2.2"
-
-applescript@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/applescript/-/applescript-1.0.0.tgz#bb87af568cad034a4e48c4bdaf6067a3a2701317"
- integrity sha1-u4evVoytA0pOSMS9r2Bno6JwExc=
-
-asn1@~0.2.3:
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
- integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
- dependencies:
- safer-buffer "~2.1.0"
-
-assert-plus@1.0.0, assert-plus@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
- integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
-
-asynckit@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
- integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
-
-auto-launch@^5.0.1:
- version "5.0.5"
- resolved "https://registry.yarnpkg.com/auto-launch/-/auto-launch-5.0.5.tgz#d14bd002b1ef642f85e991a6195ff5300c8ad3c0"
- integrity sha512-ppdF4mihhYzMYLuCcx9H/c5TUOCev8uM7en53zWVQhyYAJrurd2bFZx3qQVeJKF2jrc7rsPRNN5cD+i23l6PdA==
- dependencies:
- applescript "^1.0.0"
- mkdirp "^0.5.1"
- path-is-absolute "^1.0.0"
- untildify "^3.0.2"
- winreg "1.2.4"
-
-aws-sign2@~0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
- integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
-
-aws4@^1.8.0:
- version "1.8.0"
- resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
- integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
-
-bcrypt-pbkdf@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
- integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
- dependencies:
- tweetnacl "^0.14.3"
-
-bignumber.js@^2.1.0:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-2.4.0.tgz#838a992da9f9d737e0f4b2db0be62bb09dd0c5e8"
- integrity sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=
-
-bmp-js@0.0.3:
- version "0.0.3"
- resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.0.3.tgz#64113e9c7cf1202b376ed607bf30626ebe57b18a"
- integrity sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=
-
-buffer-equal@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b"
- integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=
-
-caseless@~0.12.0:
- version "0.12.0"
- resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
- integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
-
-combined-stream@^1.0.6, combined-stream@~1.0.6:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
- integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==
- dependencies:
- delayed-stream "~1.0.0"
-
-conf@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/conf/-/conf-2.2.0.tgz#ee282efafc1450b61e205372041ad7d866802d9a"
- integrity sha512-93Kz74FOMo6aWRVpAZsonOdl2I57jKtHrNmxhumehFQw4X8Sk37SohNY11PG7Q8Okta+UnrVaI006WLeyp8/XA==
- dependencies:
- dot-prop "^4.1.0"
- env-paths "^1.0.0"
- make-dir "^1.0.0"
- pkg-up "^2.0.0"
- write-file-atomic "^2.3.0"
-
-core-util-is@1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
- integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
-
-dashdash@^1.12.0:
- version "1.14.1"
- resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
- integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
- dependencies:
- assert-plus "^1.0.0"
-
-deep-equal@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
- integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=
-
-define-properties@^1.1.2:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
- integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
- dependencies:
- object-keys "^1.0.12"
-
-delayed-stream@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
- integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
-
-dom-walk@^0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
- integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=
-
-dot-prop@^4.1.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
- integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==
- dependencies:
- is-obj "^1.0.0"
-
-ecc-jsbn@~0.1.1:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
- integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
- dependencies:
- jsbn "~0.1.0"
- safer-buffer "^2.1.0"
-
-electron-store@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-2.0.0.tgz#1035cca2a95409d1f54c7466606345852450d64a"
- integrity sha512-1WCFYHsYvZBqDsoaS0Relnz0rd81ZkBAI0Fgx7Nq2UWU77rSNs1qxm4S6uH7TCZ0bV3LQpJFk7id/is/ZgoOPA==
- dependencies:
- conf "^2.0.0"
-
-electron-window-state@^4.1.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/electron-window-state/-/electron-window-state-4.1.1.tgz#6b34fdc31b38514dfec8b7c8f7b5d4addb67632d"
- integrity sha1-azT9wxs4UU3+yLfI97XUrdtnYy0=
- dependencies:
- deep-equal "^1.0.1"
- jsonfile "^2.2.3"
- mkdirp "^0.5.1"
-
-env-paths@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0"
- integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=
-
-es-abstract@^1.5.0:
- version "1.13.0"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9"
- integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==
- dependencies:
- es-to-primitive "^1.2.0"
- function-bind "^1.1.1"
- has "^1.0.3"
- is-callable "^1.1.4"
- is-regex "^1.0.4"
- object-keys "^1.0.12"
-
-es-to-primitive@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377"
- integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==
- dependencies:
- is-callable "^1.1.4"
- is-date-object "^1.0.1"
- is-symbol "^1.0.2"
-
-es6-promise@^3.0.2:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613"
- integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=
-
-exif-parser@^0.1.9:
- version "0.1.12"
- resolved "https://registry.yarnpkg.com/exif-parser/-/exif-parser-0.1.12.tgz#58a9d2d72c02c1f6f02a0ef4a9166272b7760922"
- integrity sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=
-
-extend@~3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
- integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
-
-extsprintf@1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
- integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
-
-extsprintf@^1.2.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
- integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
-
-fast-deep-equal@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
- integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
-
-fast-json-stable-stringify@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
- integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
-
-file-type@^3.1.0:
- version "3.9.0"
- resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
- integrity sha1-JXoHg4TR24CHvESdEH1SpSZyuek=
-
-find-up@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
- integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
- dependencies:
- locate-path "^2.0.0"
-
-for-each@^0.3.3:
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
- integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
- dependencies:
- is-callable "^1.1.3"
-
-forever-agent@~0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
- integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
-
-form-data@~2.3.2:
- version "2.3.3"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
- integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
- dependencies:
- asynckit "^0.4.0"
- combined-stream "^1.0.6"
- mime-types "^2.1.12"
-
-function-bind@^1.0.2, function-bind@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
- integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
-
-getpass@^0.1.1:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
- integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
- dependencies:
- assert-plus "^1.0.0"
-
-global@~4.3.0:
- version "4.3.2"
- resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
- integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
- dependencies:
- min-document "^2.19.0"
- process "~0.5.1"
-
-graceful-fs@^4.1.11, graceful-fs@^4.1.6:
- version "4.1.15"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
- integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
-
-har-schema@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
- integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
-
-har-validator@~5.1.0:
- version "5.1.3"
- resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
- integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
- dependencies:
- ajv "^6.5.5"
- har-schema "^2.0.0"
-
-has-symbols@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44"
- integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=
-
-has@^1.0.1, has@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
- integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
- dependencies:
- function-bind "^1.1.1"
-
-http-signature@~1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
- integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
- dependencies:
- assert-plus "^1.0.0"
- jsprim "^1.2.2"
- sshpk "^1.7.0"
-
-imurmurhash@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
- integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
-
-ip-regex@^1.0.1:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd"
- integrity sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=
-
-is-callable@^1.1.3, is-callable@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
- integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
-
-is-date-object@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
- integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=
-
-is-function@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5"
- integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=
-
-is-obj@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
- integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
-
-is-regex@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
- integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=
- dependencies:
- has "^1.0.1"
-
-is-symbol@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38"
- integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==
- dependencies:
- has-symbols "^1.0.0"
-
-is-typedarray@~1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
- integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
-
-isstream@~0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
- integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
-
-jimp@^0.2.28:
- version "0.2.28"
- resolved "https://registry.yarnpkg.com/jimp/-/jimp-0.2.28.tgz#dd529a937190f42957a7937d1acc3a7762996ea2"
- integrity sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=
- dependencies:
- bignumber.js "^2.1.0"
- bmp-js "0.0.3"
- es6-promise "^3.0.2"
- exif-parser "^0.1.9"
- file-type "^3.1.0"
- jpeg-js "^0.2.0"
- load-bmfont "^1.2.3"
- mime "^1.3.4"
- mkdirp "0.5.1"
- pixelmatch "^4.0.0"
- pngjs "^3.0.0"
- read-chunk "^1.0.1"
- request "^2.65.0"
- stream-to-buffer "^0.1.0"
- tinycolor2 "^1.1.2"
- url-regex "^3.0.0"
-
-jpeg-js@^0.2.0:
- version "0.2.0"
- resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.2.0.tgz#53e448ec9d263e683266467e9442d2c5a2ef5482"
- integrity sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=
-
-jsbn@~0.1.0:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
- integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
-
-json-schema-traverse@^0.4.1:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
- integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-
-json-schema@0.2.3:
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
- integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
-
-json-stringify-safe@~5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
- integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
-
-jsonfile@^2.2.3:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
- integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug=
- optionalDependencies:
- graceful-fs "^4.1.6"
-
-jsprim@^1.2.2:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
- integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
- dependencies:
- assert-plus "1.0.0"
- extsprintf "1.3.0"
- json-schema "0.2.3"
- verror "1.10.0"
-
-load-bmfont@^1.2.3:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.0.tgz#75f17070b14a8c785fe7f5bee2e6fd4f98093b6b"
- integrity sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==
- dependencies:
- buffer-equal "0.0.1"
- mime "^1.3.4"
- parse-bmfont-ascii "^1.0.3"
- parse-bmfont-binary "^1.0.5"
- parse-bmfont-xml "^1.1.4"
- phin "^2.9.1"
- xhr "^2.0.1"
- xtend "^4.0.0"
-
-locate-path@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
- integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=
- dependencies:
- p-locate "^2.0.0"
- path-exists "^3.0.0"
-
-make-dir@^1.0.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
- integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
- dependencies:
- pify "^3.0.0"
-
-mime-db@~1.38.0:
- version "1.38.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad"
- integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==
-
-mime-types@^2.1.12, mime-types@~2.1.19:
- version "2.1.22"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd"
- integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==
- dependencies:
- mime-db "~1.38.0"
-
-mime@^1.3.4:
- version "1.6.0"
- resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
- integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
-
-min-document@^2.19.0:
- version "2.19.0"
- resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
- integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
- dependencies:
- dom-walk "^0.1.0"
-
-minimist@0.0.8:
- version "0.0.8"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
- integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
-
-minimist@^1.2.0:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.3.tgz#3db5c0765545ab8637be71f333a104a965a9ca3f"
- integrity sha512-+bMdgqjMN/Z77a6NlY/I3U5LlRDbnmaAk6lDveAPKwSpcPM4tKAuYsvYF8xjhOPXhOYGe/73vVLVez5PW+jqhw==
-
-mkdirp@0.5.1, mkdirp@^0.5.1:
- version "0.5.1"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
- integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
- dependencies:
- minimist "0.0.8"
-
-oauth-sign@~0.9.0:
- version "0.9.0"
- resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
- integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
-
-object-keys@^1.0.12:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.0.tgz#11bd22348dd2e096a045ab06f6c85bcc340fa032"
- integrity sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==
-
-p-limit@^1.1.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
- integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
- dependencies:
- p-try "^1.0.0"
-
-p-locate@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
- integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=
- dependencies:
- p-limit "^1.1.0"
-
-p-try@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
- integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=
-
-parse-bmfont-ascii@^1.0.3:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz#11ac3c3ff58f7c2020ab22769079108d4dfa0285"
- integrity sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=
-
-parse-bmfont-binary@^1.0.5:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz#d038b476d3e9dd9db1e11a0b0e53a22792b69006"
- integrity sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=
-
-parse-bmfont-xml@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz#015319797e3e12f9e739c4d513872cd2fa35f389"
- integrity sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==
- dependencies:
- xml-parse-from-string "^1.0.0"
- xml2js "^0.4.5"
-
-parse-headers@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.2.tgz#9545e8a4c1ae5eaea7d24992bca890281ed26e34"
- integrity sha512-/LypJhzFmyBIDYP9aDVgeyEb5sQfbfY5mnDq4hVhlQ69js87wXfmEI5V3xI6vvXasqebp0oCytYFLxsBVfCzSg==
- dependencies:
- for-each "^0.3.3"
- string.prototype.trim "^1.1.2"
-
-path-exists@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
- integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
-
-path-is-absolute@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
- integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-
-performance-now@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
- integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
-
-phin@^2.9.1:
- version "2.9.3"
- resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c"
- integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==
-
-pify@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
- integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
-
-pixelmatch@^4.0.0:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-4.0.2.tgz#8f47dcec5011b477b67db03c243bc1f3085e8854"
- integrity sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=
- dependencies:
- pngjs "^3.0.0"
-
-pkg-up@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
- integrity sha1-yBmscoBZpGHKscOImivjxJoATX8=
- dependencies:
- find-up "^2.1.0"
-
-png-to-ico@^1.0.2:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/png-to-ico/-/png-to-ico-1.0.7.tgz#9346b5f4d6fd7e94cb08fd49eeb585f501c3e5f2"
- integrity sha512-heHiZjPFhVgLiuSG4C4wwKN9YPGLpPJvOfXRyI+cEJf0vPutjJ4XDaeI2f/hzTFs+2juihDw3pP8R5JtTuQTGg==
- dependencies:
- "@types/node" "^9.4.0"
- jimp "^0.2.28"
- minimist "^1.2.0"
-
-pngjs@^3.0.0:
- version "3.4.0"
- resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f"
- integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==
-
-process@~0.5.1:
- version "0.5.2"
- resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
- integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
-
-psl@^1.1.24:
- version "1.1.31"
- resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184"
- integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==
-
-punycode@^1.4.1:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
- integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
-
-punycode@^2.1.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
- integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-
-qs@~6.5.2:
- version "6.5.2"
- resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
- integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
-
-read-chunk@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/read-chunk/-/read-chunk-1.0.1.tgz#5f68cab307e663f19993527d9b589cace4661194"
- integrity sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=
-
-request@^2.65.0:
- version "2.88.0"
- resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
- integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
- dependencies:
- aws-sign2 "~0.7.0"
- aws4 "^1.8.0"
- caseless "~0.12.0"
- combined-stream "~1.0.6"
- extend "~3.0.2"
- forever-agent "~0.6.1"
- form-data "~2.3.2"
- har-validator "~5.1.0"
- http-signature "~1.2.0"
- is-typedarray "~1.0.0"
- isstream "~0.1.2"
- json-stringify-safe "~5.0.1"
- mime-types "~2.1.19"
- oauth-sign "~0.9.0"
- performance-now "^2.1.0"
- qs "~6.5.2"
- safe-buffer "^5.1.2"
- tough-cookie "~2.4.3"
- tunnel-agent "^0.6.0"
- uuid "^3.3.2"
-
-safe-buffer@^5.0.1, safe-buffer@^5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
- integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-
-safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
- integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-
-sax@>=0.6.0:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
- integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
-
-signal-exit@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
- integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=
-
-sshpk@^1.7.0:
- version "1.16.1"
- resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
- integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
- dependencies:
- asn1 "~0.2.3"
- assert-plus "^1.0.0"
- bcrypt-pbkdf "^1.0.0"
- dashdash "^1.12.0"
- ecc-jsbn "~0.1.1"
- getpass "^0.1.1"
- jsbn "~0.1.0"
- safer-buffer "^2.0.2"
- tweetnacl "~0.14.0"
-
-stream-to-buffer@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz#26799d903ab2025c9bd550ac47171b00f8dd80a9"
- integrity sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=
- dependencies:
- stream-to "~0.2.0"
-
-stream-to@~0.2.0:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/stream-to/-/stream-to-0.2.2.tgz#84306098d85fdb990b9fa300b1b3ccf55e8ef01d"
- integrity sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=
-
-string.prototype.trim@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea"
- integrity sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=
- dependencies:
- define-properties "^1.1.2"
- es-abstract "^1.5.0"
- function-bind "^1.0.2"
-
-tinycolor2@^1.1.2:
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8"
- integrity sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=
-
-tough-cookie@~2.4.3:
- version "2.4.3"
- resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
- integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
- dependencies:
- psl "^1.1.24"
- punycode "^1.4.1"
-
-tunnel-agent@^0.6.0:
- version "0.6.0"
- resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
- integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
- dependencies:
- safe-buffer "^5.0.1"
-
-tweetnacl@^0.14.3, tweetnacl@~0.14.0:
- version "0.14.5"
- resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
- integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
-
-untildify@^3.0.2:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9"
- integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==
-
-uri-js@^4.2.2:
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
- integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
- dependencies:
- punycode "^2.1.0"
-
-url-regex@^3.0.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/url-regex/-/url-regex-3.2.0.tgz#dbad1e0c9e29e105dd0b1f09f6862f7fdb482724"
- integrity sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=
- dependencies:
- ip-regex "^1.0.1"
-
-uuid@^3.3.2:
- version "3.3.2"
- resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
- integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
-
-verror@1.10.0:
- version "1.10.0"
- resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
- integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
- dependencies:
- assert-plus "^1.0.0"
- core-util-is "1.0.2"
- extsprintf "^1.2.0"
-
-winreg@1.2.4:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/winreg/-/winreg-1.2.4.tgz#ba065629b7a925130e15779108cf540990e98d1b"
- integrity sha1-ugZWKbepJRMOFXeRCM9UCZDpjRs=
-
-write-file-atomic@^2.3.0:
- version "2.4.2"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9"
- integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==
- dependencies:
- graceful-fs "^4.1.11"
- imurmurhash "^0.1.4"
- signal-exit "^3.0.2"
-
-xhr@^2.0.1:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd"
- integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==
- dependencies:
- global "~4.3.0"
- is-function "^1.0.1"
- parse-headers "^2.0.0"
- xtend "^4.0.0"
-
-xml-parse-from-string@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28"
- integrity sha1-qQKekp09vN7RafPG4oI42VpdWig=
-
-xml2js@^0.4.5:
- version "0.4.19"
- resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
- integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==
- dependencies:
- sax ">=0.6.0"
- xmlbuilder "~9.0.1"
-
-xmlbuilder@~9.0.1:
- version "9.0.7"
- resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
- integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
-
-xtend@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
- integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
diff --git a/package.json b/package.json
index 57d8513f34..11e7a31d9a 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,7 @@
{
"name": "riot-web",
"productName": "Riot",
- "main": "electron_app/src/electron-main.js",
- "version": "1.5.15",
+ "version": "1.6.0",
"description": "A feature-rich client for Matrix.org",
"author": "New Vector Ltd.",
"repository": {
@@ -35,7 +34,7 @@
"reskindex": "reskindex -h src/header",
"reskindex:watch": "reskindex -h src/header -w",
"reskindex:watch-react": "node scripts/yarn-sub.js matrix-react-sdk reskindex:watch",
- "clean": "rimraf lib webapp electron_app/dist",
+ "clean": "rimraf lib webapp",
"build": "yarn clean && yarn build:genfiles && yarn build:compile && yarn build:types && yarn build:bundle",
"build-stats": "yarn clean && yarn build:genfiles && yarn build:compile && yarn build:types && yarn build:bundle-stats",
"build:jitsi": "node scripts/build-jitsi.js",
@@ -45,17 +44,11 @@
"build:compile": "babel -d lib --verbose --extensions \".ts,.js,.tsx\" src",
"build:bundle": "cross-env NODE_ENV=production webpack -p --progress --bail --mode production",
"build:bundle-stats": "cross-env NODE_ENV=production webpack -p --progress --bail --mode production --json > webpack-stats.json",
- "build:electron": "yarn build && yarn install:electron && electron-builder -wml --ia32 --x64",
- "build:electron:linux": "yarn build && electron-builder -l --x64",
- "build:electron:macos": "yarn build && electron-builder -m --x64",
- "build:electron:windows": "yarn build && electron-builder -w --ia32 --x64",
"build:types": "tsc --emitDeclarationOnly --jsx react",
- "install:electron": "electron-builder install-app-deps",
"dist": "scripts/package.sh",
"start": "concurrently --kill-others-on-fail --prefix \"{time} [{name}]\" -n reskindex,reskindex-react,res,riot-js \"yarn reskindex:watch\" \"yarn reskindex:watch-react\" \"yarn start:res\" \"yarn start:js\"",
"start:res": "yarn build:jitsi && node scripts/copy-res.js -w",
"start:js": "webpack-dev-server --host=0.0.0.0 --output-filename=bundles/_dev_/[name].js --output-chunk-filename=bundles/_dev_/[name].js -w --progress --mode development",
- "electron": "yarn build && yarn install:electron && electron .",
"lint": "yarn lint:types && yarn lint:ts && yarn lint:js && yarn lint:style",
"lint:js": "eslint src",
"lint:ts": "echo 'We don't actually have a typescript linter at this layer because tslint is being removed from our stack. Presumably your TS is fine.'",
@@ -109,10 +102,6 @@
"cpx": "^1.3.2",
"cross-env": "^6.0.3",
"css-loader": "^3.3.2",
- "electron-builder": "^22.3.2",
- "electron-builder-squirrel-windows": "^22.3.2",
- "electron-devtools-installer": "^2.2.4",
- "electron-notarize": "^0.2.0",
"eslint": "^5.8.0",
"eslint-config-google": "^0.7.1",
"eslint-plugin-babel": "^4.1.2",
@@ -156,57 +145,7 @@
"webpack-cli": "^3.3.10",
"webpack-dev-server": "^3.9.0"
},
- "build": {
- "appId": "im.riot.app",
- "electronVersion": "7.1.14",
- "files": [
- "node_modules/**",
- "src/**"
- ],
- "extraResources": [
- {
- "from": "electron_app/img",
- "to": "img"
- },
- "webapp/**/*"
- ],
- "linux": {
- "target": "deb",
- "category": "Network;InstantMessaging;Chat",
- "maintainer": "support@riot.im",
- "desktop": {
- "StartupWMClass": "riot"
- }
- },
- "mac": {
- "category": "public.app-category.social-networking",
- "darkModeSupport": true
- },
- "win": {
- "target": {
- "target": "squirrel"
- },
- "sign": "scripts/electron_winSign"
- },
- "directories": {
- "buildResources": "electron_app/build",
- "output": "electron_app/dist",
- "app": "electron_app"
- },
- "afterSign": "scripts/electron_afterSign.js",
- "protocols": [
- {
- "name": "riot",
- "schemes": [
- "riot"
- ]
- }
- ]
- },
"jest": {
- "modulePathIgnorePatterns": [
- "/electron_app"
- ],
"testEnvironment": "jest-environment-jsdom-fourteen",
"testMatch": [
"/test/**/*-test.js"
@@ -215,6 +154,7 @@
"/node_modules/matrix-react-sdk/test/setupTests.js"
],
"moduleNameMapper": {
+ "\\.(css|scss)$": "/__mocks__/cssMock.js",
"\\.(gif|png|svg|ttf|woff2)$": "/node_modules/matrix-react-sdk/__mocks__/imageMock.js",
"\\$webapp/i18n/languages.json": "/node_modules/matrix-react-sdk/__mocks__/languages.json",
"^browser-request$": "/node_modules/matrix-react-sdk/__mocks__/browser-request.js",
diff --git a/res/css/structures/ErrorView.scss b/res/css/structures/ErrorView.scss
new file mode 100644
index 0000000000..f75ee6956f
--- /dev/null
+++ b/res/css/structures/ErrorView.scss
@@ -0,0 +1,101 @@
+/*
+Copyright 2020 New Vector Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// import font-size variables manually, ideally this scss would get loaded by the theme which has all variables in context
+@import "../../../node_modules/matrix-react-sdk/res/css/_font-sizes.scss";
+
+.mx_ErrorView {
+ background: #c5e0f7;
+ background: -moz-linear-gradient(top, #c5e0f7 0%, #ffffff 100%);
+ background: -webkit-linear-gradient(top, #c5e0f7 0%, #ffffff 100%);
+ background: linear-gradient(to bottom, #c5e0f7 0%, #ffffff 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#c5e0f7', endColorstr='#ffffff',GradientType=0 );
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+ width: 100%;
+ min-height: 100%;
+ height: auto;
+ color: #000;
+
+ .mx_ErrorView_container {
+ max-width: 680px;
+ margin: auto;
+ }
+
+ .mx_Button {
+ border: 0;
+ border-radius: 4px;
+ font-size: $font-18px;
+ margin-left: 4px;
+ margin-right: 4px;
+ min-width: 80px;
+ background-color: #03B381;
+ color: #fff;
+ cursor: pointer;
+ padding: 12px 22px;
+ word-break: break-word;
+ text-decoration: none;
+ }
+
+ .mx_Center {
+ justify-content: center;
+ }
+
+ .mx_HomePage_header {
+ color: #2E2F32;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ font-size: $font-16px;
+ h1 {
+ font-size: $font-32px;
+ }
+ h2 {
+ font-size: $font-24px;
+ color: #000;
+ }
+
+ .mx_HomePage_col {
+ display: flex;
+ flex-direction: row;
+ }
+
+ .mx_HomePage_row {
+ flex: 1 1 0;
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ }
+
+ .mx_HomePage_logo {
+ margin: auto 20px auto 0;
+ }
+
+ h1, h2 {
+ font-weight: 600;
+ margin-bottom: 32px;
+ }
+
+ .mx_Spacer {
+ margin-top: 24px;
+ }
+
+ .mx_FooterLink {
+ color: #368BD6;
+ text-decoration: none;
+ }
+}
diff --git a/res/decoder-ring/datatypes.js b/res/decoder-ring/datatypes.js
new file mode 100644
index 0000000000..93a779e079
--- /dev/null
+++ b/res/decoder-ring/datatypes.js
@@ -0,0 +1,107 @@
+/*
+ * Quick-n-dirty algebraic datatypes.
+ *
+ * These let us handle the possibility of failure without having to constantly write code to check for it.
+ * We can apply all of the transformations we need as if the data is present using `map`.
+ * If there's a None, or a FetchError, or a Pending, those are left untouched.
+ *
+ * I've used perhaps an odd bit of terminology from scalaz in `fold`. This is basically a `switch` statement:
+ * You pass it a set of functions to handle the various different states of the datatype, and if it finds the
+ * function it'll call it on its value.
+ *
+ * It's handy to have this in functional style when dealing with React as we can dispatch different ways of rendering
+ * really simply:
+ * ```
+ * bundleFetchStatus.fold({
+ * some: (fetchStatus) => ,
+ * }),
+ * ```
+ */
+
+
+class Optional {
+ static from(value) {
+ return value && Some.of(value) || None;
+ }
+ map(f) {
+ return this;
+ }
+ flatMap(f) {
+ return this;
+ }
+ fold({ none }) {
+ return none && none();
+ }
+}
+class Some extends Optional {
+ constructor(value) {
+ super();
+ this.value = value;
+ }
+ map(f) {
+ return Some.of(f(this.value));
+ }
+ flatMap(f) {
+ return f(this.value);
+ }
+ fold({ some }) {
+ return some && some(this.value);
+ }
+ static of(value) {
+ return new Some(value);
+ }
+}
+const None = new Optional();
+
+class FetchStatus {
+ constructor(opt = {}) {
+ this.opt = { at: Date.now(), ...opt };
+ }
+ map(f) {
+ return this;
+ }
+ flatMap(f) {
+ return this;
+ }
+}
+class Success extends FetchStatus {
+ static of(value) {
+ return new Success(value);
+ }
+ constructor(value, opt) {
+ super(opt);
+ this.value = value;
+ }
+ map(f) {
+ return new Success(f(this.value), this.opt);
+ }
+ flatMap(f) {
+ return f(this.value, this.opt);
+ }
+ fold({ success }) {
+ return success instanceof Function ? success(this.value, this.opt) : undefined;
+ }
+}
+class Pending extends FetchStatus {
+ static of(opt) {
+ return new Pending(opt);
+ }
+ constructor(opt) {
+ super(opt);
+ }
+ fold({ pending }) {
+ return pending instanceof Function ? pending(this.opt) : undefined;
+ }
+}
+class FetchError extends FetchStatus {
+ static of(reason, opt) {
+ return new FetchError(reason, opt);
+ }
+ constructor(reason, opt) {
+ super(opt);
+ this.reason = reason;
+ }
+ fold({ error }) {
+ return error instanceof Function ? error(this.reason, this.opt) : undefined;
+ }
+}
diff --git a/res/decoder-ring/decoder.js b/res/decoder-ring/decoder.js
new file mode 100644
index 0000000000..68c6bb066b
--- /dev/null
+++ b/res/decoder-ring/decoder.js
@@ -0,0 +1,319 @@
+class StartupError extends Error {}
+
+/*
+ * We need to know the bundle path before we can fetch the sourcemap files. In a production environment, we can guess
+ * it using this.
+ */
+async function getBundleName() {
+ const res = await fetch("../index.html");
+ if (!res.ok) {
+ throw new StartupError(`Couldn't fetch index.html to prefill bundle; ${res.status} ${res.statusText}`);
+ }
+ const index = await res.text();
+ return index.split("\n").map((line) =>
+ line.match(/
+
+
+
+
+
+
+
+
+
+
+
+
+ Waiting for javascript to run...
+
+
+