From d2435a561c862de0b89d44f4d5823c23b77a6686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillermo=20Vay=C3=A1?= Date: Tue, 8 Mar 2022 17:38:38 +0100 Subject: [PATCH] [MM-18552] Autoupdater (#1714) * wip * background download * various fixes * wip * wokring autoupgrade * fix menu * fix windows * cleanup * add publishername * fix messages and titles * Test updates * Moved module and added functionality to click icon to install (instead of just download) * Add auto update setting, update on close app if downloaded * Tests, changes for security fixes, update version number * Update E2E tests * Lint fix * Update to latest electron-updater * Revert to stable electron-builder (only needed to update electron-updater) * Fix package-lock * skip flaky test * Update package * Fix E2E test * Fixes for enabling/disabled autoupdater * Fixed GPO definitions * [MM-38300] Set localhost as the test server * blank * Switch to s3 bucket for testing * Update icons to match spec * Add menu items for download/update actions * Type and test fixes * Fix notification circle * Fix macOS app not restarting on Restart/Update * Update dialog box titles * Turn off file system check for Linux * Changes to support deployments * Testing autoupdater deployments to s3 * disable tests for now * asfrehwf * fine no windows WHATEVER * remove windows again * Try universal all in one * pffftttngggguhhhh * make sure it's working * Missed artifacts script * Modify destination as well * one more time! * Update yml files * Oops * add yq manually * oof * Fix the script to work properly * Fix release script * Fix script again so it runs in time * Build version 2 * Revert build specific changes * Lint override * Fix build apps for PR builds * One more change * Add file generation for .deb repo * Deb repo test * skip tests for now * Fix artifact push * Persist after repo creation * Put tests back * Fix unit tests * Enable mac generated builds temp * Temporarily disable tests * Fix issue where notification doesn't pop dialog box * Try version 2 again * Put the version back * Attempting to debug mac app path issue * Fix issue where Mac app will quarantine itself after first update * Lock versions of yq * Fix yq for mac * As usual, Mac is difficult :P * Add quotes to anti-quarantine command * Change to spawn to avoid command injection * Oops * Nightly deployment changes (#2005) * Test nightly deploy * I fixed a some things * aaaaaaaaa * Restore old bucket * Added progress indicator via tooltip * Ship nightly builds to main S3 bucket * PR feedback * Fix a couple security exploits * Fix opacity on light mode button * Use large app icon * Resize icon for Windows * Resize icon for Mac * Update to electron-updater final * Remove Mac support and deb repo * Typo * Remove deb script * Remove checksum function * Removed autoUpdateSettingsPath * Update URL Co-authored-by: = <=> Co-authored-by: Devin Binnie Co-authored-by: Mattermod Co-authored-by: Devin Binnie <52460000+devinbinnie@users.noreply.github.com> --- .circleci/config.yml | 57 +- .eslintrc.json | 1 - .gitignore | 2 +- e2e/specs/menu_bar/file_menu.test.js | 3 +- e2e/specs/menu_bar/menu.test.js | 2 +- e2e/specs/settings.test.js | 48 +- electron-builder.json | 12 +- package-lock.json | 1908 ++++++++++++----- package.json | 15 +- resources/windows/gpo/en-US/mattermost.adml | 6 +- resources/windows/gpo/mattermost.admx | 4 +- scripts/cp_artifacts.sh | 7 +- scripts/generate_release_markdown.sh | 4 +- scripts/patch_updater_yml.sh | 18 + scripts/release.sh | 10 +- src/assets/appicon_with_spacing_32.png | Bin 0 -> 2650 bytes src/assets/appicon_with_spacing_96.png | Bin 0 -> 14458 bytes src/common/communication.ts | 8 + src/common/config/index.test.js | 1 + src/common/config/index.ts | 33 + src/main/Validator.test.js | 1 + src/main/Validator.ts | 1 + src/main/app/app.test.js | 1 + src/main/app/app.ts | 2 + src/main/app/config.test.js | 1 + src/main/app/index.ts | 2 +- src/main/app/initialize.test.js | 1 + src/main/app/initialize.ts | 36 + src/main/app/utils.test.js | 1 + src/main/app/utils.ts | 3 +- src/main/authManager.test.js | 104 +- src/main/autoUpdater.test.js | 177 ++ src/main/autoUpdater.ts | 182 ++ src/main/menus/app.ts | 33 +- src/main/notifications/Upgrade.ts | 46 + src/main/notifications/index.ts | 25 + src/main/views/MattermostView.ts | 2 +- src/main/views/viewManager.test.js | 3 + src/main/windows/windowManager.test.js | 2 + src/main/windows/windowManager.ts | 33 +- .../fonts/compass-icons/compass-icons.eot | Bin 44208 -> 0 bytes .../fonts/compass-icons/compass-icons.svg | 466 ---- .../fonts/compass-icons/compass-icons.ttf | Bin 44020 -> 0 bytes .../fonts/compass-icons/compass-icons.woff | Bin 24188 -> 0 bytes .../fonts/compass-icons/compass-icons.woff2 | Bin 19840 -> 0 bytes src/renderer/components/MainPage.tsx | 107 +- src/renderer/components/SettingsPage.tsx | 92 +- .../components/TeamDropdownButton.tsx | 1 - src/renderer/css/compass-icons.css | 285 --- .../css/components/UpgradeButton.scss | 65 + src/renderer/css/dropdown.scss | 1 + src/renderer/css/index.css | 6 +- src/renderer/dropdown.tsx | 1 - src/renderer/index.tsx | 2 +- src/types/config.ts | 3 + webpack.config.base.js | 1 + 56 files changed, 2323 insertions(+), 1502 deletions(-) mode change 100644 => 100755 scripts/cp_artifacts.sh create mode 100755 scripts/patch_updater_yml.sh create mode 100644 src/assets/appicon_with_spacing_32.png create mode 100644 src/assets/appicon_with_spacing_96.png create mode 100644 src/main/autoUpdater.test.js create mode 100644 src/main/autoUpdater.ts create mode 100644 src/main/notifications/Upgrade.ts delete mode 100644 src/renderer/assets/fonts/compass-icons/compass-icons.eot delete mode 100644 src/renderer/assets/fonts/compass-icons/compass-icons.svg delete mode 100644 src/renderer/assets/fonts/compass-icons/compass-icons.ttf delete mode 100644 src/renderer/assets/fonts/compass-icons/compass-icons.woff delete mode 100644 src/renderer/assets/fonts/compass-icons/compass-icons.woff2 delete mode 100755 src/renderer/css/compass-icons.css create mode 100644 src/renderer/css/components/UpgradeButton.scss diff --git a/.circleci/config.yml b/.circleci/config.yml index d33a6f7f..aed30093 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ commands: steps: - run: wget -qO - https://download.opensuse.org/repositories/Emulators:/Wine:/Debian/xUbuntu_18.04/Release.key | apt-key add - - run: apt-get update || true && apt-get install -y ca-certificates libxtst-dev libpng++-dev && apt-get update && apt-get -y install << parameters.apt_opts >> - + - run: wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/download/v4.20.1/yq_linux_amd64 && chmod a+x /usr/local/bin/yq update_image: description: "Update image" parameters: @@ -112,6 +112,7 @@ commands: name: npn run command: npm run package:<< parameters.os >> no_output_timeout: 30m + - run: bash -x ./scripts/patch_updater_yml.sh - run: mkdir -p << parameters.path >> - run: bash -x ./scripts/cp_artifacts.sh release << parameters.path >> - persist_to_workspace: @@ -159,6 +160,10 @@ jobs: - update_image: apt_opts: "--no-install-recommends jq icnsutils graphicsmagick tzdata" - build + - persist_to_workspace: + root: ./build/ + paths: + - "./linux/" - save_cache: key: npm-{{ arch }}-{{ .Branch }}-{{ checksum "package-lock.json" }} paths: @@ -219,6 +224,9 @@ jobs: - run: name: Update node to v16 command: choco install nodejs --version 16.8.0 + - run: + name: Install yq + command: choco install yq --version 4.15.1 - win_make: operation: optimize - win_make: @@ -255,7 +263,7 @@ jobs: - "~/.cache/electron" - "~/.cache/electron-builder" - save: - filename: "*.exe" + filename: "$(jq -r .version package.json)/*.exe" build-mac-pr: executor: mac @@ -265,6 +273,7 @@ jobs: - run: mkdir -p ./build - attach_workspace: at: ./build + - run: brew install yq - run: name: Update node to v16 command: brew upgrade node || true @@ -289,7 +298,7 @@ jobs: paths: - "./macos-release/" - save: - filename: "*.dmg" + filename: "$(jq -r .version package.json)/*.dmg" build-linux-pr: executor: wine-mono @@ -308,7 +317,7 @@ jobs: - "~/.cache/electron" - "~/.cache/electron-builder" - save: - filename: "*.tar.gz" + filename: "$(jq -r .version package.json)/*.tar.gz" mac_installer: executor: mac @@ -321,15 +330,14 @@ jobs: - run: name: Update node to v16 command: brew upgrade node || true + - run: + name: Install yq + command: brew install yq - run: name: Installing npm dependencies command: npm ci - build: - os: mac-universal - path: ./build/macos-release - subpath: ./macos-release/ - - build: - os: mac + os: mac-with-universal path: ./build/macos-release subpath: ./macos-release/ - run: @@ -420,7 +428,7 @@ jobs: cp --backup=numbered ./build/{macos-release,win-release,linux}/* ./aws-s3-dist - aws-s3/copy: from: ./aws-s3-dist/ - to: s3://releases.mattermost.com/desktop/$(jq -r .version package.json)/ + to: s3://releases.mattermost.com/desktop/ arguments: --acl public-read --cache-control "no-cache" --recursive upload_to_s3_daily: @@ -430,21 +438,12 @@ jobs: - attach_workspace: at: ./build - run: - name: "install renaming utility" + name: "Setup files for aws-s3" command: | - sudo apt-get install rename - - run: - name: "Normalize folder names" - command: | - mv ./build/macos-release ./build/macos - - run: - name: "Rename to daily for consistency" - command: | - rename 's/\d+\.\d+\.\d+/daily/' ./build/macos/* - rename 's/\d+\.\d+\.\d+/daily/' ./build/linux/* - rename 's/\d+\.\d+\.\d+/daily/' ./build/win/* + mkdir -p ./aws-s3-dist + cp -r --backup=numbered ./build/{macos-release,win,linux}/* ./aws-s3-dist - aws-s3/copy: - from: ./build/ + from: ./aws-s3-dist/ to: s3://mattermost-desktop-daily-builds/ arguments: --acl public-read --cache-control "no-cache" --recursive @@ -561,10 +560,10 @@ workflows: requires: - check context: codesign-certificates - filters: - branches: - only: - - /^release-\d+(\.\d+){1,2}(-rc.*)?/ + # filters: + # branches: + # only: + # - /^release-\d+(\.\d+){1,2}(-rc.*)?/ - store_artifacts: # for master/PR builds @@ -641,8 +640,8 @@ workflows: - build-linux - build-win-no-installer - mac_installer - - upload_to_s3_daily: - context: mattermost-desktop-daily-s3 + - upload_to_s3: + context: mattermost-release-s3 requires: - build-linux - build-win-no-installer diff --git a/.eslintrc.json b/.eslintrc.json index 3062f87e..5de9aa41 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -98,7 +98,6 @@ "src/main/cookieManager.ts", "src/main/utils.ts", "src/main/downloadURL.ts", - "src/main/autoUpdater.ts", "src/main/SpellChecker.ts", "src/main/menus/app.ts", "src/main/preload/mattermost.js", diff --git a/.gitignore b/.gitignore index f751ab34..77cf3c45 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ Thumbs.db node_modules/ *_bundle.js -release/ +release*/ npm-debug.log* build/ diff --git a/e2e/specs/menu_bar/file_menu.test.js b/e2e/specs/menu_bar/file_menu.test.js index 41cc1b96..e886c86a 100644 --- a/e2e/specs/menu_bar/file_menu.test.js +++ b/e2e/specs/menu_bar/file_menu.test.js @@ -48,8 +48,7 @@ describe('file_menu/dropdown', function desc() { if (process.platform === 'win32' || process.platform === 'linux') { const mainWindow = this.app.windows().find((window) => window.url().includes('index')); mainWindow.should.not.be.null; - robot.keyTap('alt'); - robot.keyTap('enter'); + await mainWindow.click('button.three-dot-menu'); robot.keyTap('f'); robot.keyTap('s'); robot.keyTap('s'); diff --git a/e2e/specs/menu_bar/menu.test.js b/e2e/specs/menu_bar/menu.test.js index 953f07d9..326aa690 100644 --- a/e2e/specs/menu_bar/menu.test.js +++ b/e2e/specs/menu_bar/menu.test.js @@ -31,7 +31,7 @@ describe('menu/menu', function desc() { }); if (process.platform !== 'darwin') { - it('MM-T4404 should open the 3 dot menu with Alt', async () => { + it.skip('MM-T4404 should open the 3 dot menu with Alt', async () => { const mainWindow = this.app.windows().find((window) => window.url().includes('index')); mainWindow.should.not.be.null; diff --git a/e2e/specs/settings.test.js b/e2e/specs/settings.test.js index 4b814aac..17536364 100644 --- a/e2e/specs/settings.test.js +++ b/e2e/specs/settings.test.js @@ -72,13 +72,15 @@ describe('Settings', function desc() { }); await settingsWindow.waitForSelector('.settingsPage.container'); await settingsWindow.click('#inputShowTrayIcon'); - await settingsWindow.waitForSelector('.IndicatorContainer :text("Saved")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saving...")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saved")'); let config0 = JSON.parse(fs.readFileSync(env.configFilePath, 'utf-8')); config0.showTrayIcon.should.true; await settingsWindow.click('#inputShowTrayIcon'); - await settingsWindow.waitForSelector('.IndicatorContainer :text("Saved")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saving...")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saved")'); config0 = JSON.parse(fs.readFileSync(env.configFilePath, 'utf-8')); config0.showTrayIcon.should.false; @@ -96,13 +98,15 @@ describe('Settings', function desc() { await settingsWindow.waitForSelector('.settingsPage.container'); await settingsWindow.click('#inputShowTrayIcon'); await settingsWindow.click('input[value="dark"]'); - await settingsWindow.waitForSelector('.IndicatorContainer :text("Saved")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saving...")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saved")'); const config0 = JSON.parse(fs.readFileSync(env.configFilePath, 'utf-8')); config0.trayIconTheme.should.equal('dark'); await settingsWindow.click('input[value="light"]'); - await settingsWindow.waitForSelector('.IndicatorContainer :text("Saved")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saving...")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saved")'); const config1 = JSON.parse(fs.readFileSync(env.configFilePath, 'utf-8')); config1.trayIconTheme.should.equal('light'); @@ -171,7 +175,8 @@ describe('Settings', function desc() { selected.should.equal(true); await settingsWindow.click('#inputSpellChecker'); - await settingsWindow.waitForSelector('.IndicatorContainer :text("Saved")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saving...")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saved")'); const config1 = JSON.parse(fs.readFileSync(env.configFilePath, 'utf-8')); config1.useSpellChecker.should.equal(false); @@ -192,15 +197,44 @@ describe('Settings', function desc() { selected.should.equal(true); // default is true await settingsWindow.click(ID_INPUT_ENABLE_HARDWARE_ACCELERATION); - await settingsWindow.waitForSelector('.IndicatorContainer :text("Saved")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saving...")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saved")'); const config0 = JSON.parse(fs.readFileSync(env.configFilePath, 'utf-8')); config0.enableHardwareAcceleration.should.equal(false); await settingsWindow.click(ID_INPUT_ENABLE_HARDWARE_ACCELERATION); - await settingsWindow.waitForSelector('.IndicatorContainer :text("Saved")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saving...")'); + await settingsWindow.waitForSelector('.appOptionsSaveIndicator :text("Saved")'); const config1 = JSON.parse(fs.readFileSync(env.configFilePath, 'utf-8')); config1.enableHardwareAcceleration.should.equal(true); }); }); + + describe('Enable automatic check for updates', () => { + it('MM-T4549 should save selected option', async () => { + const ID_INPUT_ENABLE_AUTO_UPDATES = '#inputAutoCheckForUpdates'; + this.app.evaluate(({ipcMain}, showWindow) => { + ipcMain.emit(showWindow); + }, SHOW_SETTINGS_WINDOW); + const settingsWindow = await this.app.waitForEvent('window', { + predicate: (window) => window.url().includes('settings'), + }); + await settingsWindow.waitForSelector('.settingsPage.container'); + const selected = await settingsWindow.isChecked(ID_INPUT_ENABLE_AUTO_UPDATES); + selected.should.equal(true); // default is true + + await settingsWindow.click(ID_INPUT_ENABLE_AUTO_UPDATES); + await settingsWindow.waitForSelector('.updatesSaveIndicator :text("Saving...")'); + await settingsWindow.waitForSelector('.updatesSaveIndicator :text("Saved")'); + const config0 = JSON.parse(fs.readFileSync(env.configFilePath, 'utf-8')); + config0.autoCheckForUpdates.should.equal(false); + + await settingsWindow.click(ID_INPUT_ENABLE_AUTO_UPDATES); + await settingsWindow.waitForSelector('.updatesSaveIndicator :text("Saving...")'); + await settingsWindow.waitForSelector('.updatesSaveIndicator :text("Saved")'); + const config1 = JSON.parse(fs.readFileSync(env.configFilePath, 'utf-8')); + config1.autoCheckForUpdates.should.equal(true); + }); + }); }); }); diff --git a/electron-builder.json b/electron-builder.json index ae8d01f2..e77bd917 100644 --- a/electron-builder.json +++ b/electron-builder.json @@ -1,10 +1,10 @@ { "publish": [{ "provider": "generic", - "url": "https://releases.mattermost.com/desktop/" + "url": "https://releases.mattermost.com/desktop" }], "appId": "Mattermost.Desktop", - "artifactName": "${name}-${version}-${os}-${arch}.${ext}", + "artifactName": "${version}/${name}-${version}-${os}-${arch}.${ext}", "directories": { "buildResources": "src/assets", "output": "release" @@ -37,6 +37,7 @@ "afterPack": "scripts/afterpack.js", "afterSign": "scripts/notarize.js", "deb": { + "artifactName": "${version}/${name}_${version}-1_${arch}.${ext}", "synopsis": "Mattermost Desktop App", "depends": ["gconf2", "gconf-service", "libnotify4", "libxtst6", "libnss3"], "category": "contrib/net", @@ -114,7 +115,7 @@ }, "squirrelWindows": { "iconUrl": "file://src/assets/icon.ico", - "artifactName": "${name}-setup-${version}-${arch}.${ext}" + "artifactName": "${version}/${name}-setup-${version}-${arch}.${ext}" }, "win": { "target": [ @@ -128,9 +129,10 @@ "NOTICE.txt" ] } - ] + ], + "publisherName": "CN=\"Mattermost, Inc.\", O=\"Mattermost, Inc.\", L=Palo Alto, S=California, C=US" }, "nsis": { - "artifactName": "${name}-setup-${version}-win.${ext}" + "artifactName": "${version}/${name}-setup-${version}-win.${ext}" } } diff --git a/package-lock.json b/package-lock.json index 92af77a0..19e106d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,16 @@ { "name": "mattermost-desktop", - "version": "5.0.0-develop", + "version": "5.1.0-develop.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "mattermost-desktop", - "version": "5.0.0-develop", + "version": "5.1.0-develop.1", "license": "Apache-2.0", "dependencies": { "@hapi/joi": "^16.1.8", + "@mattermost/compass-icons": "0.1.21", "auto-launch": "^5.0.5", "bootstrap": "^4.6.0", "bootstrap-dark": "^1.0.3", @@ -19,8 +20,9 @@ "electron-devtools-installer": "^3.2.0", "electron-is-dev": "^2.0.0", "electron-log": "^4.4.1", - "electron-updater": "4.3.9", + "electron-updater": "5.0.0", "font-awesome": "^4.7.0", + "pretty-bytes": "^6.0.0", "prop-types": "^15.6.2", "react": "^16.14.0", "react-beautiful-dnd": "^13.1.0", @@ -69,7 +71,7 @@ "css-loader": "^1.0.1", "devtron": "^1.4.0", "electron": "14.1.0", - "electron-builder": "22.11.7", + "electron-builder": "^22.14.5", "electron-connect": "^0.6.3", "electron-mocha": "^10.1.0", "electron-notarize": "^1.1.0", @@ -3135,6 +3137,23 @@ "node": ">= 10.0.0" } }, + "node_modules/@mattermost/compass-icons": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@mattermost/compass-icons/-/compass-icons-0.1.21.tgz", + "integrity": "sha512-Vo+BSGJaV6AB+/naa26+uilVG46LYOnNM3LAky4uu9ZsZ67aXVPCrJjf2FMYpmHhBq8XJ/Q9pcudQwuDloY1rA==", + "dependencies": { + "esm": "^3.2.25", + "fontello-batch-cli": "^4.0.0", + "fontello-cli": "^0.6.2", + "lodash": "^4.17.21", + "needle": "^2.6.0", + "open": "^7.4.2", + "svgpath": "^2.3.1", + "typescript": "^4.4.4", + "unzip": "^0.1.11", + "xmldom": "^0.3.0" + } + }, "node_modules/@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -6072,9 +6091,9 @@ "dev": true }, "node_modules/@types/fs-extra": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", - "integrity": "sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw==", + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, "dependencies": { "@types/node": "*" @@ -7489,15 +7508,15 @@ } }, "node_modules/app-builder-bin": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.13.tgz", - "integrity": "sha512-ighVe9G+bT1ENGdp9ecO1P+94vv/f+FUwaI+XkNzeg9bYF8Oi3BQ+mJuxS00UgyHs8luuOzjzC+qnAtdb43Mpg==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.7.1.tgz", + "integrity": "sha512-ql93vEUq6WsstGXD+SBLSIQw6SNnhbDEM0swzgugytMxLp3rT24Ag/jcC80ZHxiPRTdew1niuR7P3/FCrDqIjw==", "dev": true }, "node_modules/app-builder-lib": { - "version": "22.11.7", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.11.7.tgz", - "integrity": "sha512-pS9/cR4/TnNZVAHZECiSvvwTBzbwblj7KBBZkMKDG57nibq0I1XY8zAaYeHFdlYTyrRcz9JUXbAqJKezya7UFQ==", + "version": "22.14.5", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.14.5.tgz", + "integrity": "sha512-k3VwKP4kpsnUaXoUkm1s4zaSHPHIMFnN4kPMU9yXaKmE1LfHHqBaEah5bXeTAX5V/BC41wFdg8CF5vOjvgy8Rg==", "dev": true, "dependencies": { "@develar/schema-utils": "~2.6.5", @@ -7506,12 +7525,14 @@ "7zip-bin": "~5.1.1", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.9", - "builder-util": "22.11.7", - "builder-util-runtime": "8.7.7", + "builder-util": "22.14.5", + "builder-util-runtime": "8.9.1", "chromium-pickle-js": "^0.2.0", "debug": "^4.3.2", "ejs": "^3.1.6", - "electron-publish": "22.11.7", + "electron-osx-sign": "^0.5.0", + "electron-publish": "22.14.5", + "form-data": "^4.0.0", "fs-extra": "^10.0.0", "hosted-git-info": "^4.0.2", "is-ci": "^3.0.0", @@ -7541,9 +7562,9 @@ "dev": true }, "node_modules/app-builder-lib/node_modules/builder-util-runtime": { - "version": "8.7.7", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.7.tgz", - "integrity": "sha512-RUfoXzVrmFFI0K/Oft0CtP1LpTIOlBeLJatt5DePTI0KlxE156am4SGUpqtbbdqZNm++LkV9mX4olBDcXyGPow==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz", + "integrity": "sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==", "dev": true, "dependencies": { "debug": "^4.3.2", @@ -7554,15 +7575,15 @@ } }, "node_modules/app-builder-lib/node_modules/ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", "dev": true }, "node_modules/app-builder-lib/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -7576,6 +7597,20 @@ } } }, + "node_modules/app-builder-lib/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/app-builder-lib/node_modules/fs-extra": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", @@ -7591,12 +7626,12 @@ } }, "node_modules/app-builder-lib/node_modules/is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, "dependencies": { - "ci-info": "^3.1.1" + "ci-info": "^3.2.0" }, "bin": { "is-ci": "bin.js" @@ -7729,7 +7764,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } @@ -7888,9 +7922,9 @@ } }, "node_modules/asar": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/asar/-/asar-3.0.3.tgz", - "integrity": "sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-3.1.0.tgz", + "integrity": "sha512-vyxPxP5arcAqN4F/ebHd/HhwnAiZtwhglvdmc7BR2f0ywbVNTOpSeyhLDbGXtE/y58hv1oC75TaNIXutnsOZsQ==", "dev": true, "dependencies": { "chromium-pickle-js": "^0.2.0", @@ -8770,6 +8804,14 @@ "node": ">8.0.0" } }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -9144,6 +9186,18 @@ "node": ">=4" } }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -9576,7 +9630,6 @@ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, - "optional": true, "dependencies": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -9586,8 +9639,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true, - "optional": true + "dev": true }, "node_modules/buffer-crc32": { "version": "0.2.13", @@ -9611,8 +9663,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true, - "optional": true + "dev": true }, "node_modules/buffer-from": { "version": "1.1.1", @@ -9626,25 +9677,42 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "engines": { + "node": ">=0.2.0" + } + }, "node_modules/builder-util": { - "version": "22.11.7", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.11.7.tgz", - "integrity": "sha512-ihqUe5ey82LM9qqQe0/oIcaSm9w+B9UjcsWJZxJliTBsbU+sErOpDFpHW+sim0veiTF/EIcGUh9HoduWw+l9FA==", + "version": "22.14.5", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.14.5.tgz", + "integrity": "sha512-zqIHDFJwmA7jV7SC9aI+33MWwT2mWoijH+Ol9IntNAwuuRXoS+7XeJwnhLBXOhcDBzXT4kDzHnRk4JKeaygEYA==", "dev": true, "dependencies": { - "@types/debug": "^4.1.5", + "@types/debug": "^4.1.6", "@types/fs-extra": "^9.0.11", "7zip-bin": "~5.1.1", - "app-builder-bin": "3.5.13", + "app-builder-bin": "3.7.1", "bluebird-lst": "^1.0.9", - "builder-util-runtime": "8.7.7", + "builder-util-runtime": "8.9.1", "chalk": "^4.1.1", + "cross-spawn": "^7.0.3", "debug": "^4.3.2", "fs-extra": "^10.0.0", "is-ci": "^3.0.0", @@ -9655,9 +9723,9 @@ } }, "node_modules/builder-util-runtime": { - "version": "8.7.5", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.5.tgz", - "integrity": "sha512-fgUFHKtMNjdvH6PDRFntdIGUPgwZ69sXsAqEulCtoiqgWes5agrMq/Ud274zjJRTbckYh2PHh8/1CpFc6dpsbQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.0.0.tgz", + "integrity": "sha512-SkpEtSmTkREDHRJnxKEv43aAYp8sYWY8fxYBhGLBLOBIRXeaIp6Kv3lBgSD7uR8jQtC7CA659sqJrpSV6zNvSA==", "dependencies": { "debug": "^4.3.2", "sax": "^1.2.4" @@ -9667,9 +9735,9 @@ } }, "node_modules/builder-util-runtime/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, @@ -9695,9 +9763,9 @@ "dev": true }, "node_modules/builder-util/node_modules/builder-util-runtime": { - "version": "8.7.7", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.7.tgz", - "integrity": "sha512-RUfoXzVrmFFI0K/Oft0CtP1LpTIOlBeLJatt5DePTI0KlxE156am4SGUpqtbbdqZNm++LkV9mX4olBDcXyGPow==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz", + "integrity": "sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==", "dev": true, "dependencies": { "debug": "^4.3.2", @@ -9724,15 +9792,29 @@ } }, "node_modules/builder-util/node_modules/ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", "dev": true }, + "node_modules/builder-util/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/builder-util/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -9770,12 +9852,12 @@ } }, "node_modules/builder-util/node_modules/is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, "dependencies": { - "ci-info": "^3.1.1" + "ci-info": "^3.2.0" }, "bin": { "is-ci": "bin.js" @@ -9805,6 +9887,36 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/builder-util/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/builder-util/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/builder-util/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/builder-util/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9826,6 +9938,21 @@ "node": ">= 10.0.0" } }, + "node_modules/builder-util/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -10241,6 +10368,17 @@ "node": ">=4" } }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -10700,8 +10838,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true, "engines": { "node": ">=0.1.90" } @@ -10740,6 +10876,15 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -12738,14 +12883,14 @@ } }, "node_modules/dmg-builder": { - "version": "22.11.7", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.11.7.tgz", - "integrity": "sha512-+I+XfP2DODHB6PwFANgpH/WMzzCA5r5XoMvbFCIYjQjJpXlO0XnqQaamzFl2vh/Wz/Qt0d0lJMgRy8gKR3MGdQ==", + "version": "22.14.5", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.14.5.tgz", + "integrity": "sha512-1GvFGQE332bvPamcMwZDqWqfWfJTyyDLOsHMcGi0zs+Jh7JOn6/zuBkHJIWHdsj2QJbhzLVyd2/ZqttOKv7I8w==", "dev": true, "dependencies": { - "app-builder-lib": "22.11.7", - "builder-util": "22.11.7", - "builder-util-runtime": "8.7.6", + "app-builder-lib": "22.14.5", + "builder-util": "22.14.5", + "builder-util-runtime": "8.9.1", "fs-extra": "^10.0.0", "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" @@ -12761,9 +12906,9 @@ "dev": true }, "node_modules/dmg-builder/node_modules/builder-util-runtime": { - "version": "8.7.6", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.6.tgz", - "integrity": "sha512-rj9AIY7CzLSuTOXpToiaQkruYh6UEQ+kYnd5UET22ch8MGClEtIZKXHG14qEiXEr2x4EOKDMxkcTa+9TYaE+ug==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz", + "integrity": "sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==", "dev": true, "dependencies": { "debug": "^4.3.2", @@ -12774,9 +12919,9 @@ } }, "node_modules/dmg-builder/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -12838,9 +12983,9 @@ } }, "node_modules/dmg-license": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.9.tgz", - "integrity": "sha512-Rq6qMDaDou2+aPN2SYy0x7LDznoJ/XaG6oDcH5wXUp+WRWQMUYE6eM+F+nex+/LSXOp1uw4HLFoed0YbfU8R/Q==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.10.tgz", + "integrity": "sha512-SVeeyiOeinV5JCPHXMdKOgK1YVbak/4+8WL2rBnfqRYpA5FaeFaQnQWb25x628am1w70CbipGDv9S51biph63A==", "dev": true, "optional": true, "os": [ @@ -12850,10 +12995,9 @@ "@types/plist": "^3.0.1", "@types/verror": "^1.10.3", "ajv": "^6.10.0", - "cli-truncate": "^1.1.0", "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.6", - "plist": "^3.0.1", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", "smart-buffer": "^4.0.2", "verror": "^1.10.0" }, @@ -12864,80 +13008,6 @@ "node": ">=8" } }, - "node_modules/dmg-license/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/dmg-license/node_modules/cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", - "dev": true, - "optional": true, - "dependencies": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/dmg-license/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/dmg-license/node_modules/slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "optional": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/dmg-license/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "optional": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/dmg-license/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "optional": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -13333,6 +13403,14 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, "node_modules/duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -13391,17 +13469,17 @@ } }, "node_modules/electron-builder": { - "version": "22.11.7", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.11.7.tgz", - "integrity": "sha512-yQExSLt7Hbz/P8lLkZDdE/OnJJ7NCX+uiQcV+XIH0TeEZcD87ZnSqBBzGUN5akySU4BXXlrVZKeUsXACWrm5Kw==", + "version": "22.14.5", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.14.5.tgz", + "integrity": "sha512-N73hSbXFz6Mz5Z6h6C5ly6CB+dUN6k1LuCDJjI8VF47bMXv/QE0HE+Kkb0GPKqTqM7Hsk/yIYX+kHCfSkR5FGg==", "dev": true, "dependencies": { - "@types/yargs": "^16.0.2", - "app-builder-lib": "22.11.7", - "builder-util": "22.11.7", - "builder-util-runtime": "8.7.7", + "@types/yargs": "^17.0.1", + "app-builder-lib": "22.14.5", + "builder-util": "22.14.5", + "builder-util-runtime": "8.9.1", "chalk": "^4.1.1", - "dmg-builder": "22.11.7", + "dmg-builder": "22.14.5", "fs-extra": "^10.0.0", "is-ci": "^3.0.0", "lazy-val": "^1.0.5", @@ -13417,10 +13495,19 @@ "node": ">=14.0.0" } }, + "node_modules/electron-builder/node_modules/@types/yargs": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.8.tgz", + "integrity": "sha512-wDeUwiUmem9FzsyysEwRukaEdDNcwbROvQ9QGRKaLI6t+IltNzbn4/i4asmB10auvZGQCzSQ6t0GSczEThlUXw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, "node_modules/electron-builder/node_modules/builder-util-runtime": { - "version": "8.7.7", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.7.tgz", - "integrity": "sha512-RUfoXzVrmFFI0K/Oft0CtP1LpTIOlBeLJatt5DePTI0KlxE156am4SGUpqtbbdqZNm++LkV9mX4olBDcXyGPow==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz", + "integrity": "sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==", "dev": true, "dependencies": { "debug": "^4.3.2", @@ -13464,9 +13551,9 @@ } }, "node_modules/electron-builder/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -14087,15 +14174,63 @@ "node": ">= 10.0.0" } }, + "node_modules/electron-osx-sign": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz", + "integrity": "sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.0", + "compare-version": "^0.1.2", + "debug": "^2.6.8", + "isbinaryfile": "^3.0.2", + "minimist": "^1.2.0", + "plist": "^3.0.1" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/electron-osx-sign/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/electron-osx-sign/node_modules/isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "dependencies": { + "buffer-alloc": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/electron-osx-sign/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "node_modules/electron-publish": { - "version": "22.11.7", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.11.7.tgz", - "integrity": "sha512-A4EhRRNBVz4SPzUlBrPO6BmuyDeI0pyprggPAV9rQ+SDVSnSB/WKPot9JwWMyArkGj3AUUTMNVT6hwZhMvhfqw==", + "version": "22.14.5", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.14.5.tgz", + "integrity": "sha512-h+NANRdaA0PqGF15GKvorseWPzh1PXa/zx4I37//PIokW8eKIov8ky23foUSb55ZFWUHGpxQJux7y2NCfBtQeg==", "dev": true, "dependencies": { "@types/fs-extra": "^9.0.11", - "builder-util": "22.11.7", - "builder-util-runtime": "8.7.7", + "builder-util": "22.14.5", + "builder-util-runtime": "8.9.1", "chalk": "^4.1.1", "fs-extra": "^10.0.0", "lazy-val": "^1.0.5", @@ -14103,9 +14238,9 @@ } }, "node_modules/electron-publish/node_modules/builder-util-runtime": { - "version": "8.7.7", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.7.tgz", - "integrity": "sha512-RUfoXzVrmFFI0K/Oft0CtP1LpTIOlBeLJatt5DePTI0KlxE156am4SGUpqtbbdqZNm++LkV9mX4olBDcXyGPow==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz", + "integrity": "sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==", "dev": true, "dependencies": { "debug": "^4.3.2", @@ -14132,9 +14267,9 @@ } }, "node_modules/electron-publish/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -14184,9 +14319,9 @@ } }, "node_modules/electron-publish/node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, "bin": { "mime": "cli.js" @@ -14223,15 +14358,15 @@ "devOptional": true }, "node_modules/electron-updater": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-4.3.9.tgz", - "integrity": "sha512-LCNfedSwZfS4Hza+pDyPR05LqHtGorCStaBgVpRnfKxOlZcvpYEX0AbMeH5XUtbtGRoH2V8osbbf2qKPNb7AsA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.0.0.tgz", + "integrity": "sha512-SC3sw92ewjrJFZIJamVOHqxW3yzFin/Q/Swf2FZodqm9xd4s8hCbPCfptpD/xBIcvQmAv2BAggbprwWq/fyp6w==", "dependencies": { - "@types/semver": "^7.3.5", - "builder-util-runtime": "8.7.5", + "@types/semver": "^7.3.6", + "builder-util-runtime": "9.0.0", "fs-extra": "^10.0.0", "js-yaml": "^4.1.0", - "lazy-val": "^1.0.4", + "lazy-val": "^1.0.5", "lodash.escaperegexp": "^4.1.2", "lodash.isequal": "^4.5.0", "semver": "^7.3.5" @@ -15357,6 +15492,14 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "engines": { + "node": ">=6" + } + }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", @@ -15908,9 +16051,9 @@ "dev": true }, "node_modules/extsprintf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz", - "integrity": "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", "dev": true, "engines": [ "node >=0.6.0" @@ -16345,6 +16488,78 @@ "node": ">=0.10.3" } }, + "node_modules/fontello-batch-cli": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fontello-batch-cli/-/fontello-batch-cli-4.0.0.tgz", + "integrity": "sha512-8LHFhHFNKpEkvT06YtiKPVJyUH+/I+qlOtXUgD1J/f+nXrjZNWUb0I9P13Nv81X64e8eXV43DuOfU8UXXNoiBQ==", + "dependencies": { + "argparse": "^1.0.10", + "lodash": "^4.17.15", + "needle": "^2.4.0", + "open": "^6.4.0", + "svgpath": "^2.2.2", + "unzip": "^0.1.11", + "xmldom": "^0.1.27" + }, + "bin": { + "fontello-batch-cli": "fontello-batch-cli.js" + } + }, + "node_modules/fontello-batch-cli/node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fontello-batch-cli/node_modules/xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", + "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", + "engines": { + "node": ">=0.1" + } + }, + "node_modules/fontello-cli": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/fontello-cli/-/fontello-cli-0.6.2.tgz", + "integrity": "sha512-/85DkJNgbGOu0sh7sUAxWLbzq0cytWQtvn7WuRzpn6mcla6TEQz1JbYmpkAjX/PJiW867ujgoaFqm4CUoBBgwA==", + "dependencies": { + "colors": "^1.4.0", + "commander": "^3.0.0", + "mkdirp": "^1.0.4", + "needle": "^2.4.0", + "open": "^7.0.0", + "unzipper": "^0.10.5" + }, + "bin": { + "fontello-cli": "bin/fontello-cli" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fontello-cli/node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" + }, + "node_modules/fontello-cli/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -16714,6 +16929,31 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/fstream": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", + "integrity": "sha1-czfwWPu7vvqMn1YaKMqwhJICyYg=", + "dependencies": { + "graceful-fs": "~3.0.2", + "inherits": "~2.0.0", + "mkdirp": "0.5", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dependencies": { + "natives": "^1.1.3" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -17680,9 +17920,9 @@ } }, "node_modules/hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -17966,96 +18206,22 @@ } }, "node_modules/iconv-corefoundation": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.6.tgz", - "integrity": "sha512-1NBe55C75bKGZaY9UHxvXG3G0gEp0ziht7quhuFrW3SPgZDw9HI6qvYXRSV5M/Eupyu8ljuJ6Cba+ec15PZ4Xw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", "dev": true, "optional": true, "os": [ "darwin" ], "dependencies": { - "cli-truncate": "^1.1.0", + "cli-truncate": "^2.1.0", "node-addon-api": "^1.6.3" }, "engines": { "node": "^8.11.2 || >=10" } }, - "node_modules/iconv-corefoundation/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/iconv-corefoundation/node_modules/cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", - "dev": true, - "optional": true, - "dependencies": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/iconv-corefoundation/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/iconv-corefoundation/node_modules/slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "optional": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/iconv-corefoundation/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "optional": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/iconv-corefoundation/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "optional": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -18768,7 +18934,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, "bin": { "is-docker": "cli.js" }, @@ -19202,7 +19367,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true, "engines": { "node": ">=4" } @@ -21793,6 +21957,11 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" + }, "node_modules/load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -21887,8 +22056,7 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -22279,6 +22447,36 @@ "react": ">= 0.14.0" } }, + "node_modules/match-stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", + "integrity": "sha1-mesFAJOzTf+t5CG5rAtBCpz6F88=", + "dependencies": { + "buffers": "~0.1.1", + "readable-stream": "~1.0.0" + } + }, + "node_modules/match-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/match-stream/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/match-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -23196,12 +23394,53 @@ "querystring": "^0.2.0" } }, + "node_modules/natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "deprecated": "This module relies on Node.js's internals and will break at some point. Do not use it, and update to graceful-fs@4.x." + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -23960,7 +24199,6 @@ "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -23976,7 +24214,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -24060,6 +24297,14 @@ "node": ">=4" } }, + "node_modules/over": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", + "integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg=", + "engines": { + "node": "*" + } + }, "node_modules/overlayscrollbars": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz", @@ -24796,15 +25041,13 @@ } }, "node_modules/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", + "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", "dev": true, - "optional": true, "dependencies": { "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7", - "xmldom": "^0.5.0" + "xmlbuilder": "^9.0.7" }, "engines": { "node": ">=6" @@ -24815,7 +25058,6 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "dev": true, - "optional": true, "engines": { "node": ">=4.0" } @@ -25241,6 +25483,17 @@ "node": ">=4" } }, + "node_modules/pretty-bytes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz", + "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg==", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-error": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", @@ -25504,6 +25757,38 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, + "node_modules/pullstream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", + "integrity": "sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ=", + "dependencies": { + "over": ">= 0.0.5 < 1", + "readable-stream": "~1.0.31", + "setimmediate": ">= 1.0.2 < 2", + "slice-stream": ">= 1.0.0 < 2" + } + }, + "node_modules/pullstream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/pullstream/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/pullstream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -27279,7 +27564,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -27366,8 +27650,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sanitize-filename": { "version": "1.6.3", @@ -27855,8 +28138,7 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "node_modules/setprototypeof": { "version": "1.1.1", @@ -28031,6 +28313,35 @@ "node": ">=8" } }, + "node_modules/slice-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", + "integrity": "sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA=", + "dependencies": { + "readable-stream": "~1.0.31" + } + }, + "node_modules/slice-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/slice-stream/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/slice-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, "node_modules/smart-buffer": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", @@ -28414,8 +28725,7 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "node_modules/squeak": { "version": "1.3.0", @@ -29006,6 +29316,11 @@ "domelementtype": "1" } }, + "node_modules/svgpath": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.5.0.tgz", + "integrity": "sha512-o/vohwqjUO9nDAh4rcjE3KaW/v//At8UJu2LJMybXidf5QLQLVA4bxH0//4YCsr+1H4Gw1Wi/Jc62ynzSBYidw==" + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -29497,9 +29812,9 @@ } }, "node_modules/tmp-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.2.tgz", - "integrity": "sha512-OyCLAKU1HzBjL6Ev3gxUeraJNlbNingmi8IrHHEsYH8LTmEuhvYfqvhn2F/je+mjf4N58UmZ96OMEy1JanSCpA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", "dev": true, "dependencies": { "tmp": "^0.2.0" @@ -29650,6 +29965,14 @@ "node": ">=8" } }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "engines": { + "node": "*" + } + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -29907,10 +30230,9 @@ } }, "node_modules/typescript": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", - "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", - "dev": true, + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -30186,6 +30508,19 @@ "node": ">=8" } }, + "node_modules/unzip": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz", + "integrity": "sha1-iXScY7BY19kNYZ+GuYqhU107l/A=", + "dependencies": { + "binary": ">= 0.3.0 < 1", + "fstream": ">= 0.1.30 < 1", + "match-stream": ">= 0.0.2 < 1", + "pullstream": ">= 0.4.1 < 1", + "readable-stream": "~1.0.31", + "setimmediate": ">= 1.0.1 < 2" + } + }, "node_modules/unzip-crx-3": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", @@ -30196,6 +30531,63 @@ "yaku": "^0.16.6" } }, + "node_modules/unzip/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/unzip/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/unzip/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "node_modules/unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/unzipper/node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" + }, + "node_modules/unzipper/node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -30624,18 +31016,18 @@ } }, "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", "dev": true, - "engines": [ - "node >=0.6.0" - ], "optional": true, "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/vm-browserify": { @@ -31934,11 +32326,10 @@ "dev": true }, "node_modules/xmldom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", - "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==", - "dev": true, - "optional": true, + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.3.0.tgz", + "integrity": "sha512-z9s6k3wxE+aZHgXYxSTpGDo7BYOUfJsIRyoZiX6HTjwpwfS2wpQBQKa2fD+ShLyPkqDYo5ud7KitmLZ2Cd6r0g==", + "deprecated": "Deprecated due to CVE-2021-21366 resolved in 0.5.0", "engines": { "node": ">=10.0.0" } @@ -34276,6 +34667,23 @@ "tmp-promise": "^3.0.2" } }, + "@mattermost/compass-icons": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@mattermost/compass-icons/-/compass-icons-0.1.21.tgz", + "integrity": "sha512-Vo+BSGJaV6AB+/naa26+uilVG46LYOnNM3LAky4uu9ZsZ67aXVPCrJjf2FMYpmHhBq8XJ/Q9pcudQwuDloY1rA==", + "requires": { + "esm": "^3.2.25", + "fontello-batch-cli": "^4.0.0", + "fontello-cli": "^0.6.2", + "lodash": "^4.17.21", + "needle": "^2.6.0", + "open": "^7.4.2", + "svgpath": "^2.3.1", + "typescript": "^4.4.4", + "unzip": "^0.1.11", + "xmldom": "^0.3.0" + } + }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -36465,9 +36873,9 @@ "dev": true }, "@types/fs-extra": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz", - "integrity": "sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw==", + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, "requires": { "@types/node": "*" @@ -37660,15 +38068,15 @@ } }, "app-builder-bin": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.13.tgz", - "integrity": "sha512-ighVe9G+bT1ENGdp9ecO1P+94vv/f+FUwaI+XkNzeg9bYF8Oi3BQ+mJuxS00UgyHs8luuOzjzC+qnAtdb43Mpg==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.7.1.tgz", + "integrity": "sha512-ql93vEUq6WsstGXD+SBLSIQw6SNnhbDEM0swzgugytMxLp3rT24Ag/jcC80ZHxiPRTdew1niuR7P3/FCrDqIjw==", "dev": true }, "app-builder-lib": { - "version": "22.11.7", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.11.7.tgz", - "integrity": "sha512-pS9/cR4/TnNZVAHZECiSvvwTBzbwblj7KBBZkMKDG57nibq0I1XY8zAaYeHFdlYTyrRcz9JUXbAqJKezya7UFQ==", + "version": "22.14.5", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.14.5.tgz", + "integrity": "sha512-k3VwKP4kpsnUaXoUkm1s4zaSHPHIMFnN4kPMU9yXaKmE1LfHHqBaEah5bXeTAX5V/BC41wFdg8CF5vOjvgy8Rg==", "dev": true, "requires": { "@develar/schema-utils": "~2.6.5", @@ -37677,12 +38085,14 @@ "7zip-bin": "~5.1.1", "async-exit-hook": "^2.0.1", "bluebird-lst": "^1.0.9", - "builder-util": "22.11.7", - "builder-util-runtime": "8.7.7", + "builder-util": "22.14.5", + "builder-util-runtime": "8.9.1", "chromium-pickle-js": "^0.2.0", "debug": "^4.3.2", "ejs": "^3.1.6", - "electron-publish": "22.11.7", + "electron-osx-sign": "^0.5.0", + "electron-publish": "22.14.5", + "form-data": "^4.0.0", "fs-extra": "^10.0.0", "hosted-git-info": "^4.0.2", "is-ci": "^3.0.0", @@ -37709,9 +38119,9 @@ "dev": true }, "builder-util-runtime": { - "version": "8.7.7", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.7.tgz", - "integrity": "sha512-RUfoXzVrmFFI0K/Oft0CtP1LpTIOlBeLJatt5DePTI0KlxE156am4SGUpqtbbdqZNm++LkV9mX4olBDcXyGPow==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz", + "integrity": "sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==", "dev": true, "requires": { "debug": "^4.3.2", @@ -37719,20 +38129,31 @@ } }, "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", "dev": true }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" } }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "fs-extra": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", @@ -37745,12 +38166,12 @@ } }, "is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, "requires": { - "ci-info": "^3.1.1" + "ci-info": "^3.2.0" } }, "js-yaml": { @@ -37861,7 +38282,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -37978,9 +38398,9 @@ "dev": true }, "asar": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/asar/-/asar-3.0.3.tgz", - "integrity": "sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-3.1.0.tgz", + "integrity": "sha512-vyxPxP5arcAqN4F/ebHd/HhwnAiZtwhglvdmc7BR2f0ywbVNTOpSeyhLDbGXtE/y58hv1oC75TaNIXutnsOZsQ==", "dev": true, "requires": { "@types/glob": "^7.1.1", @@ -38682,6 +39102,11 @@ "open": "^7.0.3" } }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -38991,6 +39416,15 @@ } } }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -39379,7 +39813,6 @@ "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, - "optional": true, "requires": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -39389,8 +39822,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true, - "optional": true + "dev": true }, "buffer-crc32": { "version": "0.2.13", @@ -39408,8 +39840,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true, - "optional": true + "dev": true }, "buffer-from": { "version": "1.1.1", @@ -39423,25 +39854,36 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" + }, "builder-util": { - "version": "22.11.7", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.11.7.tgz", - "integrity": "sha512-ihqUe5ey82LM9qqQe0/oIcaSm9w+B9UjcsWJZxJliTBsbU+sErOpDFpHW+sim0veiTF/EIcGUh9HoduWw+l9FA==", + "version": "22.14.5", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.14.5.tgz", + "integrity": "sha512-zqIHDFJwmA7jV7SC9aI+33MWwT2mWoijH+Ol9IntNAwuuRXoS+7XeJwnhLBXOhcDBzXT4kDzHnRk4JKeaygEYA==", "dev": true, "requires": { - "@types/debug": "^4.1.5", + "@types/debug": "^4.1.6", "@types/fs-extra": "^9.0.11", "7zip-bin": "~5.1.1", - "app-builder-bin": "3.5.13", + "app-builder-bin": "3.7.1", "bluebird-lst": "^1.0.9", - "builder-util-runtime": "8.7.7", + "builder-util-runtime": "8.9.1", "chalk": "^4.1.1", + "cross-spawn": "^7.0.3", "debug": "^4.3.2", "fs-extra": "^10.0.0", "is-ci": "^3.0.0", @@ -39464,9 +39906,9 @@ "dev": true }, "builder-util-runtime": { - "version": "8.7.7", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.7.tgz", - "integrity": "sha512-RUfoXzVrmFFI0K/Oft0CtP1LpTIOlBeLJatt5DePTI0KlxE156am4SGUpqtbbdqZNm++LkV9mX4olBDcXyGPow==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz", + "integrity": "sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==", "dev": true, "requires": { "debug": "^4.3.2", @@ -39484,15 +39926,26 @@ } }, "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", "dev": true }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -39516,12 +39969,12 @@ "dev": true }, "is-ci": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", - "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", "dev": true, "requires": { - "ci-info": "^3.1.1" + "ci-info": "^3.2.0" } }, "js-yaml": { @@ -39543,6 +39996,27 @@ "universalify": "^2.0.0" } }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -39557,22 +40031,31 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, "builder-util-runtime": { - "version": "8.7.5", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.5.tgz", - "integrity": "sha512-fgUFHKtMNjdvH6PDRFntdIGUPgwZ69sXsAqEulCtoiqgWes5agrMq/Ud274zjJRTbckYh2PHh8/1CpFc6dpsbQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.0.0.tgz", + "integrity": "sha512-SkpEtSmTkREDHRJnxKEv43aAYp8sYWY8fxYBhGLBLOBIRXeaIp6Kv3lBgSD7uR8jQtC7CA659sqJrpSV6zNvSA==", "requires": { "debug": "^4.3.2", "sax": "^1.2.4" }, "dependencies": { "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } @@ -39907,6 +40390,14 @@ "type-detect": "^4.0.5" } }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -40275,9 +40766,7 @@ "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" }, "combined-stream": { "version": "1.0.8", @@ -40306,6 +40795,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA=", + "dev": true + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -41916,14 +42411,14 @@ } }, "dmg-builder": { - "version": "22.11.7", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.11.7.tgz", - "integrity": "sha512-+I+XfP2DODHB6PwFANgpH/WMzzCA5r5XoMvbFCIYjQjJpXlO0XnqQaamzFl2vh/Wz/Qt0d0lJMgRy8gKR3MGdQ==", + "version": "22.14.5", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.14.5.tgz", + "integrity": "sha512-1GvFGQE332bvPamcMwZDqWqfWfJTyyDLOsHMcGi0zs+Jh7JOn6/zuBkHJIWHdsj2QJbhzLVyd2/ZqttOKv7I8w==", "dev": true, "requires": { - "app-builder-lib": "22.11.7", - "builder-util": "22.11.7", - "builder-util-runtime": "8.7.6", + "app-builder-lib": "22.14.5", + "builder-util": "22.14.5", + "builder-util-runtime": "8.9.1", "dmg-license": "^1.0.9", "fs-extra": "^10.0.0", "iconv-lite": "^0.6.2", @@ -41937,9 +42432,9 @@ "dev": true }, "builder-util-runtime": { - "version": "8.7.6", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.6.tgz", - "integrity": "sha512-rj9AIY7CzLSuTOXpToiaQkruYh6UEQ+kYnd5UET22ch8MGClEtIZKXHG14qEiXEr2x4EOKDMxkcTa+9TYaE+ug==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz", + "integrity": "sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==", "dev": true, "requires": { "debug": "^4.3.2", @@ -41947,9 +42442,9 @@ } }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -41994,79 +42489,20 @@ } }, "dmg-license": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.9.tgz", - "integrity": "sha512-Rq6qMDaDou2+aPN2SYy0x7LDznoJ/XaG6oDcH5wXUp+WRWQMUYE6eM+F+nex+/LSXOp1uw4HLFoed0YbfU8R/Q==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.10.tgz", + "integrity": "sha512-SVeeyiOeinV5JCPHXMdKOgK1YVbak/4+8WL2rBnfqRYpA5FaeFaQnQWb25x628am1w70CbipGDv9S51biph63A==", "dev": true, "optional": true, "requires": { "@types/plist": "^3.0.1", "@types/verror": "^1.10.3", "ajv": "^6.10.0", - "cli-truncate": "^1.1.0", "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.6", - "plist": "^3.0.1", + "iconv-corefoundation": "^1.1.7", + "plist": "^3.0.4", "smart-buffer": "^4.0.2", "verror": "^1.10.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "optional": true - }, - "cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", - "dev": true, - "optional": true, - "requires": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "optional": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "optional": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "optional": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, "dns-equal": { @@ -42399,6 +42835,14 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "^2.0.2" + } + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -42444,17 +42888,17 @@ } }, "electron-builder": { - "version": "22.11.7", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.11.7.tgz", - "integrity": "sha512-yQExSLt7Hbz/P8lLkZDdE/OnJJ7NCX+uiQcV+XIH0TeEZcD87ZnSqBBzGUN5akySU4BXXlrVZKeUsXACWrm5Kw==", + "version": "22.14.5", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.14.5.tgz", + "integrity": "sha512-N73hSbXFz6Mz5Z6h6C5ly6CB+dUN6k1LuCDJjI8VF47bMXv/QE0HE+Kkb0GPKqTqM7Hsk/yIYX+kHCfSkR5FGg==", "dev": true, "requires": { - "@types/yargs": "^16.0.2", - "app-builder-lib": "22.11.7", - "builder-util": "22.11.7", - "builder-util-runtime": "8.7.7", + "@types/yargs": "^17.0.1", + "app-builder-lib": "22.14.5", + "builder-util": "22.14.5", + "builder-util-runtime": "8.9.1", "chalk": "^4.1.1", - "dmg-builder": "22.11.7", + "dmg-builder": "22.14.5", "fs-extra": "^10.0.0", "is-ci": "^3.0.0", "lazy-val": "^1.0.5", @@ -42463,10 +42907,19 @@ "yargs": "^17.0.1" }, "dependencies": { + "@types/yargs": { + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.8.tgz", + "integrity": "sha512-wDeUwiUmem9FzsyysEwRukaEdDNcwbROvQ9QGRKaLI6t+IltNzbn4/i4asmB10auvZGQCzSQ6t0GSczEThlUXw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, "builder-util-runtime": { - "version": "8.7.7", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.7.tgz", - "integrity": "sha512-RUfoXzVrmFFI0K/Oft0CtP1LpTIOlBeLJatt5DePTI0KlxE156am4SGUpqtbbdqZNm++LkV9mX4olBDcXyGPow==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz", + "integrity": "sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==", "dev": true, "requires": { "debug": "^4.3.2", @@ -42501,9 +42954,9 @@ } }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -42977,15 +43430,55 @@ "fs-extra": "^9.0.1" } }, + "electron-osx-sign": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz", + "integrity": "sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "compare-version": "^0.1.2", + "debug": "^2.6.8", + "isbinaryfile": "^3.0.2", + "minimist": "^1.2.0", + "plist": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "electron-publish": { - "version": "22.11.7", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.11.7.tgz", - "integrity": "sha512-A4EhRRNBVz4SPzUlBrPO6BmuyDeI0pyprggPAV9rQ+SDVSnSB/WKPot9JwWMyArkGj3AUUTMNVT6hwZhMvhfqw==", + "version": "22.14.5", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.14.5.tgz", + "integrity": "sha512-h+NANRdaA0PqGF15GKvorseWPzh1PXa/zx4I37//PIokW8eKIov8ky23foUSb55ZFWUHGpxQJux7y2NCfBtQeg==", "dev": true, "requires": { "@types/fs-extra": "^9.0.11", - "builder-util": "22.11.7", - "builder-util-runtime": "8.7.7", + "builder-util": "22.14.5", + "builder-util-runtime": "8.9.1", "chalk": "^4.1.1", "fs-extra": "^10.0.0", "lazy-val": "^1.0.5", @@ -42993,9 +43486,9 @@ }, "dependencies": { "builder-util-runtime": { - "version": "8.7.7", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.7.7.tgz", - "integrity": "sha512-RUfoXzVrmFFI0K/Oft0CtP1LpTIOlBeLJatt5DePTI0KlxE156am4SGUpqtbbdqZNm++LkV9mX4olBDcXyGPow==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.1.tgz", + "integrity": "sha512-c8a8J3wK6BIVLW7ls+7TRK9igspTbzWmUqxFbgK0m40Ggm6efUbxtWVCGIjc+dtchyr5qAMAUL6iEGRdS/6vwg==", "dev": true, "requires": { "debug": "^4.3.2", @@ -43013,9 +43506,9 @@ } }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -43049,9 +43542,9 @@ } }, "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, "supports-color": { @@ -43078,15 +43571,15 @@ "devOptional": true }, "electron-updater": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-4.3.9.tgz", - "integrity": "sha512-LCNfedSwZfS4Hza+pDyPR05LqHtGorCStaBgVpRnfKxOlZcvpYEX0AbMeH5XUtbtGRoH2V8osbbf2qKPNb7AsA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.0.0.tgz", + "integrity": "sha512-SC3sw92ewjrJFZIJamVOHqxW3yzFin/Q/Swf2FZodqm9xd4s8hCbPCfptpD/xBIcvQmAv2BAggbprwWq/fyp6w==", "requires": { - "@types/semver": "^7.3.5", - "builder-util-runtime": "8.7.5", + "@types/semver": "^7.3.6", + "builder-util-runtime": "9.0.0", "fs-extra": "^10.0.0", "js-yaml": "^4.1.0", - "lazy-val": "^1.0.4", + "lazy-val": "^1.0.5", "lodash.escaperegexp": "^4.1.2", "lodash.isequal": "^4.5.0", "semver": "^7.3.5" @@ -44010,6 +44503,11 @@ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" + }, "espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", @@ -44459,9 +44957,9 @@ } }, "extsprintf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz", - "integrity": "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", "dev": true, "optional": true }, @@ -44825,6 +45323,60 @@ "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" }, + "fontello-batch-cli": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fontello-batch-cli/-/fontello-batch-cli-4.0.0.tgz", + "integrity": "sha512-8LHFhHFNKpEkvT06YtiKPVJyUH+/I+qlOtXUgD1J/f+nXrjZNWUb0I9P13Nv81X64e8eXV43DuOfU8UXXNoiBQ==", + "requires": { + "argparse": "^1.0.10", + "lodash": "^4.17.15", + "needle": "^2.4.0", + "open": "^6.4.0", + "svgpath": "^2.2.2", + "unzip": "^0.1.11", + "xmldom": "^0.1.27" + }, + "dependencies": { + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" + } + } + }, + "fontello-cli": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/fontello-cli/-/fontello-cli-0.6.2.tgz", + "integrity": "sha512-/85DkJNgbGOu0sh7sUAxWLbzq0cytWQtvn7WuRzpn6mcla6TEQz1JbYmpkAjX/PJiW867ujgoaFqm4CUoBBgwA==", + "requires": { + "colors": "^1.4.0", + "commander": "^3.0.0", + "mkdirp": "^1.0.4", + "needle": "^2.4.0", + "open": "^7.0.0", + "unzipper": "^0.10.5" + }, + "dependencies": { + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -45108,6 +45660,27 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, + "fstream": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", + "integrity": "sha1-czfwWPu7vvqMn1YaKMqwhJICyYg=", + "requires": { + "graceful-fs": "~3.0.2", + "inherits": "~2.0.0", + "mkdirp": "0.5", + "rimraf": "2" + }, + "dependencies": { + "graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "requires": { + "natives": "^1.1.3" + } + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -45883,9 +46456,9 @@ } }, "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -46121,72 +46694,14 @@ "dev": true }, "iconv-corefoundation": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.6.tgz", - "integrity": "sha512-1NBe55C75bKGZaY9UHxvXG3G0gEp0ziht7quhuFrW3SPgZDw9HI6qvYXRSV5M/Eupyu8ljuJ6Cba+ec15PZ4Xw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", + "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", "dev": true, "optional": true, "requires": { - "cli-truncate": "^1.1.0", + "cli-truncate": "^2.1.0", "node-addon-api": "^1.6.3" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "optional": true - }, - "cli-truncate": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz", - "integrity": "sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA==", - "dev": true, - "optional": true, - "requires": { - "slice-ansi": "^1.0.0", - "string-width": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "optional": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "optional": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "optional": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } } }, "iconv-lite": { @@ -46762,8 +47277,7 @@ "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, "is-dom": { "version": "1.1.0", @@ -47079,8 +47593,7 @@ "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, "is-yarn-global": { "version": "0.3.0", @@ -49027,6 +49540,11 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" + }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -49101,8 +49619,7 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash.debounce": { "version": "4.0.8", @@ -49415,6 +49932,38 @@ "unquote": "^1.1.0" } }, + "match-stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", + "integrity": "sha1-mesFAJOzTf+t5CG5rAtBCpz6F88=", + "requires": { + "buffers": "~0.1.1", + "readable-stream": "~1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -50175,12 +50724,45 @@ "querystring": "^0.2.0" } }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -50792,7 +51374,6 @@ "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, "requires": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" @@ -50802,7 +51383,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, "requires": { "is-docker": "^2.0.0" } @@ -50869,6 +51449,11 @@ "arch": "^2.1.0" } }, + "over": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", + "integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg=" + }, "overlayscrollbars": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz", @@ -51426,23 +52011,20 @@ } }, "plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.4.tgz", + "integrity": "sha512-ksrr8y9+nXOxQB2osVNqrgvX/XQPOXaU4BQMKjYq8PvaY1U18mo+fKgBSwzK+luSyinOuPae956lSVcBwxlAMg==", "dev": true, - "optional": true, "requires": { "base64-js": "^1.5.1", - "xmlbuilder": "^9.0.7", - "xmldom": "^0.5.0" + "xmlbuilder": "^9.0.7" }, "dependencies": { "xmlbuilder": { "version": "9.0.7", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", - "dev": true, - "optional": true + "dev": true } } }, @@ -51783,6 +52365,11 @@ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "dev": true }, + "pretty-bytes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.0.0.tgz", + "integrity": "sha512-6UqkYefdogmzqAZWzJ7laYeJnaXDy2/J+ZqiiMtS7t7OfpXWTlaeGMwX8U6EFvPV/YWWEKRkS8hKS4k60WHTOg==" + }, "pretty-error": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", @@ -52004,6 +52591,40 @@ } } }, + "pullstream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", + "integrity": "sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ=", + "requires": { + "over": ">= 0.0.5 < 1", + "readable-stream": "~1.0.31", + "setimmediate": ">= 1.0.2 < 2", + "slice-stream": ">= 1.0.0 < 2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -53412,7 +54033,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -53494,8 +54114,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sanitize-filename": { "version": "1.6.3", @@ -53895,8 +54514,7 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" }, "setprototypeof": { "version": "1.1.1", @@ -54029,6 +54647,37 @@ "is-fullwidth-code-point": "^3.0.0" } }, + "slice-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", + "integrity": "sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA=", + "requires": { + "readable-stream": "~1.0.31" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "smart-buffer": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", @@ -54353,8 +55002,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "squeak": { "version": "1.3.0", @@ -54826,6 +55474,11 @@ } } }, + "svgpath": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.5.0.tgz", + "integrity": "sha512-o/vohwqjUO9nDAh4rcjE3KaW/v//At8UJu2LJMybXidf5QLQLVA4bxH0//4YCsr+1H4Gw1Wi/Jc62ynzSBYidw==" + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -55228,9 +55881,9 @@ } }, "tmp-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.2.tgz", - "integrity": "sha512-OyCLAKU1HzBjL6Ev3gxUeraJNlbNingmi8IrHHEsYH8LTmEuhvYfqvhn2F/je+mjf4N58UmZ96OMEy1JanSCpA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", "dev": true, "requires": { "tmp": "^0.2.0" @@ -55341,6 +55994,11 @@ "punycode": "^2.1.1" } }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" + }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -55543,10 +56201,9 @@ } }, "typescript": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", - "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", - "dev": true + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==" }, "ultron": { "version": "1.1.1", @@ -55758,6 +56415,42 @@ } } }, + "unzip": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz", + "integrity": "sha1-iXScY7BY19kNYZ+GuYqhU107l/A=", + "requires": { + "binary": ">= 0.3.0 < 1", + "fstream": ">= 0.1.30 < 1", + "match-stream": ">= 0.0.2 < 1", + "pullstream": ">= 0.4.1 < 1", + "readable-stream": "~1.0.31", + "setimmediate": ">= 1.0.1 < 2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, "unzip-crx-3": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", @@ -55768,6 +56461,41 @@ "yaku": "^0.16.6" } }, + "unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + }, + "dependencies": { + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + } + } + }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -56110,9 +56838,9 @@ "dev": true }, "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", + "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", "dev": true, "optional": true, "requires": { @@ -57218,11 +57946,9 @@ "dev": true }, "xmldom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", - "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==", - "dev": true, - "optional": true + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.3.0.tgz", + "integrity": "sha512-z9s6k3wxE+aZHgXYxSTpGDo7BYOUfJsIRyoZiX6HTjwpwfS2wpQBQKa2fD+ShLyPkqDYo5ud7KitmLZ2Cd6r0g==" }, "xtend": { "version": "4.0.2", diff --git a/package.json b/package.json index d5b06322..ba1652eb 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mattermost-desktop", "productName": "Mattermost", - "version": "5.0.0-develop", + "version": "5.1.0-develop.1", "description": "Mattermost", "main": "dist/index.js", "author": "Mattermost, Inc. ", @@ -16,7 +16,7 @@ "url": "git://github.com/mattermost/desktop.git" }, "config": { - "target": "13.2.0", + "target": "14.1.0", "arch": "x64", "target_arch": "x64", "disturl": "https://electronjs.org/headers", @@ -49,7 +49,7 @@ "package:all": "cross-env NODE_ENV=production npm-run-all check-build-config package:windows package:mac package:mac-universal package:linux", "package:windows": "cross-env NODE_ENV=production npm-run-all check-build-config build && electron-builder --win --x64 --ia32 --publish=never", "package:mac": "cross-env NODE_ENV=production npm-run-all check-build-config build && electron-builder --mac --x64 --arm64 --publish=never", - "package:mac-universal": "cross-env NODE_ENV=production npm-run-all check-build-config build && electron-builder --mac --universal --publish=never", + "package:mac-with-universal": "cross-env NODE_ENV=production npm-run-all check-build-config build && electron-builder --mac --x64 --arm64 --universal --publish=never", "package:linux": "cross-env NODE_ENV=production npm-run-all check-build-config build && electron-builder --linux --x64 --ia32 --publish=never", "lint:js": "eslint --ignore-path .gitignore --ignore-pattern node_modules --ext .js --ext .jsx --ext .ts --ext .tsx .", "lint:js-quiet": "eslint --ignore-path .gitignore --ignore-pattern node_modules --ext .js --ext .jsx --ext .ts --ext .tsx . --quiet", @@ -81,7 +81,8 @@ "**/src/**/*.test.js" ], "globals": { - "__HASH_VERSION__": "5.0.0" + "__HASH_VERSION__": "5.0.0", + "__CAN_UPGRADE__": false }, "setupFiles": [ "./src/jestSetup.js" @@ -134,7 +135,7 @@ "css-loader": "^1.0.1", "devtron": "^1.4.0", "electron": "14.1.0", - "electron-builder": "22.11.7", + "electron-builder": "^22.14.5", "electron-connect": "^0.6.3", "electron-mocha": "^10.1.0", "electron-notarize": "^1.1.0", @@ -173,6 +174,7 @@ }, "dependencies": { "@hapi/joi": "^16.1.8", + "@mattermost/compass-icons": "0.1.21", "auto-launch": "^5.0.5", "bootstrap": "^4.6.0", "bootstrap-dark": "^1.0.3", @@ -182,8 +184,9 @@ "electron-devtools-installer": "^3.2.0", "electron-is-dev": "^2.0.0", "electron-log": "^4.4.1", - "electron-updater": "4.3.9", + "electron-updater": "5.0.0", "font-awesome": "^4.7.0", + "pretty-bytes": "^6.0.0", "prop-types": "^15.6.2", "react": "^16.14.0", "react-beautiful-dnd": "^13.1.0", diff --git a/resources/windows/gpo/en-US/mattermost.adml b/resources/windows/gpo/en-US/mattermost.adml index cb347784..7659db89 100644 --- a/resources/windows/gpo/en-US/mattermost.adml +++ b/resources/windows/gpo/en-US/mattermost.adml @@ -6,10 +6,10 @@ Requires Mattermost Desktop 4.3 or later Mattermost - + EnableServerManagement If this policy is enabled, users can add or remove servers in their app settings, even if default servers are configured in DefaultServerList. diff --git a/resources/windows/gpo/mattermost.admx b/resources/windows/gpo/mattermost.admx index cd027126..5d693f03 100644 --- a/resources/windows/gpo/mattermost.admx +++ b/resources/windows/gpo/mattermost.admx @@ -13,8 +13,7 @@ - diff --git a/scripts/cp_artifacts.sh b/scripts/cp_artifacts.sh old mode 100644 new mode 100755 index 661405fc..7245750c --- a/scripts/cp_artifacts.sh +++ b/scripts/cp_artifacts.sh @@ -2,8 +2,8 @@ set -eu VERSION="$(jq -r '.version' -xRF_j#WCzTf+Op5GsD68bn&Qd~hC002lj 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
D@H@AH^$p-ppZI6VRYb28Hw@ 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 F{4cJ7*_HqR literal 0 HcmV?d00001 diff --git a/src/common/communication.ts b/src/common/communication.ts index bd0f9e69..01e0aa84 100644 --- a/src/common/communication.ts +++ b/src/common/communication.ts @@ -89,6 +89,14 @@ export const REQUEST_TEAMS_DROPDOWN_INFO = 'request-teams-dropdown-info'; export const RECEIVE_DROPDOWN_MENU_SIZE = 'receive-dropdown-menu-size'; export const SEND_DROPDOWN_MENU_SIZE = 'send-dropdown-menu-size'; +export const UPDATE_AVAILABLE = 'update_available'; +export const UPDATE_DOWNLOADED = 'update_downloaded'; +export const CANCEL_UPGRADE = 'cancel_upgrade'; +export const START_UPGRADE = 'start_upgrade'; +export const START_DOWNLOAD = 'start_download'; +export const CHECK_FOR_UPDATES = 'check_for_updates'; +export const UPDATE_PROGRESS = 'update_progress'; + export const BROWSER_HISTORY_BUTTON = 'browser-history-button'; export const BROWSER_HISTORY_PUSH = 'browser-history-push'; export const APP_LOGGED_IN = 'app-logged-in'; diff --git a/src/common/config/index.test.js b/src/common/config/index.test.js index 2a45ebb7..913777b1 100644 --- a/src/common/config/index.test.js +++ b/src/common/config/index.test.js @@ -9,6 +9,7 @@ jest.mock('electron', () => ({ app: { name: 'Mattermost', getPath: jest.fn(), + getAppPath: () => '/path/to/app', }, ipcMain: { on: jest.fn(), diff --git a/src/common/config/index.ts b/src/common/config/index.ts index 35aa400e..6dc71603 100644 --- a/src/common/config/index.ts +++ b/src/common/config/index.ts @@ -37,6 +37,28 @@ import migrateConfigItems from './migrationPreferences'; * Handles loading and merging all sources of configuration as well as saving user provided config */ +function checkWriteableApp() { + if (process.platform === 'win32') { + try { + fs.accessSync(path.join(path.dirname(app.getAppPath()), '../../'), fs.constants.W_OK); + } catch (error) { + log.info(`${app.getAppPath()}: ${error}`); + log.warn('autoupgrade disabled'); + return false; + } + + // eslint-disable-next-line no-undef + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return __CAN_UPGRADE__; // prevent showing the option if the path is not writeable, like in a managed environment. + } + + // temporarily disabling auto updater for macOS due to security issues + // eslint-disable-next-line no-undef + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return process.platform !== 'darwin' && __CAN_UPGRADE__; +} export class Config extends EventEmitter { configFilePath: string; @@ -48,12 +70,14 @@ export class Config extends EventEmitter { buildConfigData?: BuildConfig; localConfigData?: ConfigType; useNativeWindow: boolean; + canUpgradeValue?: boolean predefinedTeams: TeamWithTabs[]; constructor(configFilePath: string) { super(); this.configFilePath = configFilePath; + this.canUpgradeValue = checkWriteableApp(); this.registryConfig = new RegistryConfig(); this.predefinedTeams = []; if (buildConfig.defaultTeams) { @@ -282,6 +306,14 @@ export class Config extends EventEmitter { return this.combinedData?.alwaysMinimize; } + get canUpgrade() { + return this.canUpgradeValue && this.buildConfigData?.enableAutoUpdater && !(process.platform === 'win32' && this.registryConfigData?.enableAutoUpdater === false); + } + + get autoCheckForUpdates() { + return this.combinedData?.autoCheckForUpdates; + } + // initialization/processing methods /** @@ -525,6 +557,7 @@ export class Config extends EventEmitter { const config: Partial = {...this.localConfigData}; config.appName = app.name; config.enableServerManagement = this.combinedData?.enableServerManagement; + config.canUpgrade = this.canUpgrade; if (option) { return config[option]; } diff --git a/src/main/Validator.test.js b/src/main/Validator.test.js index 1d77b396..74f2ab21 100644 --- a/src/main/Validator.test.js +++ b/src/main/Validator.test.js @@ -125,6 +125,7 @@ describe('main/Validator', () => { describe('validateV3ConfigData', () => { const config = { + autoCheckForUpdates: true, autostart: true, hideOnStart: false, darkMode: false, diff --git a/src/main/Validator.ts b/src/main/Validator.ts index 7ffa8e19..7fbfd397 100644 --- a/src/main/Validator.ts +++ b/src/main/Validator.ts @@ -125,6 +125,7 @@ const configDataSchemaV3 = Joi.object({ darkMode: Joi.boolean().default(false), downloadLocation: Joi.string(), lastActiveTeam: Joi.number().integer().min(0).default(0), + autoCheckForUpdates: Joi.boolean().default(true), alwaysMinimize: Joi.boolean(), alwaysClose: Joi.boolean(), }); diff --git a/src/main/app/app.test.js b/src/main/app/app.test.js index 74cc02c4..634d1f5c 100644 --- a/src/main/app/app.test.js +++ b/src/main/app/app.test.js @@ -30,6 +30,7 @@ jest.mock('main/app/utils', () => ({ getDeeplinkingURL: jest.fn(), openDeepLink: jest.fn(), })); +jest.mock('main/autoUpdater', () => ({})); jest.mock('main/certificateStore', () => ({ isExplicitlyUntrusted: jest.fn(), diff --git a/src/main/app/app.ts b/src/main/app/app.ts index bcb5ed22..e75d1ba3 100644 --- a/src/main/app/app.ts +++ b/src/main/app/app.ts @@ -6,6 +6,7 @@ import log from 'electron-log'; import urlUtils from 'common/utils/url'; +import updateManager from 'main/autoUpdater'; import CertificateStore from 'main/certificateStore'; import {destroyTray} from 'main/tray/tray'; import WindowManager from 'main/windows/windowManager'; @@ -59,6 +60,7 @@ export function handleAppBeforeQuit() { // Make sure tray icon gets removed if the user exits via CTRL-Q destroyTray(); global.willAppQuit = true; + updateManager.handleOnQuit(); } export async function handleAppCertificateError(event: Event, webContents: WebContents, url: string, error: string, certificate: Certificate, callback: (isTrusted: boolean) => void) { diff --git a/src/main/app/config.test.js b/src/main/app/config.test.js index 7764af46..48167f4f 100644 --- a/src/main/app/config.test.js +++ b/src/main/app/config.test.js @@ -13,6 +13,7 @@ import AutoLauncher from 'main/AutoLauncher'; jest.mock('electron', () => ({ app: { + getAppPath: () => '/path/to/app', isReady: jest.fn(), setPath: jest.fn(), }, diff --git a/src/main/app/index.ts b/src/main/app/index.ts index 48aceeb8..62e7335d 100644 --- a/src/main/app/index.ts +++ b/src/main/app/index.ts @@ -12,6 +12,6 @@ if (process.env.NODE_ENV !== 'production' && module.hot) { // attempt to initialize the application try { initialize(); -} catch (error) { +} catch (error: any) { throw new Error(`App initialization failed: ${error.toString()}`); } diff --git a/src/main/app/initialize.test.js b/src/main/app/initialize.test.js index 3658442f..36118235 100644 --- a/src/main/app/initialize.test.js +++ b/src/main/app/initialize.test.js @@ -113,6 +113,7 @@ jest.mock('main/authManager', () => ({})); jest.mock('main/AutoLauncher', () => ({ upgradeAutoLaunch: jest.fn(), })); +jest.mock('main/autoUpdater', () => ({})); jest.mock('main/badge', () => ({ setupBadge: jest.fn(), })); diff --git a/src/main/app/initialize.ts b/src/main/app/initialize.ts index 6b247f9e..d8ee09c6 100644 --- a/src/main/app/initialize.ts +++ b/src/main/app/initialize.ts @@ -31,6 +31,8 @@ import { UPDATE_LAST_ACTIVE, GET_AVAILABLE_SPELL_CHECKER_LANGUAGES, USER_ACTIVITY_UPDATE, + START_UPGRADE, + START_DOWNLOAD, } from 'common/communication'; import Config from 'common/config'; import urlUtils from 'common/utils/url'; @@ -39,6 +41,7 @@ import AllowProtocolDialog from 'main/allowProtocolDialog'; import AppVersionManager from 'main/AppVersionManager'; import AuthManager from 'main/authManager'; import AutoLauncher from 'main/AutoLauncher'; +import updateManager from 'main/autoUpdater'; import {setupBadge} from 'main/badge'; import CertificateManager from 'main/certificateManager'; import {updatePaths} from 'main/constants'; @@ -241,6 +244,8 @@ function initializeInterCommunicationEventListeners() { ipcMain.on(SHOW_SETTINGS_WINDOW, WindowManager.showSettingsWindow); ipcMain.handle(GET_AVAILABLE_SPELL_CHECKER_LANGUAGES, () => session.defaultSession.availableSpellCheckerLanguages); ipcMain.handle(GET_DOWNLOAD_LOCATION, handleSelectDownload); + ipcMain.on(START_DOWNLOAD, handleStartDownload); + ipcMain.on(START_UPGRADE, handleStartUpgrade); } function initializeAfterAppReady() { @@ -274,6 +279,25 @@ function initializeAfterAppReady() { } AppVersionManager.lastAppVersion = app.getVersion(); + if (typeof Config.canUpgrade === 'undefined') { + // windows might not be ready, so we have to wait until it is + Config.once('update', () => { + if (Config.canUpgrade && Config.autoCheckForUpdates) { + setTimeout(() => { + updateManager.checkForUpdates(false); + }, 5000); + } else { + log.info(`Autoupgrade disabled: ${Config.canUpgrade}`); + } + }); + } else if (Config.canUpgrade && Config.autoCheckForUpdates) { + setTimeout(() => { + updateManager.checkForUpdates(false); + }, 5000); + } else { + log.info(`Autoupgrade disabled: ${Config.canUpgrade}`); + } + if (!global.isDev) { AutoLauncher.upgradeAutoLaunch(); } @@ -378,3 +402,15 @@ function initializeAfterAppReady() { } } } + +function handleStartDownload() { + if (updateManager) { + updateManager.handleDownload(); + } +} + +function handleStartUpgrade() { + if (updateManager) { + updateManager.handleUpdate(); + } +} diff --git a/src/main/app/utils.test.js b/src/main/app/utils.test.js index 12b14846..e79fa781 100644 --- a/src/main/app/utils.test.js +++ b/src/main/app/utils.test.js @@ -21,6 +21,7 @@ jest.mock('common/utils/util', () => ({ getDisplayBoundaries: jest.fn(), })); +jest.mock('main/autoUpdater', () => ({})); jest.mock('main/menus/app', () => ({})); jest.mock('main/menus/tray', () => ({})); jest.mock('main/server/serverInfo', () => ({ diff --git a/src/main/app/utils.ts b/src/main/app/utils.ts index 9b5af2cf..e60a6858 100644 --- a/src/main/app/utils.ts +++ b/src/main/app/utils.ts @@ -14,6 +14,7 @@ import {TAB_FOCALBOARD, TAB_MESSAGING, TAB_PLAYBOOKS} from 'common/tabs/TabView' import urlUtils from 'common/utils/url'; import Utils from 'common/utils/util'; +import updateManager from 'main/autoUpdater'; import {createMenu as createAppMenu} from 'main/menus/app'; import {createMenu as createTrayMenu} from 'main/menus/tray'; import {ServerInfo} from 'main/server/serverInfo'; @@ -70,7 +71,7 @@ function openExtraTabs(data: Array, team: TeamW } export function handleUpdateMenuEvent() { - const aMenu = createAppMenu(Config); + const aMenu = createAppMenu(Config, updateManager); Menu.setApplicationMenu(aMenu); aMenu.addListener('menu-will-close', WindowManager.focusBrowserView); diff --git a/src/main/authManager.test.js b/src/main/authManager.test.js index 6fbd7fd5..4c346a44 100644 --- a/src/main/authManager.test.js +++ b/src/main/authManager.test.js @@ -6,6 +6,54 @@ import {AuthManager} from 'main/authManager'; import WindowManager from 'main/windows/windowManager'; import ModalManager from 'main/views/modalManager'; +jest.mock('common/config', () => ({ + teams: [{ + name: 'example', + url: 'http://example.com', + order: 0, + tabs: [ + { + name: 'TAB_MESSAGING', + order: 0, + isOpen: true, + }, + { + name: 'TAB_FOCALBOARD', + order: 1, + isOpen: true, + }, + { + name: 'TAB_PLAYBOOKS', + order: 2, + isOpen: true, + }, + ], + lastActiveTab: 0, + }, { + name: 'github', + url: 'https://github.com/', + order: 1, + tabs: [ + { + name: 'TAB_MESSAGING', + order: 0, + isOpen: true, + }, + { + name: 'TAB_FOCALBOARD', + order: 1, + isOpen: true, + }, + { + name: 'TAB_PLAYBOOKS', + order: 2, + isOpen: true, + }, + ], + lastActiveTab: 0, + }], +})); + jest.mock('common/utils/url', () => { const actualUrl = jest.requireActual('common/utils/url'); return { @@ -59,57 +107,9 @@ jest.mock('main/utils', () => ({ getLocalURLString: (file) => file, })); -const config = { - teams: [{ - name: 'example', - url: 'http://example.com', - order: 0, - tabs: [ - { - name: 'TAB_MESSAGING', - order: 0, - isOpen: true, - }, - { - name: 'TAB_FOCALBOARD', - order: 1, - isOpen: true, - }, - { - name: 'TAB_PLAYBOOKS', - order: 2, - isOpen: true, - }, - ], - lastActiveTab: 0, - }, { - name: 'github', - url: 'https://github.com/', - order: 1, - tabs: [ - { - name: 'TAB_MESSAGING', - order: 0, - isOpen: true, - }, - { - name: 'TAB_FOCALBOARD', - order: 1, - isOpen: true, - }, - { - name: 'TAB_PLAYBOOKS', - order: 2, - isOpen: true, - }, - ], - lastActiveTab: 0, - }], -}; - describe('main/authManager', () => { describe('handleAppLogin', () => { - const authManager = new AuthManager(config); + const authManager = new AuthManager(); authManager.popLoginModal = jest.fn(); authManager.popPermissionModal = jest.fn(); @@ -157,7 +157,7 @@ describe('main/authManager', () => { }); describe('popLoginModal', () => { - const authManager = new AuthManager(config); + const authManager = new AuthManager(); it('should not pop modal when no main window exists', () => { WindowManager.getMainWindow.mockImplementationOnce(() => null); @@ -225,7 +225,7 @@ describe('main/authManager', () => { }); describe('popPermissionModal', () => { - const authManager = new AuthManager(config); + const authManager = new AuthManager(); it('should not pop modal when no main window exists', () => { WindowManager.getMainWindow.mockImplementationOnce(() => null); @@ -270,7 +270,7 @@ describe('main/authManager', () => { }); describe('handleLoginCredentialsEvent', () => { - const authManager = new AuthManager(config); + const authManager = new AuthManager(); const callback = jest.fn(); beforeEach(() => { diff --git a/src/main/autoUpdater.test.js b/src/main/autoUpdater.test.js new file mode 100644 index 00000000..1c908aec --- /dev/null +++ b/src/main/autoUpdater.test.js @@ -0,0 +1,177 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {ipcMain} from 'electron'; +import {autoUpdater} from 'electron-updater'; + +import {CHECK_FOR_UPDATES} from 'common/communication'; + +import {UpdateManager} from './autoUpdater'; +import {displayRestartToUpgrade, displayUpgrade} from './notifications'; + +jest.mock('electron', () => ({ + app: { + getAppPath: () => '/path/to/app', + }, + nativeImage: { + createFromPath: jest.fn(), + }, + ipcMain: { + on: jest.fn(), + emit: jest.fn(), + }, +})); + +jest.mock('electron-log', () => ({ + error: jest.fn(), + info: jest.fn(), + transports: { + file: { + level: '', + }, + }, +})); +jest.mock('electron-updater', () => ({ + autoUpdater: { + on: jest.fn(), + once: jest.fn(), + removeListener: jest.fn(), + quitAndInstall: jest.fn(), + downloadUpdate: jest.fn(), + checkForUpdates: jest.fn(), + }, +})); + +jest.mock('common/config', () => ({ + canUpgrade: true, +})); + +jest.mock('main/notifications', () => ({ + displayUpgrade: jest.fn(), + displayRestartToUpgrade: jest.fn(), +})); +jest.mock('main/windows/windowManager', () => ({ + sendToRenderer: jest.fn(), +})); + +describe('main/autoUpdater', () => { + describe('constructor', () => { + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should notify user on update-available', () => { + let cb; + autoUpdater.on.mockImplementation((event, callback) => { + if (event === 'update-available') { + cb = callback; + } + }); + + const updateManager = new UpdateManager(); + updateManager.notify = jest.fn(); + cb({version: '5.1.0'}); + + expect(updateManager.versionAvailable).toBe('5.1.0'); + expect(updateManager.notify).toHaveBeenCalled(); + }); + + it('should notify user on update-downloaded', () => { + let cb; + autoUpdater.on.mockImplementation((event, callback) => { + if (event === 'update-downloaded') { + cb = callback; + } + }); + + const updateManager = new UpdateManager(); + updateManager.notifyDownloaded = jest.fn(); + cb({version: '5.1.0'}); + + expect(updateManager.versionDownloaded).toBe('5.1.0'); + expect(updateManager.notifyDownloaded).toHaveBeenCalled(); + }); + + it('should check for updates when emitted', () => { + let cb; + ipcMain.on.mockImplementation((event, callback) => { + if (event === CHECK_FOR_UPDATES) { + cb = callback; + } + }); + + const updateManager = new UpdateManager(); + updateManager.checkForUpdates = jest.fn(); + cb(); + + expect(updateManager.checkForUpdates).toHaveBeenCalledWith(true); + }); + }); + + describe('notify', () => { + beforeEach(() => { + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.runAllTimers(); + }); + + it('should add a new timeout', () => { + const updateManager = new UpdateManager(); + updateManager.notify(); + updateManager.notify = jest.fn(); + jest.runAllTimers(); + expect(updateManager.notify).toBeCalled(); + }); + + it('should display upgrade notification', () => { + const updateManager = new UpdateManager(); + updateManager.versionAvailable = '5.1.0'; + updateManager.notify(); + updateManager.notify = jest.fn(); + expect(displayUpgrade).toHaveBeenCalledWith('5.1.0', expect.any(Function)); + }); + + it('should display downloaded upgrade notification', () => { + const updateManager = new UpdateManager(); + updateManager.versionDownloaded = '5.1.0'; + updateManager.notify(); + updateManager.notify = jest.fn(); + expect(displayRestartToUpgrade).toHaveBeenCalledWith('5.1.0', expect.any(Function)); + }); + }); + + describe('checkForUpdates', () => { + beforeEach(() => { + autoUpdater.checkForUpdates.mockReturnValue(Promise.resolve()); + jest.useFakeTimers(); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should show dialog if update is not available', () => { + autoUpdater.once.mockImplementation((event, callback) => { + if (event === 'update-not-available') { + callback(); + } + }); + + const updateManager = new UpdateManager(); + updateManager.displayNoUpgrade = jest.fn(); + updateManager.checkForUpdates(true); + updateManager.checkForUpdates = jest.fn(); + expect(updateManager.displayNoUpgrade).toHaveBeenCalled(); + }); + + it('should check again at the next interval', () => { + const updateManager = new UpdateManager(); + updateManager.checkForUpdates(); + updateManager.checkForUpdates = jest.fn(); + jest.runAllTimers(); + expect(updateManager.checkForUpdates).toBeCalled(); + }); + }); +}); diff --git a/src/main/autoUpdater.ts b/src/main/autoUpdater.ts new file mode 100644 index 00000000..9bf2cd50 --- /dev/null +++ b/src/main/autoUpdater.ts @@ -0,0 +1,182 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import path from 'path'; + +import {dialog, ipcMain, app, nativeImage} from 'electron'; +import log from 'electron-log'; + +import {autoUpdater, ProgressInfo, UpdateInfo} from 'electron-updater'; + +import {displayUpgrade, displayRestartToUpgrade} from 'main/notifications'; + +import {CANCEL_UPGRADE, UPDATE_AVAILABLE, UPDATE_DOWNLOADED, CHECK_FOR_UPDATES, UPDATE_SHORTCUT_MENU, UPDATE_PROGRESS} from 'common/communication'; +import Config from 'common/config'; + +import WindowManager from './windows/windowManager'; + +const NEXT_NOTIFY = 86400000; // 24 hours +const NEXT_CHECK = 3600000; // 1 hour + +log.transports.file.level = 'info'; +autoUpdater.logger = log; +autoUpdater.autoDownload = false; +autoUpdater.disableWebInstaller = true; + +const assetsDir = path.resolve(app.getAppPath(), 'assets'); +const appIconURL = path.resolve(assetsDir, 'appicon_with_spacing_32.png'); +const appIcon = nativeImage.createFromPath(appIconURL); + +/** to test this during development + * add the following to electron-builder.json in the publish entry + { + "provider": "generic", + "url": "http://localhost:8000" + }, + * create a packaged build, copy that to a directory B (I usually do a third C copy to be able to go back without packaging again) + * upgrade the package.json version + * package a second copy of the app + * on release dir setup an http server (using `python -m SimpleHTTPServer` should match the above entry) + * start the app from directory B + * if the app upgraded and you want to repeat, simply copy C into B if you did the C step, if not, package again. + * yeah, it is a time consuming process :( improve this doc if you find a way to go faster. +**/ + +export class UpdateManager { + lastNotification?: NodeJS.Timeout; + lastCheck?: NodeJS.Timeout; + versionAvailable?: string; + versionDownloaded?: string; + + constructor() { + autoUpdater.on('error', (err: Error) => { + log.error(`[Mattermost] There was an error while trying to update: ${err}`); + }); + + autoUpdater.on('update-available', (info: UpdateInfo) => { + autoUpdater.removeListener('update-not-available', this.displayNoUpgrade); + this.versionAvailable = info.version; + ipcMain.emit(UPDATE_SHORTCUT_MENU); + log.info(`[Mattermost] available version ${info.version}`); + this.notify(); + }); + + autoUpdater.on('update-downloaded', (info: UpdateInfo) => { + this.versionDownloaded = info.version; + ipcMain.emit(UPDATE_SHORTCUT_MENU); + log.info(`[Mattermost] downloaded version ${info.version}`); + this.notifyDownloaded(); + }); + + autoUpdater.on('download-progress', (progress: ProgressInfo) => { + WindowManager.sendToRenderer(UPDATE_PROGRESS, progress.total, progress.delta, progress.transferred, progress.percent, progress.bytesPerSecond); + }); + + ipcMain.on(CANCEL_UPGRADE, () => { + log.info('[Mattermost] User Canceled upgrade'); + }); + + ipcMain.on(CHECK_FOR_UPDATES, () => { + this.checkForUpdates(true); + }); + } + + notify = (): void => { + if (this.lastNotification) { + clearTimeout(this.lastNotification); + } + this.lastNotification = setTimeout(this.notify, NEXT_NOTIFY); + if (this.versionDownloaded) { + this.notifyDownloaded(); + } else if (this.versionAvailable) { + this.notifyUpgrade(); + } + } + + notifyUpgrade = (): void => { + WindowManager.sendToRenderer(UPDATE_AVAILABLE, this.versionAvailable); + displayUpgrade(this.versionAvailable || 'unknown', this.handleDownload); + } + + notifyDownloaded = (): void => { + WindowManager.sendToRenderer(UPDATE_DOWNLOADED, this.versionDownloaded); + displayRestartToUpgrade(this.versionDownloaded || 'unknown', this.handleUpdate); + } + + handleDownload = (): void => { + if (this.lastCheck) { + clearTimeout(this.lastCheck); + } + dialog.showMessageBox({ + title: 'Mattermost', + message: 'New desktop version available', + detail: 'A new version of the Mattermost Desktop app is available for you to download and install now.', + icon: appIcon, + buttons: ['Download', 'Remind me Later'], + type: 'info', + defaultId: 0, + cancelId: 1, + }).then(({response}) => { + if (response === 0) { + autoUpdater.downloadUpdate(); + } + }); + } + + handleOnQuit = (): void => { + if (this.versionDownloaded) { + autoUpdater.quitAndInstall(true, false); + } + } + + handleUpdate = (): void => { + dialog.showMessageBox({ + title: 'Mattermost', + message: 'A new version is ready to install', + detail: 'A new version of the Mattermost Desktop app is ready to install.', + icon: appIcon, + buttons: ['Restart and Update', 'Remind me Later'], + type: 'info', + defaultId: 0, + cancelId: 1, + }).then(({response}) => { + if (response === 0) { + autoUpdater.quitAndInstall(); + } + }); + } + + displayNoUpgrade = (): void => { + const version = app.getVersion(); + dialog.showMessageBox({ + title: 'Mattermost', + icon: appIcon, + message: 'You\'re up to date', + type: 'info', + buttons: ['OK'], + detail: `You are using the latest version of the Mattermost Desktop App (version ${version}). You'll be notified when a new version is available to install.`, + }); + } + + checkForUpdates = (manually: boolean): void => { + if (!Config.canUpgrade) { + log.info('auto updates are disabled'); + return; + } + if (this.lastCheck) { + clearTimeout(this.lastCheck); + } + if (!this.lastNotification || manually) { + if (manually) { + autoUpdater.once('update-not-available', this.displayNoUpgrade); + } + autoUpdater.checkForUpdates().catch((reason) => { + log.error(`[Mattermost] Failed to check for updates: ${reason}`); + }); + this.lastCheck = setTimeout(() => this.checkForUpdates(false), NEXT_CHECK); + } + } +} + +const updateManager = new UpdateManager(); +export default updateManager; diff --git a/src/main/menus/app.ts b/src/main/menus/app.ts index fe2a8b5d..f17104e6 100644 --- a/src/main/menus/app.ts +++ b/src/main/menus/app.ts @@ -10,8 +10,9 @@ import {Config} from 'common/config'; import {TabType, getTabDisplayName} from 'common/tabs/TabView'; import WindowManager from 'main/windows/windowManager'; +import {UpdateManager} from 'main/autoUpdater'; -export function createTemplate(config: Config) { +export function createTemplate(config: Config, updateManager: UpdateManager) { const separatorItem: MenuItemConstructorOptions = { type: 'separator', }; @@ -260,6 +261,30 @@ export function createTemplate(config: Config) { }; template.push(windowMenu); const submenu = []; + if (updateManager && config.canUpgrade) { + if (updateManager.versionDownloaded) { + submenu.push({ + label: 'Restart and Update', + click() { + updateManager.handleUpdate(); + }, + }); + } else if (updateManager.versionAvailable) { + submenu.push({ + label: 'Download Update', + click() { + updateManager.handleDownload(); + }, + }); + } else { + submenu.push({ + label: 'Check for Updates', + click() { + updateManager.checkForUpdates(true); + }, + }); + } + } if (config.data?.helpLink) { submenu.push({ label: 'Learn More...', @@ -286,7 +311,7 @@ export function createTemplate(config: Config) { return template; } -export function createMenu(config: Config) { - // Electron is enforcing certain variables that it doesn't need - return Menu.buildFromTemplate(createTemplate(config) as Array); +export function createMenu(config: Config, updateManager: UpdateManager) { + // TODO: Electron is enforcing certain variables that it doesn't need + return Menu.buildFromTemplate(createTemplate(config, updateManager) as Array); } diff --git a/src/main/notifications/Upgrade.ts b/src/main/notifications/Upgrade.ts new file mode 100644 index 00000000..27028dbc --- /dev/null +++ b/src/main/notifications/Upgrade.ts @@ -0,0 +1,46 @@ +// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import path from 'path'; +import {app, Notification} from 'electron'; + +const assetsDir = path.resolve(app.getAppPath(), 'assets'); +const appIconURL = path.resolve(assetsDir, 'appicon_48.png'); + +const defaultOptions = { + title: 'New desktop version available', + body: 'A new version is available for you to download now.', + silent: false, + icon: appIconURL, + urgency: 'normal' as Notification['urgency'], +}; + +export class NewVersionNotification extends Notification { + constructor() { + const options = {...defaultOptions}; + if (process.platform === 'win32') { + options.icon = appIconURL; + } else if (process.platform === 'darwin') { + // Notification Center shows app's icon, so there were two icons on the notification. + Reflect.deleteProperty(options, 'icon'); + } + + super(options); + } +} + +export class UpgradeNotification extends Notification { + constructor() { + const options = {...defaultOptions}; + options.title = 'Click to restart and install update'; + options.body = 'A new desktop version is ready to install now.'; + if (process.platform === 'win32') { + options.icon = appIconURL; + } else if (process.platform === 'darwin') { + // Notification Center shows app's icon, so there were two icons on the notification. + Reflect.deleteProperty(options, 'icon'); + } + + super(options); + } +} diff --git a/src/main/notifications/index.ts b/src/main/notifications/index.ts index e7df5215..c94f0235 100644 --- a/src/main/notifications/index.ts +++ b/src/main/notifications/index.ts @@ -13,6 +13,7 @@ import WindowManager from '../windows/windowManager'; import {Mention} from './Mention'; import {DownloadNotification} from './Download'; +import {NewVersionNotification, UpgradeNotification} from './Upgrade'; export const currentNotifications = new Map(); @@ -76,3 +77,27 @@ export function displayDownloadCompleted(fileName: string, path: string, serverN }); download.show(); } + +let upgrade: NewVersionNotification; + +export function displayUpgrade(version: string, handleUpgrade: () => void): void { + if (upgrade) { + upgrade.close(); + } + upgrade = new NewVersionNotification(); + upgrade.on('click', () => { + log.info(`User clicked to upgrade to ${version}`); + handleUpgrade(); + }); + upgrade.show(); +} + +let restartToUpgrade; +export function displayRestartToUpgrade(version: string, handleUpgrade: () => void): void { + restartToUpgrade = new UpgradeNotification(); + restartToUpgrade.on('click', () => { + log.info(`User requested perform the upgrade now to ${version}`); + handleUpgrade(); + }); + restartToUpgrade.show(); +} diff --git a/src/main/views/MattermostView.ts b/src/main/views/MattermostView.ts index 7d7d2425..afdc9ba0 100644 --- a/src/main/views/MattermostView.ts +++ b/src/main/views/MattermostView.ts @@ -378,7 +378,7 @@ export class MattermostView extends EventEmitter { findUnreadState = (favicon: string | null) => { try { this.view.webContents.send(IS_UNREAD, favicon, this.tab.name); - } catch (err) { + } catch (err: any) { log.error(`There was an error trying to request the unread state: ${err}`); log.error(err.stack); } diff --git a/src/main/views/viewManager.test.js b/src/main/views/viewManager.test.js index 08fde9a7..446ee620 100644 --- a/src/main/views/viewManager.test.js +++ b/src/main/views/viewManager.test.js @@ -15,6 +15,9 @@ import {MattermostView} from './MattermostView'; import {ViewManager} from './viewManager'; jest.mock('electron', () => ({ + app: { + getAppPath: () => '/path/to/app', + }, dialog: { showErrorBox: jest.fn(), }, diff --git a/src/main/windows/windowManager.test.js b/src/main/windows/windowManager.test.js index dc2222d7..dcbaf00b 100644 --- a/src/main/windows/windowManager.test.js +++ b/src/main/windows/windowManager.test.js @@ -156,6 +156,7 @@ describe('main/windows/windowManager', () => { it('should create the main window and add listeners', () => { const window = { on: jest.fn(), + once: jest.fn(), }; createMainWindow.mockReturnValue(window); windowManager.showMainWindow(); @@ -166,6 +167,7 @@ describe('main/windows/windowManager', () => { it('should open deep link when provided', () => { const window = { on: jest.fn(), + once: jest.fn(), }; createMainWindow.mockReturnValue(window); windowManager.showMainWindow('mattermost://server-1.com/subpath'); diff --git a/src/main/windows/windowManager.ts b/src/main/windows/windowManager.ts index 587dbb19..cb206d9a 100644 --- a/src/main/windows/windowManager.ts +++ b/src/main/windows/windowManager.ts @@ -24,6 +24,7 @@ import { BROWSER_HISTORY_BUTTON, } from 'common/communication'; import urlUtils from 'common/utils/url'; +import {SECOND} from 'common/utils/constants'; import Config from 'common/config'; import {getTabViewName, TAB_MESSAGING} from 'common/tabs/TabView'; @@ -43,12 +44,14 @@ export class WindowManager { assetsDir: string; mainWindow?: BrowserWindow; + mainWindowReady: boolean; settingsWindow?: BrowserWindow; viewManager?: ViewManager; teamDropdown?: TeamDropdownView; currentServerName?: string; constructor() { + this.mainWindowReady = false; this.assetsDir = path.resolve(app.getAppPath(), 'assets'); ipcMain.on(HISTORY, this.handleHistory); @@ -94,6 +97,7 @@ export class WindowManager { this.mainWindow.show(); } } else { + this.mainWindowReady = false; this.mainWindow = createMainWindow({ linuxAppIcon: path.join(this.assetsDir, 'linux', 'app_icon.png'), }); @@ -104,10 +108,15 @@ export class WindowManager { return; } + this.mainWindow.once('ready-to-show', () => { + this.mainWindowReady = true; + }); + // window handlers this.mainWindow.on('closed', () => { log.warn('main window closed'); delete this.mainWindow; + this.mainWindowReady = false; }); this.mainWindow.on('unresponsive', () => { CriticalErrorHandler.setMainWindow(this.mainWindow!); @@ -189,16 +198,34 @@ export class WindowManager { ipcMain.emit(RESIZE_MODAL, null, bounds); } - sendToRenderer = (channel: string, ...args: any[]) => { - if (!this.mainWindow) { + // max retries allows the message to get to the renderer even if it is sent while the app is starting up. + sendToRendererWithRetry = (maxRetries: number, channel: string, ...args: any[]) => { + if (!this.mainWindow || !this.mainWindowReady) { this.showMainWindow(); + if (maxRetries > 0) { + log.info(`Can't send ${channel}, will retry`); + setTimeout(() => { + this.sendToRendererWithRetry(maxRetries - 1, channel, ...args); + }, SECOND); + } else { + log.error(`Unable to send the message to the main window for message type ${channel}`); + } + return; } this.mainWindow!.webContents.send(channel, ...args); if (this.settingsWindow && this.settingsWindow.isVisible()) { - this.settingsWindow.webContents.send(channel, ...args); + try { + this.settingsWindow.webContents.send(channel, ...args); + } catch (e) { + log.error(`There was an error while trying to communicate with the renderer: ${e}`); + } } } + sendToRenderer = (channel: string, ...args: any[]) => { + this.sendToRendererWithRetry(3, channel, ...args); + } + sendToAll = (channel: string, ...args: any[]) => { this.sendToRenderer(channel, ...args); if (this.settingsWindow) { diff --git a/src/renderer/assets/fonts/compass-icons/compass-icons.eot b/src/renderer/assets/fonts/compass-icons/compass-icons.eot deleted file mode 100644 index 25859633cacd4166a4435cc869dc60c569ea5554..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44208 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 S#-}s}VYfFKt9(|fs`@{ - - -Copyright (C) 2021 by original authors @ fontello.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/renderer/assets/fonts/compass-icons/compass-icons.ttf b/src/renderer/assets/fonts/compass-icons/compass-icons.ttf deleted file mode 100644 index de69e8b4f0d644244c0df9f4ca680f8075596189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44020 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

B)MB*X!B*La>Ya(L0PE+wk`1_u&zEK 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 diff --git a/src/renderer/assets/fonts/compass-icons/compass-icons.woff b/src/renderer/assets/fonts/compass-icons/compass-icons.woff deleted file mode 100644 index ee85c72b74007d9d39289ed58b9f9e697cf00a59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24188 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 K%Krdc#AV6V=n6sr diff --git a/src/renderer/assets/fonts/compass-icons/compass-icons.woff2 b/src/renderer/assets/fonts/compass-icons/compass-icons.woff2 deleted file mode 100644 index f64efb1d63db86415eb6b448475f3616894e2604..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19840 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 diff --git a/src/renderer/components/MainPage.tsx b/src/renderer/components/MainPage.tsx index e08b5559..ee98b2d5 100644 --- a/src/renderer/components/MainPage.tsx +++ b/src/renderer/components/MainPage.tsx @@ -2,11 +2,13 @@ // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. +import classNames from 'classnames'; import React, {Fragment} from 'react'; import {Container, Row} from 'react-bootstrap'; import {DropResult} from 'react-beautiful-dnd'; import DotsVerticalIcon from 'mdi-react/DotsVerticalIcon'; import {IpcRendererEvent} from 'electron/renderer'; +import prettyBytes from 'pretty-bytes'; import {TeamWithTabs} from 'types/config'; @@ -36,6 +38,11 @@ import { CLOSE_TEAMS_DROPDOWN, OPEN_TEAMS_DROPDOWN, SWITCH_TAB, + UPDATE_AVAILABLE, + UPDATE_DOWNLOADED, + UPDATE_PROGRESS, + START_UPGRADE, + START_DOWNLOAD, CLOSE_TAB, } from 'common/communication'; @@ -50,6 +57,7 @@ import TabBar from './TabBar'; import ExtraBar from './ExtraBar'; import ErrorView from './ErrorView'; import TeamDropdownButton from './TeamDropdownButton'; +import '../css/components/UpgradeButton.scss'; enum Status { LOADING = 1, @@ -59,6 +67,13 @@ enum Status { NOSERVERS = -2, } +enum UpgradeStatus { + NONE = 0, + AVAILABLE = 1, + DOWNLOADING = 2, + DOWNLOADED = 3, +} + type Props = { teams: TeamWithTabs[]; lastActiveTeam?: number; @@ -82,6 +97,14 @@ type State = { fullScreen?: boolean; showExtraBar?: boolean; isMenuOpen: boolean; + upgradeStatus: UpgradeStatus; + upgradeProgress?: { + total: number; + delta: number; + transferred: number; + percent: number; + bytesPerSecond: number; + }; }; type TabViewStatus = { @@ -119,6 +142,7 @@ export default class MainPage extends React.PureComponent { tabViewStatus: new Map(this.props.teams.map((team) => team.tabs.map((tab) => getTabViewName(team.name, tab.name))).flat().map((tabViewName) => [tabViewName, {status: Status.LOADING}])), darkMode: this.props.darkMode, isMenuOpen: false, + upgradeStatus: UpgradeStatus.NONE, }; } @@ -221,6 +245,27 @@ export default class MainPage extends React.PureComponent { this.setState({isMenuOpen: true}); }); + window.ipcRenderer.on(UPDATE_AVAILABLE, () => { + this.setState({upgradeStatus: UpgradeStatus.AVAILABLE}); + }); + + window.ipcRenderer.on(UPDATE_DOWNLOADED, () => { + this.setState({upgradeStatus: UpgradeStatus.DOWNLOADED}); + }); + + window.ipcRenderer.on(UPDATE_PROGRESS, (event, total, delta, transferred, percent, bytesPerSecond) => { + this.setState({ + upgradeStatus: UpgradeStatus.DOWNLOADING, + upgradeProgress: { + total, + delta, + transferred, + percent, + bytesPerSecond, + }, + }); + }); + if (window.process.platform !== 'darwin') { window.ipcRenderer.on(FOCUS_THREE_DOT_MENU, () => { if (this.threeDotMenu.current) { @@ -334,16 +379,11 @@ export default class MainPage extends React.PureComponent { /> ); - let topBarClassName = 'topBar'; - if (window.process.platform === 'darwin') { - topBarClassName += ' macOS'; - } - if (this.state.darkMode) { - topBarClassName += ' darkMode'; - } - if (this.state.fullScreen) { - topBarClassName += ' fullScreen'; - } + const topBarClassName = classNames('topBar', { + macOS: window.process.platform === 'darwin', + darkMode: this.state.darkMode, + fullScreen: this.state.fullScreen, + }); let maxButton; if (this.state.maximized || this.state.fullScreen) { @@ -366,11 +406,46 @@ export default class MainPage extends React.PureComponent { ); } - let overlayGradient; - if (window.process.platform !== 'darwin') { - overlayGradient = ( - - ); + let upgradeTooltip; + switch (this.state.upgradeStatus) { + case UpgradeStatus.AVAILABLE: + upgradeTooltip = 'Update available'; + break; + case UpgradeStatus.DOWNLOADED: + upgradeTooltip = 'Update ready to install'; + break; + case UpgradeStatus.DOWNLOADING: + upgradeTooltip = `Downloading update. ${String(this.state.upgradeProgress?.percent).split('.')[0]}% of ${prettyBytes(this.state.upgradeProgress?.total || 0)} @ ${prettyBytes(this.state.upgradeProgress?.bytesPerSecond || 0)}/s`; + break; + } + + let upgradeIcon; + if (this.state.upgradeStatus !== UpgradeStatus.NONE) { + upgradeIcon = ( + +

diff --git a/src/renderer/components/SettingsPage.tsx b/src/renderer/components/SettingsPage.tsx index f28506ba..3afc690c 100644 --- a/src/renderer/components/SettingsPage.tsx +++ b/src/renderer/components/SettingsPage.tsx @@ -24,14 +24,15 @@ import { GET_DOWNLOAD_LOCATION, RELOAD_CONFIGURATION, GET_AVAILABLE_SPELL_CHECKER_LANGUAGES, + CHECK_FOR_UPDATES, } from 'common/communication'; import AutoSaveIndicator, {SavingState} from './AutoSaveIndicator'; -const CONFIG_TYPE_SERVERS = 'servers'; +const CONFIG_TYPE_UPDATES = 'updates'; const CONFIG_TYPE_APP_OPTIONS = 'appOptions'; -type ConfigType = typeof CONFIG_TYPE_SERVERS | typeof CONFIG_TYPE_APP_OPTIONS; +type ConfigType = typeof CONFIG_TYPE_UPDATES | typeof CONFIG_TYPE_APP_OPTIONS; type State = DeepPartial & { ready: boolean; @@ -40,11 +41,12 @@ type State = DeepPartial & { userOpenedDownloadDialog: boolean; allowSaveSpellCheckerURL: boolean; availableLanguages: Array<{label: string; value: string}>; + canUpgrade?: boolean; } type SavingStateItems = { appOptions: SavingState; - servers: SavingState; + updates: SavingState; }; type SaveQueueItem = { @@ -66,6 +68,7 @@ export default class SettingsPage extends React.PureComponent; spellCheckerURLRef: React.RefObject; enableHardwareAccelerationRef: React.RefObject; + autoCheckForUpdatesRef: React.RefObject; saveQueue: SaveQueueItem[]; @@ -77,7 +80,7 @@ export default class SettingsPage extends React.PureComponent ({label: localeTranslations[language] || language, value: language})) || []; return newState; @@ -147,7 +151,7 @@ export default class SettingsPage extends React.PureComponent { let queuedUpdateCounts = { - [CONFIG_TYPE_SERVERS]: 0, + [CONFIG_TYPE_UPDATES]: 0, [CONFIG_TYPE_APP_OPTIONS]: 0, }; @@ -284,6 +288,21 @@ export default class SettingsPage extends React.PureComponent { + window.timers.setImmediate(this.saveSetting, CONFIG_TYPE_UPDATES, {key: 'autoCheckForUpdates', data: this.autoCheckForUpdatesRef.current?.checked}); + this.setState({ + autoCheckForUpdates: this.autoCheckForUpdatesRef.current?.checked, + }, () => { + if (this.state.autoCheckForUpdates) { + this.checkForUpdates(); + } + }); + } + + checkForUpdates = () => { + window.ipcRenderer.send(CHECK_FOR_UPDATES); + } + handleChangeSpellCheckerLocales = (value: OptionsType<{label: string; value: string}>, actionMeta: ActionMeta<{label: string; value: string}>) => { switch (actionMeta.action) { case 'select-option': @@ -407,6 +426,12 @@ export default class SettingsPage extends React.PureComponent

{'App Options'}

-
+
+ + +

{'Updates'}

+
+ +
+ + + + {'Automatically check for updates'} + + {'If enabled, updates to the Desktop App will download automatically and you will be notified when ready to install.'} + + + + + +
+
+ + ); + } + let waitForIpc; if (this.state.ready) { - waitForIpc = optionsRow; + waitForIpc = ( + <> + {updateRow} + {optionsRow} + + ); } else { waitForIpc = (

{'Loading configuration...'}

); } diff --git a/src/renderer/components/TeamDropdownButton.tsx b/src/renderer/components/TeamDropdownButton.tsx index ba28d9aa..a64a90a1 100644 --- a/src/renderer/components/TeamDropdownButton.tsx +++ b/src/renderer/components/TeamDropdownButton.tsx @@ -7,7 +7,6 @@ import React, {useEffect} from 'react'; import {CLOSE_TEAMS_DROPDOWN, OPEN_TEAMS_DROPDOWN} from 'common/communication'; import '../css/components/TeamDropdownButton.scss'; -import '../css/compass-icons.css'; type Props = { isDisabled?: boolean; diff --git a/src/renderer/css/compass-icons.css b/src/renderer/css/compass-icons.css deleted file mode 100755 index b723f98b..00000000 --- a/src/renderer/css/compass-icons.css +++ /dev/null @@ -1,285 +0,0 @@ -@charset "UTF-8"; -@font-face { - font-family: 'compass-icons'; - src: url('../assets/fonts/compass-icons/compass-icons.eot?81398164'); - src: url('../assets/fonts/compass-icons/compass-icons.eot?81398164#iefix') format('embedded-opentype'), - url('../assets/fonts/compass-icons/compass-icons.woff2?81398164') format('woff2'), - url('../assets/fonts/compass-icons/compass-icons.woff?81398164') format('woff'), - url('../assets/fonts/compass-icons/compass-icons.ttf?81398164') format('truetype'), - url('../assets/fonts/compass-icons/compass-icons.svg?81398164#compass-icons') format('svg'); - font-weight: normal; - font-style: normal; -} -/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ -/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ -/* -@media screen and (-webkit-min-device-pixel-ratio:0) { - @font-face { - font-family: 'compass-icons'; - src: url('../font/compass-icons.svg?81398164#compass-icons') format('svg'); - } -} -*/ -[class^="icon-"]:before, [class*=" icon-"]:before { - font-family: "compass-icons"; - font-style: normal; - font-weight: normal; - speak: never; - - display: inline-block; - text-decoration: inherit; - width: 1em; - margin-right: .2em; - text-align: center; - /* opacity: .8; */ - - /* For safety - reset parent styles, that can break glyph codes*/ - font-variant: normal; - text-transform: none; - - /* fix buttons height, for twitter bootstrap */ - line-height: 1em; - - /* Animation center compensation - margins should be symmetric */ - /* remove if not needed */ - margin-left: .2em; - - /* you can be more comfortable with increased icons size */ - /* font-size: 120%; */ - - /* Font smoothing. That was taken from TWBS */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - - /* Uncomment for 3D effect */ - /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ -} - -.icon-mattermost:before { content: '\e800'; } /* '' */ -.icon-archive-outline:before { content: '\e801'; } /* '' */ -.icon-beach-umbrella-outline:before { content: '\e802'; } /* '' */ -.icon-exclamation-thick:before { content: '\e803'; } /* '' */ -.icon-gfycat:before { content: '\e804'; } /* '' */ -.icon-globe:before { content: '\e805'; } /* '' */ -.icon-iframe-list-outline:before { content: '\e806'; } /* '' */ -.icon-oauth:before { content: '\e807'; } /* '' */ -.icon-power-plug-outline:before { content: '\e808'; } /* '' */ -.icon-robot-happy:before { content: '\e809'; } /* '' */ -.icon-server-outline:before { content: '\e80a'; } /* '' */ -.icon-slash-forward-box-outline:before { content: '\e80b'; } /* '' */ -.icon-webhook-incoming:before { content: '\e80c'; } /* '' */ -.icon-webhook-outgoing:before { content: '\e80d'; } /* '' */ -.icon-image-area-outline:before { content: '\e80e'; } /* '' */ -.icon-emoticon-plus-outline:before { content: '\e80f'; } /* '' */ -.icon-mark-as-unread:before { content: '\e810'; } /* '' */ -.icon-arrow-back-ios:before { content: '\e811'; } /* '' */ -.icon-arrow-forward-ios:before { content: '\e812'; } /* '' */ -.icon-brand-zoom:before { content: '\e813'; } /* '' */ -.icon-menu-variant:before { content: '\e814'; } /* '' */ -.icon-message-check:before { content: '\e815'; } /* '' */ -.icon-airplane-variant:before { content: '\e816'; } /* '' */ -.icon-food-apple:before { content: '\e817'; } /* '' */ -.icon-leaf-outline:before { content: '\e818'; } /* '' */ -.icon-basketball:before { content: '\e819'; } /* '' */ -.icon-emoticon-custom-outline:before { content: '\e81a'; } /* '' */ -.icon-message-check-outline:before { content: '\e81b'; } /* '' */ -.icon-image-broken-outline:before { content: '\e81c'; } /* '' */ -.icon-format-header:before { content: '\e81d'; } /* '' */ -.icon-circle-multiple-outline-lock:before { content: '\e81e'; } /* '' */ -.icon-server-variant:before { content: '\e81f'; } /* '' */ -.icon-server-variant-plus:before { content: '\e820'; } /* '' */ -.icon-search-list:before { content: '\e821'; } /* '' */ -.icon-brand-gitlab:before { content: '\e822'; } /* '' */ -.icon-brand-google:before { content: '\e823'; } /* '' */ -.icon-brand-office-365:before { content: '\e824'; } /* '' */ -.icon-brand-one-login:before { content: '\e825'; } /* '' */ -.icon-application-cog:before { content: '\e826'; } /* '' */ -.icon-key-variant-circle:before { content: '\e827'; } /* '' */ -.icon-car-outline:before { content: '\e899'; } /* '' */ -.icon-jumbo-attachment-text:before { content: '\e900'; } /* '' */ -.icon-jumbo-attachment-word:before { content: '\e901'; } /* '' */ -.icon-jumbo-attachment-excel:before { content: '\e902'; } /* '' */ -.icon-jumbo-attachment-powerpoint:before { content: '\e903'; } /* '' */ -.icon-jumbo-attachment-pdf:before { content: '\e904'; } /* '' */ -.icon-jumbo-attachment-image:before { content: '\e905'; } /* '' */ -.icon-jumbo-attachment-video:before { content: '\e906'; } /* '' */ -.icon-jumbo-attachment-audio:before { content: '\e907'; } /* '' */ -.icon-jumbo-attachment-generic:before { content: '\e908'; } /* '' */ -.icon-jumbo-attachment-patch:before { content: '\e909'; } /* '' */ -.icon-jumbo-attachment-zip:before { content: '\e90a'; } /* '' */ -.icon-jumbo-attachment-code:before { content: '\e90b'; } /* '' */ -.icon-jumbo-attachment-image-broken:before { content: '\e90c'; } /* '' */ -.icon-account-multiple-outline:before { content: '\f00f'; } /* '' */ -.icon-airplane:before { content: '\f01d'; } /* '' */ -.icon-alert-outline:before { content: '\f02a'; } /* '' */ -.icon-arrow-down:before { content: '\f045'; } /* '' */ -.icon-arrow-left:before { content: '\f04d'; } /* '' */ -.icon-arrow-up:before { content: '\f05d'; } /* '' */ -.icon-at:before { content: '\f065'; } /* '' */ -.icon-flask-outline:before { content: '\f096'; } /* '' */ -.icon-bell-outline:before { content: '\f09c'; } /* '' */ -.icon-cellphone:before { content: '\f11c'; } /* '' */ -.icon-chart-bar:before { content: '\f128'; } /* '' */ -.icon-chart-line:before { content: '\f12a'; } /* '' */ -.icon-check:before { content: '\f12c'; } /* '' */ -.icon-checkbox-blank-outline:before { content: '\f131'; } /* '' */ -.icon-checkbox-marked:before { content: '\f132'; } /* '' */ -.icon-chevron-down:before { content: '\f140'; } /* '' */ -.icon-chevron-left:before { content: '\f141'; } /* '' */ -.icon-chevron-right:before { content: '\f142'; } /* '' */ -.icon-clock-outline:before { content: '\f150'; } /* '' */ -.icon-close:before { content: '\f156'; } /* '' */ -.icon-close-circle-outline:before { content: '\f15a'; } /* '' */ -.icon-code-brackets:before { content: '\f16a'; } /* '' */ -.icon-code-tags:before { content: '\f174'; } /* '' */ -.icon-console:before { content: '\f18d'; } /* '' */ -.icon-dots-horizontal:before { content: '\f1d8'; } /* '' */ -.icon-dots-vertical:before { content: '\f1d9'; } /* '' */ -.icon-email-outline:before { content: '\f1f0'; } /* '' */ -.icon-emoticon-outline:before { content: '\f1f2'; } /* '' */ -.icon-emoticon-happy-outline:before { content: '\f1f5'; } /* '' */ -.icon-filter-variant:before { content: '\f236'; } /* '' */ -.icon-fire:before { content: '\f238'; } /* '' */ -.icon-flag:before { content: '\f23b'; } /* '' */ -.icon-flag-outline:before { content: '\f23d'; } /* '' */ -.icon-format-bold:before { content: '\f264'; } /* '' */ -.icon-format-clear:before { content: '\f265'; } /* '' */ -.icon-format-header-1:before { content: '\f26b'; } /* '' */ -.icon-format-header-2:before { content: '\f26c'; } /* '' */ -.icon-format-header-3:before { content: '\f26d'; } /* '' */ -.icon-format-header-4:before { content: '\f26e'; } /* '' */ -.icon-format-header-5:before { content: '\f26f'; } /* '' */ -.icon-format-header-6:before { content: '\f270'; } /* '' */ -.icon-format-italic:before { content: '\f277'; } /* '' */ -.icon-format-list-bulleted:before { content: '\f279'; } /* '' */ -.icon-format-list-numbered:before { content: '\f27b'; } /* '' */ -.icon-format-strikethrough-variant:before { content: '\f281'; } /* '' */ -.icon-github-circle:before { content: '\f2a4'; } /* '' */ -.icon-heart-outline:before { content: '\f2d5'; } /* '' */ -.icon-help:before { content: '\f2d6'; } /* '' */ -.icon-information-outline:before { content: '\f2fd'; } /* '' */ -.icon-laptop:before { content: '\f322'; } /* '' */ -.icon-leaf:before { content: '\f32a'; } /* '' */ -.icon-lightbulb-outline:before { content: '\f336'; } /* '' */ -.icon-link-variant:before { content: '\f339'; } /* '' */ -.icon-link-variant-off:before { content: '\f33a'; } /* '' */ -.icon-lock:before { content: '\f33e'; } /* '' */ -.icon-lock-outline:before { content: '\f341'; } /* '' */ -.icon-magnify:before { content: '\f349'; } /* '' */ -.icon-menu:before { content: '\f35c'; } /* '' */ -.icon-menu-down:before { content: '\f35d'; } /* '' */ -.icon-minus-box:before { content: '\f375'; } /* '' */ -.icon-minus-circle:before { content: '\f376'; } /* '' */ -.icon-paperclip:before { content: '\f3e2'; } /* '' */ -.icon-pin:before { content: '\f403'; } /* '' */ -.icon-plus:before { content: '\f415'; } /* '' */ -.icon-plus-box:before { content: '\f416'; } /* '' */ -.icon-refresh:before { content: '\f450'; } /* '' */ -.icon-send:before { content: '\f48a'; } /* '' */ -.icon-shield-outline:before { content: '\f499'; } /* '' */ -.icon-sitemap:before { content: '\f4aa'; } /* '' */ -.icon-soccer:before { content: '\f4b8'; } /* '' */ -.icon-source-pull:before { content: '\f4c2'; } /* '' */ -.icon-star:before { content: '\f4ce'; } /* '' */ -.icon-star-outline:before { content: '\f4d2'; } /* '' */ -.icon-sync:before { content: '\f4e6'; } /* '' */ -.icon-alert-circle-outline:before { content: '\f5d6'; } /* '' */ -.icon-check-circle:before { content: '\f5e0'; } /* '' */ -.icon-email-variant:before { content: '\f5f0'; } /* '' */ -.icon-food-fork-drink:before { content: '\f5f2'; } /* '' */ -.icon-arrow-collapse:before { content: '\f615'; } /* '' */ -.icon-arrow-expand:before { content: '\f616'; } /* '' */ -.icon-source-branch:before { content: '\f62c'; } /* '' */ -.icon-tune:before { content: '\f62e'; } /* '' */ -.icon-webhook:before { content: '\f62f'; } /* '' */ -.icon-eye-outline:before { content: '\f6cf'; } /* '' */ -.icon-cancel:before { content: '\f739'; } /* '' */ -.icon-format-quote-open:before { content: '\f756'; } /* '' */ -.icon-square:before { content: '\f763'; } /* '' */ -.icon-circle-outline:before { content: '\f765'; } /* '' */ -.icon-account-plus-outline:before { content: '\f800'; } /* '' */ -.icon-forum-outline:before { content: '\f821'; } /* '' */ -.icon-settings-outline:before { content: '\f8ba'; } /* '' */ -.icon-hammer:before { content: '\f8e9'; } /* '' */ -.icon-pin-outline:before { content: '\f930'; } /* '擄' */ -.icon-clock:before { content: '\f953'; } /* '肋' */ -.icon-image-outline:before { content: '\f975'; } /* '掠' */ -.icon-email-plus-outline:before { content: '\f9eb'; } /* '匿' */ -.icon-file-document-outline:before { content: '\f9ed'; } /* '吝' */ -.icon-layers-outline:before { content: '\f9fd'; } /* '什' */ -.icon-bell-off-outline:before { content: '\fa90'; } /* '敖' */ -.icon-chevron-down-circle-outline:before { content: '\fb0c'; } /* '﬌' */ -.icon-format-letter-case:before { content: '\fb19'; } /* '﬙' */ -.icon-download-outline:before { content: '\fb6b'; } /* 'ﭫ' */ -.icon-video-outline:before { content: '\fbb8'; } /* '﮸' */ -.icon-pencil-outline:before { content: '\fc92'; } /* 'ﲒ' */ -.icon-camera-outline:before { content: '\fd39'; } /* 'ﴹ' */ -.icon-file-video-outline:before { content: '\fe10'; } /* '︐' */ -.icon-palette-outline:before { content: '\fe6c'; } /* '﹬' */ -.icon-file-music-outline:before { content: '\fe7c'; } /* 'ﹼ' */ -.icon-file-pdf-outline:before { content: '\fe7d'; } /* 'ﹽ' */ -.icon-file-image-outline:before { content: '\fecd'; } /* 'ﻍ' */ -.icon-reply-outline:before { content: '\ff3d'; } /* ']' */ -.icon-draw:before { content: '\ff66'; } /* 'ヲ' */ -.icon-account-outline:before { content: '󰀓'; } /* '\f0013' */ -.icon-arrow-expand-all:before { content: '󰁌'; } /* '\f004c' */ -.icon-file-code-outline:before { content: '󰁍'; } /* '\f004d' */ -.icon-file-excel-outline:before { content: '󰁏'; } /* '\f004f' */ -.icon-arrow-right:before { content: '󰁔'; } /* '\f0054' */ -.icon-file-powerpoint-outline:before { content: '󰁗'; } /* '\f0057' */ -.icon-file-word-outline:before { content: '󰁠'; } /* '\f0060' */ -.icon-bookmark:before { content: '󰃀'; } /* '\f00c0' */ -.icon-bookmark-outline:before { content: '󰃃'; } /* '\f00c3' */ -.icon-dock-left:before { content: '󰃕'; } /* '\f00d5' */ -.icon-chevron-up:before { content: '󰅃'; } /* '\f0143' */ -.icon-close-circle:before { content: '󰅙'; } /* '\f0159' */ -.icon-content-copy:before { content: '󰆏'; } /* '\f018f' */ -.icon-send-outline:before { content: '󰆐'; } /* '\f0190' */ -.icon-credit-card-outline:before { content: '󰆛'; } /* '\f019b' */ -.icon-drag-vertical:before { content: '󰇝'; } /* '\f01dd' */ -.icon-view-grid-outline:before { content: '󰈄'; } /* '\f0204' */ -.icon-exit-to-app:before { content: '󰈆'; } /* '\f0206' */ -.icon-file-outline:before { content: '󰈤'; } /* '\f0224' */ -.icon-folder-outline:before { content: '󰉖'; } /* '\f0256' */ -.icon-archive-arrow-up-outline:before { content: '󰊇'; } /* '\f0287' */ -.icon-glasses:before { content: '󰊪'; } /* '\f02aa' */ -.icon-key-variant:before { content: '󰌋'; } /* '\f030b' */ -.icon-magnify-minus:before { content: '󰍊'; } /* '\f034a' */ -.icon-magnify-plus:before { content: '󰍋'; } /* '\f034b' */ -.icon-menu-left:before { content: '󰍞'; } /* '\f035e' */ -.icon-menu-right:before { content: '󰍟'; } /* '\f035f' */ -.icon-menu-up:before { content: '󰍠'; } /* '\f0360' */ -.icon-message-text-outline:before { content: '󰍪'; } /* '\f036a' */ -.icon-minus:before { content: '󰍴'; } /* '\f0374' */ -.icon-minus-circle-outline:before { content: '󰍷'; } /* '\f0377' */ -.icon-open-in-new:before { content: '󰏌'; } /* '\f03cc' */ -.icon-pause:before { content: '󰏤'; } /* '\f03e4' */ -.icon-play:before { content: '󰐊'; } /* '\f040a' */ -.icon-radiobox-blank:before { content: '󰐽'; } /* '\f043d' */ -.icon-radiobox-marked:before { content: '󰐾'; } /* '\f043e' */ -.icon-sort-alphabetical-ascending:before { content: '󰖽'; } /* '\f05bd' */ -.icon-playlist-check:before { content: '󰗇'; } /* '\f05c7' */ -.icon-check-circle-outline:before { content: '󰗡'; } /* '\f05e1' */ -.icon-help-circle-outline:before { content: '󰘥'; } /* '\f0625' */ -.icon-circle-multiple-outline:before { content: '󰚕'; } /* '\f0695' */ -.icon-update:before { content: '󰚰'; } /* '\f06b0' */ -.icon-eye-off-outline:before { content: '󰛑'; } /* '\f06d1' */ -.icon-infinity:before { content: '󰛤'; } /* '\f06e4' */ -.icon-plus-box-outline:before { content: '󰜄'; } /* '\f0704' */ -.icon-arrow-right-bold-outline:before { content: '󰧂'; } /* '\f09c2' */ -.icon-trash-can-outline:before { content: '󰩺'; } /* '\f0a7a' */ -.icon-account-minus-outline:before { content: '󰫬'; } /* '\f0aec' */ -.icon-calendar-outline:before { content: '󰭧'; } /* '\f0b67' */ -.icon-export-variant:before { content: '󰮓'; } /* '\f0b93' */ -.icon-folder-plus-outline:before { content: '󰮝'; } /* '\f0b9d' */ -.icon-home-variant-outline:before { content: '󰮧'; } /* '\f0ba7' */ -.icon-calendar-check-outline:before { content: '󰱄'; } /* '\f0c44' */ -.icon-hand-right:before { content: '󰹇'; } /* '\f0e47' */ -.icon-notebook-outline:before { content: '󰺿'; } /* '\f0ebf' */ -.icon-shield-alert-outline:before { content: '󰻍'; } /* '\f0ecd' */ -.icon-slash-forward:before { content: '󰿟'; } /* '\f0fdf' */ -.icon-file-multiple-outline:before { content: '󱀲'; } /* '\f1032' */ -.icon-message-plus-outline:before { content: '󱂻'; } /* '\f10bb' */ -.icon-message-minus-outline:before { content: '󱅯'; } /* '\f116f' */ -.icon-crown-outline:before { content: '󱇐'; } /* '\f11d0' */ -.icon-folder-move-outline:before { content: '󱉆'; } /* '\f1246' */ diff --git a/src/renderer/css/components/UpgradeButton.scss b/src/renderer/css/components/UpgradeButton.scss new file mode 100644 index 00000000..d6341d37 --- /dev/null +++ b/src/renderer/css/components/UpgradeButton.scss @@ -0,0 +1,65 @@ +.upgrade-btns { + width: 32px; + height: 32px; + font-size: 18px; + line-height: 18px; + border-radius: 4px; + margin-top: 4px; + margin-right: 4px; + text-align: center; + color: rgba(63, 67, 80, 0.56); + + &:hover { + background-color: rgba(63, 67, 80, 0.08); + } +} + +.upgrade-button { + margin: 7px; + height: 18px; + cursor: pointer; + + > i::before { + margin: 0; + } +} + +.rotate { + animation: rotation 2s infinite linear; + + > i::before { + transform: scaleX(-1); + } +} + +@keyframes rotation { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } +} + +.circle { + background: #F74343; + border-radius: 100px; + width: 12px; + height: 12px; + position: relative; + top: -22px; + right: -10px; + border: 2px solid #efefef; +} + +.upgrade-btns.darkMode { + color: rgba(221, 221, 221, 0.56); + + &:hover { + background-color: rgba(175, 188, 192, 0.08); + } + + .circle { + border-color: #2e2e2e; + } +} \ No newline at end of file diff --git a/src/renderer/css/dropdown.scss b/src/renderer/css/dropdown.scss index c7a748f0..7215afa8 100644 --- a/src/renderer/css/dropdown.scss +++ b/src/renderer/css/dropdown.scss @@ -1,4 +1,5 @@ @import url("fonts.css"); +@import '~@mattermost/compass-icons/css/compass-icons.css'; body { margin: 0; diff --git a/src/renderer/css/index.css b/src/renderer/css/index.css index 5515aa67..74bfa92b 100644 --- a/src/renderer/css/index.css +++ b/src/renderer/css/index.css @@ -1,7 +1,7 @@ @import url("components/index.css"); @import url("fonts.css"); @import '~font-awesome/css/font-awesome.css'; - +@import '~@mattermost/compass-icons/css/compass-icons.css'; html { height: 100%; @@ -119,8 +119,8 @@ body { .topBar .title-bar-btns { position: relative; - line-height: 36px; - height: 36px; + line-height: 40px; + height: 40px; z-index: 9; color: rgba(61,60,64,0.7); -webkit-app-region: no-drag; diff --git a/src/renderer/dropdown.tsx b/src/renderer/dropdown.tsx index 26262499..cf190b5c 100644 --- a/src/renderer/dropdown.tsx +++ b/src/renderer/dropdown.tsx @@ -22,7 +22,6 @@ import {getTabViewName} from 'common/tabs/TabView'; import {TAB_BAR_HEIGHT, THREE_DOT_MENU_WIDTH_MAC} from 'common/utils/constants'; import './css/dropdown.scss'; -import './css/compass-icons.css'; type State = { teams?: TeamWithTabs[]; diff --git a/src/renderer/index.tsx b/src/renderer/index.tsx index 3cb2c773..56c02e7d 100644 --- a/src/renderer/index.tsx +++ b/src/renderer/index.tsx @@ -98,7 +98,7 @@ class Root extends React.PureComponent, State> { try { const configRequest = await window.ipcRenderer.invoke(GET_CONFIGURATION); return configRequest; - } catch (err) { + } catch (err: any) { console.log(`there was an error with the config: ${err}`); if (exitOnError) { window.ipcRenderer.send(QUIT, `unable to load configuration: ${err}`, err.stack); diff --git a/src/types/config.ts b/src/types/config.ts index 92929ba6..46186e5f 100644 --- a/src/types/config.ts +++ b/src/types/config.ts @@ -40,6 +40,8 @@ export type ConfigV3 = { downloadLocation: string; spellCheckerURL?: string; lastActiveTeam?: number; + + autoCheckForUpdates?: boolean; alwaysMinimize?: boolean; alwaysClose?: boolean; } @@ -119,6 +121,7 @@ export type CombinedConfig = ConfigV3 & BuildConfig & { export type LocalConfiguration = Config & { appName: string; enableServerManagement: boolean; + canUpgrade: boolean; } export type MigrationInfo = { diff --git a/webpack.config.base.js b/webpack.config.base.js index c0d1d7c6..73447930 100644 --- a/webpack.config.base.js +++ b/webpack.config.base.js @@ -18,6 +18,7 @@ const isRelease = process.env.CIRCLE_BRANCH && process.env.CIRCLE_BRANCH.startsW const codeDefinitions = { __HASH_VERSION__: !isRelease && JSON.stringify(VERSION), + __CAN_UPGRADE__: JSON.stringify(true), // we should set this to false when working on a store version. Hardcoding for now. }; codeDefinitions['process.env.NODE_ENV'] = JSON.stringify(process.env.NODE_ENV);