2
0

18 Commits

Author SHA1 Message Date
Sergio Padrino
cbd3dbb31d Fix prebuilds to include ssh-wrapper
Aside from changing `--include-regex`, I also needed to fix `prebuild` itself to support stripping debug symbols of multiple files: https://github.com/prebuild/prebuild/pull/280

Instead of waiting until that PR is merged, I went ahead and switched our `prebuild` dependency with my fork, containing my changes.
2021-08-17 12:00:02 +02:00
Sergio Padrino
a2cfb8a8f3 Bump version to v0.9.8 2021-08-16 16:18:10 +02:00
Sergio Padrino
8b38cd56a1 Merge pull request #13 from desktop/ssh-wrapper
Add SSH wrapper for macOS
2021-08-16 15:30:06 +02:00
Sergio Padrino
6d672bd70f Skip ssh-wrapper tests on Linux too 2021-08-16 12:23:32 +02:00
Sergio Padrino
c16ca4bad7 Make sure we always build in CI 2021-08-16 11:54:08 +02:00
Sergio Padrino
158101ca4d Fix index.js style 2021-08-16 11:50:53 +02:00
Sergio Padrino
ac5ec3b3d2 Update README.md 2021-08-16 11:37:29 +02:00
Sergio Padrino
6bab396b51 Fix build & test on Windows 2021-08-16 11:32:50 +02:00
Sergio Padrino
0165c9bc33 Add ssh-wrapper with some tests 2021-08-16 11:03:10 +02:00
Sergio Padrino
c39c55721f Merge pull request #11 from desktop/releases/0.9.6 2021-04-29 08:45:33 +02:00
Sergio Padrino
38c590851f Bump version to 0.9.7 2021-04-29 08:39:30 +02:00
Sergio Padrino
ab9cabd08f Bump node version to fix arm64 prebuilds 😒 2021-04-29 08:39:03 +02:00
Sergio Padrino
0f81f6ec9a Bump version to 0.9.6 2021-04-22 15:27:13 +02:00
Sergio Padrino
0ca3d5caef Allow to actually install prebuilt binaries 2021-04-22 15:26:51 +02:00
Sergio Padrino
1dfb44afbe Merge pull request #10 from desktop/releases/0.9.5
Bump version to 0.9.5
2021-04-22 15:25:49 +02:00
Sergio Padrino
ee5cc6e589 Bump version to 0.9.5 2021-04-22 11:36:06 +02:00
Sergio Padrino
6ad1a5079e Merge pull request #9 from desktop/n-api-prebuilds
Make prebuilds using N-API
2021-04-22 11:34:36 +02:00
Sergio Padrino
d66fb5cf16 Make prebuilds using N-API 2021-04-22 11:24:16 +02:00
11 changed files with 329 additions and 24 deletions

View File

@@ -13,15 +13,19 @@ jobs:
name: ${{ matrix.friendlyName }}
runs-on: ${{ matrix.os }}
timeout-minutes: 10
env:
# Needed until macos-11.0 hosted runners are available
SDKROOT: '/Library/Developer/CommandLineTools/SDKs/MacOSX11.1.sdk'
strategy:
fail-fast: false
matrix:
node: [12.14.1]
os: [macos-10.14, windows-2019, ubuntu-18.04]
node: [14.15.4]
os: [macos-10.14, windows-latest, ubuntu-18.04]
include:
- os: macos-10.14
friendlyName: macOS
- os: windows-2019
- os: windows-latest
friendlyName: Windows
- os: ubuntu-18.04
friendlyName: Linux
@@ -33,19 +37,33 @@ jobs:
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node }}
# This step can be removed as soon as official Windows arm64 builds are published:
# https://github.com/nodejs/build/issues/2450#issuecomment-705853342
- run: |
$NodeVersion = (node --version) -replace '^.'
$NodeFallbackVersion = "15.8.0"
& .\script\download-node-lib-win-arm64.ps1 $NodeVersion $NodeFallbackVersion
if: ${{ matrix.os == 'windows-latest' }}
name: Install Windows arm64 node.lib
- name: Install and build
run: yarn
run: |
yarn install
yarn build
- name: Lint
run: yarn lint
- name: Test
run: yarn test
shell: bash
- name: Prebuild Node x64
run: yarn prebuild-node
- name: Prebuild Electron x64
run: yarn prebuild-electron
- name: Prebuild Electron arm64
run: yarn prebuild-electron-arm64
- name: Prebuild (x64)
run: npm run prebuild-napi-x64
- name: Prebuild (arm64)
run: npm run prebuild-napi-arm64
if: ${{ matrix.os != 'ubuntu-18.04' }}
- name: Prebuild (Windows x86)
run: npm run prebuild-napi-ia32
if: ${{ matrix.os == 'windows-latest' }}
- name: Publish
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
run: yarn upload

