2
0

8 Commits

Author SHA1 Message Date
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
7 changed files with 218 additions and 249 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,6 +37,16 @@ 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
- name: Lint
@@ -40,12 +54,14 @@ jobs:
- 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,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' ],

View File

@@ -1,6 +1,6 @@
{
"name": "desktop-trampoline",
"version": "0.9.4",
"version": "0.9.7",
"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(\\.exe)?$\"",
"prebuild-napi-ia32": "prebuild -t 3 -r napi -a ia32 --strip --include-regex \"desktop-trampoline(\\.exe)?$\"",
"prebuild-napi-arm64": "prebuild -t 3 -r napi -a arm64 --strip --include-regex \"desktop-trampoline(\\.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",
"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)"

View File

@@ -1,7 +1,5 @@
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -46,42 +44,6 @@ int isValidEnvVar(char *env) {
return 0;
}
/**
* Reads a string from the socket, reading first 2 bytes to get its length and
* then the string itself.
*/
ssize_t readDelimitedString(SOCKET socket, char *buffer, size_t bufferSize) {
uint16_t outputLength = 0;
if (readSocket(socket, &outputLength, sizeof(uint16_t)) < (int)sizeof(uint16_t)) {
printSocketError("ERROR: Error reading from socket");
return -1;
}
if (outputLength > bufferSize) {
fprintf(stderr, "ERROR: received string is bigger than buffer (%d > %zu)", outputLength, bufferSize);
return -1;
}
size_t totalBytesRead = 0;
ssize_t bytesRead = 0;
// Read output from server
do {
bytesRead = readSocket(socket, buffer + totalBytesRead, outputLength - totalBytesRead);
if (bytesRead == -1) {
printSocketError("ERROR: Error reading from socket");
return -1;
}
totalBytesRead += bytesRead;
} while (bytesRead > 0);
buffer[totalBytesRead] = '\0';
return totalBytesRead;
}
int runTrampolineClient(SOCKET *outSocket, int argc, char **argv, char **envp) {
char *desktopPortString;
@@ -140,57 +102,29 @@ int runTrampolineClient(SOCKET *outSocket, int argc, char **argv, char **envp) {
WRITE_STRING_OR_EXIT("environment variable", validEnvVars[idx]);
}
// TODO: send stdin stuff?
char buffer[BUFFER_LENGTH + 1];
size_t totalBytesWritten = 0;
ssize_t bytesToWrite = 0;
size_t totalBytesRead = 0;
ssize_t bytesRead = 0;
// Make stdin reading non-blocking, to prevent getting stuck when no data is
// provided via stdin.
int flags = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK);
// Send stdin data
// Read output from server
do {
bytesToWrite = read(0, buffer, BUFFER_LENGTH);
bytesRead = readSocket(socket, buffer + totalBytesRead, BUFFER_LENGTH - totalBytesRead);
if (bytesToWrite == -1) {
if (totalBytesWritten == 0) {
// No stdin content found, continuing...
break;
} else {
fprintf(stderr, "ERROR: Error reading stdin data");
return 1;
}
}
if (writeSocket(socket, buffer, bytesToWrite) != 0) {
printSocketError("ERROR: Couldn't send stdin data");
if (bytesRead == -1) {
printSocketError("ERROR: Error reading from socket");
return 1;
}
totalBytesWritten += bytesToWrite;
} while (bytesToWrite > 0);
totalBytesRead += bytesRead;
} while (bytesRead > 0);
writeSocket(socket, "\0", 1);
// Read stdout from the server
if (readDelimitedString(socket, buffer, BUFFER_LENGTH) == -1) {
fprintf(stderr, "ERROR: Couldn't read stdout from socket");
return 1;
}
buffer[totalBytesRead] = '\0';
// Write that output to stdout
fprintf(stdout, "%s", buffer);
// Read stderr from the server
if (readDelimitedString(socket, buffer, BUFFER_LENGTH) == -1) {
fprintf(stderr, "ERROR: Couldn't read stdout from socket");
return 1;
}
// Write that output to stderr
fprintf(stderr, "%s", buffer);
return 0;
}

View File

