diff --git a/.github/ISSUE_TEMPLATE/installation-issue.md b/.github/ISSUE_TEMPLATE/installation-issue.md new file mode 100644 index 00000000000..0d2175f7faa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/installation-issue.md @@ -0,0 +1,21 @@ +--- +name: "\U0001F4BB Installation issue" +about: Report a problem when installing the application +title: '' +labels: '' +assignees: '' + +--- + +### Operating System/Distribution + +Which distribution of Linux are you using? + +### Installer + +Which version of the app? +Which installer type? + +### What happened? + +Provide as much detail as possible. Error messages or output are extremely useful. diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ca79ca5b4d5..0b10093544d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,3 +4,13 @@ updates: directory: / schedule: interval: weekly + + - package-ecosystem: 'npm' + directory: '/' + open-pull-requests-limit: 5 + schedule: + interval: 'weekly' + allow: + - dependency-name: 'electron-builder' + - dependency-name: 'electron-packager' + - dependency-name: 'electron-installer-*' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 86d1a83fa94..d7c9b4aca28 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,25 +4,37 @@ on: push: branches: - development - - __release-* + - linux + - 'linux-release-*' + tags: + - 'release-*.*.*-linux*' pull_request: + branches: + - linux + - 'linux-release-*' jobs: build: name: ${{ matrix.friendlyName }} ${{ matrix.arch }} runs-on: ${{ matrix.os }} - permissions: read-all + permissions: + contents: write strategy: fail-fast: false matrix: node: [16.17.1] - os: [macos-11, windows-2019] + os: [macos-11, windows-2019, ubuntu-20.04] arch: [x64, arm64] include: - os: macos-11 friendlyName: macOS - os: windows-2019 friendlyName: Windows + - os: ubuntu-20.04 + friendlyName: Ubuntu + exclude: + - os: ubuntu-20.04 + arch: arm64 timeout-minutes: 60 steps: - uses: actions/checkout@v3 @@ -56,13 +68,6 @@ jobs: - name: Build production app run: yarn build:prod env: - DESKTOP_OAUTH_CLIENT_ID: ${{ secrets.DESKTOP_OAUTH_CLIENT_ID }} - DESKTOP_OAUTH_CLIENT_SECRET: - ${{ secrets.DESKTOP_OAUTH_CLIENT_SECRET }} - APPLE_ID: ${{ secrets.APPLE_ID }} - APPLE_ID_PASSWORD: ${{ secrets.APPLE_ID_PASSWORD }} - DESKTOPBOT_TOKEN: ${{ secrets.DESKTOPBOT_TOKEN }} - KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} npm_config_arch: ${{ matrix.arch }} TARGET_ARCH: ${{ matrix.arch }} - name: Prepare testing environment @@ -74,15 +79,20 @@ jobs: - name: Run script tests if: matrix.arch == 'x64' run: yarn test:script - - name: Publish production app - run: yarn run publish + - name: Package application + run: yarn run package + if: ${{ matrix.os == 'ubuntu-20.04' && matrix.arch == 'x64' }} + - name: Create Release + uses: softprops/action-gh-release@v1 + if: + ${{ matrix.os == 'ubuntu-20.04' && startsWith(github.ref, + 'refs/tags/') }} + with: + files: | + dist/*.AppImage + dist/*.deb + dist/*.rpm + dist/*.txt + draft: true env: - npm_config_arch: ${{ matrix.arch }} - DESKTOPBOT_TOKEN: ${{ secrets.DESKTOPBOT_TOKEN }} - WINDOWS_CERT_PASSWORD: ${{ secrets.WINDOWS_CERT_PASSWORD }} - KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} - DEPLOYMENT_SECRET: ${{ secrets.DEPLOYMENT_SECRET }} - AZURE_STORAGE_ACCOUNT: ${{ secrets.AZURE_STORAGE_ACCOUNT }} - AZURE_STORAGE_ACCESS_KEY: ${{ secrets.AZURE_STORAGE_ACCESS_KEY }} - AZURE_BLOB_CONTAINER: ${{ secrets.AZURE_BLOB_CONTAINER }} - AZURE_STORAGE_URL: ${{ secrets.AZURE_STORAGE_URL }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 0118ec3438c..c1328f2d9cb 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -2,7 +2,7 @@ name: 'Code scanning - action' on: push: - branches: ['development'] + branches: ['development', 'linux'] pull_request: branches: ['development'] schedule: diff --git a/README.md b/README.md index d37bb71dc39..632624cd286 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# [GitHub Desktop](https://desktop.github.com) +# [GitHub Desktop](https://desktop.github.com) - The Linux Fork + +[![CI](https://github.com/shiftkey/desktop/actions/workflows/ci.yml/badge.svg)](https://github.com/shiftkey/desktop/actions/workflows/ci.yml) [GitHub Desktop](https://desktop.github.com/) is an open source [Electron](https://www.electronjs.org/)-based GitHub app. It is written in [TypeScript](https://www.typescriptlang.org) and @@ -16,91 +18,142 @@ uses [React](https://reactjs.org/). /> -## Where can I get it? +## What is this repository for? + +This repository contains specific patches on top of the upstream +`desktop/desktop` repository to support Linux usage. + +It also publishes [releases](https://github.com/shiftkey/desktop/releases) for various Linux distributions: + + - AppImage (`.AppImage`) + - Debian (`.deb`) + - RPM (`.rpm`) + +## Installation via package manager + +You can use your operating system's package manager to install `github-desktop` and +keep it up to date on Debian and RPM-based distributions. + +### Debian/Ubuntu + +There are two APT package feeds available, both hosted in the US. You only need +to add one or the other here, as both of these are generated based on the +releases from this repository. + +#### [@shiftkey](https://github.com/shiftkey) package feed + +``` +wget -qO - https://apt.packages.shiftkey.dev/gpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/shiftkey-packages.gpg > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/shiftkey-packages.gpg] https://apt.packages.shiftkey.dev/ubuntu/ any main" > /etc/apt/sources.list.d/shiftkey-packages.list' +``` + +#### [@mwt](https://github.com/mwt) package feed + +```sh +wget -qO - https://mirror.mwt.me/shiftkey-desktop/gpgkey | gpg --dearmor | sudo tee /usr/share/keyrings/mwt-desktop.gpg > /dev/null +sudo sh -c 'echo "deb [arch=amd64 signed-by=/usr/share/keyrings/mwt-desktop.gpg] https://mirror.mwt.me/shiftkey-desktop/deb/ any main" > /etc/apt/sources.list.d/mwt-desktop.list' +``` + +#### Installation + +Once you have a feed configured, run this command to install the application: + +```sh +sudo apt update && sudo apt install github-desktop +``` + +### Red Hat/CentOS/Fedora + +There are two RPM package feeds available, both hosted in the US. You only need +to add one or the other here, as both of these are generated based on the +releases from this repository. -Download the official installer for your operating system: +#### [@shiftkey](https://github.com/shiftkey) package feed - - [macOS](https://central.github.com/deployments/desktop/desktop/latest/darwin) - - [macOS (Apple silicon)](https://central.github.com/deployments/desktop/desktop/latest/darwin-arm64) - - [Windows](https://central.github.com/deployments/desktop/desktop/latest/win32) - - [Windows machine-wide install](https://central.github.com/deployments/desktop/desktop/latest/win32?format=msi) +``` +sudo rpm --import https://rpm.packages.shiftkey.dev/gpg.key +sudo sh -c 'echo -e "[shiftkey-packages]\nname=GitHub Desktop\nbaseurl=https://rpm.packages.shiftkey.dev/rpm/\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://rpm.packages.shiftkey.dev/gpg.key" > /etc/yum.repos.d/shiftkey-packages.repo' +``` -You can install this alongside your existing GitHub Desktop for Mac or GitHub -Desktop for Windows application. +#### [@mwt](https://github.com/mwt) package feed -Linux is not officially supported; however, you can find installers created for Linux from a fork of GitHub Desktop in the [Community Releases](https://github.com/desktop/desktop#community-releases) section. +```sh +sudo rpm --import https://mirror.mwt.me/shiftkey-desktop/gpgkey +sudo sh -c 'echo -e "[mwt-packages]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/shiftkey-desktop/rpm\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/shiftkey-desktop/gpgkey" > /etc/yum.repos.d/mwt-packages.repo' +``` -**NOTE**: There is no current migration path to import your existing -repositories into the new application - you can drag-and-drop your repositories -from disk onto the application to get started. +#### Installation +Once you have a feed configured, run this command to install the application: -### Beta Channel +```sh +# if yum is your package manager +sudo yum install github-desktop -Want to test out new features and get fixes before everyone else? Install the -beta channel to get access to early builds of Desktop: +# if dnf is your package manager +sudo dnf install github-desktop - - [macOS](https://central.github.com/deployments/desktop/desktop/latest/darwin?env=beta) - - [macOS (Apple silicon)](https://central.github.com/deployments/desktop/desktop/latest/darwin-arm64?env=beta) - - [Windows](https://central.github.com/deployments/desktop/desktop/latest/win32?env=beta) - - [Windows (ARM64)](https://central.github.com/deployments/desktop/desktop/latest/win32-arm64?env=beta) +# if zypper is your package manager +sudo zypper ref && sudo zypper in github-desktop +``` -The release notes for the latest beta versions are available [here](https://desktop.github.com/release-notes/?env=beta). +#### OpenSUSE -### Community Releases +There are two RPM package feeds available, both hosted in the US. You only need +to add one or the other here, as both of these are generated based on the +releases from this repository. -There are several community-supported package managers that can be used to -install GitHub Desktop: - - Windows users can install using [winget](https://docs.microsoft.com/en-us/windows/package-manager/winget/) `c:\> winget install github-desktop` or [Chocolatey](https://chocolatey.org/) `c:\> choco install github-desktop` - - macOS users can install using [Homebrew](https://brew.sh/) package manager: - `$ brew install --cask github` +#### [@shiftkey](https://github.com/shiftkey) package feed -Installers for various Linux distributions can be found on the -[`shiftkey/desktop`](https://github.com/shiftkey/desktop) fork. +``` +sudo rpm --import https://rpm.packages.shiftkey.dev/gpg.key +sudo sh -c 'echo -e "[shiftkey-packages]\nname=GitHub Desktop\nbaseurl=https://rpm.packages.shiftkey.dev/rpm/\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://rpm.packages.shiftkey.dev/gpg.key" > /etc/zypp/repos.d/shiftkey-packages.repo' +``` -Arch Linux users can install the latest version from the -[AUR](https://aur.archlinux.org/packages/github-desktop-bin/). +#### [@mwt](https://github.com/mwt) package feed -## Is GitHub Desktop right for me? What are the primary areas of focus? +```sh +sudo rpm --import https://mirror.mwt.me/shiftkey-desktop/gpgkey +sudo sh -c 'echo -e "[mwt-packages]\nname=GitHub Desktop\nbaseurl=https://mirror.mwt.me/shiftkey-desktop/rpm\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=https://mirror.mwt.me/shiftkey-desktop/gpgkey" > /etc/zypp/repos.d/mwt-packages.repo' +``` -[This document](https://github.com/desktop/desktop/blob/development/docs/process/what-is-desktop.md) describes the focus of GitHub Desktop and who the product is most useful for. +#### Installation -And to see what the team is working on currently and in the near future, check out the [GitHub Desktop roadmap](https://github.com/desktop/desktop/blob/development/docs/process/roadmap.md). +```sh +sudo zypper ref && sudo zypper in github-desktop +``` -## I have a problem with GitHub Desktop -Note: The [GitHub Desktop Code of Conduct](https://github.com/desktop/desktop/blob/development/CODE_OF_CONDUCT.md) applies in all interactions relating to the GitHub Desktop project. +## Other Distributions -First, please search the [open issues](https://github.com/desktop/desktop/issues?q=is%3Aopen) -and [closed issues](https://github.com/desktop/desktop/issues?q=is%3Aclosed) -to see if your issue hasn't already been reported (it may also be fixed). +### Arch Linux -There is also a list of [known issues](https://github.com/desktop/desktop/blob/development/docs/known-issues.md) -that are being tracked against Desktop, and some of these issues have workarounds. +Arch Linux users can install GitHub Desktop from the [AUR](https://aur.archlinux.org/packages/github-desktop-bin/). -If you can't find an issue that matches what you're seeing, open a [new issue](https://github.com/desktop/desktop/issues/new/choose), -choose the right template and provide us with enough information to investigate -further. +`gnome-keyring` is required and the daemon must be launched either at login or when the X server is started. Normally this is handled by a display manager, but in other cases following the instructions found on the [Arch Wiki](https://wiki.archlinux.org/index.php/GNOME/Keyring#Using_the_keyring_outside_GNOME) will fix the issue of not being able to save login credentials. -## The issue I reported isn't fixed yet. What can I do? +### Cross-Distribution Packages -If nobody has responded to your issue in a few days, you're welcome to respond to it with a friendly ping in the issue. Please do not respond more than a second time if nobody has responded. The GitHub Desktop maintainers are constrained in time and resources, and diagnosing individual configurations can be difficult and time consuming. While we'll try to at least get you pointed in the right direction, we can't guarantee we'll be able to dig too deeply into any one person's issue. +GitHub Desktop is also available cross-platform as a [Flatpak](https://github.com/flathub/io.github.shiftey.Desktop) and [AppImage](https://appimage.github.io/GitHubDesktop/). -## How can I contribute to GitHub Desktop? +### deb-get -The [CONTRIBUTING.md](./.github/CONTRIBUTING.md) document will help you get setup and -familiar with the source. The [documentation](docs/) folder also contains more -resources relevant to the project. +Debian/Ubuntu users can also install directly from this repository using [`deb-get`](https://github.com/wimpysworld/deb-get): `deb-get install github-desktop`. -If you're looking for something to work on, check out the [help wanted](https://github.com/desktop/desktop/issues?q=is%3Aissue+is%3Aopen+label%3A%22help%20wanted%22) label. +## Known issues -## Building Desktop +If you're having troubles with Desktop, please refer to the [Known issues](docs/known-issues.md#linux) +document for guidance and workarounds for common limitations. -To get your development environment set up for building Desktop, see [setup.md](./docs/contributing/setup.md). +If your package manager is still trying to reach PackageCloud, refer to the +[cleanup instructions](docs/known-issues.md#the-packagecloud-package-feed-is-no-longer-working) +for details about migrating away. -## More Resources +## More information -See [desktop.github.com](https://desktop.github.com) for more product-oriented +Please check out the [README](https://github.com/desktop/desktop#github-desktop) +on the upstream [GitHub Desktop project](https://github.com/desktop/desktop) and +[desktop.github.com](https://desktop.github.com) for more product-oriented information about GitHub Desktop. diff --git a/app/package.json b/app/package.json index e2451edb93a..a024cbaeb45 100644 --- a/app/package.json +++ b/app/package.json @@ -1,5 +1,5 @@ { - "name": "desktop", + "name": "github-desktop", "productName": "GitHub Desktop", "bundleID": "com.github.GitHubClient", "companyName": "GitHub, Inc.", @@ -30,7 +30,7 @@ "desktop-trampoline": "desktop/desktop-trampoline#v0.9.8", "dexie": "^3.2.2", "dompurify": "^2.3.3", - "dugite": "^2.5.0", + "@shiftkey/dugite": "2.5.0-shiftkey1", "electron-window-state": "^5.0.3", "event-kit": "^2.0.0", "focus-trap-react": "^8.1.0", diff --git a/app/src/cli/open-desktop.ts b/app/src/cli/open-desktop.ts index e81b97a94b7..49091d188c0 100644 --- a/app/src/cli/open-desktop.ts +++ b/app/src/cli/open-desktop.ts @@ -14,6 +14,8 @@ export function openDesktop(url: string = '') { // https://github.com/nodejs/node/blob/b39dabefe6d/lib/child_process.js#L565-L577 const shell = process.env.comspec || 'cmd.exe' return ChildProcess.spawn(shell, ['/d', '/c', 'start', url], { env }) + } else if (__LINUX__) { + return ChildProcess.spawn('xdg-open', [url], { env }) } else { throw new Error( `Desktop command line interface not currently supported on platform ${process.platform}` diff --git a/app/src/lib/editors/found-editor.ts b/app/src/lib/editors/found-editor.ts index a2c7f2bb5ad..c6a54597cc5 100644 --- a/app/src/lib/editors/found-editor.ts +++ b/app/src/lib/editors/found-editor.ts @@ -1,5 +1,11 @@ export interface IFoundEditor { readonly editor: T readonly path: string + /** + * Indicate to Desktop to launch the editor with the `shell: true` option included. + * + * This is available to all platforms, but is only currently used by some Windows + * editors as their launch programs end in `.cmd` + */ readonly usesShell?: boolean } diff --git a/app/src/lib/editors/launch.ts b/app/src/lib/editors/launch.ts index 63bcfdbcd11..45cbfd1b306 100644 --- a/app/src/lib/editors/launch.ts +++ b/app/src/lib/editors/launch.ts @@ -1,7 +1,25 @@ import { spawn, SpawnOptions } from 'child_process' -import { pathExists } from '../../ui/lib/path-exists' +import { pathExists as pathExistsDefault } from '../../ui/lib/path-exists' +import { pathExists as pathExistsLinux, spawnEditor } from '../helpers/linux' import { ExternalEditorError, FoundEditor } from './shared' +/** + * Use a platform-specific pathExists based on the platform, to simplify changes + * to the application logic + * + * @param path the location of some program on disk + * + * @returns `true` if the path exists on disk, or `false` otherwise + * + */ +function pathExists(path: string) { + if (__LINUX__) { + return pathExistsLinux(path) + } else { + return pathExistsDefault(path) + } +} + /** * Open a given file or folder in the desired external editor. * @@ -35,6 +53,8 @@ export async function launchExternalEditor( // In macOS we can use `open`, which will open the right executable file // for us, we only need the path to the editor .app folder. spawn('open', ['-a', editorPath, fullPath], opts) + } else if (__LINUX__) { + spawnEditor(editorPath, fullPath, opts) } else { spawn(editorPath, [fullPath], opts) } diff --git a/app/src/lib/editors/linux.ts b/app/src/lib/editors/linux.ts index d7a0308b3c2..e53cee7c535 100644 --- a/app/src/lib/editors/linux.ts +++ b/app/src/lib/editors/linux.ts @@ -1,4 +1,5 @@ -import { pathExists } from '../../ui/lib/path-exists' +import { pathExists } from '../helpers/linux' + import { IFoundEditor } from './found-editor' /** Represents an external editor on Linux */ diff --git a/app/src/lib/git/apply.ts b/app/src/lib/git/apply.ts index bf3680cce19..f7878d49084 100644 --- a/app/src/lib/git/apply.ts +++ b/app/src/lib/git/apply.ts @@ -1,4 +1,4 @@ -import { GitError as DugiteError } from 'dugite' +import { GitError as DugiteError } from '@shiftkey/dugite' import { git } from './core' import { WorkingDirectoryFileChange, diff --git a/app/src/lib/git/authentication.ts b/app/src/lib/git/authentication.ts index 59d2b0f71b0..53e8246fcf9 100644 --- a/app/src/lib/git/authentication.ts +++ b/app/src/lib/git/authentication.ts @@ -1,4 +1,4 @@ -import { GitError as DugiteError } from 'dugite' +import { GitError as DugiteError } from '@shiftkey/dugite' import { IGitAccount } from '../../models/git-account' /** Get the environment for authenticating remote operations. */ diff --git a/app/src/lib/git/branch.ts b/app/src/lib/git/branch.ts index 936c792191a..a6a0423b25d 100644 --- a/app/src/lib/git/branch.ts +++ b/app/src/lib/git/branch.ts @@ -4,7 +4,7 @@ import { Branch } from '../../models/branch' import { IGitAccount } from '../../models/git-account' import { formatAsLocalRef } from './refs' import { deleteRef } from './update-ref' -import { GitError as DugiteError } from 'dugite' +import { GitError as DugiteError } from '@shiftkey/dugite' import { getRemoteURL } from './remote' import { envForRemoteOperation, diff --git a/app/src/lib/git/cherry-pick.ts b/app/src/lib/git/cherry-pick.ts index 2ddacd68053..3cf4dd3b268 100644 --- a/app/src/lib/git/cherry-pick.ts +++ b/app/src/lib/git/cherry-pick.ts @@ -1,5 +1,5 @@ import * as Path from 'path' -import { GitError } from 'dugite' +import { GitError } from '@shiftkey/dugite' import { Repository } from '../../models/repository' import { AppFileStatusKind, diff --git a/app/src/lib/git/core.ts b/app/src/lib/git/core.ts index 8c666f4b514..7cc6f058655 100644 --- a/app/src/lib/git/core.ts +++ b/app/src/lib/git/core.ts @@ -3,7 +3,7 @@ import { IGitResult as DugiteResult, GitError as DugiteError, IGitExecutionOptions as DugiteExecutionOptions, -} from 'dugite' +} from '@shiftkey/dugite' import { assertNever } from '../fatal-error' import * as GitPerf from '../../ui/lib/git-perf' diff --git a/app/src/lib/git/diff.ts b/app/src/lib/git/diff.ts index c43cf46278f..72e6e5e8a54 100644 --- a/app/src/lib/git/diff.ts +++ b/app/src/lib/git/diff.ts @@ -29,7 +29,7 @@ import { readFile } from 'fs/promises' import { forceUnwrap } from '../fatal-error' import { git } from './core' import { NullTreeSHA } from './diff-index' -import { GitError } from 'dugite' +import { GitError } from '@shiftkey/dugite' import { IChangesetData, parseRawLogWithNumstat } from './log' import { getConfigValue } from './config' import { getMergeBase } from './merge' diff --git a/app/src/lib/git/for-each-ref.ts b/app/src/lib/git/for-each-ref.ts index 5f477a07581..bcfe8d4b0a0 100644 --- a/app/src/lib/git/for-each-ref.ts +++ b/app/src/lib/git/for-each-ref.ts @@ -1,5 +1,5 @@ import { git } from './core' -import { GitError } from 'dugite' +import { GitError } from '@shiftkey/dugite' import { Repository } from '../../models/repository' import { Branch, diff --git a/app/src/lib/git/merge.ts b/app/src/lib/git/merge.ts index 7216fc21535..74e954f859a 100644 --- a/app/src/lib/git/merge.ts +++ b/app/src/lib/git/merge.ts @@ -1,7 +1,7 @@ import * as Path from 'path' import { git } from './core' -import { GitError } from 'dugite' +import { GitError } from '@shiftkey/dugite' import { Repository } from '../../models/repository' import { pathExists } from '../../ui/lib/path-exists' diff --git a/app/src/lib/git/push.ts b/app/src/lib/git/push.ts index eb81701baf1..7a474efd90c 100644 --- a/app/src/lib/git/push.ts +++ b/app/src/lib/git/push.ts @@ -1,4 +1,4 @@ -import { GitError as DugiteError } from 'dugite' +import { GitError as DugiteError } from '@shiftkey/dugite' import { git, diff --git a/app/src/lib/git/rebase.ts b/app/src/lib/git/rebase.ts index 5e84cca5bf1..095199b8f03 100644 --- a/app/src/lib/git/rebase.ts +++ b/app/src/lib/git/rebase.ts @@ -1,6 +1,6 @@ import * as Path from 'path' import { ChildProcess } from 'child_process' -import { GitError } from 'dugite' +import { GitError } from '@shiftkey/dugite' import byline from 'byline' import { Repository } from '../../models/repository' diff --git a/app/src/lib/git/remote.ts b/app/src/lib/git/remote.ts index 13de73ab5db..8e1be6b5ebd 100644 --- a/app/src/lib/git/remote.ts +++ b/app/src/lib/git/remote.ts @@ -1,5 +1,5 @@ import { git } from './core' -import { GitError } from 'dugite' +import { GitError } from '@shiftkey/dugite' import { Repository } from '../../models/repository' import { IRemote } from '../../models/remote' diff --git a/app/src/lib/git/rev-list.ts b/app/src/lib/git/rev-list.ts index 6e87fe31c2a..b4b3f11a203 100644 --- a/app/src/lib/git/rev-list.ts +++ b/app/src/lib/git/rev-list.ts @@ -1,4 +1,4 @@ -import { GitError } from 'dugite' +import { GitError } from '@shiftkey/dugite' import { git } from './core' import { Repository } from '../../models/repository' import { Branch, BranchType, IAheadBehind } from '../../models/branch' diff --git a/app/src/lib/git/show.ts b/app/src/lib/git/show.ts index d47927543c2..a323f67649e 100644 --- a/app/src/lib/git/show.ts +++ b/app/src/lib/git/show.ts @@ -4,7 +4,7 @@ import { git } from './core' import { spawnAndComplete } from './spawn' import { Repository } from '../../models/repository' -import { GitError } from 'dugite' +import { GitError } from '@shiftkey/dugite' import { enableMultiCommitDiffs } from '../feature-flag' /** diff --git a/app/src/lib/git/spawn.ts b/app/src/lib/git/spawn.ts index 5eb2831274d..764bdcf7eff 100644 --- a/app/src/lib/git/spawn.ts +++ b/app/src/lib/git/spawn.ts @@ -1,5 +1,5 @@ -import { GitProcess } from 'dugite' -import { IGitSpawnExecutionOptions } from 'dugite/build/lib/git-process' +import { GitProcess } from '@shiftkey/dugite' +import { IGitSpawnExecutionOptions } from '@shiftkey/dugite/build/lib/git-process' import * as GitPerf from '../../ui/lib/git-perf' import { isErrnoException } from '../errno-exception' import { withTrampolineEnv } from '../trampoline/trampoline-environment' diff --git a/app/src/lib/git/stash.ts b/app/src/lib/git/stash.ts index a5a3f292f8d..9a51d8dcabf 100644 --- a/app/src/lib/git/stash.ts +++ b/app/src/lib/git/stash.ts @@ -1,4 +1,4 @@ -import { GitError as DugiteError } from 'dugite' +import { GitError as DugiteError } from '@shiftkey/dugite' import { git, GitError } from './core' import { Repository } from '../../models/repository' import { diff --git a/app/src/lib/helpers/linux.ts b/app/src/lib/helpers/linux.ts new file mode 100644 index 00000000000..5595d2a537e --- /dev/null +++ b/app/src/lib/helpers/linux.ts @@ -0,0 +1,105 @@ +import { join } from 'path' +import { pathExists as pathExistsInternal } from 'fs-extra' +import { + ChildProcess, + spawn, + SpawnOptionsWithoutStdio, + SpawnOptions, +} from 'child_process' + +export function isFlatpakBuild() { + return __LINUX__ && process.env.FLATPAK_HOST === '1' +} + +/** + * Convert an executable path to be relative to the flatpak host + * + * @param path a path to an executable relative to the root of the filesystem + * + */ +export function convertToFlatpakPath(path: string) { + if (!__LINUX__) { + return path + } + + if (path.startsWith('/opt/') || path.startsWith('/var/lib/flatpak')) { + return path + } + + return join('/var/run/host', path) +} +export function formatWorkingDirectoryForFlatpak(path: string): string { + return path.replace(/(\s)/, ' ') +} + +export function formatPathForFlatpak(path: string): string { + if (path.startsWith('/var/lib/flatpak/app')) { + return path.replace('/var/lib/flatpak/app/', '') + } + return path +} +/** + * Checks the file path on disk exists before attempting to launch a specific shell + * + * @param path + * + * @returns `true` if the path can be resolved, or `false` otherwise + */ +export async function pathExists(path: string): Promise { + if (isFlatpakBuild()) { + path = convertToFlatpakPath(path) + } + + try { + return await pathExistsInternal(path) + } catch { + return false + } +} + +/** + * Spawn a particular shell in a way that works for Flatpak-based usage + * + * @param path path to shell, relative to the root of the filesystem + * @param args arguments to provide to the shell + * @param options additional options to provide to spawn function + * + * @returns a child process to observe and monitor + */ +export function spawnShell( + path: string, + args: string[], + options?: SpawnOptionsWithoutStdio +): ChildProcess { + if (isFlatpakBuild()) { + return spawn('flatpak-spawn', ['--host', path, ...args], options) + } + + return spawn(path, args, options) +} + +/** + * Spawn a given editor in a way that works for Flatpak-based usage + * + * @param path path to editor, relative to the root of the filesystem + * @param workingDirectory working directory to open initially in editor + * @param options additional options to provide to spawn function + */ +export function spawnEditor( + path: string, + workingDirectory: string, + options: SpawnOptions +): ChildProcess { + if (isFlatpakBuild()) { + const actualpath = formatPathForFlatpak(path) + const EscapedworkingDirectory = + formatWorkingDirectoryForFlatpak(workingDirectory) + return spawn( + 'flatpak-spawn', + ['--host', actualpath, EscapedworkingDirectory], + options + ) + } else { + return spawn(path, [workingDirectory], options) + } +} diff --git a/app/src/lib/shells/linux.ts b/app/src/lib/shells/linux.ts index 7ab0a4a5e89..2eb1aa3b824 100644 --- a/app/src/lib/shells/linux.ts +++ b/app/src/lib/shells/linux.ts @@ -1,11 +1,12 @@ -import { spawn, ChildProcess } from 'child_process' +import { ChildProcess } from 'child_process' import { assertNever } from '../fatal-error' import { IFoundShell } from './found-shell' import { parseEnumValue } from '../enum' -import { pathExists } from '../../ui/lib/path-exists' +import { pathExists as pathExistsLinux, spawnShell } from '../helpers/linux' export enum Shell { Gnome = 'GNOME Terminal', + GnomeConsole = 'GNOME Console', Mate = 'MATE Terminal', Tilix = 'Tilix', Terminator = 'Terminator', @@ -18,6 +19,7 @@ export enum Shell { XFCE = 'XFCE Terminal', Alacritty = 'Alacritty', Kitty = 'Kitty', + LXTerminal = 'LXDE Terminal', } export const Default = Shell.Gnome @@ -27,13 +29,15 @@ export function parse(label: string): Shell { } async function getPathIfAvailable(path: string): Promise { - return (await pathExists(path)) ? path : null + return (await pathExistsLinux(path)) ? path : null } function getShellPath(shell: Shell): Promise { switch (shell) { case Shell.Gnome: return getPathIfAvailable('/usr/bin/gnome-terminal') + case Shell.GnomeConsole: + return getPathIfAvailable('/usr/bin/kgx') case Shell.Mate: return getPathIfAvailable('/usr/bin/mate-terminal') case Shell.Tilix: @@ -58,6 +62,8 @@ function getShellPath(shell: Shell): Promise { return getPathIfAvailable('/usr/bin/alacritty') case Shell.Kitty: return getPathIfAvailable('/usr/bin/kitty') + case Shell.LXTerminal: + return getPathIfAvailable('/usr/bin/lxterminal') default: return assertNever(shell, `Unknown shell: ${shell}`) } @@ -68,6 +74,7 @@ export async function getAvailableShells(): Promise< > { const [ gnomeTerminalPath, + gnomeConsolePath, mateTerminalPath, tilixPath, terminatorPath, @@ -80,8 +87,10 @@ export async function getAvailableShells(): Promise< xfcePath, alacrittyPath, kittyPath, + lxterminalPath, ] = await Promise.all([ getShellPath(Shell.Gnome), + getShellPath(Shell.GnomeConsole), getShellPath(Shell.Mate), getShellPath(Shell.Tilix), getShellPath(Shell.Terminator), @@ -94,6 +103,7 @@ export async function getAvailableShells(): Promise< getShellPath(Shell.XFCE), getShellPath(Shell.Alacritty), getShellPath(Shell.Kitty), + getShellPath(Shell.LXTerminal), ]) const shells: Array> = [] @@ -101,6 +111,10 @@ export async function getAvailableShells(): Promise< shells.push({ shell: Shell.Gnome, path: gnomeTerminalPath }) } + if (gnomeConsolePath) { + shells.push({ shell: Shell.GnomeConsole, path: gnomeConsolePath }) + } + if (mateTerminalPath) { shells.push({ shell: Shell.Mate, path: mateTerminalPath }) } @@ -149,6 +163,10 @@ export async function getAvailableShells(): Promise< shells.push({ shell: Shell.Kitty, path: kittyPath }) } + if (lxterminalPath) { + shells.push({ shell: Shell.LXTerminal, path: lxterminalPath }) + } + return shells } @@ -159,26 +177,33 @@ export function launch( const shell = foundShell.shell switch (shell) { case Shell.Gnome: + case Shell.GnomeConsole: case Shell.Mate: case Shell.Tilix: case Shell.Terminator: case Shell.XFCE: case Shell.Alacritty: - return spawn(foundShell.path, ['--working-directory', path]) + return spawnShell(foundShell.path, ['--working-directory', path]) case Shell.Urxvt: - return spawn(foundShell.path, ['-cd', path]) + return spawnShell(foundShell.path, ['-cd', path]) case Shell.Konsole: - return spawn(foundShell.path, ['--workdir', path]) + return spawnShell(foundShell.path, ['--workdir', path]) case Shell.Xterm: - return spawn(foundShell.path, ['-e', '/bin/bash'], { cwd: path }) + return spawnShell(foundShell.path, ['-e', '/bin/bash'], { cwd: path }) case Shell.Terminology: - return spawn(foundShell.path, ['-d', path]) + return spawnShell(foundShell.path, ['-d', path]) case Shell.Deepin: - return spawn(foundShell.path, ['-w', path]) + return spawnShell(foundShell.path, ['-w', path]) case Shell.Elementary: - return spawn(foundShell.path, ['-w', path]) + return spawnShell(foundShell.path, ['-w', path]) case Shell.Kitty: - return spawn(foundShell.path, ['--single-instance', '--directory', path]) + return spawnShell(foundShell.path, [ + '--single-instance', + '--directory', + path, + ]) + case Shell.LXTerminal: + return spawnShell(foundShell.path, ['--working-directory=' + path]) default: return assertNever(shell, `Unknown shell: ${shell}`) } diff --git a/app/src/lib/shells/shared.ts b/app/src/lib/shells/shared.ts index 8d9dad37f7c..149fd4d846c 100644 --- a/app/src/lib/shells/shared.ts +++ b/app/src/lib/shells/shared.ts @@ -3,9 +3,10 @@ import { ChildProcess } from 'child_process' import * as Darwin from './darwin' import * as Win32 from './win32' import * as Linux from './linux' +import { pathExists as pathExistsLinux } from '../helpers/linux' import { IFoundShell } from './found-shell' import { ShellError } from './error' -import { pathExists } from '../../ui/lib/path-exists' +import { pathExists as pathExistsDefault } from '../../ui/lib/path-exists' export type Shell = Darwin.Shell | Win32.Shell | Linux.Shell @@ -72,6 +73,23 @@ export async function findShellOrDefault(shell: Shell): Promise { } } +/** + * Use a platform-specific pathExists based on the platform, to simplify changes + * to the application logic + * + * @param path the location of some program on disk + * + * @returns `true` if the path exists on disk, or `false` otherwise + * + */ +function pathExists(path: string) { + if (__LINUX__) { + return pathExistsLinux(path) + } else { + return pathExistsDefault(path) + } +} + /** Launch the given shell at the path. */ export async function launchShell( shell: FoundShell, diff --git a/app/src/lib/stores/app-store.ts b/app/src/lib/stores/app-store.ts index a8702e62a5d..1762887aaae 100644 --- a/app/src/lib/stores/app-store.ts +++ b/app/src/lib/stores/app-store.ts @@ -270,7 +270,7 @@ import { WorkflowPreferences } from '../../models/workflow-preferences' import { RepositoryIndicatorUpdater } from './helpers/repository-indicator-updater' import { isAttributableEmailFor } from '../email' import { TrashNameLabel } from '../../ui/lib/context-menu' -import { GitError as DugiteError } from 'dugite' +import { GitError as DugiteError } from '@shiftkey/dugite' import { ErrorWithMetadata, CheckoutError, diff --git a/app/src/lib/stores/git-store.ts b/app/src/lib/stores/git-store.ts index 580ba2c13c5..abd0160776b 100644 --- a/app/src/lib/stores/git-store.ts +++ b/app/src/lib/stores/git-store.ts @@ -78,7 +78,7 @@ import { getRemoteHEAD, } from '../git' import { GitError as DugiteError } from '../../lib/git' -import { GitError } from 'dugite' +import { GitError } from '@shiftkey/dugite' import { RetryAction, RetryActionType } from '../../models/retry-actions' import { UpstreamAlreadyExistsError } from './upstream-already-exists-error' import { forceUnwrap } from '../fatal-error' diff --git a/app/src/main-process/app-window.ts b/app/src/main-process/app-window.ts index 0a8e7299d92..b4f2c6ff869 100644 --- a/app/src/main-process/app-window.ts +++ b/app/src/main-process/app-window.ts @@ -7,6 +7,7 @@ import { nativeTheme, } from 'electron' import { Emitter, Disposable } from 'event-kit' +import { join } from 'path' import { encodePathAsUrl } from '../lib/path' import { getWindowState, @@ -17,7 +18,6 @@ import { URLActionType } from '../lib/parse-app-url' import { ILaunchStats } from '../lib/stats' import { menuFromElectronMenu } from '../models/app-menu' import { now } from './now' -import * as path from 'path' import windowStateKeeper from 'electron-window-state' import * as ipcMain from './ipc-main' import * as ipcWebContents from './ipc-webcontents' @@ -76,7 +76,13 @@ export class AppWindow { } else if (__WIN32__) { windowOptions.frame = false } else if (__LINUX__) { - windowOptions.icon = path.join(__dirname, 'static', 'icon-logo.png') + windowOptions.icon = join(__dirname, 'static', 'logos', '512x512.png') + + // relax restriction here for users trying to run app at a small + // resolution and any other side-effects of dropping this restriction are + // currently unsupported + delete windowOptions.minHeight + delete windowOptions.minWidth } this.window = new BrowserWindow(windowOptions) diff --git a/app/src/main-process/main.ts b/app/src/main-process/main.ts index b7728befaf3..801577cd00b 100644 --- a/app/src/main-process/main.ts +++ b/app/src/main-process/main.ts @@ -151,6 +151,10 @@ if (__WIN32__ && process.argv.length > 1) { } } +if (__LINUX__ && process.argv.length > 1) { + handlePossibleProtocolLauncherArgs(process.argv) +} + initializeDesktopNotifications() function handleAppURL(url: string) { @@ -269,6 +273,16 @@ function handlePossibleProtocolLauncherArgs(args: ReadonlyArray) { } else { log.error(`Malformed launch arguments received: ${args}`) } + } else if (__LINUX__) { + // we expect this call to have several parameters before the URL we want, + // so we should filter out the program name as well as any parameters that + // look like arguments to Electron + const argsWithoutParameters = args.filter( + a => !a.endsWith('github-desktop') && !a.startsWith('--') + ) + if (argsWithoutParameters.length > 0) { + handleAppURL(argsWithoutParameters[0]) + } } else if (args.length > 1) { handleAppURL(args[1]) } diff --git a/app/src/main-process/menu/build-default-menu.ts b/app/src/main-process/menu/build-default-menu.ts index a0e394c04c0..8a7efa9a802 100644 --- a/app/src/main-process/menu/build-default-menu.ts +++ b/app/src/main-process/menu/build-default-menu.ts @@ -1,4 +1,4 @@ -import { Menu, shell, app, BrowserWindow } from 'electron' +import { Menu, shell, BrowserWindow } from 'electron' import { ensureItemIds } from './ensure-item-ids' import { MenuEvent } from './menu-event' import { truncateWithEllipsis } from '../../lib/truncate-with-ellipsis' @@ -489,22 +489,11 @@ export function buildDefaultMenu({ label: __DARWIN__ ? 'Report Issue…' : 'Report issue…', click() { shell - .openExternal('https://github.com/desktop/desktop/issues/new/choose') + .openExternal('https://github.com/shiftkey/desktop/issues/new/choose') .catch(err => log.error('Failed opening issue creation page', err)) }, } - const contactSupportItem: Electron.MenuItemConstructorOptions = { - label: __DARWIN__ ? 'Contact GitHub Support…' : '&Contact GitHub support…', - click() { - shell - .openExternal( - `https://github.com/contact?from_desktop_app=1&app_version=${app.getVersion()}` - ) - .catch(err => log.error('Failed opening contact support page', err)) - }, - } - const showUserGuides: Electron.MenuItemConstructorOptions = { label: 'Show User Guides', click() { @@ -543,7 +532,6 @@ export function buildDefaultMenu({ const helpItems = [ submitIssueItem, - contactSupportItem, showUserGuides, showKeyboardShortcuts, showLogsItem, diff --git a/app/src/ui/about/about.tsx b/app/src/ui/about/about.tsx index ad5ecf5de29..16f2b2f1e47 100644 --- a/app/src/ui/about/about.tsx +++ b/app/src/ui/about/about.tsx @@ -14,7 +14,7 @@ import { Disposable } from 'event-kit' import { Loading } from '../lib/loading' import { RelativeTime } from '../relative-time' import { assertNever } from '../../lib/fatal-error' -import { ReleaseNotesUri } from '../lib/releases' +import { ReleaseNotesUri, LinuxReleasesUri } from '../lib/releases' import { encodePathAsUrl } from '../../lib/path' import { isTopMostDialog } from '../dialog/is-top-most' @@ -136,6 +136,17 @@ export class About extends React.Component { return null } + if (__LINUX__) { + const linuxReleaseLink = ( + View Releases + ) + return ( + +