View File

@@ -2,7 +2,7 @@
A cross-platform no-dependency C executable trampoline which lets GitHub Desktop
intercede in order to provide Git with any additional info it needs (like
credentials through `GIT_ASKPASS`).
credentials through `GIT_ASKPASS` or `SSH_ASKPASS`).
The intention is to support the same platforms that
[Electron supports](https://www.electronjs.org/docs/tutorial/support#supported-platforms).
@@ -125,3 +125,15 @@ Thanks to this, with only one generic trampoline that forwards everything via
that TCP socket, the implementation for every possible protocol like
`GIT_ASKPASS` can live within the GitHub Desktop codebase instead of having
multiple trampoline executables.
## SSH Wrapper
Along with the trampoline, an SSH wrapper is provided for macOS. The reason for
this is macOS before Monterey include an "old" version of OpenSSH that will
ignore the `SSH_ASKPASS` variable unless it's unable to write to a tty.
This SSH wrapper achieves exactly that: just runs whatever `ssh` exists in the
path in a way that will use `SSH_ASKPASS` when necessary.
More recent versions of OpenSSH (starting with 8.3) don't require this wrapper,
since they added support for a new `SSH_ASKPASS_REQUIRE` environment variable.

View File

@@ -2,12 +2,16 @@
'targets': [
{
'target_name': 'desktop-trampoline',
'defines': [
"NAPI_VERSION=<(napi_build_version)",
],
'type': 'executable',
'sources': [
'src/desktop-trampoline.c',
'src/socket.c'
],
'include_dirs': [
'<!(node -p "require(\'node-addon-api\').include_dir")',
'include'
],
'xcode_settings': {
@@ -27,12 +31,17 @@
'-pie',
'-D_FORTIFY_SOURCE=1',
'-fstack-protector-strong',
'-Werror=format-security'
'-Werror=format-security',
'-fno-exceptions'
],
'cflags_cc!': [ '-fno-exceptions' ],
'ldflags!': [
'-z relro',
'-z now'
],
'msvs_settings': {
'VCCLCompilerTool': { 'ExceptionHandling': 1 },
},
'conditions': [
['OS=="win"', {
'defines': [ 'WINDOWS' ],
@@ -42,5 +51,53 @@
}]
]
},
{
'target_name': 'ssh-wrapper',
'defines': [
"NAPI_VERSION=<(napi_build_version)",
],
'type': 'executable',
'sources': [
'src/ssh-wrapper.c'
],
'include_dirs': [
'<!(node -p "require(\'node-addon-api\').include_dir")',
'include'
],
'xcode_settings': {
'OTHER_CFLAGS': [
'-Wall',
'-Werror',
'-Werror=format-security',
'-fPIC',
'-D_FORTIFY_SOURCE=1',
'-fstack-protector-strong'
]
},
'cflags!': [
'-Wall',
'-Werror',
'-fPIC',
'-pie',
'-D_FORTIFY_SOURCE=1',
'-fstack-protector-strong',
'-Werror=format-security',
'-fno-exceptions'
],
'cflags_cc!': [ '-fno-exceptions' ],
'ldflags!': [
'-z relro',
'-z now'
],
'msvs_settings': {
'VCCLCompilerTool': { 'ExceptionHandling': 1 },
},
'conditions': [
# For now only build it for macOS, since it's not needed on Windows
['OS=="win"', {
'defines': [ 'WINDOWS' ],
}]
]
},
],
}

