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' ({ 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 25859633..00000000 Binary files a/src/renderer/assets/fonts/compass-icons/compass-icons.eot and /dev/null differ diff --git a/src/renderer/assets/fonts/compass-icons/compass-icons.svg b/src/renderer/assets/fonts/compass-icons/compass-icons.svg deleted file mode 100644 index 1dbb77d6..00000000 --- a/src/renderer/assets/fonts/compass-icons/compass-icons.svg +++ /dev/null @@ -1,466 +0,0 @@ - - - -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 de69e8b4..00000000 Binary files a/src/renderer/assets/fonts/compass-icons/compass-icons.ttf and /dev/null differ 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 ee85c72b..00000000 Binary files a/src/renderer/assets/fonts/compass-icons/compass-icons.woff and /dev/null differ 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 f64efb1d..00000000 Binary files a/src/renderer/assets/fonts/compass-icons/compass-icons.woff2 and /dev/null differ 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 = ( + +
{ + if (this.state.upgradeStatus === UpgradeStatus.DOWNLOADING) { + return; + } + + window.ipcRenderer.send(this.state.upgradeStatus === UpgradeStatus.DOWNLOADED ? START_UPGRADE : START_DOWNLOAD); + }} + > + + {(this.state.upgradeStatus !== UpgradeStatus.DOWNLOADING) &&
} +
+ ); } let titleBarButtons; @@ -435,7 +510,7 @@ export default class MainPage extends React.PureComponent { darkMode={this.state.darkMode} /> {tabsRow} - {overlayGradient} + {upgradeIcon} {titleBarButtons}
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);