{linuxReleaseLink}

+
+ ) + } + const updateStatus = this.state.updateState.status switch (updateStatus) { @@ -227,7 +238,12 @@ export class About extends React.Component { private renderUpdateDetails() { if (__LINUX__) { - return null + return ( +

+ Please visit the GitHub Desktop for Linux release page for + Linux-specific release notes and to download the latest version. +

+ ) } if (__RELEASE_CHANNEL__ === 'development') { @@ -287,6 +303,10 @@ export class About extends React.Component { return } + if (__LINUX__) { + return + } + return (

Looking for the latest features?

diff --git a/app/src/ui/add-repository/add-existing-repository.tsx b/app/src/ui/add-repository/add-existing-repository.tsx index 3ea78822309..6190dbe1362 100644 --- a/app/src/ui/add-repository/add-existing-repository.tsx +++ b/app/src/ui/add-repository/add-existing-repository.tsx @@ -16,6 +16,7 @@ import { FoldoutType } from '../../lib/app-state' import untildify from 'untildify' import { showOpenDialog } from '../main-process-proxy' import { Ref } from '../lib/ref' +import { isGitRepository } from './create-repository' interface IAddExistingRepositoryProps { readonly dispatcher: Dispatcher @@ -237,9 +238,9 @@ export class AddExistingRepository extends React.Component< } private onPathChanged = async (path: string) => { - if (this.state.path !== path) { - this.updatePath(path) - } + const isRepository = await isGitRepository(this.resolvedPath(path)) + + this.setState({ path, isRepository }) } private showFilePicker = async () => { diff --git a/app/src/ui/dispatcher/error-handlers.ts b/app/src/ui/dispatcher/error-handlers.ts index 34d670ae4f6..7356212d72a 100644 --- a/app/src/ui/dispatcher/error-handlers.ts +++ b/app/src/ui/dispatcher/error-handlers.ts @@ -1,7 +1,7 @@ import { GitError as DugiteError, RepositoryDoesNotExistErrorCode, -} from 'dugite' +} from '@shiftkey/dugite' import { Dispatcher } from '.' import { ExternalEditorError } from '../../lib/editors/shared' diff --git a/app/src/ui/lib/application-theme.ts b/app/src/ui/lib/application-theme.ts index 47ad7e8dffc..f7da2a1ec00 100644 --- a/app/src/ui/lib/application-theme.ts +++ b/app/src/ui/lib/application-theme.ts @@ -142,7 +142,7 @@ export function supportsSystemThemeChanges(): boolean { return isWindows10And1809Preview17666OrLater() } - return false + return __LINUX__ } function isDarkModeEnabled(): Promise { diff --git a/app/src/ui/lib/releases.ts b/app/src/ui/lib/releases.ts index 958ccad3722..ba088f73374 100644 --- a/app/src/ui/lib/releases.ts +++ b/app/src/ui/lib/releases.ts @@ -2,3 +2,5 @@ export const ReleaseNotesUri = __RELEASE_CHANNEL__ === 'beta' ? 'https://desktop.github.com/release-notes/?env=beta' : 'https://desktop.github.com/release-notes/' + +export const LinuxReleasesUri = 'https://github.com/shiftkey/desktop/releases/' diff --git a/app/static/linux/github b/app/static/linux/github new file mode 100644 index 00000000000..0f7513eb244 --- /dev/null +++ b/app/static/linux/github @@ -0,0 +1,35 @@ +#!/bin/sh + +if [ ! -L "$0" ]; then + # if path is not a symlink, find relatively + GITHUB_PATH=$(dirname "$(dirname "$(dirname "$(dirname "$0")")")") +else + if command -v readlink >/dev/null; then + # if readlink exists, follow the symlink and then find relatively + SYMLINK=$(readlink -f "$0") + GITHUB_PATH=$(dirname "$(dirname "$(dirname "$(dirname "$SYMLINK")")")") + else + # else use the standard install location + GITHUB_PATH="/opt/GitHub Desktop" + fi +fi +# check if this is a dev install or standard +if [ -f "$GITHUB_PATH/github-desktop-dev" ]; then + BINARY_NAME="github-desktop-dev" +else + BINARY_NAME="github-desktop" +fi + +ELECTRON="$GITHUB_PATH/$BINARY_NAME" +CLI="$GITHUB_PATH/resources/app/cli.js" + +case $1 in + # if help in the first variable, return contents to shell + *help*|*--help*) + ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" "$@";; + # any other, redirect to /dev/null to detach from controlling terminal + *) + ELECTRON_RUN_AS_NODE=1 "$ELECTRON" "$CLI" "$@" < /dev/null > /dev/null &;; +esac + +exit $? diff --git a/app/static/linux/icon-logo.png b/app/static/linux/icon-logo.png deleted file mode 100644 index 7e598fe0118..00000000000 Binary files a/app/static/linux/icon-logo.png and /dev/null differ diff --git a/app/static/logos/1024x1024.png b/app/static/linux/logos/1024x1024.png similarity index 100% rename from app/static/logos/1024x1024.png rename to app/static/linux/logos/1024x1024.png diff --git a/app/static/linux/logos/128x128.png b/app/static/linux/logos/128x128.png new file mode 100644 index 00000000000..af1e5cfcd8c Binary files /dev/null and b/app/static/linux/logos/128x128.png differ diff --git a/app/static/logos/256x256.png b/app/static/linux/logos/256x256.png similarity index 100% rename from app/static/logos/256x256.png rename to app/static/linux/logos/256x256.png diff --git a/app/static/linux/logos/32x32.png b/app/static/linux/logos/32x32.png new file mode 100644 index 00000000000..f1b5f9719ea Binary files /dev/null and b/app/static/linux/logos/32x32.png differ diff --git a/app/static/logos/512x512.png b/app/static/linux/logos/512x512.png similarity index 100% rename from app/static/logos/512x512.png rename to app/static/linux/logos/512x512.png diff --git a/app/static/linux/logos/64x64.png b/app/static/linux/logos/64x64.png new file mode 100644 index 00000000000..77fe2a72c18 Binary files /dev/null and b/app/static/linux/logos/64x64.png differ diff --git a/app/styles/_variables.scss b/app/styles/_variables.scss index 95e27861a01..0738f436ed4 100644 --- a/app/styles/_variables.scss +++ b/app/styles/_variables.scss @@ -83,7 +83,7 @@ $overlay-background-color: rgba(0, 0, 0, 0.4); * Background color for custom scroll bars. * The color is applied to the thumb part of the scrollbar. * - * Note: Only applies to win32 platforms + * Note: Only applies to win32 and linux platforms */ --scroll-bar-thumb-background-color: rgba(0, 0, 0, 0.2); @@ -91,7 +91,7 @@ $overlay-background-color: rgba(0, 0, 0, 0.4); * Background color for custom scroll bars in their active state. * The color is applied to the thumb part of the scrollbar. * - * Note: Only applies to win32 platforms + * Note: Only applies to win32 and linux platforms */ --scroll-bar-thumb-background-color-active: rgba(0, 0, 0, 0.5); @@ -301,8 +301,9 @@ $overlay-background-color: rgba(0, 0, 0, 0.4); --list-item-selected-active-badge-background-color: #{$white}; --list-item-hover-background-color: #{$gray-100}; - /** Win32 has custom scrol bars, see _scroll.scss */ + /** Windows/Linux have custom scrollbars, see _scroll.scss */ --win32-scroll-bar-size: 10px; + --linux-scroll-bar-size: 10px; /** * The z-index for tooltips. Nothing should be higher, but other z-indexes can diff --git a/app/styles/mixins/_platform.scss b/app/styles/mixins/_platform.scss index 0191bdd2dcc..b3c7bd55584 100644 --- a/app/styles/mixins/_platform.scss +++ b/app/styles/mixins/_platform.scss @@ -41,3 +41,25 @@ @content; } } + +// A mixin which takes a content block that should only +// be applied when the current (real or emulated) operating +// system is Linux. +// +// This helper mixin is useful in so far that it allows us +// to keep platform specific styles next to cross-platform +// styles instead of splitting them out and possibly forgetting +// about them. +@mixin linux { + body.platform-linux & { + @content; + } +} + +// An exact copy of the linux mixin except that it allows for +// writing base-level rules +@mixin linux-context { + body.platform-linux { + @content; + } +} diff --git a/app/styles/themes/_dark.scss b/app/styles/themes/_dark.scss index fdfb75ffe26..788052df54d 100644 --- a/app/styles/themes/_dark.scss +++ b/app/styles/themes/_dark.scss @@ -49,16 +49,16 @@ body.theme-dark { * Background color for custom scroll bars. * The color is applied to the thumb part of the scrollbar. * - * Note: Only applies to win32 platforms + * Note: Only applies to win32 and linux platforms */ --scroll-bar-thumb-background-color: rgba(255, 255, 255, 0.2); /** - * Background color for custom scroll bars in their active state. - * The color is applied to the thumb part of the scrollbar. - * - * Note: Only applies to win32 platforms - */ + * Background color for custom scroll bars in their active state. + * The color is applied to the thumb part of the scrollbar. + * + * Note: Only applies to win32 and linux platforms + */ --scroll-bar-thumb-background-color-active: rgba(255, 255, 255, 0.5); // Box diff --git a/app/styles/ui/_scroll.scss b/app/styles/ui/_scroll.scss index 30f477b7296..6d7f5152e77 100644 --- a/app/styles/ui/_scroll.scss +++ b/app/styles/ui/_scroll.scss @@ -59,3 +59,40 @@ } } } + +@include linux-context { + // Linux scrollbars need styled, too + ::-webkit-scrollbar { + width: var(--linux-scroll-bar-size); + height: var(--linux-scroll-bar-size); + background: transparent; + cursor: pointer; + + &-thumb { + background-color: var(--scroll-bar-thumb-background-color); + border-radius: var(--linux-scroll-bar-size); + + // This little hack allows us to have a slim scroll bar + // with a bigger hit area. The scroll bar width/height + // is 10px but we're cutting off 6px using clipping so + // that it appears as if it's actually only 4px. + border-color: transparent; + border-style: solid; + border-width: 3px; + background-clip: padding-box; + + // ...and when it's pressed we'll up the contrast + &:active { + background-color: var(--scroll-bar-thumb-background-color-active); + } + + // When someone hovers over, or presses the bar we'll expand it to 8px + &:hover, + &:active { + border-width: 1px; + background-color: var(--scroll-bar-thumb-background-color-active); + cursor: pointer; + } + } + } +} diff --git a/app/test/helpers/local-config.ts b/app/test/helpers/local-config.ts index 945f12fa578..42ab21afb6b 100644 --- a/app/test/helpers/local-config.ts +++ b/app/test/helpers/local-config.ts @@ -1,5 +1,5 @@ import { Repository } from '../../src/models/repository' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' export async function setupLocalConfig( repository: Repository, diff --git a/app/test/helpers/repositories.ts b/app/test/helpers/repositories.ts index 65a5addf28d..b8cc534eae8 100644 --- a/app/test/helpers/repositories.ts +++ b/app/test/helpers/repositories.ts @@ -3,7 +3,7 @@ import * as FSE from 'fs-extra' import { mkdirSync } from './temp' import klawSync, { Item } from 'klaw-sync' import { Repository } from '../../src/models/repository' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { makeCommit, switchTo } from './repository-scaffolding' import { writeFile } from 'fs-extra' import { git } from '../../src/lib/git' diff --git a/app/test/helpers/repository-builder-branch-pruner.ts b/app/test/helpers/repository-builder-branch-pruner.ts index 5f3e76b6e38..dabb67a423c 100644 --- a/app/test/helpers/repository-builder-branch-pruner.ts +++ b/app/test/helpers/repository-builder-branch-pruner.ts @@ -1,6 +1,6 @@ import { setupEmptyRepository } from './repositories' import { makeCommit, switchTo } from './repository-scaffolding' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { RepositoriesStore, GitStore } from '../../src/lib/stores' import { RepositoryStateCache } from '../../src/lib/stores/repository-state-cache' import { diff --git a/app/test/helpers/repository-scaffolding.ts b/app/test/helpers/repository-scaffolding.ts index ad53ea8c82a..a5e9feabb99 100644 --- a/app/test/helpers/repository-scaffolding.ts +++ b/app/test/helpers/repository-scaffolding.ts @@ -1,4 +1,4 @@ -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import * as FSE from 'fs-extra' import * as Path from 'path' diff --git a/app/test/unit/app-store-test.ts b/app/test/unit/app-store-test.ts index c2d33debed1..9aa178c1a46 100644 --- a/app/test/unit/app-store-test.ts +++ b/app/test/unit/app-store-test.ts @@ -1,6 +1,6 @@ import * as Path from 'path' import * as FSE from 'fs-extra' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { AppStore, diff --git a/app/test/unit/branch-pruner-test.ts b/app/test/unit/branch-pruner-test.ts index 04c0aab75d8..02bf55d5bcb 100644 --- a/app/test/unit/branch-pruner-test.ts +++ b/app/test/unit/branch-pruner-test.ts @@ -6,7 +6,7 @@ import { RepositoryStateCache } from '../../src/lib/stores/repository-state-cach import { setupFixtureRepository } from '../helpers/repositories' import { shell } from '../helpers/test-app-shell' import { TestRepositoriesDatabase } from '../helpers/databases' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { createRepository as createPrunedRepository, setupRepository, diff --git a/app/test/unit/git-store-test.ts b/app/test/unit/git-store-test.ts index 391b5a56f0e..a9200f1a109 100644 --- a/app/test/unit/git-store-test.ts +++ b/app/test/unit/git-store-test.ts @@ -1,6 +1,6 @@ import * as FSE from 'fs-extra' import * as Path from 'path' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { shell } from '../helpers/test-app-shell' import { diff --git a/app/test/unit/git/apply-test.ts b/app/test/unit/git/apply-test.ts index 34450ded8f1..1eaf05593b6 100644 --- a/app/test/unit/git/apply-test.ts +++ b/app/test/unit/git/apply-test.ts @@ -1,4 +1,4 @@ -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { setupTwoCommitRepo, setupFixtureRepository, diff --git a/app/test/unit/git/branch-test.ts b/app/test/unit/git/branch-test.ts index 542c828aa3f..91d5c57c9cf 100644 --- a/app/test/unit/git/branch-test.ts +++ b/app/test/unit/git/branch-test.ts @@ -13,7 +13,7 @@ import { IUnbornRepository, } from '../../../src/models/tip' import { GitStore } from '../../../src/lib/stores' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { getBranchesPointedAt, createBranch, diff --git a/app/test/unit/git/checkout-test.ts b/app/test/unit/git/checkout-test.ts index de1c5ab0967..b49c94f9351 100644 --- a/app/test/unit/git/checkout-test.ts +++ b/app/test/unit/git/checkout-test.ts @@ -10,7 +10,7 @@ import { TipState, IValidBranch } from '../../../src/models/tip' import { GitStore } from '../../../src/lib/stores' import { Branch, BranchType } from '../../../src/models/branch' import { getStatusOrThrow } from '../../helpers/status' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { StatsStore, StatsDatabase } from '../../../src/lib/stats' import { UiActivityMonitor } from '../../../src/ui/lib/ui-activity-monitor' diff --git a/app/test/unit/git/cherry-pick-test.ts b/app/test/unit/git/cherry-pick-test.ts index 4588620b873..3116ff9666f 100644 --- a/app/test/unit/git/cherry-pick-test.ts +++ b/app/test/unit/git/cherry-pick-test.ts @@ -1,4 +1,4 @@ -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import * as FSE from 'fs-extra' import * as Path from 'path' import { diff --git a/app/test/unit/git/commit-test.ts b/app/test/unit/git/commit-test.ts index 16b844a2c2a..a5535220a7b 100644 --- a/app/test/unit/git/commit-test.ts +++ b/app/test/unit/git/commit-test.ts @@ -18,7 +18,7 @@ import { setupConflictedRepoWithMultipleFiles, } from '../../helpers/repositories' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { WorkingDirectoryFileChange, AppFileStatusKind, diff --git a/app/test/unit/git/config-test.ts b/app/test/unit/git/config-test.ts index 376d8d0297a..f52ab103513 100644 --- a/app/test/unit/git/config-test.ts +++ b/app/test/unit/git/config-test.ts @@ -1,4 +1,4 @@ -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import * as Path from 'path' import { Repository } from '../../../src/models/repository' diff --git a/app/test/unit/git/core-test.ts b/app/test/unit/git/core-test.ts index b61c94a0c75..60827b82201 100644 --- a/app/test/unit/git/core-test.ts +++ b/app/test/unit/git/core-test.ts @@ -1,4 +1,4 @@ -import { GitError } from 'dugite' +import { GitError } from '@shiftkey/dugite' import { Repository } from '../../../src/models/repository' import { git, diff --git a/app/test/unit/git/diff-test.ts b/app/test/unit/git/diff-test.ts index 8e1a2f198d0..4cc3021bc92 100644 --- a/app/test/unit/git/diff-test.ts +++ b/app/test/unit/git/diff-test.ts @@ -30,7 +30,7 @@ import { } from '../../../src/lib/git' import { getStatusOrThrow } from '../../helpers/status' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { makeCommit, switchTo } from '../../helpers/repository-scaffolding' async function getTextDiff( diff --git a/app/test/unit/git/format-patch-test.ts b/app/test/unit/git/format-patch-test.ts index d5092f4181e..724cb5c1695 100644 --- a/app/test/unit/git/format-patch-test.ts +++ b/app/test/unit/git/format-patch-test.ts @@ -8,7 +8,7 @@ import { cloneLocalRepository, makeCommit, } from '../../helpers/repository-scaffolding' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' describe('formatPatch', () => { describe('in a repo with commits', () => { diff --git a/app/test/unit/git/gitignore-test.ts b/app/test/unit/git/gitignore-test.ts index 9ddc1cf16c9..1d3ba2c94d6 100644 --- a/app/test/unit/git/gitignore-test.ts +++ b/app/test/unit/git/gitignore-test.ts @@ -1,6 +1,6 @@ import * as FSE from 'fs-extra' import * as Path from 'path' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { setupEmptyRepository } from '../../helpers/repositories' import { getStatusOrThrow } from '../../helpers/status' diff --git a/app/test/unit/git/lfs-test.ts b/app/test/unit/git/lfs-test.ts index 0ae47412a9b..adb69cb4889 100644 --- a/app/test/unit/git/lfs-test.ts +++ b/app/test/unit/git/lfs-test.ts @@ -6,7 +6,7 @@ import { setupEmptyRepository, } from '../../helpers/repositories' import { Repository } from '../../../src/models/repository' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { isUsingLFS, isTrackedByLFS, diff --git a/app/test/unit/git/merge-test.ts b/app/test/unit/git/merge-test.ts index 2b45457fbf0..f03a322f58c 100644 --- a/app/test/unit/git/merge-test.ts +++ b/app/test/unit/git/merge-test.ts @@ -10,7 +10,7 @@ import { setupFixtureRepository, setupConflictedRepo, } from '../../helpers/repositories' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { Repository } from '../../../src/models/repository' describe('git/merge', () => { diff --git a/app/test/unit/git/rebase/detect-conflict-test.ts b/app/test/unit/git/rebase/detect-conflict-test.ts index db928f9e157..0c100121c38 100644 --- a/app/test/unit/git/rebase/detect-conflict-test.ts +++ b/app/test/unit/git/rebase/detect-conflict-test.ts @@ -1,4 +1,4 @@ -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import * as FSE from 'fs-extra' import * as Path from 'path' diff --git a/app/test/unit/git/reflog-test.ts b/app/test/unit/git/reflog-test.ts index c9623106144..c95caf5b5ed 100644 --- a/app/test/unit/git/reflog-test.ts +++ b/app/test/unit/git/reflog-test.ts @@ -8,7 +8,7 @@ import { getBranchCheckouts, } from '../../../src/lib/git' import { setupFixtureRepository } from '../../helpers/repositories' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { offsetFromNow } from '../../../src/lib/offset-from' async function createAndCheckout( diff --git a/app/test/unit/git/remote-test.ts b/app/test/unit/git/remote-test.ts index 4ccfe6572d4..dff8c8665b6 100644 --- a/app/test/unit/git/remote-test.ts +++ b/app/test/unit/git/remote-test.ts @@ -11,7 +11,7 @@ import { setupEmptyDirectory, } from '../../helpers/repositories' import { findDefaultRemote } from '../../../src/lib/stores/helpers/find-default-remote' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' describe('git/remote', () => { describe('getRemotes', () => { diff --git a/app/test/unit/git/reorder-test.ts b/app/test/unit/git/reorder-test.ts index f8a06c87c42..f3c8570929e 100644 --- a/app/test/unit/git/reorder-test.ts +++ b/app/test/unit/git/reorder-test.ts @@ -11,7 +11,7 @@ import { Commit } from '../../../src/models/commit' import { Repository } from '../../../src/models/repository' import { setupEmptyRepositoryDefaultMain } from '../../helpers/repositories' import { makeCommit } from '../../helpers/repository-scaffolding' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { getStatusOrThrow } from '../../helpers/status' import { getTempFilePath } from '../../../src/lib/file-system' import { reorder } from '../../../src/lib/git/reorder' diff --git a/app/test/unit/git/reset-test.ts b/app/test/unit/git/reset-test.ts index 32ef18d37cb..b63b5650c60 100644 --- a/app/test/unit/git/reset-test.ts +++ b/app/test/unit/git/reset-test.ts @@ -4,7 +4,7 @@ import { Repository } from '../../../src/models/repository' import { reset, resetPaths, GitResetMode } from '../../../src/lib/git/reset' import { getStatusOrThrow } from '../../helpers/status' import { setupFixtureRepository } from '../../helpers/repositories' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import * as FSE from 'fs-extra' diff --git a/app/test/unit/git/rev-parse-test.ts b/app/test/unit/git/rev-parse-test.ts index 5e2c1b64288..2118bed3bdc 100644 --- a/app/test/unit/git/rev-parse-test.ts +++ b/app/test/unit/git/rev-parse-test.ts @@ -9,7 +9,7 @@ import { setupFixtureRepository, setupEmptyRepository, } from '../../helpers/repositories' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { mkdirSync } from '../../helpers/temp' import { writeFile } from 'fs-extra' diff --git a/app/test/unit/git/squash-test.ts b/app/test/unit/git/squash-test.ts index fb0bfefe055..cec600e0487 100644 --- a/app/test/unit/git/squash-test.ts +++ b/app/test/unit/git/squash-test.ts @@ -13,7 +13,7 @@ import { Repository } from '../../../src/models/repository' import { setupEmptyRepositoryDefaultMain } from '../../helpers/repositories' import { makeCommit } from '../../helpers/repository-scaffolding' import { squash } from '../../../src/lib/git/squash' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { getStatusOrThrow } from '../../helpers/status' import { getTempFilePath } from '../../../src/lib/file-system' diff --git a/app/test/unit/git/stash-test.ts b/app/test/unit/git/stash-test.ts index 3dfbfb8f84d..544923a251e 100644 --- a/app/test/unit/git/stash-test.ts +++ b/app/test/unit/git/stash-test.ts @@ -2,7 +2,7 @@ import * as FSE from 'fs-extra' import * as path from 'path' import { Repository } from '../../../src/models/repository' import { setupEmptyRepository } from '../../helpers/repositories' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { createDesktopStashMessage, createDesktopStashEntry, diff --git a/app/test/unit/git/status-test.ts b/app/test/unit/git/status-test.ts index 7163d039774..89ee17f9c61 100644 --- a/app/test/unit/git/status-test.ts +++ b/app/test/unit/git/status-test.ts @@ -1,6 +1,6 @@ import * as path from 'path' import * as FSE from 'fs-extra' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { Repository } from '../../../src/models/repository' diff --git a/app/test/unit/helpers/linux-test.ts b/app/test/unit/helpers/linux-test.ts new file mode 100644 index 00000000000..52873f4e9d0 --- /dev/null +++ b/app/test/unit/helpers/linux-test.ts @@ -0,0 +1,47 @@ +import { + convertToFlatpakPath, + formatWorkingDirectoryForFlatpak, +} from '../../../src/lib/helpers/linux' + +describe('convertToFlatpakPath()', () => { + if (__LINUX__) { + it('converts /usr paths', () => { + const path = '/usr/bin/subl' + const expectedPath = '/var/run/host/usr/bin/subl' + expect(convertToFlatpakPath(path)).toEqual(expectedPath) + }) + + it('preserves /opt paths', () => { + const path = '/opt/slickedit-pro2018/bin/vs' + expect(convertToFlatpakPath(path)).toEqual(path) + }) + } + + if (__WIN32__) { + it('returns same path', () => { + const path = 'C:\\Windows\\System32\\Notepad.exe' + expect(convertToFlatpakPath(path)).toEqual(path) + }) + } + + if (__DARWIN__) { + it('returns same path', () => { + const path = '/usr/local/bin/code' + expect(convertToFlatpakPath(path)).toEqual(path) + }) + } +}) + +describe('formatWorkingDirectoryForFlatpak()', () => { + if (__LINUX__) { + it('escapes string', () => { + const path = '/home/test/path with space' + const expectedPath = '/home/test/path with space' + expect(formatWorkingDirectoryForFlatpak(path)).toEqual(expectedPath) + }) + it('returns same path', () => { + const path = '/home/test/path_wthout_spaces' + expect(formatWorkingDirectoryForFlatpak(path)).toEqual(path) + }) + } +}) diff --git a/app/test/unit/parse-files-to-be-overwritten-test.ts b/app/test/unit/parse-files-to-be-overwritten-test.ts index f5ab0a1077a..64f7331d925 100644 --- a/app/test/unit/parse-files-to-be-overwritten-test.ts +++ b/app/test/unit/parse-files-to-be-overwritten-test.ts @@ -3,7 +3,7 @@ import { writeFile } from 'fs-extra' import { join } from 'path' import { git } from '../../src/lib/git' import { cloneLocalRepository } from '../helpers/repository-scaffolding' -import { GitError as DugiteError } from 'dugite' +import { GitError as DugiteError } from '@shiftkey/dugite' import { parseFilesToBeOverwritten } from '../../src/ui/lib/parse-files-to-be-overwritten' describe('parseFilesToBeOverwritten', () => { diff --git a/app/test/unit/text-diff-expansion-test.ts b/app/test/unit/text-diff-expansion-test.ts index d330178a4ff..f8725826b81 100644 --- a/app/test/unit/text-diff-expansion-test.ts +++ b/app/test/unit/text-diff-expansion-test.ts @@ -1,7 +1,7 @@ import * as path from 'path' import * as os from 'os' import * as FSE from 'fs-extra' -import { GitProcess } from 'dugite' +import { GitProcess } from '@shiftkey/dugite' import { DiffParser } from '../../src/lib/diff-parser' import { expandTextDiffHunk, diff --git a/app/yarn.lock b/app/yarn.lock index a1080588869..bf836e88de0 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -53,6 +53,14 @@ resolved "https://registry.yarnpkg.com/@icons/material/-/material-0.2.4.tgz#e90c9f71768b3736e76d7dd6783fc6c2afa88bc8" integrity sha512-QPcGmICAPbGLGb6F/yNf/KzKqvFx8z5qx3D1yFqVAjoFmXK35EgyW+cJ57Te3CNsmzblwtzakLGFqHPqrfb4Tw== +"@shiftkey/dugite@2.5.0-shiftkey1": + version "2.5.0-shiftkey1" + resolved "https://registry.yarnpkg.com/@shiftkey/dugite/-/dugite-2.5.0-shiftkey1.tgz#c764c9cb699d30214c23cd30a5578bf65d4ea500" + integrity sha512-xSns3OmXkc2aBXq3UZHPouDQAuXSp+BNFjVuRT9WG5wybpkPa41yKudHIKBamLw6JlQyAtduWcwli3DZYL5SGA== + dependencies: + progress "^2.0.3" + tar "^6.1.11" + accessibility-developer-tools@^2.11.0: version "2.12.0" resolved "https://registry.yarnpkg.com/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz#3da0cce9d6ec6373964b84f35db7cfc3df7ab514" @@ -387,14 +395,6 @@ dompurify@^2.3.3: resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.3.tgz#c1af3eb88be47324432964d8abc75cf4b98d634c" integrity sha512-dqnqRkPMAjOZE0FogZ+ceJNM2dZ3V/yNOuFB7+39qpO93hHhfRpHw3heYQC7DPK9FqbQTfBKUJhiSfz4MvXYwg== -dugite@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/dugite/-/dugite-2.5.0.tgz#8b235564fdf8692688283c714149a59d9da79865" - integrity sha512-sYsSOqV7NidthDtMUPgKCvqMGqswKkcyAxOMhwEswlcGZ+kHadT2SEDFUJOy0AVR/yTJL6wBF7q1OiySfU0gGA== - dependencies: - progress "^2.0.3" - tar "^6.1.11" - electron-debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/electron-debug/-/electron-debug-3.1.0.tgz#0df17297487fa3c82344d810812853bf67f0bd69" diff --git a/docs/installation.md b/docs/installation.md index 6681d22a00b..af08c517d13 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -13,6 +13,26 @@ On Windows you have two options: - Download the `GitHubDesktopSetup.exe` and run it to install it for the current user. - Download the `GitHubDesktopSetup.msi` and run it to install a machine-wide version of GitHub Desktop - each logged-in user will then be able to run GitHub Desktop from the program at `%PROGRAMFILES(x86)\GitHub Desktop Installer\desktop.exe`. +### Linux + +On Linux there are four different package formats available, depending on your +distribution: + + - AppImage (`.AppImage`) + - Debian (`.deb`) + - RPM (`.rpm`) + - Snap (`.snap`) - also available from [snapcraft.io](https://snapcraft.io/github-desktop) + +If you install the Snap package, ensure you also connect it to your password +manager: + +```shellsession +$ sudo snap connect github-desktop:password-manager-service +``` + +Without this, GitHub Desktop cannot store or retrieve account details it +requires in the user's keychain. + ## Data Directories GitHub Desktop will create directories to manage the files and data it needs to function. If you manage a network of computers and want to install GitHub Desktop, here is more information about how things work. @@ -25,6 +45,13 @@ GitHub Desktop will create directories to manage the files and data it needs to - `%LOCALAPPDATA%\GitHubDesktop\` - contains the latest versions of the app, and some older versions if the user has updated from a previous version. - `%APPDATA%\GitHub Desktop\` - this directory contains user-specific data which the application requires to run, and is created on launch if it doesn't exist. Log files are also stored in this location. +### Linux + +This varies based on the installer chosen: + + - AppImage, Debian and RPM: `~/.config/GitHub Desktop/` + - Snap: `~/snap/github-desktop/current/.config/GitHub Desktop/` + ## Log Files GitHub Desktop will generate logs as part of its normal usage, to assist with troubleshooting. They are located in the data directory that GitHub Desktop uses (see above) under a `logs` subdirectory, organized by date using the format `YYYY-MM-DD.desktop.production.log`, where `YYYY-MM-DD` is the day the log was created. diff --git a/docs/known-issues.md b/docs/known-issues.md index 2a8d7b89cbe..cbddf7f67ba 100644 --- a/docs/known-issues.md +++ b/docs/known-issues.md @@ -11,6 +11,9 @@ - [I get a black screen when launching Desktop](#i-get-a-black-screen-when-launching-desktop) - [Failed to open CA file after an update](#failed-to-open-ca-file-after-an-update) - [Authentication errors due to modified registry entries](#authentication-errors-due-to-modified-registry-entries) +- [Linux](#linux) + - [I get a white screen when launching Desktop](#i-get-a-white-screen-when-launching-desktop) + - [I cannot access repositories under my organization](#i-cannot-access-repositories-under-my-organization) # Known Issues @@ -225,3 +228,46 @@ Related issue: [#15217](https://github.com/desktop/desktop/issues/15217) If you see an error that says "Not enough resources are available to process this command" when signing in to GitHub Desktop, it's likely that you have too many credentials stored in Windows Credentials Manager. **Workaround:** open the Credential Manager application, click on Windows Credentials and go through the list to see if there are some you can delete. + +## Linux + +### The PackageCloud package feed is no longer working + +The PackageCloud feed has been closed down. If you are seeing errors about this you should remove the configuration for this feed and refer to the [README](https://github.com/shiftkey/desktop#repositories) +for the new settings. + +#### APT configuration + +``` +sudo rm /etc/apt/trusted.gpg.d/shiftkey-desktop.asc +sudo rm /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list +``` + +#### RPM configuration + +``` +sudo rm /etc/apt/sources.list.d/packagecloud-shiftkey-desktop.list +``` + +### I get a white screen when launching Desktop + +Electron enables hardware accelerated graphics by default, but some graphics cards have issues with hardware acceleration which means the application will launch successfully but it will be a white screen. If you are running GitHub Desktop within virtualization software like Parallels Desktop, hardware accelerated graphics may not be available. + +**Workaround:** if you set the `GITHUB_DESKTOP_DISABLE_HARDWARE_ACCELERATION` environment variable to any value and launch Desktop again it will disable hardware acceleration on launch, so the application is usable. + +### I cannot access repositories under my organization + +The GitHub Desktop application is an OAuth application, but this fork does not +have the same permissions as the app does on Windows and macOS, which manifests +in a couple of different ways: + + - the "Clone a Repository" view does not show all organization repositories + - pushes to a repository owned by an organization may be rejected with a + generic error message + +The root cause of this is organizations by default will have "OAuth App access +restrictions" enabled, which blocks the GitHub Desktop development app that is +used by this fork. + +**Workaround:** ask your organization admin to [approve access](https://docs.github.com/en/organizations/restricting-access-to-your-organizations-data/approving-oauth-apps-for-your-organization) +to the GitHub Desktop development app. diff --git a/docs/process/publishing-linux-releases.md b/docs/process/publishing-linux-releases.md new file mode 100644 index 00000000000..76a5648b68a --- /dev/null +++ b/docs/process/publishing-linux-releases.md @@ -0,0 +1,154 @@ +# Publishing Linux Releases + +This document outlines the steps I take once a release has been published from +the main GitHub Desktop project. + +This document assumes you have these remotes configured: + +``` +$ git remote -v +origin https://github.com/shiftkey/desktop (fetch) +origin https://github.com/shiftkey/desktop (push) +upstream https://github.com/desktop/desktop (fetch) +upstream https://github.com/desktop/desktop (push) +``` + +Ensure that `development` and `linux` are up-to-date: + +``` +$ git fetch --all +$ git checkout development +$ git reset upstream/development --hard +$ git push origin development +$ git checkout linux +$ git reset origin/linux --hard +$ git rebase development linux +``` + +We want to ensure our changes work against the current branch, so take some time +to rebase the changes and force push `linux` once you're done. + +``` +$ git push origin linux --force-with-lease +``` + +Wait for the continuous integration tests to pass. If `linux` is not passing the +continuous integration tests we need to investigate and identify why things are +no longer working. + +### 1. Create a branch from the release tag + +Each release tag from the upstream project matches the format `release-X.Y.Z` +where `X.Y.Z` are version numbers. We should create a corresponding branch in +this repository named `linux-release-X.Y.Z` as a starting point for the next +Linux release. + +On the command line, this looks like this (using the `2.1.3` release as an +example): + +``` +$ git checkout -b linux-release-2.1.3 release-2.1.3 +$ git push origin linux-release-2.1.3 -u +``` + +### 2. Open pull request to apply the necessary patches to the new branch + +The first step to cutting a release is to backport the latest fixes to the +release branch: + +``` +$ git checkout -b apply-changes-2.1.3 linux +$ git submodule update +$ git rebase --onto linux-release-2.1.3 development apply-changes-2.1.3 +``` + +Work through the conflicts reported until the branch is cleanly applied to the +previous release. + +When the branch is ready to go, push the branch to the remote: + +``` +$ git push origin apply-changes-2.1.3 -u +``` + +Open a pull request that targets `linux-release-2.1.3`. Review the changes and +ensure the tests pass. + +### 3. Approve and merge PR + +If we're satisifed with the pull request, we can merge the pull request to +update the release branch. + +Ensure **rebase and merge** is used here, as we want to preserve the commit +history as-is without introducing merge commits. + +If there are additional changes that need to go into the release, make sure to +include them + +### 4. Tag the release + +Ensure you are on the latest version that passes all tests: + +``` +$ git checkout linux-release-2.1.3 +$ git pull +``` + +We need to bump the version here to indicate this is not the exact same version +as the original release. The convention we follow is `release-X.Y.Z-linuxA` +where `A` is an auto-incrementing number (starting from 1). + +Update the `version` field in `app/package.json` to this new version. For +example, updating to the first release of `2.1.3` would look like this: + +```diff +diff --git a/app/package.json b/app/package.json +index fbbbb976f..3baaf9e33 100644 +--- a/app/package.json ++++ b/app/package.json +@@ -3,7 +3,7 @@ + "productName": "GitHub Desktop", + "bundleID": "com.github.GitHubClient", + "companyName": "GitHub, Inc.", +- "version": "2.1.0", ++ "version": "2.1.3-linux1", + "main": "./main.js", + "repository": { + "type": "git", +``` + +Commit and push this change to ensure we still pass the CI suite: + +``` +$ git commit -am "bump version for release" +$ git push +``` + +With this passing CI, we can tag this version to indicate this is what we are +releasing: + +``` +$ git tag release-2.1.3-linux1 +``` + +With those things in place, push the changes to the branch as well as the new +tag: + +``` +$ git push --follow-tags +``` + +### 5. Publish to GitHub + +After the tagged build completes, it will have the installers available as +artifacts. Over on Azure Pipelines - switch to the Releases tab and run "Publish +to Beta Channel" with the Snap release disabled +([**#204**](https://github.com/shiftkey/desktop/issues/202) is the tracking +issue for re-enabling that). + +When that is done, there should be a draft release available assigned to the tag +from earlier. Edit the release to add the release notes and checksums. + +**TODO:** it'd be great to have some sort of script to generate the release +notes from the changelog in this "markdown + sections" format, which would save +a lot of manual effort. diff --git a/docs/technical/shell-integration.md b/docs/technical/shell-integration.md index bf80153814a..0dafce67ac4 100644 --- a/docs/technical/shell-integration.md +++ b/docs/technical/shell-integration.md @@ -254,6 +254,8 @@ These shells are currently supported: - [Konsole](https://konsole.kde.org/) - [XTerm](http://invisible-island.net/xterm/) - [Terminology](https://www.enlightenment.org/docs/apps/terminology.md) + - [Deepin Terminal](https://www.deepin.org/en/original/deepin-terminal/) + - [Elementary Terminal](https://github.com/elementary/terminal) These are defined in an enum at the top of the file: @@ -267,6 +269,8 @@ export enum Shell { Konsole = 'Konsole', Xterm = 'XTerm', Terminology = 'Terminology', + Deepin = 'Deepin Terminal', + Elementary = 'Elementary Terminal', } ``` @@ -301,6 +305,8 @@ export async function getAvailableShells(): Promise< konsolePath, xtermPath, terminologyPath, + deepinPath, + elementaryPath, ] = await Promise.all([ getShellPath(Shell.Gnome), getShellPath(Shell.Mate), @@ -310,6 +316,8 @@ export async function getAvailableShells(): Promise< getShellPath(Shell.Konsole), getShellPath(Shell.Xterm), getShellPath(Shell.Terminology), + getShellPath(Shell.Deepin), + getShellPath(Shell.Elementary), ]) ... @@ -346,6 +354,10 @@ export function launch( return spawn(foundShell.path, ['-e', '/bin/bash'], { cwd: path }) case Shell.Terminology: return spawn(foundShell.path, ['-d', path]) + case Shell.Deepin: + return spawn(foundShell.path, ['-w', path]) + case Shell.Elementary: + return spawn(foundShell.path, ['-w', path]) default: return assertNever(shell, `Unknown shell: ${shell}`) } diff --git a/package.json b/package.json index 219246123f2..357f6367e91 100644 --- a/package.json +++ b/package.json @@ -108,7 +108,9 @@ "webpack-dev-middleware": "^5.3.1", "webpack-hot-middleware": "^2.25.1", "webpack-merge": "^5.8.0", - "xml2js": "^0.4.16" + "xml2js": "^0.4.16", + "xvfb-maybe": "^0.2.1", + "yaml": "^1.4.0" }, "devDependencies": { "@github/markdownlint-github": "^0.1.0", @@ -158,12 +160,18 @@ "@types/xml2js": "^0.4.0", "electron": "22.0.3", "electron-builder": "^23.6.0", - "electron-packager": "^15.1.0", - "electron-winstaller": "^5.0.0", + "electron-packager": "^16.0.0", "eslint-plugin-github": "^4.3.7", "jest-esm-transformer": "^1.0.0", "markdownlint-cli": "^0.32.2", + "patch-package": "^6.5.1", + "postinstall-postinstall": "^2.1.0", "reserved-words": "^0.1.2", "tsconfig-paths": "^3.9.0" + }, + "optionalDependencies": { + "electron-installer-debian": "3.1.0", + "electron-installer-redhat": "3.4.0", + "electron-winstaller": "^5.0.0" } } diff --git a/patches/electron-installer-redhat+3.4.0.patch b/patches/electron-installer-redhat+3.4.0.patch new file mode 100644 index 00000000000..9f8d649ba51 --- /dev/null +++ b/patches/electron-installer-redhat+3.4.0.patch @@ -0,0 +1,10 @@ +diff --git a/node_modules/electron-installer-redhat/resources/spec.ejs b/node_modules/electron-installer-redhat/resources/spec.ejs +index e07a8a3..486f59e 100644 +--- a/node_modules/electron-installer-redhat/resources/spec.ejs ++++ b/node_modules/electron-installer-redhat/resources/spec.ejs +@@ -1,4 +1,5 @@ + %define _binary_payload w<%= compressionLevel %>.xzdio ++%define _build_id_links none + + %if "%{_host_cpu}" != "%{_target_cpu}" + %global __strip /bin/true diff --git a/script/build.ts b/script/build.ts index 075cb99354b..675e1066358 100755 --- a/script/build.ts +++ b/script/build.ts @@ -156,7 +156,11 @@ function packageApp() { targetArch = os.arch() } - if (targetArch === 'arm64' || targetArch === 'x64') { + if ( + targetArch === 'arm64' || + targetArch === 'x64' || + targetArch === 'armv7l' + ) { return targetArch } @@ -181,13 +185,20 @@ function packageApp() { ) } + // this setting only works for macOS and Windows, so let's clear it now to ensure + // the app is working as expected + const icon = + process.platform === 'linux' + ? undefined + : path.join(projectRoot, 'app', 'static', 'logos', getIconFileName()) + const options: Options & IPackageAdditionalOptions = { name: getExecutableName(), platform: toPackagePlatform(process.platform), arch: toPackageArch(process.env.TARGET_ARCH), asar: false, // TODO: Probably wanna enable this down the road. out: getDistRoot(), - icon: path.join(projectRoot, 'app', 'static', 'logos', getIconFileName()), + icon, dir: outRoot, overwrite: true, tmpdir: false, @@ -350,7 +361,10 @@ function copyDependencies() { const gitDir = path.resolve(outRoot, 'git') rmSync(gitDir, { recursive: true, force: true }) mkdirSync(gitDir, { recursive: true }) - copySync(path.resolve(projectRoot, 'app/node_modules/dugite/git'), gitDir) + copySync( + path.resolve(projectRoot, 'app/node_modules/@shiftkey/dugite/git'), + gitDir + ) if (process.platform === 'win32') { console.log(' Cleaning unneeded Git components…') diff --git a/script/dist-info.ts b/script/dist-info.ts index ee9de2328c8..dcc430b9c08 100644 --- a/script/dist-info.ts +++ b/script/dist-info.ts @@ -28,7 +28,7 @@ export function getExecutableName() { if (process.platform === 'win32') { return `${getWindowsIdentifierName()}${suffix}` } else if (process.platform === 'linux') { - return 'desktop' + return `github-desktop${suffix}` } else { return productName } @@ -143,11 +143,12 @@ export function getReleaseSHA() { return pieces[2] } -export function getDistArchitecture(): 'arm64' | 'x64' { +export function getDistArchitecture(): 'arm64' | 'x64' | 'armv7l' { // If a specific npm_config_arch is set, we use that one instead of the OS arch (to support cross compilation) if ( process.env.npm_config_arch === 'arm64' || - process.env.npm_config_arch === 'x64' + process.env.npm_config_arch === 'x64' || + process.env.npm_config_arch === 'armv7l' ) { return process.env.npm_config_arch } @@ -155,6 +156,9 @@ export function getDistArchitecture(): 'arm64' | 'x64' { if (process.arch === 'arm64') { return 'arm64' } + if (process.arch === 'armv7l') { + return 'armv7l' + } // TODO: Check if it's x64 running on an arm64 Windows with IsWow64Process2 // More info: https://www.rudyhuyn.com/blog/2017/12/13/how-to-detect-that-your-x86-application-runs-on-windows-on-arm/ diff --git a/script/electron-builder-linux.yml b/script/electron-builder-linux.yml index de59d242e2c..bcaae41ee82 100644 --- a/script/electron-builder-linux.yml +++ b/script/electron-builder-linux.yml @@ -1,36 +1,22 @@ -productName: 'GitHubDesktop' -artifactName: '${productName}-${os}-${arch}-${version}.${ext}' +artifactName: 'GitHubDesktop-${os}-${version}.${ext}' linux: category: 'GNOME;GTK;Development' packageCategory: 'GNOME;GTK;Development' - icon: 'app/static/logos' + icon: 'app/static/linux/logos' + mimeTypes: + - x-scheme-handler/x-github-client + - x-scheme-handler/x-github-desktop-auth + # workaround for handling OAuth flow until we figure out what we're doing + # With the development OAuth details + # see https://github.com/shiftkey/desktop/issues/72 for more details + - x-scheme-handler/x-github-desktop-dev-auth target: - - deb - - rpm - AppImage maintainer: 'GitHub, Inc ' -deb: - afterInstall: './script/linux-after-install.sh' - afterRemove: './script/linux-after-remove.sh' - depends: - # default Electron dependencies - - gconf2 - - gconf-service - - libnotify4 - - libappindicator1 - - libxtst6 - - libnss3 - # dugite-native dependencies - - libcurl3 | libcurl4 - # keytar dependencies - - libsecret-1-0 rpm: depends: - # default Electron dependencies - - libXScrnSaver - - libappindicator - - libnotify # dugite-native dependencies - libcurl # keytar dependencies - libsecret + - gnome-keyring diff --git a/script/linux-after-install.sh b/script/linux-after-install.sh deleted file mode 100644 index b6f0a7d1f0c..00000000000 --- a/script/linux-after-install.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -set -e - -PROFILE_D_FILE="/etc/profile.d/github-desktop.sh" -INSTALL_DIR="/opt/${productFilename}" -SCRIPT=$"#!/bin/sh -export PATH=\"$INSTALL_DIR:\$PATH\"" - -case "$1" in - configure) - echo "$SCRIPT" > "${PROFILE_D_FILE}"; - . "${PROFILE_D_FILE}"; - ;; - - abort-upgrade|abort-remove|abort-deconfigure) - ;; - - *) - echo "postinst called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - -exit 0 diff --git a/script/package-debian.ts b/script/package-debian.ts new file mode 100644 index 00000000000..9a918473070 --- /dev/null +++ b/script/package-debian.ts @@ -0,0 +1,115 @@ +import { promisify } from 'util' +import { join } from 'path' + +import glob = require('glob') +const globPromise = promisify(glob) + +import { rename } from 'fs-extra' + +import { getVersion } from '../app/package-info' +import { getDistPath, getDistRoot } from './dist-info' + +function getArchitecture() { + switch (process.arch) { + case 'arm64': + return 'arm64' + case 'arm': + return 'armhf' + default: + return 'amd64' + } +} + +const distRoot = getDistRoot() + +// best guess based on documentation +type DebianOptions = { + // required + src: string + dest: string + arch: 'amd64' | 'i386' | 'arm64' | 'armhf' + // optional + description?: string + productDescription?: string + categories?: Array + section?: string + priority?: 'required' | 'important' | 'standard' | 'optional' | 'extra' + homepage?: string + icon?: any + scripts?: { + preinst?: string + postinst?: string + prerm?: string + postrm?: string + } + mimeType?: Array + maintainer?: string + depends?: Array +} + +const options: DebianOptions = { + src: getDistPath(), + dest: distRoot, + arch: getArchitecture(), + description: 'Simple collaboration from your desktop', + productDescription: + 'This is the unofficial port of GitHub Desktop for Linux distributions', + section: 'GNOME;GTK;Development', + priority: 'extra', + homepage: 'https://github.com/shiftkey/desktop', + depends: [ + // Desktop-specific dependencies + 'libcurl3 | libcurl4', + 'libsecret-1-0', + 'gnome-keyring', + ], + icon: { + '32x32': 'app/static/linux/logos/32x32.png', + '64x64': 'app/static/linux/logos/64x64.png', + '128x128': 'app/static/linux/logos/128x128.png', + '256x256': 'app/static/linux/logos/256x256.png', + '512x512': 'app/static/linux/logos/512x512.png', + '1024x1024': 'app/static/linux/logos/1024x1024.png', + }, + scripts: { + postinst: 'script/resources/deb/postinst.sh', + postrm: 'script/resources/deb/postrm.sh', + }, + mimeType: [ + 'x-scheme-handler/x-github-client', + 'x-scheme-handler/x-github-desktop-auth', + // workaround for handling OAuth flow until we figure out what we're doing + // with the development OAuth details + // + // see https://github.com/shiftkey/desktop/issues/72 for more details + 'x-scheme-handler/x-github-desktop-dev-auth', + ], + maintainer: 'Brendan Forster ', +} + +export async function packageDebian(): Promise { + if (process.platform === 'win32') { + return Promise.reject('Windows is not supported') + } + + const installer = require('electron-installer-debian') + + await installer(options) + const installersPath = `${distRoot}/github-desktop*.deb` + + const files = await globPromise(installersPath) + + if (files.length !== 1) { + return Promise.reject( + `Expected one file but instead found '${files.join(', ')}' - exiting...` + ) + } + + const oldPath = files[0] + + const newFileName = `GitHubDesktop-linux-${getVersion()}.deb` + const newPath = join(distRoot, newFileName) + await rename(oldPath, newPath) + + return Promise.resolve(newPath) +} diff --git a/script/package-electron-builder.ts b/script/package-electron-builder.ts new file mode 100644 index 00000000000..6292c28b9f4 --- /dev/null +++ b/script/package-electron-builder.ts @@ -0,0 +1,66 @@ +/* eslint-disable no-sync */ + +import * as path from 'path' +import * as cp from 'child_process' +import { promisify } from 'util' + +import glob = require('glob') +const globPromise = promisify(glob) + +import { getDistPath, getDistRoot } from './dist-info' + +function getArchitecture() { + switch (process.arch) { + case 'arm64': + return '--arm64' + case 'arm': + return '--armv7l' + default: + return '--x64' + } +} + +export async function packageElectronBuilder(): Promise> { + const distPath = getDistPath() + const distRoot = getDistRoot() + + const electronBuilder = path.resolve( + __dirname, + '..', + 'node_modules', + '.bin', + 'electron-builder' + ) + + const configPath = path.resolve(__dirname, 'electron-builder-linux.yml') + + const args = [ + 'build', + '--prepackaged', + distPath, + getArchitecture(), + '--config', + configPath, + ] + + const { error } = cp.spawnSync(electronBuilder, args, { stdio: 'inherit' }) + + if (error != null) { + return Promise.reject(error) + } + + const appImageInstaller = `${distRoot}/GitHubDesktop-linux-*.AppImage` + + const files = await globPromise(appImageInstaller) + if (files.length !== 1) { + return Promise.reject( + `Expected one AppImage installer but instead found '${files.join( + ', ' + )}' - exiting...` + ) + } + + const appImageInstallerPath = files[0] + + return Promise.resolve([appImageInstallerPath]) +} diff --git a/script/package-redhat.ts b/script/package-redhat.ts new file mode 100644 index 00000000000..37bd3819293 --- /dev/null +++ b/script/package-redhat.ts @@ -0,0 +1,111 @@ +import { promisify } from 'util' +import { join } from 'path' + +import glob = require('glob') +const globPromise = promisify(glob) + +import { rename } from 'fs-extra' + +import { getVersion } from '../app/package-info' +import { getDistPath, getDistRoot } from './dist-info' + +function getArchitecture() { + switch (process.arch) { + case 'arm64': + return 'aarch64' + case 'arm': + return 'armv7l' + default: + return 'x86_64' + } +} + +const distRoot = getDistRoot() + +// best guess based on documentation +type RedhatOptions = { + // required + src: string + dest: string + arch: string + // optional + description?: string + productDescription?: string + categories?: Array + icon?: any + scripts?: { + pre?: string + post?: string + preun?: string + postun?: string + } + homepage?: string + mimeType?: Array + requires?: Array +} + +const options: RedhatOptions = { + src: getDistPath(), + dest: distRoot, + arch: getArchitecture(), + description: 'Simple collaboration from your desktop', + productDescription: + 'This is the unofficial port of GitHub Desktop for Linux distributions', + categories: ['GNOME', 'GTK', 'Development'], + requires: [ + // dugite-native dependencies + '(libcurl or libcurl4)', + // keytar dependencies + 'libsecret', + 'gnome-keyring', + ], + icon: { + '32x32': 'app/static/linux/logos/32x32.png', + '64x64': 'app/static/linux/logos/64x64.png', + '128x128': 'app/static/linux/logos/128x128.png', + '256x256': 'app/static/linux/logos/256x256.png', + '512x512': 'app/static/linux/logos/512x512.png', + '1024x1024': 'app/static/linux/logos/1024x1024.png', + }, + scripts: { + post: 'script/resources/rpm/post.sh', + preun: 'script/resources/rpm/preun.sh', + }, + homepage: 'https://github.com/shiftkey/desktop', + mimeType: [ + 'x-scheme-handler/x-github-client', + 'x-scheme-handler/x-github-desktop-auth', + // workaround for handling OAuth flow until we figure out what we're doing + // with the development OAuth details + // + // see https://github.com/shiftkey/desktop/issues/72 for more details + 'x-scheme-handler/x-github-desktop-dev-auth', + ], +} + +export async function packageRedhat(): Promise { + if (process.platform === 'win32') { + return Promise.reject('Windows is not supported') + } + + const installer = require('electron-installer-redhat') + + await installer(options) + const installersPath = `${distRoot}/github-desktop*.rpm` + + const files = await globPromise(installersPath) + + if (files.length !== 1) { + return Promise.reject( + `Expected one file but instead found '${files.join(', ')}' - exiting...` + ) + } + + const oldPath = files[0] + + const newFileName = `GitHubDesktop-linux-${getVersion()}.rpm` + const newPath = join(distRoot, newFileName) + await rename(oldPath, newPath) + + return Promise.resolve(newPath) +} diff --git a/script/package.ts b/script/package.ts index 8cfd8f03c79..ab4c299b2cf 100644 --- a/script/package.ts +++ b/script/package.ts @@ -1,8 +1,13 @@ /* eslint-disable no-sync */ import * as cp from 'child_process' +import { createReadStream } from 'fs' +import { writeFile } from 'fs/promises' +import { pathExists, chmod } from 'fs-extra' import * as path from 'path' import * as electronInstaller from 'electron-winstaller' +import * as crypto from 'crypto' + import { getProductName, getCompanyName } from '../app/package-info' import { getDistPath, @@ -13,10 +18,15 @@ import { shouldMakeDelta, getUpdatesURL, getIconFileName, + getDistRoot, } from './dist-info' import { isAppveyor, isGitHubActions } from './build-platforms' import { existsSync, rmSync } from 'fs' +import { packageElectronBuilder } from './package-electron-builder' +import { packageDebian } from './package-debian' +import { packageRedhat } from './package-redhat' + const distPath = getDistPath() const productName = getProductName() const outputDir = path.join(distPath, '..', 'installer') @@ -128,26 +138,70 @@ function packageWindows() { }) } -function packageLinux() { - const electronBuilder = path.resolve( - __dirname, - '..', - 'node_modules', - '.bin', - 'electron-builder' - ) +function getSha256Checksum(fullPath: string): Promise { + return new Promise((resolve, reject) => { + const algo = 'sha256' + const shasum = crypto.createHash(algo) - const configPath = path.resolve(__dirname, 'electron-builder-linux.yml') + const s = createReadStream(fullPath) + s.on('data', function (d) { + shasum.update(d) + }) + s.on('error', err => { + reject(err) + }) + s.on('end', function () { + const d = shasum.digest('hex') + resolve(d) + }) + }) +} + +async function generateChecksums(files: Array) { + const distRoot = getDistRoot() + + const checksums = new Map() + + for (const f of files) { + const checksum = await getSha256Checksum(f) + checksums.set(f, checksum) + } - const args = [ - 'build', - '--prepackaged', - distPath, - '--x64', - '--config', - configPath, - ] + let checksumsText = `Checksums: \n` - console.log('Packaging for Linux…') - cp.spawnSync(electronBuilder, args, { stdio: 'inherit' }) + for (const [fullPath, checksum] of checksums) { + const fileName = path.basename(fullPath) + checksumsText += `${checksum} - ${fileName}\n` + } + + const checksumFile = path.join(distRoot, 'checksums.txt') + + await writeFile(checksumFile, checksumsText) +} + +async function packageLinux() { + const helperPath = path.join(getDistPath(), 'chrome-sandbox') + const exists = await pathExists(helperPath) + + if (exists) { + console.log('Updating file mode for chrome-sandbox…') + await chmod(helperPath, 0o4755) + } + try { + const files = await packageElectronBuilder() + const debianPackage = await packageDebian() + const redhatPackage = await packageRedhat() + + const installers = [...files, debianPackage, redhatPackage] + + console.log(`Installers created:`) + for (const installer of installers) { + console.log(` - ${installer}`) + } + + generateChecksums(installers) + } catch (err) { + console.error('A problem occurred with the packaging step', err) + process.exit(1) + } } diff --git a/script/post-install.ts b/script/post-install.ts index 4d35d219a80..3f79a3d1f2d 100644 --- a/script/post-install.ts +++ b/script/post-install.ts @@ -13,6 +13,22 @@ const options: SpawnSyncOptions = { stdio: 'inherit', } +/** Check if the caller has set the OFFLINe environment variable */ +function isOffline() { + return process.env.OFFLINE === '1' +} + +/** Format the arguments to ensure these work offline */ +function getYarnArgs(baseArgs: Array): Array { + const args = baseArgs + + if (isOffline()) { + args.splice(1, 0, '--offline') + } + + return args +} + function findYarnVersion(callback: (path: string) => void) { glob('vendor/yarn-*.js', (error, files) => { if (error != null) { @@ -28,29 +44,37 @@ function findYarnVersion(callback: (path: string) => void) { } findYarnVersion(path => { - let result = spawnSync( - 'node', - [path, '--cwd', 'app', 'install', '--force'], - options - ) + const installArgs = getYarnArgs([path, '--cwd', 'app', 'install', '--force']) + + let result = spawnSync('node', installArgs, options) if (result.status !== 0) { process.exit(result.status || 1) } - result = spawnSync( - 'git', - ['submodule', 'update', '--recursive', '--init'], - options - ) + if (!isOffline()) { + result = spawnSync( + 'git', + ['submodule', 'update', '--recursive', '--init'], + options + ) - if (result.status !== 0) { - process.exit(result.status || 1) + if (result.status !== 0) { + process.exit(result.status || 1) + } } - result = spawnSync('node', [path, 'compile:script'], options) + result = spawnSync('node', getYarnArgs([path, 'compile:script']), options) if (result.status !== 0) { process.exit(result.status || 1) } + + if (process.platform === 'linux') { + result = spawnSync('node', getYarnArgs([path, 'patch-package']), options) + + if (result.status !== 0) { + process.exit(result.status || 1) + } + } }) diff --git a/script/resources/deb/postinst.sh b/script/resources/deb/postinst.sh new file mode 100755 index 00000000000..79081967042 --- /dev/null +++ b/script/resources/deb/postinst.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +set -e + +PROFILE_D_FILE="/etc/profile.d/github-desktop.sh" +INSTALL_DIR="/usr/lib/github-desktop" +CLI_DIR="$INSTALL_DIR/resources/app/static" + +case "$1" in + configure) + # add executable permissions for CLI interface + chmod +x "$CLI_DIR"/github || : + # check if this is a dev install or standard + if [ -f "$INSTALL_DIR/github-desktop-dev" ]; then + BINARY_NAME="github-desktop-dev" + else + BINARY_NAME="github-desktop" + fi + # create symbolic links to /usr/bin directory + ln -f -s "$INSTALL_DIR"/$BINARY_NAME /usr/bin || : + ln -f -s "$CLI_DIR"/github /usr/bin || : + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/script/linux-after-remove.sh b/script/resources/deb/postrm.sh old mode 100644 new mode 100755 similarity index 58% rename from script/linux-after-remove.sh rename to script/resources/deb/postrm.sh index 9a73886e2a5..d85b3eb28e8 --- a/script/linux-after-remove.sh +++ b/script/resources/deb/postrm.sh @@ -2,12 +2,17 @@ set -e PROFILE_D_FILE="/etc/profile.d/github-desktop.sh" +BASE_FILE="/usr/bin/github" case "$1" in purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) echo "#!/bin/sh" > "${PROFILE_D_FILE}"; . "${PROFILE_D_FILE}"; rm "${PROFILE_D_FILE}"; + # remove symbolic links in /usr/bin directory + test -f ${BASE_FILE} && unlink ${BASE_FILE} + test -f ${BASE_FILE}-desktop && unlink ${BASE_FILE}-desktop + test -f ${BASE_FILE}-desktop-dev && unlink ${BASE_FILE}-desktop-dev ;; *) diff --git a/script/resources/rpm/post.sh b/script/resources/rpm/post.sh new file mode 100755 index 00000000000..092c75b9d26 --- /dev/null +++ b/script/resources/rpm/post.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +INSTALL_DIR="/usr/lib/github-desktop" +CLI_DIR="$INSTALL_DIR/resources/app/static" + +# add executable permissions for CLI interface +chmod +x "$CLI_DIR"/github || : + +# create symbolic links to /usr/bin directory +ln -f -s "$CLI_DIR"/github /usr/bin || : + +exit 0 diff --git a/script/resources/rpm/preun.sh b/script/resources/rpm/preun.sh new file mode 100755 index 00000000000..fdb0a748a34 --- /dev/null +++ b/script/resources/rpm/preun.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +BASE_FILE="/usr/bin/github" + +# remove symbolic links in /usr/bin directory +test -f ${BASE_FILE} && unlink ${BASE_FILE} + +exit 0 diff --git a/yarn.lock b/yarn.lock index bf8c7acf575..f817dea3a08 100644 --- a/yarn.lock +++ b/yarn.lock @@ -434,6 +434,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.3.4": + version "7.4.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.2.tgz#f5ab6897320f16decd855eed70b705908a313fe8" + integrity sha512-7Bl2rALb7HpvXFL7TETNzKSAeBVCPHELzc0C//9FCxN8nsiueWSJBqaF+2oIJScyILStASR/Cx5WMkXGYTiJFA== + dependencies: + regenerator-runtime "^0.13.2" + "@babel/template@^7.10.4", "@babel/template@^7.12.7", "@babel/template@^7.3.3": version "7.12.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" @@ -521,21 +528,6 @@ ajv "^6.12.0" ajv-keywords "^3.4.1" -"@electron/get@^1.6.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.7.1.tgz#41aa60871b9d7e225bbe68135012f88a9ef87012" - integrity sha512-+BOIzkmYbe+oOBGqSByq8zXYXCFztccoymR3uNkvX5ckJ/5xU+4peVyEvFyH6+zfv58hCo99RxgIpwuaMfRtRg== - dependencies: - debug "^4.1.1" - env-paths "^2.2.0" - fs-extra "^8.1.0" - got "^9.6.0" - sanitize-filename "^1.6.2" - sumchecker "^3.0.0" - optionalDependencies: - global-agent "^2.0.2" - global-tunnel-ng "^2.7.1" - "@electron/get@^2.0.0": version "2.0.2" resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.2.tgz#ae2a967b22075e9c25aaf00d5941cd79c21efd7e" @@ -551,7 +543,7 @@ optionalDependencies: global-agent "^3.0.0" -"@electron/universal@1.2.1": +"@electron/universal@1.2.1", "@electron/universal@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.2.1.tgz#3c2c4ff37063a4e9ab1e6ff57db0bc619bc82339" integrity sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ== @@ -853,7 +845,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@malept/cross-spawn-promise@^1.1.0": +"@malept/cross-spawn-promise@^1.0.0", "@malept/cross-spawn-promise@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" integrity sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ== @@ -903,11 +895,6 @@ dependencies: object-assign "^4.1.1" -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - "@sindresorhus/is@^4.0.0": version "4.6.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" @@ -927,13 +914,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - "@szmarczak/http-timer@^4.0.5": version "4.0.6" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" @@ -1000,14 +980,14 @@ "@types/node" "*" "@types/cacheable-request@^6.0.1": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" - integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" + integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== dependencies: "@types/http-cache-semantics" "*" - "@types/keyv" "^3.1.4" + "@types/keyv" "*" "@types/node" "*" - "@types/responselike" "^1.0.0" + "@types/responselike" "*" "@types/classnames@^2.2.2": version "2.2.3" @@ -1125,7 +1105,7 @@ dependencies: "@types/node" "*" -"@types/fs-extra@^9.0.11": +"@types/fs-extra@^9.0.1", "@types/fs-extra@^9.0.11": version "9.0.13" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== @@ -1216,6 +1196,11 @@ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.1.tgz#a4319aedb071d478e6f407d1c4578ec8156829cf" integrity sha512-/UMY+2GkOZ27Vrc51pqC5J8SPd39FKt7kkoGAtWJ8s4msj0b15KehDWIiJpWY3/7tLxBQLLzJhIBhnEsXdzpgw== +"@types/json-buffer@~3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64" + integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ== + "@types/json-schema@*": version "7.0.7" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" @@ -1231,7 +1216,7 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/keyv@^3.1.4": +"@types/keyv@*": version "3.1.4" resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== @@ -1409,7 +1394,7 @@ resolved "https://registry.yarnpkg.com/@types/reserved-words/-/reserved-words-0.1.0.tgz#a9d5318bb4ac4466862b93fc702542b75d2cd3ac" integrity sha512-ls6lSkkhEFm8XSVQjHj47pJoCL9sVK91mwIONw0Iwjqkmy98ForMFYa5+/vb6sytTaK0HSwkzKKYzREPTUhhhg== -"@types/responselike@^1.0.0": +"@types/responselike@*", "@types/responselike@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== @@ -1888,6 +1873,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + abab@^2.0.3, abab@^2.0.5: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -2308,22 +2298,10 @@ asar@^2.0.1: mkdirp "^0.5.1" tmp-promise "^1.0.5" -asar@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/asar/-/asar-3.0.3.tgz#1fef03c2d6d2de0cbad138788e4f7ae03b129c7b" - integrity sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw== - dependencies: - chromium-pickle-js "^0.2.0" - commander "^5.0.0" - glob "^7.1.6" - minimatch "^3.0.4" - optionalDependencies: - "@types/glob" "^7.1.1" - -asar@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/asar/-/asar-3.2.0.tgz#e6edb5edd6f627ebef04db62f771c61bea9c1221" - integrity sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg== +asar@^3.0.0, asar@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/asar/-/asar-3.1.0.tgz#70b0509449fe3daccc63beb4d3c7d2e24d3c6473" + integrity sha512-vyxPxP5arcAqN4F/ebHd/HhwnAiZtwhglvdmc7BR2f0ywbVNTOpSeyhLDbGXtE/y58hv1oC75TaNIXutnsOZsQ== dependencies: chromium-pickle-js "^0.2.0" commander "^5.0.0" @@ -2755,19 +2733,6 @@ cacheable-lookup@^5.0.3: resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - cacheable-request@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" @@ -2803,9 +2768,9 @@ camel-case@^4.1.2: tslib "^2.0.3" camelcase@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" - integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + version "5.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45" + integrity sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ== camelcase@^5.3.1: version "5.3.1" @@ -2862,15 +2827,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2970,6 +2927,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -3108,19 +3074,19 @@ component-emitter@^1.2.1: resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= +compress-brotli@^1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/compress-brotli/-/compress-brotli-1.3.8.tgz#0c0a60c97a989145314ec381e84e26682e7b38db" + integrity sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ== + dependencies: + "@types/json-buffer" "~3.0.0" + json-buffer "~3.0.1" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -config-chain@^1.1.11: - version "1.1.12" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" - integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - console-polyfill@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/console-polyfill/-/console-polyfill-0.3.0.tgz#84900902a18c47a5eba932be75fa44d23e8af861" @@ -3175,11 +3141,6 @@ core-js@^2.4.1, core-js@^2.5.3: resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== -core-js@^3.6.5: - version "3.8.2" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.8.2.tgz#0a1fd6709246da9ca8eff5bb0cbd15fba9ac7044" - integrity sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A== - core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -3200,6 +3161,15 @@ cross-env@^5.0.5: cross-spawn "^5.1.0" is-windows "^1.0.0" +cross-spawn-windows-exe@^1.1.0, cross-spawn-windows-exe@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz#46253b0f497676e766faf4a7061004618b5ac5ec" + integrity sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw== + dependencies: + "@malept/cross-spawn-promise" "^1.1.0" + is-wsl "^2.2.0" + which "^2.0.2" + cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -3209,7 +3179,7 @@ cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.0: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -3220,7 +3190,7 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -3229,6 +3199,15 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" + integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + css-loader@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" @@ -3353,13 +3332,6 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -3387,11 +3359,6 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - defer-to-connect@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" @@ -3615,11 +3582,6 @@ dotenv@^9.0.2: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-9.0.2.tgz#dacc20160935a37dea6364aa1bef819fb9b6ab05" integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" @@ -3668,18 +3630,62 @@ electron-builder@^23.6.0: simple-update-notifier "^1.0.7" yargs "^17.5.1" -electron-notarize@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.0.0.tgz#bc925b1ccc3f79e58e029e8c4706572b01a9fd8f" - integrity sha512-dsib1IAquMn0onCrNMJ6gtEIZn/azG8hZMCYOuZIMVMUeRMgBYHK1s5TK9P8xAcrAjh/2aN5WYHzgVSWX314og== +electron-installer-common@^0.10.2: + version "0.10.3" + resolved "https://registry.yarnpkg.com/electron-installer-common/-/electron-installer-common-0.10.3.tgz#40f9db644ca60eb28673d545b67ee0113aef4444" + integrity sha512-mYbP+6i+nHMIm0WZHXgGdmmXMe+KXncl6jZYQNcCF9C1WsNA9C5SZ2VP4TLQMSIoFO+X4ugkMEA5uld1bmyEvA== + dependencies: + "@malept/cross-spawn-promise" "^1.0.0" + asar "^3.0.0" + debug "^4.1.1" + fs-extra "^9.0.0" + glob "^7.1.4" + lodash "^4.17.15" + parse-author "^2.0.0" + semver "^7.1.1" + tmp-promise "^3.0.2" + optionalDependencies: + "@types/fs-extra" "^9.0.1" + +electron-installer-debian@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/electron-installer-debian/-/electron-installer-debian-3.1.0.tgz#2f6107f559f6564c44e3832fb2942dd8de4d40cc" + integrity sha512-k6KChvx0Fw8XTlCqwwbBfh19yGQaKjGdbugokmr1IpzINOm4QFyACKMTHAYFHW5LCBUZQShZD96hwxUZ+8Kx+w== + dependencies: + "@malept/cross-spawn-promise" "^1.0.0" + debug "^4.1.1" + electron-installer-common "^0.10.2" + fs-extra "^9.0.0" + get-folder-size "^2.0.1" + lodash "^4.17.4" + word-wrap "^1.2.3" + yargs "^15.0.1" + +electron-installer-redhat@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz#4a7f8d67b48b7d5b23bd1eb074f4b684ae43b192" + integrity sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw== + dependencies: + "@malept/cross-spawn-promise" "^1.0.0" + debug "^4.1.1" + electron-installer-common "^0.10.2" + fs-extra "^9.0.0" + lodash "^4.17.15" + word-wrap "^1.2.3" + yargs "^16.0.2" + +electron-notarize@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-1.1.1.tgz#3ed274b36158c1beb1dbef14e7faf5927e028629" + integrity sha512-kufsnqh86CTX89AYNG3NCPoboqnku/+32RxeJ2+7A4Rbm4bbOx0Nc7XTy3/gAlBfpj9xPAxHfhZLOHgfi6cJVw== dependencies: debug "^4.1.1" fs-extra "^9.0.1" -electron-osx-sign@^0.4.11: - version "0.4.17" - resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.17.tgz#2727ca0c79e1e4e5ccd3861fb3da9c3c913b006c" - integrity sha512-wUJPmZJQCs1zgdlQgeIpRcvrf7M5/COQaOV68Va1J/SgmWx5KL2otgg+fAae7luw6qz9R8Gvu/Qpe9tAOu/3xQ== +electron-osx-sign@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.5.0.tgz#fc258c5e896859904bbe3d01da06902c04b51c3a" + integrity sha512-icoRLHzFz/qxzDh/N4Pi2z4yVHurlsCAYQvsCSG7fCedJ4UJXBS6PoQyGH71IfcqKupcKeK7HX/NkyfG+v6vlQ== dependencies: bluebird "^3.5.0" compare-version "^0.1.2" @@ -3700,28 +3706,30 @@ electron-osx-sign@^0.6.0: minimist "^1.2.0" plist "^3.0.1" -electron-packager@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-15.1.0.tgz#16a3733e4cad26112a2ac36f0b0f35c3b0170eff" - integrity sha512-THNm4bz1DfvR9f0g51+NjuAYELflM8+1vhQ/iv/G8vyZNKzSMuFd5doobngQKq3rRsLdPNZVnGqDdgS884d7Og== +electron-packager@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-16.0.0.tgz#2eb7f14114e06b545207496ef66b10c24b7c8ba1" + integrity sha512-7Ey4UUaHg3FYhA7ktsAvCWP8srp9+iPljGdeJBsNaZBakU6HWhvRC+Pc7LWXGCgAVIN5BQsUwR3xrCbFno91VA== dependencies: - "@electron/get" "^1.6.0" - asar "^3.0.0" + "@electron/get" "^2.0.0" + "@electron/universal" "^1.2.1" + asar "^3.1.0" + cross-spawn-windows-exe "^1.2.0" debug "^4.0.1" - electron-notarize "^1.0.0" - electron-osx-sign "^0.4.11" + electron-notarize "^1.1.1" + electron-osx-sign "^0.5.0" extract-zip "^2.0.0" filenamify "^4.1.0" - fs-extra "^9.0.0" + fs-extra "^10.1.0" galactus "^0.2.1" get-package-info "^1.0.0" junk "^3.1.0" parse-author "^2.0.0" plist "^3.0.0" - rcedit "^2.0.0" + rcedit "^3.0.1" resolve "^1.1.6" semver "^7.1.3" - yargs-parser "^19.0.1" + yargs-parser "^21.1.1" electron-publish@23.6.0: version "23.6.0" @@ -3791,7 +3799,7 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -encodeurl@^1.0.2, encodeurl@~1.0.2: +encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= @@ -4657,6 +4665,13 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -4777,14 +4792,14 @@ fs-extra@^8.1.0: universalify "^0.1.0" fs-extra@^9.0.0, fs-extra@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" - integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" graceful-fs "^4.2.0" jsonfile "^6.0.1" - universalify "^1.0.0" + universalify "^2.0.0" fs-minipass@^2.0.0: version "2.1.0" @@ -4856,6 +4871,11 @@ galactus@^0.2.1: flora-colossus "^1.0.0" fs-extra "^4.0.0" +gar@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/gar/-/gar-1.0.4.tgz#f777bc7db425c0572fdeb52676172ca1ae9888b8" + integrity sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w== + gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -4866,6 +4886,14 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-folder-size@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/get-folder-size/-/get-folder-size-2.0.1.tgz#3fe0524dd3bad05257ef1311331417bcd020a497" + integrity sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA== + dependencies: + gar "^1.0.4" + tiny-each-async "2.0.3" + get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" @@ -4900,7 +4928,7 @@ get-stdin@~9.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== -get-stream@^4.0.0, get-stream@^4.1.0: +get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -4993,19 +5021,6 @@ glob@~8.0.3: minimatch "^5.0.1" once "^1.3.0" -global-agent@^2.0.2: - version "2.1.12" - resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-2.1.12.tgz#e4ae3812b731a9e81cbf825f9377ef450a8e4195" - integrity sha512-caAljRMS/qcDo69X9BfkgrihGUgGx44Fb4QQToNQjsiWh+YlQ66uqYVAdA8Olqit+5Ng0nkz09je3ZzANMZcjg== - dependencies: - boolean "^3.0.1" - core-js "^3.6.5" - es6-error "^4.1.1" - matcher "^3.0.0" - roarr "^2.15.3" - semver "^7.3.2" - serialize-error "^7.0.1" - global-agent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" @@ -5018,16 +5033,6 @@ global-agent@^3.0.0: semver "^7.3.2" serialize-error "^7.0.1" -global-tunnel-ng@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f" - integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg== - dependencies: - encodeurl "^1.0.2" - lodash "^4.17.10" - npm-conf "^1.1.3" - tunnel "^0.0.6" - globals@^11.1.0: version "11.7.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" @@ -5060,9 +5065,9 @@ globby@^11.0.4, globby@^11.1.0: slash "^3.0.0" got@^11.8.5: - version "11.8.6" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" - integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + version "11.8.5" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" + integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ== dependencies: "@sindresorhus/is" "^4.0.0" "@szmarczak/http-timer" "^4.0.5" @@ -5076,24 +5081,22 @@ got@^11.8.5: p-cancelable "^2.0.0" responselike "^2.0.0" -got@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= + +graceful-fs@^4.1.15: + version "4.2.0" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.0.tgz#8d8fdc73977cb04104721cb53666c1ca64cd328b" + integrity sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg== + +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +graceful-fs@^4.2.9: version "4.2.9" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== @@ -5395,9 +5398,9 @@ iconv-lite@0.4.24: safer-buffer ">= 2.1.2 < 3" iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" @@ -5465,11 +5468,6 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ini@^1.3.4: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - ini@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ini/-/ini-3.0.1.tgz#c76ec81007875bc44d544ff7a11a55d12294102d" @@ -5825,7 +5823,7 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -is-wsl@^2.2.0: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -6414,7 +6412,15 @@ js-queue@2.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.10.0, js-yaml@^3.13.1: +js-yaml@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + integrity sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -6477,12 +6483,7 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4= -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - -json-buffer@3.0.1: +json-buffer@3.0.1, json-buffer@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== @@ -6632,18 +6633,12 @@ junk@^3.1.0: resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ== -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - keyv@^4.0.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" - integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== + version "4.4.1" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.4.1.tgz#5d97bae8dfbb6788ebc9330daf5eb6582e2d3d1c" + integrity sha512-PzByhNxfBLnSBW2MZi1DF+W5+qB/7BMpOokewqIvqS8GFtP7xHm2oeGU72Y1fhtfOv/FiEnI4+nyViYDmUChnw== dependencies: + compress-brotli "^1.3.8" json-buffer "3.0.1" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: @@ -6677,6 +6672,13 @@ klaw-sync@^3.0.0: dependencies: graceful-fs "^4.1.11" +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -6882,7 +6884,7 @@ lodash.upperfirst@4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6901,11 +6903,6 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - lowercase-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" @@ -7120,7 +7117,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0, mimic-response@^1.0.1: +mimic-response@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== @@ -7359,24 +7356,11 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - normalize-url@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -npm-conf@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9" - integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw== - dependencies: - config-chain "^1.1.11" - pify "^3.0.0" - npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -7575,6 +7559,14 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +open@^7.4.2: + version "7.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" + integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== + dependencies: + is-docker "^2.0.0" + is-wsl "^2.1.1" + opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" @@ -7609,11 +7601,6 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - p-cancelable@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" @@ -7745,6 +7732,26 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +patch-package@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.5.1.tgz#3e5d00c16997e6160291fee06a521c42ac99b621" + integrity sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + cross-spawn "^6.0.5" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + is-ci "^2.0.0" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^5.6.0" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^1.10.2" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -7770,7 +7777,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.5, path-parse@^1.0.6, path-parse@^1.0.7: +path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -7822,11 +7829,6 @@ pify@^2.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" @@ -7842,12 +7844,12 @@ pkg-dir@^4.2.0: find-up "^4.0.0" plist@^3.0.0, plist@^3.0.1, plist@^3.0.4: - version "3.0.6" - resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.6.tgz#7cfb68a856a7834bca6dbfe3218eb9c7740145d3" - integrity sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA== + version "3.0.5" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.5.tgz#2cbeb52d10e3cdccccf0c11a63a85d830970a987" + integrity sha512-83vX4eYdQp3vP9SxuYgEM/G/pJQqLUz/V/xzPrzruLs7fz7jxGQ1msZ/mg1nwZxUSuOp4sb+/bEIbRrbzZRxDA== dependencies: base64-js "^1.5.1" - xmlbuilder "^15.1.1" + xmlbuilder "^9.0.7" pluralize@^1.2.1: version "1.2.1" @@ -7909,6 +7911,11 @@ postcss@^8.4.7: picocolors "^1.0.0" source-map-js "^1.0.2" +postinstall-postinstall@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz#4f7f77441ef539d1512c40bd04c71b06a4704ca3" + integrity sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ== + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -7919,11 +7926,6 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -8033,11 +8035,6 @@ prop-types@^15.7.2: object-assign "^4.1.1" react-is "^16.8.1" -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= - proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -8133,10 +8130,12 @@ raw-body@2.4.3: iconv-lite "0.4.24" unpipe "1.0.0" -rcedit@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-2.1.0.tgz#37ae6ad1fc8d7734b2e445ec3d378ace89d4076d" - integrity sha512-Nrd/65LzMjFmKpS9d2fqIxVYdW0M8ovsN0PgZhCrPMQss2yznkp6/zjEQ1a9DzzoGv2uuN3yDJAeHybOD5ZNKA== +rcedit@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-3.0.1.tgz#ae21b43e49c075f4d84df1929832a12c302f3c90" + integrity sha512-XM0Jv40/y4hVAqj/MO70o/IWs4uOsaSoo2mLyk3klFDW+SStLnCtzuQu+1OBTIMGlM8CvaK9ftlYCp6DJ+cMsw== + dependencies: + cross-spawn-windows-exe "^1.1.0" react-is@^16.12.0: version "16.13.1" @@ -8287,6 +8286,11 @@ realistic-structured-clone@^2.0.1: typeson "^5.8.2" typeson-registry "^1.0.0-alpha.20" +regenerator-runtime@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447" + integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA== + regenerator-runtime@^0.13.4: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" @@ -8450,21 +8454,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.6, resolve@^1.3.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" - integrity sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw== - dependencies: - path-parse "^1.0.5" - -resolve@^1.10.0: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.18.1: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.18.1, resolve@^1.3.2: version "1.19.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== @@ -8489,13 +8479,6 @@ resolve@^2.0.0-next.3: is-core-module "^2.2.0" path-parse "^1.0.6" -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - responselike@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" @@ -8532,6 +8515,13 @@ rimraf@^2.5.2: dependencies: glob "^7.0.5" +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -8610,7 +8600,7 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sanitize-filename@^1.6.2, sanitize-filename@^1.6.3: +sanitize-filename@^1.6.3: version "1.6.3" resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== @@ -8676,15 +8666,15 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.x, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== +semver@7.x, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" @@ -8693,20 +8683,6 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - semver@~7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" @@ -9238,9 +9214,9 @@ strip-ansi@^3.0.0: ansi-regex "^2.0.0" strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + version "5.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.1.0.tgz#55aaa54e33b4c0649a7338a43437b1887d153ec4" + integrity sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg== dependencies: ansi-regex "^4.1.0" @@ -9295,7 +9271,7 @@ style-loader@^3.3.1: resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== -sumchecker@^3.0.0, sumchecker@^3.0.1: +sumchecker@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== @@ -9455,6 +9431,11 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== +tiny-each-async@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/tiny-each-async/-/tiny-each-async-2.0.3.tgz#8ebbbfd6d6295f1370003fbb37162afe5a0a51d1" + integrity sha1-jru/1tYpXxNwAD+7NxYq/loKUdE= + tmp-promise@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-1.0.5.tgz#3208d7fa44758f86a2a4c4060f3c33fea30e8038" @@ -9470,7 +9451,7 @@ tmp-promise@^3.0.2: dependencies: tmp "^0.2.0" -tmp@0.0.33: +tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== @@ -9513,11 +9494,6 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -9704,11 +9680,6 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -tunnel@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" - integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== - tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" @@ -9881,13 +9852,6 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - use@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" @@ -10197,7 +10161,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.9: +which@^1.2.4, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -10299,7 +10263,7 @@ xml2js@^0.4.16: sax ">=0.6.0" xmlbuilder "~9.0.1" -xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1: +xmlbuilder@>=11.0.1: version "15.1.1" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== @@ -10319,15 +10283,23 @@ xtend@^4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= +xvfb-maybe@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/xvfb-maybe/-/xvfb-maybe-0.2.1.tgz#ed8cb132957b7848b439984c66f010ea7f24361b" + integrity sha1-7YyxMpV7eEi0OZhMZvAQ6n8kNhs= + dependencies: + debug "^2.2.0" + which "^1.2.4" + y18n@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + version "5.0.5" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" + integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== yallist@^2.1.2: version "2.1.2" @@ -10339,7 +10311,19 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@20.x: +yaml@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.4.0.tgz#b729a3ef7e35bdc5ece8f28900e20a9b41510fc3" + integrity sha512-rzU83hGJrNgyT7OE2mP/SILeZxEMRJ0mza0n4KFtkNL1aXUZ79ZgZ5pIH56yT6LiqujcAs/Rqzp0ApvvNYfUfw== + dependencies: + "@babel/runtime" "^7.3.4" + +yargs-parser@20.x, yargs-parser@^20.2.2: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== @@ -10352,17 +10336,12 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@^19.0.1: - version "19.0.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-19.0.4.tgz#99183a3a59268b205c6b04177f2a5bfb46e79ba7" - integrity sha512-eXeQm7yXRjPFFyf1voPkZgXQZJjYfjgQUmGPbD2TLtZeIYzvacgWX7sQ5a1HsRgVP+pfKAkRZDNtTGev4h9vhw== - yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^15.4.1: +yargs@^15.0.1, yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== @@ -10379,6 +10358,19 @@ yargs@^15.4.1: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^16.0.2: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^17.5.1: version "17.7.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.0.tgz#b21e9af1e0a619a2a9c67b1133219b2975a07985"