3
index.d.ts vendored
View File

@@ -1,2 +1,5 @@
export function getDesktopTrampolinePath(): string
export function getDesktopTrampolineFilename(): string
export function getSSHWrapperPath(): string
export function getSSHWrapperFilename(): string

View File

@@ -15,7 +15,17 @@ function getDesktopTrampolineFilename() {
: 'desktop-trampoline'
}
function getSSHWrapperPath() {
return Path.join(__dirname, 'build', 'Release', getSSHWrapperFilename())
}
function getSSHWrapperFilename() {
return process.platform === 'win32' ? 'ssh-wrapper.exe' : 'ssh-wrapper'
}
module.exports = {
getDesktopTrampolinePath,
getDesktopTrampolineFilename,
getSSHWrapperPath,
getSSHWrapperFilename,
}

View File

@@ -1,6 +1,6 @@
{
"name": "desktop-trampoline",
"version": "0.9.4",
"version": "0.9.8",
"main": "index.js",
"keywords": [],
"author": "",
@@ -15,10 +15,10 @@
"test": "jest",
"lint": "prettier -c **/*.js **/*.md",
"lint:fix": "prettier --write **/*.js **/*.md",
"prebuild-node": "prebuild -t 10.11.0 -t 11.9.0 -t 12.0.0 -t 14.8.0 --strip --include-regex \"desktop-trampoline(\\.exe)?$\"",
"prebuild-electron": "prebuild -t 7.0.0 -t 8.0.0 -t 9.0.0 -t 10.0.0 -t 11.0.0 -r electron --strip --include-regex \"desktop-trampoline(\\.exe)?$\"",
"prebuild-electron-arm64": "prebuild -t 7.0.0 -t 8.0.0 -t 9.0.0 -t 10.0.0 -t 11.0.0 -r electron -a arm64 --strip --include-regex \"desktop-trampoline(\\.exe)?$\"",
"prebuild-all": "yarn prebuild-node && yarn prebuild-electron && yarn prebuild-electron-arm64",
"prebuild-napi-x64": "prebuild -t 3 -r napi -a x64 --strip --include-regex \"(desktop-trampoline|ssh-wrapper)(\\.exe)?$\"",
"prebuild-napi-ia32": "prebuild -t 3 -r napi -a ia32 --strip --include-regex \"(desktop-trampoline|ssh-wrapper)(\\.exe)?$\"",
"prebuild-napi-arm64": "prebuild -t 3 -r napi -a arm64 --strip --include-regex \"(desktop-trampoline|ssh-wrapper)(\\.exe)?$\"",
"prebuild-all": "yarn prebuild-napi-x64 && yarn prebuild-napi-ia32 && yarn prebuild-napi-arm64",
"upload": "node ./script/upload.js"
},
"repository": {
@@ -29,11 +29,24 @@
"url": "https://github.com/desktop/desktop-trampoline/issues"
},
"homepage": "https://github.com/desktop/desktop-trampoline#readme",
"dependencies": {
"node-addon-api": "^3.1.0",
"prebuild-install": "^6.0.0"
},
"devDependencies": {
"jest": "^26.4.2",
"node-gyp": "^7.1.0",
"prebuild": "^10.0.1",
"prebuild": "https://github.com/sergiou87/prebuild#strip-multiple-files",
"prettier": "^2.1.2",
"split2": "^3.2.2"
},
"binary": {
"napi_versions": [
3
]
},
"config": {
"runtime": "napi",
"target": 3
}
}

View File

