diff --git a/.circleci/config.yml b/.circleci/config.yml index f6d2ae80..d265af2c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -11,6 +11,9 @@ jobs: - checkout - restore_cache: key: dependency-cache-{{ checksum "yarn.lock" }} + - run: + name: install-apt + command: sudo apt-get install libusb-1.0.0 - run: name: install-deps command: yarn install --frozen-lockfile diff --git a/packages/ui-keyring/package.json b/packages/ui-keyring/package.json index 8ff2e2d0..f27097ac 100644 --- a/packages/ui-keyring/package.json +++ b/packages/ui-keyring/package.json @@ -9,10 +9,18 @@ ], "contributors": [], "license": "Apache-2.0", + "browser": { + "@ledgerhq/hw-transport-node-hid": "@ledgerhq/hw-transport-u2f" + }, + "react-native": { + "@ledgerhq/hw-transport-node-hid": "@ledgerhq/hw-transport-u2f" + }, "dependencies": { "@babel/runtime": "^7.6.0", + "@ledgerhq/hw-transport-node-hid": "^4.70.0", "@ledgerhq/hw-transport-u2f": "^4.70.0", "@ledgerhq/hw-transport-webusb": "^4.70.0", + "@types/ledgerhq__hw-transport-node-hid": "^4.21.1", "@types/ledgerhq__hw-transport-u2f": "^4.21.1", "@types/mkdirp": "^0.5.2", "@types/store": "^2.0.2", @@ -24,7 +32,7 @@ }, "devDependencies": { "@polkadot/keyring": "^1.4.1", - "@polkadot/types": "^0.93.0-beta.3", + "@polkadot/types": "^0.93.0-beta.4", "@polkadot/util": "^1.4.1" }, "peerDependencies": { diff --git a/packages/ui-keyring/src/Keyring.ts b/packages/ui-keyring/src/Keyring.ts index 2bc444a0..8a76c4ba 100644 --- a/packages/ui-keyring/src/Keyring.ts +++ b/packages/ui-keyring/src/Keyring.ts @@ -36,6 +36,10 @@ export class Keyring extends Base implements KeyringStruct { }; } + public addHardware (address: string | Uint8Array, hardwareType: string, meta: KeyringPair$Meta = {}): CreateResult { + return this.addExternal(address, { ...meta, hardwareType, isHardware: true }); + } + public addPair (pair: KeyringPair, password: string): CreateResult { this.keyring.addPair(pair); diff --git a/packages/ui-keyring/src/index.ts b/packages/ui-keyring/src/index.ts index 5b843190..71df8c29 100644 --- a/packages/ui-keyring/src/index.ts +++ b/packages/ui-keyring/src/index.ts @@ -5,7 +5,7 @@ import { assertSingletonPackage } from '@polkadot/util'; import keyring, { Keyring } from './Keyring'; -import { openLedger } from './ledger'; +import Ledger from './ledger'; assertSingletonPackage('@polkadot/ui-keyring'); @@ -13,5 +13,5 @@ export default keyring; export { Keyring, - openLedger + Ledger }; diff --git a/packages/ui-keyring/src/ledger-polkadot.d.ts b/packages/ui-keyring/src/ledger-polkadot.d.ts index 02972296..8722cd38 100644 --- a/packages/ui-keyring/src/ledger-polkadot.d.ts +++ b/packages/ui-keyring/src/ledger-polkadot.d.ts @@ -29,7 +29,7 @@ declare module 'ledger-polkadot' { getVersion (): Promise; getAddress (account: number, change: number, addressIndex: number, requireConfirmation?: boolean): Promise; signSendChunk (chunkIdx: number, chunkNum: number, chunk: Buffer): Promise; - sign (account: number, change: number, addressIndex: number, message: Uint8Array): Promise; + sign (account: number, change: number, addressIndex: number, message: Buffer): Promise; } export default LedgerApp; diff --git a/packages/ui-keyring/src/ledger.ts b/packages/ui-keyring/src/ledger.ts index 6bc26e70..6d93b7b4 100644 --- a/packages/ui-keyring/src/ledger.ts +++ b/packages/ui-keyring/src/ledger.ts @@ -1,22 +1,130 @@ +/* eslint-disable @typescript-eslint/camelcase */ // Copyright 2017-2019 @polkadot/ui-keyring authors & contributors // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. import Transport from '@ledgerhq/hw-transport'; +import LedgerHid from '@ledgerhq/hw-transport-node-hid'; import LedgerU2F from '@ledgerhq/hw-transport-u2f'; import LedgerWebUSB from '@ledgerhq/hw-transport-webusb'; -import LedgerApp from 'ledger-polkadot'; +import LedgerApp, { ResponseBase } from 'ledger-polkadot'; +import { assert, u8aToBuffer } from '@polkadot/util'; -export async function openLedger (type: 'u2f' | 'webusb'): Promise { - let transport: Transport; +export type LedgerTypes = 'hid' | 'u2f' | 'webusb'; - if (type === 'u2f') { - transport = await LedgerU2F.create(7500); - } else if (type === 'webusb') { - transport = await LedgerWebUSB.create(); - } else { - throw new Error(`Unsupported transport ${type}`); +export interface LedgerAddress { + address: string; + publicKey: string; +} + +export interface LedgerSignature { + signature: string; +} + +export interface LedgerVersion { + isLocked: boolean; + isTestMode: boolean; + major: number; + minor: number; + patch: number; +} + +export const LEDGER_DEFAULT_ACCOUNT = 0x80000000; + +export const LEDGER_DEFAULT_CHANGE = 0x80000000; + +export const LEDGER_DEFAULT_INDEX = 0x80000000; + +const SUCCESS_CODE = 0x9000; + +// A very basic wrapper for a ledger app - +// - it connects automatically, creating an app as required +// - Promises return errors (instead of wrapper errors) +export default class Ledger { + private app: LedgerApp | null = null; + private type: LedgerTypes; + + public constructor (type: LedgerTypes) { + assert(['hid', 'u2f', 'webusb'].includes(type), `Unsupported transport ${type}`); + + this.type = type; } - return new LedgerApp(transport); + private async getApp (): Promise { + if (!this.app) { + let transport: Transport; + + if (this.type === 'hid') { + transport = await LedgerHid.create(); + } else if (this.type === 'u2f') { + transport = await LedgerU2F.create(); + } else if (this.type === 'webusb') { + transport = await LedgerWebUSB.create(); + } else { + throw new Error(`Unable to create app for ${this.type}`); + } + + this.app = new LedgerApp(transport); + } + + return this.app; + } + + private async wrapResult (fn: (app: LedgerApp) => Promise): Promise { + try { + const app = await this.getApp(); + + return await fn(app); + } catch (error) { + this.app = null; + + throw error; + } + } + + private async wrapError (promise: Promise): Promise { + const result = await promise; + + if (result.return_code !== SUCCESS_CODE) { + throw new Error(result.error_message); + } + + return result; + } + + public async getAddress (confirm = false, account = LEDGER_DEFAULT_ACCOUNT, change = LEDGER_DEFAULT_CHANGE, addressIndex = LEDGER_DEFAULT_INDEX): Promise { + return this.wrapResult(async (app: LedgerApp): Promise => { + const { address, pubKey } = await this.wrapError(app.getAddress(account, change, addressIndex, confirm)); + + return { + address, + publicKey: `0x${pubKey}` + }; + }); + } + + public async getVersion (): Promise { + return this.wrapResult(async (app: LedgerApp): Promise => { + const { device_locked, major, minor, patch, test_mode } = await this.wrapError(app.getVersion()); + + return { + isLocked: device_locked, + isTestMode: test_mode, + major, + minor, + patch + }; + }); + } + + public async sign (message: Uint8Array, account = LEDGER_DEFAULT_ACCOUNT, change = LEDGER_DEFAULT_CHANGE, addressIndex = LEDGER_DEFAULT_INDEX): Promise { + return this.wrapResult(async (app: LedgerApp): Promise => { + const buffer = u8aToBuffer(message); + const { signature } = await this.wrapError(app.sign(account, change, addressIndex, buffer)); + + return { + signature: `0x${signature}` + }; + }); + } } diff --git a/yarn.lock b/yarn.lock index 35530ad8..6a718bea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1252,6 +1252,31 @@ resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-4.70.0.tgz#3ec196ed8f1211ed2f4e84969c26e9e97a3a4bc0" integrity sha512-XFFuVGJ34dhkIfqTUGudPvnSx3cRGuZ+oVr8lR4UFuc29TwDVjf1X4GJ5wQU4XUqS4rNe+I+Tq7BK7V1DFX9lQ== +"@ledgerhq/hw-transport-node-hid-noevents@^4.70.0": + version "4.70.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-4.70.0.tgz#c2b235c5b80898b0f78fecc75a19421724a4def9" + integrity sha512-i+0zmxlpx+MtXAxJA/rr/M0j4wDDm8hRLu+Xq7dBLky7ANJernyR/Xkrgn0y0VFec20pWk3T00EyIZ3S3M2Uyg== + dependencies: + "@ledgerhq/devices" "^4.70.0" + "@ledgerhq/errors" "^4.70.0" + "@ledgerhq/hw-transport" "^4.70.0" + "@ledgerhq/logs" "^4.70.0" + node-hid "^0.7.9" + +"@ledgerhq/hw-transport-node-hid@^4.70.0": + version "4.70.0" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-4.70.0.tgz#7ded1ae6d5ad5bf06de1cceadc8480401eef303c" + integrity sha512-/KyfYoKLqnJwwRKf6t4oYaTWlUwF2u8+KdyIrPzDcBqCSgml6dYR9hPyem/R8xoHelmn1XuzCd0n5bBBeeNMsQ== + dependencies: + "@ledgerhq/devices" "^4.70.0" + "@ledgerhq/errors" "^4.70.0" + "@ledgerhq/hw-transport" "^4.70.0" + "@ledgerhq/hw-transport-node-hid-noevents" "^4.70.0" + "@ledgerhq/logs" "^4.70.0" + lodash "^4.17.15" + node-hid "^0.7.9" + usb "^1.6.0" + "@ledgerhq/hw-transport-u2f@^4.70.0": version "4.70.0" resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-u2f/-/hw-transport-u2f-4.70.0.tgz#1f10465d7cab016f787c552d05aa48c6bd235a58" @@ -2147,10 +2172,10 @@ dependencies: "@types/chrome" "^0.0.88" -"@polkadot/types@^0.93.0-beta.3": - version "0.93.0-beta.3" - resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-0.93.0-beta.3.tgz#2a5843c35b3fb3369390e66236ff20968099b9fe" - integrity sha512-RlwhdtnQXq9yHgNwQJ2Rnl0RtklGucPFJE2in6gCNrvAE9V+KbJqXrwGtCqbt/CmGySTZclaL9yJ9Qzg1JgS1w== +"@polkadot/types@^0.93.0-beta.4": + version "0.93.0-beta.4" + resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-0.93.0-beta.4.tgz#a4512efa541e10fc7feae5c7d66e6656cc0b8e01" + integrity sha512-OdE7WxhNp/+IbMs4ALujMUA5MNK8R9buD7QWDXjWg2DxuavN0UziHkDRNgMasoYlqvn/xDevu8oy+RYyVm/Vkg== dependencies: "@babel/runtime" "^7.6.0" "@polkadot/util" "^1.4.1" @@ -2424,6 +2449,15 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== +"@types/ledgerhq__hw-transport-node-hid@^4.21.1": + version "4.22.1" + resolved "https://registry.yarnpkg.com/@types/ledgerhq__hw-transport-node-hid/-/ledgerhq__hw-transport-node-hid-4.22.1.tgz#0f075f8965c7234126eb19bc8d569b73cc9a6f8e" + integrity sha512-EVdR5HWKUsuQOeg8DUqyhAtCooPsYpA3q+xvEdcZsgXxD/R8XNuYxSDCKNVyl0nEfobfJisb7f3Ta+Shf58izw== + dependencies: + "@types/ledgerhq__hw-transport" "*" + "@types/node" "*" + "@types/node-hid" "*" + "@types/ledgerhq__hw-transport-u2f@^4.21.1": version "4.21.1" resolved "https://registry.yarnpkg.com/@types/ledgerhq__hw-transport-u2f/-/ledgerhq__hw-transport-u2f-4.21.1.tgz#8193aa3199cc5ba6cf7f9d880a88f2993a6c6c3b" @@ -2456,6 +2490,13 @@ dependencies: "@types/node" "*" +"@types/node-hid@*": + version "0.7.3" + resolved "https://registry.yarnpkg.com/@types/node-hid/-/node-hid-0.7.3.tgz#993762b795473dc2ad8ee041f870838735087532" + integrity sha512-ip+Un3Ps0Qok3W3fMgYxaYxVYcbjDYM7yXNm8Uf1sggvSeXL/Q+vZG0AdSDWDQO9apQSE7Yieb4SjfymF1OqPA== + dependencies: + "@types/node" "*" + "@types/node@*", "@types/node@^12.7.5": version "12.7.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.5.tgz#e19436e7f8e9b4601005d73673b6dc4784ffcc2f" @@ -3797,7 +3838,7 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== -bindings@^1.5.0: +bindings@^1.4.0, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== @@ -3822,6 +3863,13 @@ bip66@^1.1.5: dependencies: safe-buffer "^5.0.1" +bl@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88" + integrity sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A== + dependencies: + readable-stream "^3.0.1" + blakejs@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" @@ -5360,6 +5408,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@^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" + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -5517,7 +5572,7 @@ detect-indent@^5.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= -detect-libc@^1.0.2: +detect-libc@^1.0.2, detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= @@ -5817,7 +5872,7 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== @@ -6387,6 +6442,11 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" +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== + expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -6910,6 +6970,11 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" @@ -7141,6 +7206,11 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -10148,6 +10218,11 @@ mimic-fn@^2.0.0, 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: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -10368,7 +10443,12 @@ mz@^2.5.0, mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.12.1, nan@^2.14.0: +nan@2.13.2: + version "2.13.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7" + integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw== + +nan@^2.12.1, nan@^2.13.2, nan@^2.14.0: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== @@ -10395,6 +10475,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +napi-build-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508" + integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -10447,6 +10532,13 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +node-abi@^2.7.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.11.0.tgz#b7dce18815057544a049be5ae75cd1fdc2e9ea59" + integrity sha512-kuy/aEg75u40v378WRllQ4ZexaXJiCvB68D2scDXclp/I4cRq6togpbOoKhmN07tns9Zldu51NNERo0wehfX9g== + dependencies: + semver "^5.4.1" + node-fetch-npm@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" @@ -10491,6 +10583,15 @@ node-gyp@^5.0.2: tar "^4.4.8" which "1" +node-hid@^0.7.9: + version "0.7.9" + resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-0.7.9.tgz#cc0cdf1418a286a7667f0b63642b5eeb544ccd05" + integrity sha512-vJnonTqmq3frCyTumJqG4g2IZcny3ynkfmbfDfQ90P3ZhRzcWYS/Um1ux6HFmAxmkaQnrZqIYHcGpL7kdqY8jA== + dependencies: + bindings "^1.5.0" + nan "^2.13.2" + prebuild-install "^5.3.0" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -10564,6 +10665,11 @@ node-releases@^1.1.29: dependencies: semver "^5.3.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= + nopt@1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" @@ -10697,7 +10803,7 @@ npm-run-path@^3.0.0: dependencies: path-key "^3.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2, npmlog@^4.1.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -11890,6 +11996,27 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.1 source-map "^0.6.1" supports-color "^6.1.0" +prebuild-install@^5.2.4, prebuild-install@^5.3.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.2.tgz#6392e9541ac0b879ef0f22b3d65037417eb2035e" + integrity sha512-INDfXzTPnhT+WYQemqnAXlP7SvfiFMopMozSgXCZ+RDLb279gKfIuLk4o7PgEawLp3WrMgIYGBpkxpraROHsSA== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.0" + mkdirp "^0.5.1" + napi-build-utils "^1.0.1" + node-abi "^2.7.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" + which-pm-runs "^1.0.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -12500,7 +12627,7 @@ read@1, read@~1.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.1: +"readable-stream@2 || 3", readable-stream@^3.0.1, readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.1: version "3.4.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.4.0.tgz#a51c26754658e0a3c21dbf59163bd45ba6f447fc" integrity sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== @@ -13264,6 +13391,20 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + integrity sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY= + +simple-get@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.0.3.tgz#924528ac3f9d7718ce5e9ec1b1a69c0be4d62efa" + integrity sha512-Wvre/Jq5vgoz31Z9stYWPLn0PqRqmBDpFSdypAnHu5AvRVCYPRYGnvryNLiXu8GOBNDH82J2FRHUGMjjHUpXFw== + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-plist@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/simple-plist/-/simple-plist-1.0.0.tgz#bed3085633b22f371e111f45d159a1ccf94b81eb" @@ -13949,6 +14090,27 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== +tar-fs@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.0.tgz#677700fc0c8b337a78bee3623fdc235f21d7afad" + integrity sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA== + dependencies: + chownr "^1.1.1" + mkdirp "^0.5.1" + pump "^3.0.0" + tar-stream "^2.0.0" + +tar-stream@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3" + integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw== + dependencies: + bl "^3.0.0" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^4, tar@^4.4.10, tar@^4.4.8: version "4.4.10" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.10.tgz#946b2810b9a5e0b26140cf78bea6b0b0d689eba1" @@ -14578,6 +14740,15 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +usb@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/usb/-/usb-1.6.0.tgz#bc5d4decf4ffca32d1136717edcf73366137a789" + integrity sha512-52DyWlCk9K+iw3LnvY95WXSnpHjxJoI++aGkV8HiMNPc4zmvDQlYvWAzrkbJ2JH3oUcx26XfU5sZcG4RAcVkMg== + dependencies: + bindings "^1.4.0" + nan "2.13.2" + prebuild-install "^5.2.4" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -15105,6 +15276,11 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= + which@1, which@^1.2.14, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"