diff --git a/.eslintrc.js b/.eslintrc.js index 47b3af2f5e..b16ae63f26 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -22,7 +22,7 @@ module.exports = { rules: { curly: ["warn", "multi-line", "consistent"], "no-bitwise": "warn", - "no-console": ["warn", { allow: ["error", "info", "warn"] }], + "no-console": ["warn", { allow: ["error", "info", "table", "warn"] }], "no-param-reassign": "warn", "no-shadow": "warn", "no-unused-vars": "off", // disabled in favour of @typescript-eslint/no-unused-vars, see https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-unused-vars.md diff --git a/packages/launchpad-ledger/README.md b/packages/launchpad-ledger/README.md index 4cd9ca242f..0d2f1b409b 100644 --- a/packages/launchpad-ledger/README.md +++ b/packages/launchpad-ledger/README.md @@ -4,14 +4,38 @@ ## Supported platforms -We use the +This library works with Node.js as well as certain browsers. We use the [@ledgerhq/hw-transport-webusb](https://github.com/LedgerHQ/ledgerjs/tree/master/packages/hw-transport-webusb) library to connect to Ledger devices from the browser via USB. You can check the support status of this library [here](https://github.com/LedgerHQ/ledgerjs/tree/master/packages/hw-transport-webusb#support-status). +Note the optional dependencies: + +```json +"optionalDependencies": { + "@ledgerhq/hw-transport-node-hid": "^5.23.2", + "@ledgerhq/hw-transport-webusb": "^5.23.0" +} +``` + +If you are using this library with Node.js you must install +`@ledgerhq/hw-transport-node-hid`. You’ll need `@ledgerhq/hw-transport-webusb` +for the browser. + ## Running the demo +### Node.js + +Connect the Ledger device via USB, open the Cosmos app, then run the demo (this +will also build the package): + +```sh +yarn demo-node +``` + +### Browser + Build the package for web: ```sh diff --git a/packages/launchpad-ledger/demo/index.html b/packages/launchpad-ledger/demo/index.html index 1575c6bd55..7a04b1cd25 100644 --- a/packages/launchpad-ledger/demo/index.html +++ b/packages/launchpad-ledger/demo/index.html @@ -24,9 +24,13 @@
+
+ + +
- +
diff --git a/packages/launchpad-ledger/demo/node.js b/packages/launchpad-ledger/demo/node.js new file mode 100644 index 0000000000..86c7e904fe --- /dev/null +++ b/packages/launchpad-ledger/demo/node.js @@ -0,0 +1,25 @@ +const demo = require("../build/demo/node"); + +async function run() { + const accountNumbers = [0, 1, 2, 10]; + const accounts = await demo.getAccounts(); + console.info("Accounts from Ledger device:"); + console.table(accounts.map((account, i) => ({ ...account, accountNumber: accountNumbers[i] }))); + + const accountNumber0 = 0; + const address0 = accounts[accountNumber0].address; + const signature0 = await demo.sign(accountNumber0, address0, address0); + console.info(`Signature from Ledger device for account number 0 (${address0}):`); + console.info(signature0); + + // It seems the Ledger device needs a bit of time to recover + await new Promise((resolve) => setTimeout(resolve, 1000)); + + const accountNumber10 = 10; + const address10 = accounts[accountNumbers.findIndex((n) => n === accountNumber10)].address; + const signature1 = await demo.sign(accountNumber10, address10, address10); + console.info(`Signature from Ledger device for account number 10 (${address10}):`); + console.info(signature1); +} + +run().catch(console.error); diff --git a/packages/launchpad-ledger/package.json b/packages/launchpad-ledger/package.json index 0d6a3185d6..85ddd4d04f 100644 --- a/packages/launchpad-ledger/package.json +++ b/packages/launchpad-ledger/package.json @@ -35,17 +35,24 @@ "postbuild": "yarn move-types && yarn format-types", "build-or-skip": "[ -n \"$SKIP_BUILD\" ] || yarn build", "test": "echo 'Please check README for information on how to manually run the demo'", + "demo-node": "yarn build-or-skip && node ./demo/node.js", "coverage": "nyc --reporter=text --reporter=lcov yarn test --quiet", "pack-web": "yarn build-or-skip && webpack --mode development --config webpack.demo.config.js" }, "dependencies": { "@cosmjs/launchpad": "^0.22.2", "@cosmjs/utils": "^0.22.2", - "@ledgerhq/hw-transport-webusb": "^5.23.0", "ledger-cosmos-js": "^2.1.7", "semver": "^7.3.2" }, + "optionalDependencies": { + "@ledgerhq/hw-transport-node-hid": "^5.23.2", + "@ledgerhq/hw-transport-webusb": "^5.23.0" + }, "devDependencies": { + "@ledgerhq/hw-transport-node-hid": "^5.23.2", + "@ledgerhq/hw-transport-webusb": "^5.23.0", + "@types/ledgerhq__hw-transport-node-hid": "^4.22.1", "@types/ledgerhq__hw-transport-webusb": "^4.70.0", "@types/semver": "^7.3.3" } diff --git a/packages/launchpad-ledger/src/demo/node.ts b/packages/launchpad-ledger/src/demo/node.ts new file mode 100644 index 0000000000..ef3b3bb16e --- /dev/null +++ b/packages/launchpad-ledger/src/demo/node.ts @@ -0,0 +1,60 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import { toBase64 } from "@cosmjs/encoding"; +import { makeCosmoshubPath, makeSignBytes, StdFee, StdSignature } from "@cosmjs/launchpad"; + +import { LedgerSigner } from "../ledgersigner"; + +const defaultChainId = "testing"; +const defaultFee: StdFee = { + amount: [{ amount: "100", denom: "ucosm" }], + gas: "250", +}; +const defaultMemo = "Some memo"; +const defaultSequence = "0"; + +const signer = new LedgerSigner({ + testModeAllowed: true, + hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1), makeCosmoshubPath(2), makeCosmoshubPath(10)], +}); + +export async function getAccounts(): Promise< + ReadonlyArray<{ + readonly algo: string; + readonly address: string; + readonly pubkey: string; + }> +> { + const accounts = await signer.getAccounts(); + return accounts.map((account) => ({ ...account, pubkey: toBase64(account.pubkey) })); +} + +export async function sign( + accountNumber: number, + fromAddress: string, + toAddress: string, +): Promise { + const msgs = [ + { + type: "cosmos-sdk/MsgSend", + value: { + amount: [ + { + amount: "1234567", + denom: "ucosm", + }, + ], + from_address: fromAddress, + to_address: toAddress, + }, + }, + ]; + const signBytes = makeSignBytes( + msgs, + defaultFee, + defaultChainId, + defaultMemo, + accountNumber, + defaultSequence, + ); + return signer.sign(fromAddress, signBytes); +} diff --git a/packages/launchpad-ledger/src/demo/index.ts b/packages/launchpad-ledger/src/demo/web.ts similarity index 55% rename from packages/launchpad-ledger/src/demo/index.ts rename to packages/launchpad-ledger/src/demo/web.ts index 8269c3a3e2..e656a871bb 100644 --- a/packages/launchpad-ledger/src/demo/index.ts +++ b/packages/launchpad-ledger/src/demo/web.ts @@ -1,13 +1,16 @@ -import { toHex, toUtf8 } from "@cosmjs/encoding"; +import { toBase64, toUtf8 } from "@cosmjs/encoding"; +import { AccountData, makeCosmoshubPath } from "@cosmjs/launchpad"; import { LedgerSigner } from "../ledgersigner"; declare const window: any; declare const document: any; -function createMessage(address: string): string { +let accounts: readonly AccountData[] = []; + +function createMessage(accountNumber: number, address: string): string { return `{ - "account_number": 0, + "account_number": ${accountNumber}, "chain_id": "testing", "fee": { "amount": [{ "amount": 100, "denom": "ucosm" }], @@ -29,21 +32,44 @@ function createMessage(address: string): string { }`; } -const signer = new LedgerSigner({ testModeAllowed: true }); +const signer = new LedgerSigner({ + testModeAllowed: true, + hdPaths: [makeCosmoshubPath(0), makeCosmoshubPath(1), makeCosmoshubPath(2)], +}); + +window.updateMessage = (accountNumber: number) => { + const account = accounts[accountNumber]; + if (account === undefined) { + return; + } + + const address = accounts[accountNumber].address; + const addressInput = document.getElementById("address"); + addressInput.value = address; + const messageTextArea = document.getElementById("message"); + messageTextArea.textContent = createMessage(accountNumber, address); +}; window.getAccounts = async function getAccounts(): Promise { + const accountNumberInput = document.getElementById("account-number"); const addressInput = document.getElementById("address"); const accountsDiv = document.getElementById("accounts"); const messageTextArea = document.getElementById("message"); accountsDiv.textContent = "Loading..."; try { - const accounts = await signer.getAccounts(); - const prettyAccounts = accounts.map((account) => ({ ...account, pubkey: toHex(account.pubkey) })); - accountsDiv.textContent = JSON.stringify(prettyAccounts, null, "\t"); + accounts = await signer.getAccounts(); + const prettyAccounts = accounts.map((account: AccountData) => ({ + ...account, + pubkey: toBase64(account.pubkey), + })); + accountsDiv.textContent = JSON.stringify(prettyAccounts, null, "\n"); + const accountNumber = 0; + accountNumberInput.max = accounts.length - 1; + accountNumberInput.value = accountNumber; const address = accounts[0].address; addressInput.value = address; - messageTextArea.textContent = createMessage(address); + messageTextArea.textContent = createMessage(accountNumber, address); } catch (error) { accountsDiv.textContent = error; } diff --git a/packages/launchpad-ledger/src/launchpadledger.ts b/packages/launchpad-ledger/src/launchpadledger.ts index d781ea9519..4d027ce07e 100644 --- a/packages/launchpad-ledger/src/launchpadledger.ts +++ b/packages/launchpad-ledger/src/launchpadledger.ts @@ -3,7 +3,6 @@ import { fromUtf8 } from "@cosmjs/encoding"; import { makeCosmoshubPath } from "@cosmjs/launchpad"; import { assert } from "@cosmjs/utils"; import Transport from "@ledgerhq/hw-transport"; -import TransportWebUsb from "@ledgerhq/hw-transport-webusb"; import CosmosApp, { AppInfoResponse, PublicKeyResponse, @@ -26,46 +25,17 @@ function isWindows(platform: string): boolean { return platform.indexOf("Win") > -1; } -function verifyBrowserIsSupported(platform: string, userAgent: string): void { +function verifyBrowserIsSupported(platform: string, userAgent: string | null): void { if (isWindows(platform)) { throw new Error("Windows is not currently supported."); } - const isChromeOrBrave = /chrome|crios/i.test(userAgent) && !/edge|opr\//i.test(userAgent); + const isChromeOrBrave = userAgent && /chrome|crios/i.test(userAgent) && !/edge|opr\//i.test(userAgent); if (!isChromeOrBrave) { throw new Error("Your browser does not support Ledger devices."); } } -async function createTransport(timeout: number): Promise { - try { - const transport = await TransportWebUsb.create(timeout * 1000); - return transport; - } catch (error) { - const trimmedErrorMessage = error.message.trim(); - if (trimmedErrorMessage.startsWith("No WebUSB interface found for your Ledger device")) { - throw new Error( - "Could not connect to a Ledger device. Please use Ledger Live to upgrade the Ledger firmware to version 1.5.5 or later.", - ); - } - if (trimmedErrorMessage.startsWith("Unable to claim interface")) { - throw new Error("Could not access Ledger device. Is it being used in another tab?"); - } - if (trimmedErrorMessage.startsWith("Not supported")) { - throw new Error( - "Your browser does not seem to support WebUSB yet. Try updating it to the latest version.", - ); - } - if (trimmedErrorMessage.startsWith("No device selected")) { - throw new Error( - "You did not select a Ledger device. If you did not see your Ledger, check if the Ledger is plugged in and unlocked.", - ); - } - - throw error; - } -} - function unharden(hdPath: HdPath): number[] { return hdPath.map((n) => (n.isHardened() ? n.toNumber() - 2 ** 31 : n.toNumber())); } @@ -85,7 +55,7 @@ export class LaunchpadLedger { private readonly prefix: string; private cosmosApp: CosmosApp | null; public readonly platform: string; - public readonly userAgent: string; + public readonly userAgent: string | null; constructor(options: LaunchpadLedgerOptions = {}) { const defaultOptions = { @@ -101,8 +71,14 @@ export class LaunchpadLedger { this.hdPaths = hdPaths; this.prefix = prefix; this.cosmosApp = null; - this.platform = navigator.platform; - this.userAgent = navigator.userAgent; + + try { + this.platform = navigator.platform; + this.userAgent = navigator.userAgent; + } catch (error) { + this.platform = "node"; + this.userAgent = null; + } } async connect(timeout = defaultInteractionTimeout): Promise { @@ -111,9 +87,11 @@ export class LaunchpadLedger { return this; } - verifyBrowserIsSupported(this.platform, this.userAgent); + if (this.platform !== "node") { + verifyBrowserIsSupported(this.platform, this.userAgent); + } - const transport = await createTransport(timeout * 1000); + const transport = await this.createTransport(timeout * 1000); this.cosmosApp = new CosmosApp(transport); await this.verifyDeviceIsReady(); @@ -144,7 +122,11 @@ export class LaunchpadLedger { } async getPubkeys(): Promise { - return Promise.all(this.hdPaths.map(async (hdPath) => this.getPubkey(hdPath))); + return this.hdPaths.reduce( + (promise: Promise, hdPath) => + promise.then(async (pubkeys) => [...pubkeys, await this.getPubkey(hdPath)]), + Promise.resolve([]), + ); } async getCosmosAddress(pubkey?: Uint8Array): Promise { @@ -163,6 +145,43 @@ export class LaunchpadLedger { return Secp256k1Signature.fromDer((response as SignResponse).signature).toFixedLength(); } + private async createTransport(timeout: number): Promise { + // HACK: Use a variable to get webpack to ignore this + const nodeJsTransportPackageName = "@ledgerhq/hw-transport-node-hid"; + /* eslint-disable-next-line @typescript-eslint/naming-convention */ + const { default: TransportClass } = + this.platform === "node" + ? await import(nodeJsTransportPackageName) + : await import("@ledgerhq/hw-transport-webusb"); + + try { + const transport = await TransportClass.create(timeout * 1000); + return transport; + } catch (error) { + const trimmedErrorMessage = error.message.trim(); + if (trimmedErrorMessage.startsWith("No WebUSB interface found for your Ledger device")) { + throw new Error( + "Could not connect to a Ledger device. Please use Ledger Live to upgrade the Ledger firmware to version 1.5.5 or later.", + ); + } + if (trimmedErrorMessage.startsWith("Unable to claim interface")) { + throw new Error("Could not access Ledger device. Is it being used in another tab?"); + } + if (trimmedErrorMessage.startsWith("Not supported")) { + throw new Error( + "Your browser does not seem to support WebUSB yet. Try updating it to the latest version.", + ); + } + if (trimmedErrorMessage.startsWith("No device selected")) { + throw new Error( + "You did not select a Ledger device. If you did not see your Ledger, check if the Ledger is plugged in and unlocked.", + ); + } + + throw error; + } + } + private verifyAppMode(testMode: boolean): void { if (testMode && !this.testModeAllowed) { throw new Error(`DANGER: The Cosmos Ledger app is in test mode and should not be used on mainnet!`); diff --git a/packages/launchpad-ledger/src/ledgersigner.ts b/packages/launchpad-ledger/src/ledgersigner.ts index 836c748032..da6892ae03 100644 --- a/packages/launchpad-ledger/src/ledgersigner.ts +++ b/packages/launchpad-ledger/src/ledgersigner.ts @@ -1,18 +1,25 @@ -import { AccountData, encodeSecp256k1Signature, OfflineSigner, StdSignature } from "@cosmjs/launchpad"; +import { HdPath } from "@cosmjs/crypto"; +import { + AccountData, + encodeSecp256k1Signature, + makeCosmoshubPath, + OfflineSigner, + StdSignature, +} from "@cosmjs/launchpad"; import { LaunchpadLedger, LaunchpadLedgerOptions } from "./launchpadledger"; export class LedgerSigner implements OfflineSigner { private readonly ledger: LaunchpadLedger; + private readonly hdPaths: readonly HdPath[]; private accounts?: readonly AccountData[]; - constructor(options?: LaunchpadLedgerOptions) { + constructor(options: LaunchpadLedgerOptions = {}) { + this.hdPaths = options.hdPaths || [makeCosmoshubPath(0)]; this.ledger = new LaunchpadLedger(options); } public async getAccounts(): Promise { - await this.ledger.connect(); - if (!this.accounts) { const pubkeys = await this.ledger.getPubkeys(); this.accounts = await Promise.all( @@ -28,16 +35,16 @@ export class LedgerSigner implements OfflineSigner { } public async sign(address: string, message: Uint8Array): Promise { - await this.ledger.connect(); - const accounts = this.accounts || (await this.getAccounts()); - const accountForAddress = accounts.find((account) => account.address === address); + const accountIndex = accounts.findIndex((account) => account.address === address); - if (!accountForAddress) { + if (accountIndex === -1) { throw new Error(`Address ${address} not found in wallet`); } - const signature = await this.ledger.sign(message); + const accountForAddress = accounts[accountIndex]; + const hdPath = this.hdPaths[accountIndex]; + const signature = await this.ledger.sign(message, hdPath); return encodeSecp256k1Signature(accountForAddress.pubkey, signature); } } diff --git a/packages/launchpad-ledger/types/launchpadledger.d.ts b/packages/launchpad-ledger/types/launchpadledger.d.ts index 6eda113d4d..2cc42f18d8 100644 --- a/packages/launchpad-ledger/types/launchpadledger.d.ts +++ b/packages/launchpad-ledger/types/launchpadledger.d.ts @@ -14,7 +14,7 @@ export declare class LaunchpadLedger { private readonly prefix; private cosmosApp; readonly platform: string; - readonly userAgent: string; + readonly userAgent: string | null; constructor(options?: LaunchpadLedgerOptions); connect(timeout?: number): Promise; getCosmosAppVersion(): Promise; @@ -22,6 +22,7 @@ export declare class LaunchpadLedger { getPubkeys(): Promise; getCosmosAddress(pubkey?: Uint8Array): Promise; sign(message: Uint8Array, hdPath?: HdPath): Promise; + private createTransport; private verifyAppMode; private getOpenAppName; private verifyAppVersion; diff --git a/packages/launchpad-ledger/types/ledgersigner.d.ts b/packages/launchpad-ledger/types/ledgersigner.d.ts index dc4c4e49a7..1ebfdcdd51 100644 --- a/packages/launchpad-ledger/types/ledgersigner.d.ts +++ b/packages/launchpad-ledger/types/ledgersigner.d.ts @@ -2,6 +2,7 @@ import { AccountData, OfflineSigner, StdSignature } from "@cosmjs/launchpad"; import { LaunchpadLedgerOptions } from "./launchpadledger"; export declare class LedgerSigner implements OfflineSigner { private readonly ledger; + private readonly hdPaths; private accounts?; constructor(options?: LaunchpadLedgerOptions); getAccounts(): Promise; diff --git a/packages/launchpad-ledger/webpack.demo.config.js b/packages/launchpad-ledger/webpack.demo.config.js index e16bea23b8..534338d511 100644 --- a/packages/launchpad-ledger/webpack.demo.config.js +++ b/packages/launchpad-ledger/webpack.demo.config.js @@ -8,7 +8,7 @@ module.exports = [ { // bundle used for Ledger demo target: target, - entry: glob.sync("./build/demo/index.js"), + entry: glob.sync("./build/demo/web.js"), output: { path: demodir, filename: "ledger.js", diff --git a/packages/launchpad/src/encoding.ts b/packages/launchpad/src/encoding.ts index 17f8de77c1..3c09e77528 100644 --- a/packages/launchpad/src/encoding.ts +++ b/packages/launchpad/src/encoding.ts @@ -28,7 +28,7 @@ function sortJson(json: any): any { * * @see https://docs.cosmos.network/master/modules/auth/03_types.html#stdsigndoc */ -interface StdSignDoc { +export interface StdSignDoc { readonly account_number: string; readonly chain_id: string; readonly fee: StdFee; diff --git a/packages/launchpad/src/index.ts b/packages/launchpad/src/index.ts index 49a0ea91b0..3701ab3357 100644 --- a/packages/launchpad/src/index.ts +++ b/packages/launchpad/src/index.ts @@ -28,7 +28,7 @@ export { isSearchBySentFromOrToQuery, isSearchByTagsQuery, } from "./cosmosclient"; -export { makeSignBytes } from "./encoding"; +export { makeSignBytes, StdSignDoc } from "./encoding"; export { buildFeeTable, FeeTable, GasLimits, GasPrice } from "./gas"; export { AuthAccountsResponse, diff --git a/packages/launchpad/types/encoding.d.ts b/packages/launchpad/types/encoding.d.ts index 35885e4d27..51c2c0c4c7 100644 --- a/packages/launchpad/types/encoding.d.ts +++ b/packages/launchpad/types/encoding.d.ts @@ -1,5 +1,18 @@ import { Msg } from "./msgs"; import { StdFee } from "./types"; +/** + * The document to be signed + * + * @see https://docs.cosmos.network/master/modules/auth/03_types.html#stdsigndoc + */ +export interface StdSignDoc { + readonly account_number: string; + readonly chain_id: string; + readonly fee: StdFee; + readonly memo: string; + readonly msgs: readonly Msg[]; + readonly sequence: string; +} export declare function makeSignBytes( msgs: readonly Msg[], fee: StdFee, diff --git a/packages/launchpad/types/index.d.ts b/packages/launchpad/types/index.d.ts index 17332cf298..9d137f0b59 100644 --- a/packages/launchpad/types/index.d.ts +++ b/packages/launchpad/types/index.d.ts @@ -26,7 +26,7 @@ export { isSearchBySentFromOrToQuery, isSearchByTagsQuery, } from "./cosmosclient"; -export { makeSignBytes } from "./encoding"; +export { makeSignBytes, StdSignDoc } from "./encoding"; export { buildFeeTable, FeeTable, GasLimits, GasPrice } from "./gas"; export { AuthAccountsResponse, diff --git a/yarn.lock b/yarn.lock index c0c33ea5e1..1bd753174d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -325,6 +325,31 @@ resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-5.23.0.tgz#30a0338dafba8264556011604abed08bf24979f3" integrity sha512-qtpX8aFrUUlYfOMu7BxTvxqUa8CniE+tEBpVEjYUhVbFdVJjM4ouwJD++RtQkMAU2c5jE7xb12WnUnf5BlAgLQ== +"@ledgerhq/hw-transport-node-hid-noevents@^5.23.2": + version "5.23.2" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-5.23.2.tgz#0ee4b54c62d23b0f0cce258fe2c612f71b8d454a" + integrity sha512-8LiF87iIZWJaXMptXJ64ZnMb5T8Sjq66E6AkjnthCuBCPpz6oex50h5vNLVNNNpa/jGv0na7CADOkQkxyBQKmQ== + dependencies: + "@ledgerhq/devices" "^5.23.0" + "@ledgerhq/errors" "^5.23.0" + "@ledgerhq/hw-transport" "^5.23.0" + "@ledgerhq/logs" "^5.23.0" + node-hid "1.3.0" + +"@ledgerhq/hw-transport-node-hid@^5.23.2": + version "5.23.2" + resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-5.23.2.tgz#436d624334146c8a818e3270d7508e4dbb1a5b1c" + integrity sha512-u0oBoKFltMk05T5ySnemLKoUtUXmB25196PuDe8C+vdA34usoESiNZb49Ookp1vAw7BHzImZYo1moF+IlLGVZQ== + dependencies: + "@ledgerhq/devices" "^5.23.0" + "@ledgerhq/errors" "^5.23.0" + "@ledgerhq/hw-transport" "^5.23.0" + "@ledgerhq/hw-transport-node-hid-noevents" "^5.23.2" + "@ledgerhq/logs" "^5.23.0" + lodash "^4.17.20" + node-hid "1.3.0" + usb "^1.6.3" + "@ledgerhq/hw-transport-webusb@^5.23.0": version "5.23.0" resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-5.23.0.tgz#f374415ab1bda6ba55898c0e74097f2005fd06f7" @@ -1374,6 +1399,15 @@ dependencies: "@types/koa" "*" +"@types/ledgerhq__hw-transport-node-hid@^4.22.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-webusb@^4.70.0": version "4.70.0" resolved "https://registry.yarnpkg.com/@types/ledgerhq__hw-transport-webusb/-/ledgerhq__hw-transport-webusb-4.70.0.tgz#8e03b1f8bec52a8291ef41b00470b07f28285788" @@ -1414,6 +1448,13 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= +"@types/node-hid@*": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/node-hid/-/node-hid-1.3.0.tgz#fe021af9df739871c3cb60e7efaa4adfe91d58e6" + integrity sha512-jQ9Z8PegPENPlzR/7fziAF6yqcdYYcIfeJOiN1wnk2zf/Y8yFpprf6uEp1OWPdzhM9dBgv/K5MQ5WFHwK22Gbg== + dependencies: + "@types/node" "*" + "@types/node@*", "@types/node@>= 8": version "13.9.2" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.2.tgz#ace1880c03594cc3e80206d96847157d8e7fa349" @@ -2176,7 +2217,7 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== -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== @@ -2193,6 +2234,15 @@ bip39@^3.0.2: pbkdf2 "^3.0.9" randombytes "^2.0.1" +bl@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.3.tgz#12d6287adc29080e22a705e5764b2a9522cdc489" + integrity sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + blob@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" @@ -2343,6 +2393,14 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.5.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -3137,6 +3195,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" + dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" @@ -3147,6 +3212,11 @@ deep-equal@~1.0.1: resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -3243,6 +3313,11 @@ 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.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + dezalgo@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" @@ -3389,7 +3464,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.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -3792,6 +3867,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== + 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" @@ -4089,6 +4169,11 @@ fromentries@^1.2.0: resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.0.tgz#e6aa06f240d6267f913cea422075ef88b63e7897" integrity sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ== +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@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -4271,6 +4356,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-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -4709,7 +4799,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4724,7 +4814,7 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.2, ini@^1.3.4, ini@^1.3.5: +ini@^1.3.2, ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -5600,6 +5690,11 @@ lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== +lodash@^4.17.20: + version "4.17.20" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" + integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== + log4js@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/log4js/-/log4js-6.3.0.tgz#10dfafbb434351a3e30277a00b9879446f715bcb" @@ -5866,6 +5961,11 @@ mimic-fn@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== +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== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -5905,7 +6005,7 @@ minimist-options@^4.0.2: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.1.3, 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== @@ -5949,6 +6049,11 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" +mkdirp-classic@^0.5.2: + 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-promise@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" @@ -6031,11 +6136,21 @@ mz@^2.5.0: object-assign "^4.0.1" thenify-all "^1.0.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: version "2.14.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== +nan@^2.14.0: + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -6053,6 +6168,11 @@ nanomatch@^1.2.9: snapdragon "^0.8.1" to-regex "^3.0.1" +napi-build-utils@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -6073,6 +6193,13 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +node-abi@^2.18.0, node-abi@^2.7.0: + version "2.19.1" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.19.1.tgz#6aa32561d0a5e2fdb6810d8c25641b657a8cea85" + integrity sha512-HbtmIuByq44yhAzK7b9j/FelKlHYISKQn0mtvcBrU5QBkhoCMp5bu8Hv5AI34DcKfOAcJBcOEMwLlwO62FFu9A== + dependencies: + semver "^5.4.1" + node-fetch-npm@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.3.tgz#efae4aacb0500444e449a51fc1467397775ebc38" @@ -6104,6 +6231,16 @@ node-gyp@^5.0.2: tar "^4.4.12" which "^1.3.1" +node-hid@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-1.3.0.tgz#346a468505cee13d69ccd760052cbaf749f66a41" + integrity sha512-BA6G4V84kiNd1uAChub/Z/5s/xS3EHBCxotQ0nyYrUG65mXewUDHE1tWOSqA2dp3N+mV0Ffq9wo2AW9t4p/G7g== + dependencies: + bindings "^1.5.0" + nan "^2.14.0" + node-abi "^2.18.0" + prebuild-install "^5.3.4" + node-libs-browser@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" @@ -6140,6 +6277,11 @@ node-preload@^0.2.1: dependencies: process-on-spawn "^1.0.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@^4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.3.tgz#a375cad9d02fd921278d954c2254d5aa57e15e48" @@ -6236,7 +6378,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.1.2: +npmlog@^4.0.1, 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== @@ -6796,6 +6938,27 @@ 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@^5.3.3, prebuild-install@^5.3.4: + version "5.3.5" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.5.tgz#e7e71e425298785ea9d22d4f958dbaccf8bb0e1b" + integrity sha512-YmMO7dph9CYKi5IR/BzjOJlRzpxGGVo1EsLSUZ0mt/Mq0HWZIHOKHHcHdT69yG54C9m6i45GpItwRHpk0Py7Uw== + dependencies: + detect-libc "^1.0.3" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + 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.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -7043,6 +7206,16 @@ raw-body@^2.3.3: iconv-lite "0.4.24" unpipe "1.0.0" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + read-cmd-shim@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16" @@ -7161,7 +7334,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@2 || 3", readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -7601,6 +7774,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.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" + slash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" @@ -8051,6 +8238,11 @@ strip-json-comments@^3.1.0: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + strong-log-transformer@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -8101,6 +8293,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.1.0" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.0.tgz#d1cdd121ab465ee0eb9ccde2d35049d3f3daf0d5" + integrity sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.0.0" + +tar-stream@^2.0.0: + version "2.1.4" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.4.tgz#c4fb1a11eb0da29b893a5b25476397ba2d053bfa" + integrity sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" @@ -8560,6 +8773,15 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +usb@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/usb/-/usb-1.6.3.tgz#c0bc14994e8f9cb16f9602ec0dbadaa57cb919f5" + integrity sha512-23KYMjaWydACd8wgGKMQ4MNwFspAT6Xeim4/9Onqe5Rz/nMb4TM/WHL+qPT0KNFxzNKzAs63n1xQWGEtgaQ2uw== + dependencies: + bindings "^1.4.0" + nan "2.13.2" + prebuild-install "^5.3.3" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" @@ -8748,6 +8970,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.2.1, which@^1.2.14, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"