@@ -9,44 +9,6 @@ const { createServer } = require('net')
const trampolinePath = getDesktopTrampolinePath()
const run = promisify(execFile)
async function startTrampolineServer(output, stdout = '', stderr = '') {
const server = createServer(socket => {
socket.pipe(split2(/\0/)).on('data', data => {
output.push(data.toString('utf8'))
})
const buffer = Buffer.alloc(2, 0)
// Send stdout
buffer.writeUInt16LE(stdout.length, 0)
socket.write(buffer)
socket.write(stdout)
// Send stderr
buffer.writeUInt16LE(stderr.length, 0)
socket.write(buffer)
socket.write(stderr)
// Close the socket
socket.end()
})
server.unref()
const startServer = async () => {
return new Promise((resolve, reject) => {
server.on('error', e => reject(e))
server.listen(0, '127.0.0.1', () => {
resolve(server.address().port)
})
})
}
return {
server,
port: await startServer(),
}
}
describe('desktop-trampoline', () => {
it('exists and is a regular file', async () =>
expect((await stat(trampolinePath)).isFile()).toBe(true))
@@ -57,127 +19,48 @@ describe('desktop-trampoline', () => {
it('fails when required environment variables are missing', () =>
expect(run(trampolinePath, ['Username'])).rejects.toThrow())
describe('with a trampoline server', () => {
let server = null
let output = []
let baseEnv = {}
it('forwards arguments and valid environment variables correctly', async () => {
const output = []
const server = createServer(socket => {
socket.pipe(split2(/\0/)).on('data', data => {
output.push(data.toString('utf8'))
})
async function configureTrampolineServer(stdout = '', stderr = '') {
output = []
const serverInfo = await startTrampolineServer(output, stdout, stderr)
server = serverInfo.server
baseEnv = {
DESKTOP_PORT: serverInfo.port,
}
// Don't send anything and just close the socket after the trampoline is
// done forwarding data.
socket.end()
})
server.unref()
const startTrampolineServer = async () => {
return new Promise((resolve, reject) => {
server.on('error', e => reject(e))
server.listen(0, '127.0.0.1', () => {
resolve(server.address().port)
})
})
}
afterEach(() => {
server.close()
})
const port = await startTrampolineServer()
const env = {
DESKTOP_TRAMPOLINE_IDENTIFIER: '123456',
DESKTOP_PORT: port,
DESKTOP_USERNAME: 'sergiou87',
DESKTOP_USERNAME_FAKE: 'fake-user',
INVALID_VARIABLE: 'foo bar',
}
const opts = { env }
it('forwards arguments and valid environment variables correctly without stdin', async () => {
await configureTrampolineServer()
await run(trampolinePath, ['baz'], opts)
const env = {
...baseEnv,
DESKTOP_TRAMPOLINE_IDENTIFIER: '123456',
DESKTOP_USERNAME: 'sergiou87',
DESKTOP_USERNAME_FAKE: 'fake-user',
INVALID_VARIABLE: 'foo bar',
}
const opts = { env }
const outputArguments = output.slice(1, 2)
expect(outputArguments).toStrictEqual(['baz'])
// output[2] is the number of env variables
const outputEnv = output.slice(3)
expect(outputEnv).toHaveLength(2)
expect(outputEnv).toContain('DESKTOP_TRAMPOLINE_IDENTIFIER=123456')
expect(outputEnv).toContain(`DESKTOP_USERNAME=sergiou87`)
await run(trampolinePath, ['baz'], opts)
const outputArguments = output.slice(1, 2)
expect(outputArguments).toStrictEqual(['baz'])
// output[2] is the number of env variables
const outputEnv = output.slice(3, output.length - 1)
expect(outputEnv).toHaveLength(2)
expect(outputEnv).toContain('DESKTOP_TRAMPOLINE_IDENTIFIER=123456')
expect(outputEnv).toContain(`DESKTOP_USERNAME=sergiou87`)
expect(output[output.length - 1]).toStrictEqual('')
})
it('forwards arguments, environment variables and stdin correctly', async () => {
await configureTrampolineServer()
const env = {
...baseEnv,
DESKTOP_TRAMPOLINE_IDENTIFIER: '123456',
DESKTOP_USERNAME: 'sergiou87',
}
const opts = {
env,
stdin: 'This is a test\nWith a multiline\nStandard input text',
}
const run = new Promise((resolve, reject) => {
const process = execFile(trampolinePath, ['baz'], opts, function (
err,
stdout,
stderr
) {
if (!err) {
resolve({ stdout, stderr, exitCode: 0 })
return
}
reject(err)
})
process.stdin.end(
'This is a test\nWith a multiline\nStandard input text',
'utf-8'
)
})
await run
const outputArguments = output.slice(1, 2)
expect(outputArguments).toStrictEqual(['baz'])
// output[2] is the number of env variables
const outputEnv = output.slice(3, output.length - 1)
expect(outputEnv).toHaveLength(2)
expect(outputEnv).toContain('DESKTOP_TRAMPOLINE_IDENTIFIER=123456')
expect(outputEnv).toContain(`DESKTOP_USERNAME=sergiou87`)
expect(output[output.length - 1]).toBe(
'This is a test\nWith a multiline\nStandard input text'
)
})
it('outputs the same stdout received from the server, when no stderr is specified', async () => {
await configureTrampolineServer('This is the command stdout', '')
const opts = { env: baseEnv }
const result = await run(trampolinePath, ['baz'], opts)
expect(result.stdout).toStrictEqual('This is the command stdout')
expect(result.stderr).toStrictEqual('')
})
it('outputs the same stderr received from the server, when no stdout is specified', async () => {
await configureTrampolineServer('', 'This is the command stderr')
const opts = { env: baseEnv }
const result = await run(trampolinePath, ['baz'], opts)
expect(result.stdout).toStrictEqual('')
expect(result.stderr).toStrictEqual('This is the command stderr')
})
it('outputs the same stdout and stderr received from the server, when both are specified', async () => {
await configureTrampolineServer(
'This is the command stdout',
'This is the command stderr'
)
const opts = { env: baseEnv }
const result = await run(trampolinePath, ['baz'], opts)
expect(result.stdout).toStrictEqual('This is the command stdout')
expect(result.stderr).toStrictEqual('This is the command stderr')
})
server.close()
})
})

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,6 +3432,26 @@ 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-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@^10.0.1:
version "10.0.1"
resolved "https://registry.yarnpkg.com/prebuild/-/prebuild-10.0.1.tgz#9d46a00f42b60ad1718479cc5e3d1ef4882b7f33"
@@ -3840,6 +3894,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 +4206,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==