@@ -0,0 +1,36 @@
# This script can be removed as soon as official Windows arm64 builds are published:
# https://github.com/nodejs/build/issues/2450#issuecomment-705853342
$nodeVersion = $args[0]
$fallbackVersion = $args[1]
If ($null -eq $nodeVersion -Or $null -eq $fallbackVersion) {
Write-Error "No NodeJS version given as argument to this file. Run it like download-nodejs-win-arm64.ps1 NODE_VERSION NODE_FALLBACK_VERSION"
exit 1
}
$url = "https://unofficial-builds.nodejs.org/download/release/v$nodeVersion/win-arm64/node.lib"
$fallbackUrl = "https://unofficial-builds.nodejs.org/download/release/v$fallbackVersion/win-arm64/node.lib"
# Always write to the $nodeVersion cache folder, even if we're using the fallbackVersion
$cacheFolder = "$env:TEMP\prebuild\napi\$nodeVersion\arm64"
If (!(Test-Path $cacheFolder)) {
New-Item -ItemType Directory -Force -Path $cacheFolder
}
$output = "$cacheFolder\node.lib"
$start_time = Get-Date
Try {
Invoke-WebRequest -Uri $url -OutFile $output
$downloadedNodeVersion = $nodeVersion
} Catch {
If ($_.Exception.Response -And $_.Exception.Response.StatusCode -eq "NotFound") {
Write-Output "No arm64 node.lib found for Node Windows $nodeVersion, trying fallback version $fallbackVersion..."
Invoke-WebRequest -Uri $fallbackUrl -OutFile $output
$downloadedNodeVersion = $fallbackVersion
}
}
Write-Output "Downloaded arm64 NodeJS lib v$downloadedNodeVersion to $output in $((Get-Date).Subtract($start_time).Seconds) second(s)"

37
src/ssh-wrapper.c Normal file
View File

@@ -0,0 +1,37 @@
#ifdef WINDOWS
int main(int argc, char **argv) {
// Not needed on Windows, this will just create a dummy executable
return -1;
}
#else
#include <unistd.h>
#include <stdio.h>
/**
* This is a wrapper for the ssh command. It is used to make sure ssh runs without
* a tty on macOS, allowing GitHub Desktop to intercept different prompts from
* ssh (e.g. passphrase, adding a host to the list of known hosts...).
* This is not necessary on more recent versions of OpenSSH (starting with v8.3)
* which include support for the SSH_ASKPASS_REQUIRE environment variable.
*/
int main(int argc, char **argv) {
pid_t child = fork();
if (child < 0) {
fprintf(stderr, "Failed to fork\n");
return -1;
}
if (child != 0) {
// This is the parent process. Just exit.
return 0;
}
setsid();
return execvp("ssh", argv);
}
#endif

42
test/ssh-wrapper.test.js Normal file
View File

@@ -0,0 +1,42 @@
const { stat, access } = require('fs').promises
const { constants } = require('fs')
const { execFile } = require('child_process')
const { promisify } = require('util')
const { getSSHWrapperPath } = require('../index')
const sshWrapperPath = getSSHWrapperPath()
const run = promisify(execFile)
describe('ssh-wrapper', () => {
it('exists and is a regular file', async () =>
expect((await stat(sshWrapperPath)).isFile()).toBe(true))
// On Windows, the binary generated is just useless, so no point to test it.
// Also, this won't be used on Linux (for now at least), so don't bother to
// run the tests there.
if (process.platform !== 'darwin') {
return
}
it('can be executed by current process', () =>
access(sshWrapperPath, constants.X_OK))
it('attempts to use ssh-askpass program', async () => {
// Try to connect to github.com with a non-existent known_hosts file to force
// ssh to prompt the user and use askpass.
const result = await run(
sshWrapperPath,
['-o', 'UserKnownHostsFile=/path/to/fake/known_hosts', 'git@github.com'],
{
env: {
SSH_ASKPASS: '/path/to/fake/ssh-askpass',
DISPLAY: '.',
},
}
)
expect(result.stderr).toMatch(
/ssh_askpass: exec\(\/path\/to\/fake\/ssh-askpass\): No such file or directory/
)
})
})

View File

@@ -1296,6 +1296,13 @@ decode-uri-component@^0.2.0:
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
decompress-response@^4.2.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
dependencies:
mimic-response "^2.0.0"
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
@@ -1539,6 +1546,11 @@ expand-brackets@^2.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
expand-template@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
expect@^26.4.2:
version "26.4.2"
resolved "https://registry.yarnpkg.com/expect/-/expect-26.4.2.tgz#36db120928a5a2d7d9736643032de32f24e1b2a1"
@@ -2893,13 +2905,18 @@ 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@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43"
integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
"minimatch@2 || 3", minimatch@3, minimatch@^3.0.2, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
dependencies:
brace-expansion "^1.1.7"
minimist@^1.1.1, minimist@^1.1.2, minimist@^1.2.0, minimist@^1.2.5:
minimist@^1.1.1, minimist@^1.1.2, minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@@ -2942,6 +2959,11 @@ mixin-deep@^1.2.0:
for-in "^1.0.2"
is-extendable "^1.0.1"
mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
version "0.5.3"
resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
@@ -3008,6 +3030,18 @@ node-abi@^2.2.0:
dependencies:
semver "^5.4.1"
node-abi@^2.21.0:
version "2.26.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.26.0.tgz#355d5d4bc603e856f74197adbf3f5117a396ba40"
integrity sha512-ag/Vos/mXXpWLLAYWsAoQdgS+gW7IwvgMLOgqopm/DbzAjazLltzgzpVMsFlgmo9TzG5hGXeaBZx2AI731RIsQ==
dependencies:
semver "^5.4.1"
node-addon-api@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239"
integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==
node-gyp@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-6.1.0.tgz#64e31c61a4695ad304c1d5b82cf6b7c79cc79f3f"
@@ -3083,7 +3117,7 @@ node-notifier@^8.0.0:
uuid "^8.3.0"
which "^2.0.2"
noop-logger@^0.1.0:
noop-logger@^0.1.0, noop-logger@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2"
integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=
@@ -3398,10 +3432,29 @@ posix-character-classes@^0.1.0:
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
prebuild@^10.0.1:
prebuild-install@^6.0.0:
version "6.1.1"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.1.tgz#6754fa6c0d55eced7f9e14408ff9e4cba6f097b4"
integrity sha512-M+cKwofFlHa5VpTWub7GLg5RLcunYIcLqtY5pKcls/u7xaAb8FrXZ520qY8rkpYy5xw90tYCyMO0MP5ggzR3Sw==
dependencies:
detect-libc "^1.0.3"
expand-template "^2.0.3"
github-from-package "0.0.0"
minimist "^1.2.3"
mkdirp-classic "^0.5.3"
napi-build-utils "^1.0.1"
node-abi "^2.21.0"
noop-logger "^0.1.1"
npmlog "^4.0.1"
pump "^3.0.0"
rc "^1.2.7"
simple-get "^3.0.3"
tar-fs "^2.0.0"
tunnel-agent "^0.6.0"
"prebuild@https://github.com/sergiou87/prebuild#strip-multiple-files":
version "10.0.1"
resolved "https://registry.yarnpkg.com/prebuild/-/prebuild-10.0.1.tgz#9d46a00f42b60ad1718479cc5e3d1ef4882b7f33"
integrity sha512-x0CkKDmHFwX49rTGEYJwB9jBQwJWxRzwUtP5PA9dP8khFGMm3oSFgYortxdlp0PkxB29EhWGp/KQE5g+adehYg==
resolved "https://github.com/sergiou87/prebuild#d3761817d9a0db1ecf4dfbf12d02b36b0a03cadc"
dependencies:
cmake-js "~5.2.0"
detect-libc "^1.0.3"
@@ -3840,6 +3893,20 @@ signal-exit@^3.0.2:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
simple-concat@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
simple-get@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3"
integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
dependencies:
decompress-response "^4.2.0"
once "^1.3.1"
simple-concat "^1.0.0"
simple-mime@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/simple-mime/-/simple-mime-0.1.0.tgz#95f517c4f466d7cff561a71fc9dab2596ea9ef2e"
@@ -4138,7 +4205,17 @@ symbol-tree@^3.2.4:
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
tar-stream@^2.1.0:
tar-fs@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
dependencies:
chownr "^1.1.1"
mkdirp-classic "^0.5.2"
pump "^3.0.0"
tar-stream "^2.1.4"
tar-stream@^2.1.0, tar-stream@^2.1.4:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==