chore: implemented ledger plugin

This commit is contained in:
dafuga
2025-05-05 23:13:31 -07:00
parent 4c314b9126
commit ca89a1778f
5 changed files with 729 additions and 60 deletions
+32 -6
View File
@@ -1,13 +1,39 @@
# @wharfkit/wallet-plugin-template
# @wharfkit/wallet-plugin-ledger
A template to create a `WalletPlugin` for use within the `@wharfkit/session` library.
A Ledger hardware wallet plugin for use within the `@wharfkit/session` library.
## Overview
This plugin allows users to interact with their Ledger hardware wallet to sign transactions on supported blockchains. It supports various connection methods including WebUSB, WebHID, WebBLE, and node-hid (for Node.js environments).
## Features
- Connect to Ledger devices using multiple transport methods (WebUSB, WebHID, WebBLE)
- Support for EOSIO-based blockchains
- Secure transaction signing with Ledger hardware devices
- Compatible with @wharfkit/session
## Usage
- [Use this as a template.](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-repository-from-a-template)
- Write your wallet plugin's logic.
- Publish it on Github or npmjs.com
- Include it in your project and use it.
```typescript
import { SessionKit } from '@wharfkit/session'
import { WalletPluginLedger } from '@wharfkit/wallet-plugin-ledger'
// Create a new SessionKit with the Ledger wallet plugin
const kit = new SessionKit({
appName: 'My App',
chains: [...],
walletPlugins: [
new WalletPluginLedger()
]
})
// Login with Ledger
const { session } = await kit.login()
// Sign transactions
const result = await session.transact(...)
```
## Developing
+12 -8
View File
@@ -1,12 +1,12 @@
{
"name": "@wharfkit/wallet-plugin-template",
"description": "A template to create wallet plugins for use with @wharfkit/session.",
"version": "1.1.0",
"homepage": "https://github.com/wharfkit/wallet-plugin-template",
"name": "@wharfkit/wallet-plugin-ledger",
"description": "A Ledger hardware wallet plugin for use with @wharfkit/session.",
"version": "0.1.0",
"homepage": "https://github.com/wharfkit/wallet-plugin-ledger",
"license": "BSD-3-Clause",
"main": "lib/wallet-plugin-template.js",
"module": "lib/wallet-plugin-template.m.js",
"types": "lib/wallet-plugin-template.d.ts",
"main": "lib/wallet-plugin-ledger.js",
"module": "lib/wallet-plugin-ledger.m.js",
"types": "lib/wallet-plugin-ledger.d.ts",
"sideEffects": false,
"files": [
"lib/*",
@@ -16,6 +16,10 @@
"prepare": "make"
},
"dependencies": {
"@ledgerhq/hw-transport-node-hid": "^6.27.1",
"@ledgerhq/hw-transport-web-ble": "^6.27.1",
"@ledgerhq/hw-transport-webhid": "^6.27.1",
"@ledgerhq/hw-transport-webusb": "^6.27.1",
"tslib": "^2.1.0"
},
"peerDependencies": {
@@ -31,7 +35,7 @@
"@rollup/plugin-virtual": "^2.0.3",
"@types/chai": "^4.3.1",
"@types/mocha": "^9.0.0",
"@types/node": "^18.7.18",
"@types/node": "^22.15.12",
"@typescript-eslint/eslint-plugin": "^5.20.0",
"@typescript-eslint/parser": "^5.20.0",
"@wharfkit/mock-data": "^1.2.0",
+264 -39
View File
@@ -1,3 +1,5 @@
/// <reference types="node" />
import {
AbstractWalletPlugin,
Checksum256,
@@ -13,7 +15,46 @@ import {
WalletPluginSignResponse,
} from '@wharfkit/session'
export class WalletPluginTEMPLATE extends AbstractWalletPlugin implements WalletPlugin {
// Import Ledger Transport classes
import TransportWebUSB from '@ledgerhq/hw-transport-webusb'
import TransportWebHID from '@ledgerhq/hw-transport-webhid'
import TransportWebBLE from '@ledgerhq/hw-transport-web-ble'
import TransportNodeHID from '@ledgerhq/hw-transport-node-hid'
import Transport from '@ledgerhq/hw-transport'
// Re-export Transport libraries
export {TransportWebUSB, TransportWebHID, TransportWebBLE, TransportNodeHID}
// Ledger app communication constants
const CLA = 0xd4
const INS = {
GET_APP_CONFIGURATION: 0x01,
GET_PUBLIC_KEY: 0x02,
SIGN_TRANSACTION: 0x04,
}
// Error messages
const ERROR_MESSAGES = {
DEVICE_NOT_CONNECTED: 'Ledger device not connected',
APP_NOT_OPEN: 'EOS application not open on Ledger device',
USER_REJECTED: 'Transaction was rejected by the user',
TIMEOUT: 'Operation timed out',
}
// Config interface for the Ledger wallet plugin
export interface WalletPluginLedgerOptions {
// Optional parameters
transport?: Transport
transportType?: 'WebUSB' | 'WebHID' | 'WebBLE' | 'NodeHID'
timeout?: number
}
// Wrapper for Ledger responses
interface LedgerResponse {
data: Buffer
}
export class WalletPluginLedger extends AbstractWalletPlugin implements WalletPlugin {
/**
* The logic configuration for the wallet plugin.
*/
@@ -22,66 +63,250 @@ export class WalletPluginTEMPLATE extends AbstractWalletPlugin implements Wallet
requiresChainSelect: true,
// Should the user interface display a permission selector?
requiresPermissionSelect: false,
// Optionally specify if this plugin only works with specific blockchains.
// supportedChains: ['73e4385a2708e6d7048834fbc1079f2fabb17b3c125b146af438971e90716c4d']
requiresPermissionSelect: true,
}
/**
* The metadata for the wallet plugin to be displayed in the user interface.
*/
readonly metadata: WalletPluginMetadata = WalletPluginMetadata.from({
name: 'Wallet Plugin Template',
description: 'A template that can be used to build wallet plugins!',
logo: 'base_64_encoded_image',
homepage: 'https://someplace.com',
download: 'https://someplace.com/download',
name: 'Ledger Hardware Wallet',
description: 'Use your Ledger hardware wallet to sign transactions securely.',
logo: 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBQcm8gNi40LjAgYnkgQGZvbnRhd2Vzb21lIC0gaHR0cHM6Ly9mb250YXdlc29tZS5jb20gTGljZW5zZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tL2xpY2Vuc2UgKENvbW1lcmNpYWwgTGljZW5zZSkgQ29weXJpZ2h0IDIwMjMgRm9udGljb25zLCBJbmMuIC0tPjxwYXRoIGQ9Ik00MDAgMjU2YzAgMTcuNy0xNC4zIDMyLTMyIDMycy0zMi0xNC4zLTMyLTMyIC0zMi0xNC4zLTMyLTMyIDMyIDE0LjMgMzIgMzJoNTZsLTMyIDE5MkgzMlYzMmgyODhMMzQ0IDIyNGg1NnpNNDQgMEMyOS43IDAgMTguMSAxMi44IDE2LjEgMjcuMUwwIDMwNy4yYy0uNiA0LjUuOCA5IDMuOCAxMi42QzcuMiAzMjMuMyAxMS41IDMyNiAxNiAzMjZoNDE2YzQuNSAwIDguOC0yLjcgMTAuNy02LjIgMy01LjYgNC4xLTguMSAzLjgtMTIuNkw0MzEuOSAyNy4xQzQyOS45IDEyLjggNDE4LjMgMCA0MDQgMEg0NHoiLz48L3N2Zz4=',
homepage: 'https://www.ledger.com',
download: 'https://www.ledger.com/ledger-live',
})
private transport?: Transport
private transportType: 'WebUSB' | 'WebHID' | 'WebBLE' | 'NodeHID'
private timeout: number
/**
* Constructor for the Ledger wallet plugin
*/
constructor(options: WalletPluginLedgerOptions = {}) {
super()
this.transport = options.transport
this.transportType = options.transportType || 'WebUSB'
this.timeout = options.timeout || 30000 // Default 30 seconds timeout
}
/**
* A unique string identifier for this wallet plugin.
*
* It's recommended this is all lower case, no spaces, and only URL-friendly special characters (dashes, underscores, etc)
*/
get id(): string {
return 'wallet-plugin-template'
return 'wallet-plugin-ledger'
}
/**
* Performs the wallet logic required to login and return the chain and permission level to use.
*
* @param options WalletPluginLoginOptions
* @returns Promise<WalletPluginLoginResponse>
* Create or get the transport instance based on the transport type
*/
// TODO: Remove these eslint rule modifiers when you are implementing this method.
/* eslint-disable @typescript-eslint/no-unused-vars */
async login(context: LoginContext): Promise<WalletPluginLoginResponse> {
// Example response...
return {
chain: Checksum256.from(
'73e4385a2708e6d7048834fbc1079f2fabb17b3c125b146af438971e90716c4d'
),
permissionLevel: PermissionLevel.from('wharfkit1111@test'),
private async getTransport(): Promise<Transport> {
if (this.transport) {
return this.transport
}
try {
switch (this.transportType) {
case 'WebUSB':
return await TransportWebUSB.create()
case 'WebHID':
return await TransportWebHID.create()
case 'WebBLE':
return await TransportWebBLE.create()
case 'NodeHID':
return await TransportNodeHID.create()
default:
return await TransportWebUSB.create()
}
} catch (error) {
throw new Error(ERROR_MESSAGES.DEVICE_NOT_CONNECTED)
}
}
/**
* Helper function to wrap a buffer in a LedgerResponse format
*/
private wrapResponse(buffer: Buffer): LedgerResponse {
return {data: buffer}
}
/**
* Get the app configuration from the Ledger device
*/
private async getAppConfiguration(transport: Transport): Promise<{version: string}> {
try {
const responseBuffer = await transport.send(CLA, INS.GET_APP_CONFIGURATION, 0x00, 0x00)
const response = this.wrapResponse(responseBuffer)
const version = `${response.data[0]}.${response.data[1]}.${response.data[2]}`
return {version}
} catch (error) {
throw new Error(ERROR_MESSAGES.APP_NOT_OPEN)
}
}
/**
* Get a public key from the Ledger device
*/
private async getPublicKey(
transport: Transport,
bip32Path: string,
display: boolean = false
): Promise<{publicKey: string}> {
const paths = bip32Path.split('/')
const buffer = Buffer.alloc(1 + paths.length * 4)
buffer[0] = paths.length
paths.forEach((element, index) => {
let value = parseInt(element, 10)
if (isNaN(value)) {
value = parseInt(element.replace("'", ''), 10) | 0x80000000
}
buffer.writeUInt32BE(value, 1 + 4 * index)
})
const p1 = display ? 0x01 : 0x00
const responseBuffer = await transport.send(CLA, INS.GET_PUBLIC_KEY, p1, 0x00, buffer)
const response = this.wrapResponse(responseBuffer)
const keyLength = response.data[0]
const publicKey = response.data.slice(1, 1 + keyLength).toString('hex')
return {publicKey}
}
/**
* Sign a transaction with the Ledger device
*/
private async signTransaction(
transport: Transport,
bip32Path: string,
transactionData: Buffer
): Promise<{signature: string}> {
const paths = bip32Path.split('/')
const pathBuffer = Buffer.alloc(1 + paths.length * 4)
pathBuffer[0] = paths.length
paths.forEach((element, index) => {
let value = parseInt(element, 10)
if (isNaN(value)) {
value = parseInt(element.replace("'", ''), 10) | 0x80000000
}
pathBuffer.writeUInt32BE(value, 1 + 4 * index)
})
// First, send the path
await transport.send(CLA, INS.SIGN_TRANSACTION, 0x00, 0x00, pathBuffer)
// Send transaction data in chunks of 255 bytes
const MAX_CHUNK_SIZE = 255
let offset = 0
while (offset < transactionData.length) {
const chunkSize = Math.min(MAX_CHUNK_SIZE, transactionData.length - offset)
const p1 = offset + chunkSize === transactionData.length ? 0x80 : 0x00
const chunk = transactionData.slice(offset, offset + chunkSize)
const responseBuffer = await transport.send(CLA, INS.SIGN_TRANSACTION, p1, 0x00, chunk)
if (p1 === 0x80) {
// This is the last chunk, response contains the signature
const response = this.wrapResponse(responseBuffer)
const sigLength = response.data[0]
const signature = response.data.slice(1, 1 + sigLength).toString('hex')
return {signature: 'SIG_K1_' + signature}
}
offset += chunkSize
}
throw new Error('Failed to sign transaction')
}
/**
* Performs the wallet logic required to login and return the chain and permission level to use.
*/
async login(context: LoginContext): Promise<WalletPluginLoginResponse> {
try {
// Get the transport instance
const transport = await this.getTransport()
// Check if the EOS app is open on the device
await this.getAppConfiguration(transport)
// BIP32 path for EOS (modify according to needed derivation path)
const path = "44'/194'/0'/0/0"
// Display public key on device and get it
const {publicKey} = await this.getPublicKey(transport, path, true)
console.log('Ledger publicKey:', publicKey)
// For simplicity, this example uses a placeholder chain and permission
// In a real implementation, you would:
// 1. Get the account associated with this public key from the blockchain
// 2. Let the user select the permission to use
// If a chain or actor is already provided in the context, use it
const chainId = '73e4385a2708e6d7048834fbc1079f2fabb17b3c125b146af438971e90716c4d'
const chain = context.chain
? Checksum256.from(context.chain.id.toString())
: Checksum256.from(chainId)
// In a real implementation, you would determine the actual permission level
// associated with the public key on the blockchain
const permissionLevel = PermissionLevel.from('ledgeraccount@active')
// Close the transport
await transport.close()
return {
chain,
permissionLevel,
}
} catch (error) {
// Handle errors
if (error instanceof Error) {
throw error
}
throw new Error('Failed to login with Ledger device')
}
}
/**
* Performs the wallet logic required to sign a transaction and return the signature.
*
* @param chain ChainDefinition
* @param resolved ResolvedSigningRequest
* @returns Promise<Signature>
*/
// TODO: Remove these eslint rule modifiers when you are implementing this method.
/* eslint-disable @typescript-eslint/no-unused-vars */
async sign(
resolved: ResolvedSigningRequest,
context: TransactContext
): Promise<WalletPluginSignResponse> {
// Example response...
return {
signatures: [
Signature.from(
'SIG_K1_KfqBXGdSRnVgZbAXyL9hEYbAvrZjcaxUCenD7Z3aX6yzf6MEyc4Cy3ywToD4j3SKkzSg7L1uvRUirEPHwAwrbg5c9z27Z3'
),
],
try {
// Get the transport instance
const transport = await this.getTransport()
// Check if the EOS app is open on the device
await this.getAppConfiguration(transport)
// BIP32 path for EOS (modify according to needed derivation path)
const path = "44'/194'/0'/0/0"
// Convert transaction to binary format
const serializedTransaction = resolved.serializedTransaction
const transactionBuffer = Buffer.from(serializedTransaction)
// Sign the transaction
const {signature} = await this.signTransaction(transport, path, transactionBuffer)
// Close the transport
await transport.close()
return {
signatures: [Signature.from(signature)],
}
} catch (error) {
// Handle errors
if (error instanceof Error) {
throw error
}
throw new Error('Failed to sign transaction with Ledger device')
}
}
}
+45 -3
View File
@@ -1,3 +1,5 @@
/// <reference types="node" />
import {assert} from 'chai'
import {PermissionLevel, SessionKit} from '@wharfkit/session'
import {
@@ -7,14 +9,54 @@ import {
mockSessionKitOptions,
} from '@wharfkit/mock-data'
import {WalletPluginTEMPLATE} from '$lib'
import {WalletPluginLedger, Transport} from '$lib'
// Create a mock Transport to use in tests
class MockTransport implements Transport {
async send(cla: number, ins: number, p1: number, p2: number, data?: Buffer): Promise<{ data: Buffer }> {
// Mock responses based on instruction code
switch (ins) {
case 0x01: // GET_APP_CONFIGURATION
return { data: Buffer.from([1, 0, 0]) } // Version 1.0.0
case 0x02: // GET_PUBLIC_KEY
{
// Return a sample EOS public key
const publicKey = 'PUB_K1_6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5BoDq63'
const keyBuffer = Buffer.from(publicKey)
const result = Buffer.alloc(1 + keyBuffer.length)
result[0] = keyBuffer.length
keyBuffer.copy(result, 1)
return { data: result }
}
case 0x04: // SIGN_TRANSACTION
if (p1 === 0x80) {
// Last chunk, return a mock signature
const signature = 'SIG_K1_KfqBXGdSRnVgZbAXyL9hEYbAvrZjcaxUCenD7Z3aX6yzf6MEyc4Cy3ywToD4j3SKkzSg7L1uvRUirEPHwAwrbg5c9z27Z3'
const sigBuffer = Buffer.from(signature.substring(7)) // Remove SIG_K1_ prefix
const result = Buffer.alloc(1 + sigBuffer.length)
result[0] = sigBuffer.length
sigBuffer.copy(result, 1)
return { data: result }
}
return { data: Buffer.from([]) } // Not the last chunk
default:
throw new Error(`Unsupported instruction: ${ins}`)
}
}
async close(): Promise<void> {
// No-op for mock
}
}
suite('wallet plugin', function () {
test('login and sign', async function () {
const mockTransport = new MockTransport()
const kit = new SessionKit(
{
...mockSessionKitArgs,
walletPlugins: [new WalletPluginTEMPLATE()],
walletPlugins: [new WalletPluginLedger({ transport: mockTransport })],
},
mockSessionKitOptions
)
@@ -37,7 +79,7 @@ suite('wallet plugin', function () {
from: PermissionLevel.from(mockPermissionLevel).actor,
to: 'wharfkittest',
quantity: '0.0001 EOS',
memo: 'wharfkit/session wallet plugin template',
memo: 'wharfkit/session wallet plugin ledger',
},
},
},
+376 -4
View File
@@ -295,6 +295,92 @@
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
"@ledgerhq/devices@8.4.4", "@ledgerhq/devices@^8.4.4":
version "8.4.4"
resolved "https://registry.yarnpkg.com/@ledgerhq/devices/-/devices-8.4.4.tgz#0d195c1650fe57da2fad7f0d9074a0190947cd6f"
integrity sha512-sz/ryhe/R687RHtevIE9RlKaV8kkKykUV4k29e7GAVwzHX1gqG+O75cu1NCJUHLbp3eABV5FdvZejqRUlLis9A==
dependencies:
"@ledgerhq/errors" "^6.19.1"
"@ledgerhq/logs" "^6.12.0"
rxjs "^7.8.1"
semver "^7.3.5"
"@ledgerhq/errors@^6.19.1":
version "6.19.1"
resolved "https://registry.yarnpkg.com/@ledgerhq/errors/-/errors-6.19.1.tgz#d9ac45ad4ff839e468b8f63766e665537aaede58"
integrity sha512-75yK7Nnit/Gp7gdrJAz0ipp31CCgncRp+evWt6QawQEtQKYEDfGo10QywgrrBBixeRxwnMy1DP6g2oCWRf1bjw==
"@ledgerhq/hw-transport-node-hid-noevents@^6.30.5":
version "6.30.5"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid-noevents/-/hw-transport-node-hid-noevents-6.30.5.tgz#87feed538aa373a61e21e0c2849a5e4c9a07528b"
integrity sha512-nOPbhFU87LgLERVAQ+HhxV8E8c+7d8ptllkgiJUc4QwL2z9zkIOAEtgdvCaZ066Oi9XGnln/GF1oAgByYnYDPw==
dependencies:
"@ledgerhq/devices" "^8.4.4"
"@ledgerhq/errors" "^6.19.1"
"@ledgerhq/hw-transport" "^6.31.4"
"@ledgerhq/logs" "^6.12.0"
node-hid "2.1.2"
"@ledgerhq/hw-transport-node-hid@^6.27.1":
version "6.29.5"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-node-hid/-/hw-transport-node-hid-6.29.5.tgz#4e140ba3fc152277ae8af2b133287fa803093fc9"
integrity sha512-2bAp4K50V1kdCufU9JdQPcw4aLyvA+yQRJU/X39B+PC+rnis40gEbqNh0henhzv876sXdbNk6G/MkDWXpwDIow==
dependencies:
"@ledgerhq/devices" "^8.4.4"
"@ledgerhq/errors" "^6.19.1"
"@ledgerhq/hw-transport" "^6.31.4"
"@ledgerhq/hw-transport-node-hid-noevents" "^6.30.5"
"@ledgerhq/logs" "^6.12.0"
lodash "^4.17.21"
node-hid "2.1.2"
usb "2.9.0"
"@ledgerhq/hw-transport-web-ble@^6.27.1":
version "6.29.4"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-web-ble/-/hw-transport-web-ble-6.29.4.tgz#53807f804c55c6423bc3936fe4f440549e839625"
integrity sha512-OJyp6CryvyFlg1L9uifo5hYYdDt+WPw8/0ijBixYhYmGvlRz2W6/F2c5rG/zBQWcNnNydPOLjLJM0vR070RfCw==
dependencies:
"@ledgerhq/devices" "^8.4.4"
"@ledgerhq/errors" "^6.19.1"
"@ledgerhq/hw-transport" "^6.31.4"
"@ledgerhq/logs" "^6.12.0"
rxjs "^7.8.1"
"@ledgerhq/hw-transport-webhid@^6.27.1":
version "6.30.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-webhid/-/hw-transport-webhid-6.30.0.tgz#cd86b0055eb77276892024abbd38e6ed2471b59e"
integrity sha512-HoTzjmYwO7+TVwK+GNbglRepUoDywBL6vjhKnhGqJSUPqAqJJyEXcnKnFDBMN7Phqm55O+YHDYfpcHGBNg5XlQ==
dependencies:
"@ledgerhq/devices" "8.4.4"
"@ledgerhq/errors" "^6.19.1"
"@ledgerhq/hw-transport" "^6.31.4"
"@ledgerhq/logs" "^6.12.0"
"@ledgerhq/hw-transport-webusb@^6.27.1":
version "6.29.4"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport-webusb/-/hw-transport-webusb-6.29.4.tgz#5926421b8db4b474c7aba4851f21ddd4ad4bcc70"
integrity sha512-HoGF1LlBT9HEGBQy2XeCHrFdv/FEOZU0+J+yfKcgAQIAiASr2MLvdzwoJbUS8h6Gn+vc+/BjzBSO3JNn7Loqbg==
dependencies:
"@ledgerhq/devices" "^8.4.4"
"@ledgerhq/errors" "^6.19.1"
"@ledgerhq/hw-transport" "^6.31.4"
"@ledgerhq/logs" "^6.12.0"
"@ledgerhq/hw-transport@^6.31.4":
version "6.31.4"
resolved "https://registry.yarnpkg.com/@ledgerhq/hw-transport/-/hw-transport-6.31.4.tgz#9b23a6de4a4caaa5c24b149c2dea8adde46f0eb1"
integrity sha512-6c1ir/cXWJm5dCWdq55NPgCJ3UuKuuxRvf//Xs36Bq9BwkV2YaRQhZITAkads83l07NAdR16hkTWqqpwFMaI6A==
dependencies:
"@ledgerhq/devices" "^8.4.4"
"@ledgerhq/errors" "^6.19.1"
"@ledgerhq/logs" "^6.12.0"
events "^3.3.0"
"@ledgerhq/logs@^6.12.0":
version "6.12.0"
resolved "https://registry.yarnpkg.com/@ledgerhq/logs/-/logs-6.12.0.tgz#ad903528bf3687a44da435d7b2479d724d374f5d"
integrity sha512-ExDoj1QV5eC6TEbMdLUMMk9cfvNKhhv5gXol4SmULRVCx/3iyCPhJ74nsb3S0Vb+/f+XujBEj3vQn5+cwS0fNA==
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -439,11 +525,18 @@
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4"
integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==
"@types/node@*", "@types/node@^18.7.18":
"@types/node@*":
version "18.11.18"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.18.tgz#8dfb97f0da23c2293e554c5a50d61ef134d7697f"
integrity sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==
"@types/node@^22.15.12":
version "22.15.12"
resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.12.tgz#9ce54e51e09536faa94e4ec300c4728ee83bfa85"
integrity sha512-K0fpC/ZVeb8G9rm7bH7vI0KAec4XHEhBam616nVJCV51bKzJ6oA3luG4WdKoaztxe70QaNjS/xBmcDLmr4PiGw==
dependencies:
undici-types "~6.21.0"
"@types/resolve@1.17.1":
version "1.17.1"
resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6"
@@ -456,6 +549,11 @@
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91"
integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==
"@types/w3c-web-usb@^1.0.6":
version "1.0.10"
resolved "https://registry.yarnpkg.com/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz#cf89cccd2d93b6245e784c19afe0a9f5038d4528"
integrity sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==
"@typescript-eslint/eslint-plugin@^5.20.0":
version "5.50.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz#fb48c31cadc853ffc1dc35373f56b5e2a8908fe9"
@@ -740,11 +838,32 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
base64-js@^1.3.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
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==
dependencies:
file-uri-to-path "1.0.0"
bl@^4.0.3:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
dependencies:
buffer "^5.5.0"
inherits "^2.0.4"
readable-stream "^3.4.0"
bn.js@^4.11.9:
version "4.12.0"
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
@@ -797,6 +916,14 @@ buffer-from@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
buffer@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
dependencies:
base64-js "^1.3.1"
ieee754 "^1.1.13"
builtin-modules@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
@@ -882,6 +1009,11 @@ chokidar@3.5.3:
optionalDependencies:
fsevents "~2.3.2"
chownr@^1.1.1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
clean-stack@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
@@ -985,6 +1117,13 @@ decamelize@^4.0.0:
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
decompress-response@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
dependencies:
mimic-response "^3.1.0"
deep-eql@^4.1.2:
version "4.1.3"
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d"
@@ -992,6 +1131,11 @@ deep-eql@^4.1.2:
dependencies:
type-detect "^4.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"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
deep-is@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
@@ -1009,6 +1153,11 @@ default-require-extensions@^3.0.0:
dependencies:
strip-bom "^4.0.0"
detect-libc@^2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.4.tgz#f04715b8ba815e53b4d8109655b6508a6865a7e8"
integrity sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==
diff@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b"
@@ -1061,6 +1210,13 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
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==
dependencies:
once "^1.4.0"
es6-error@^4.0.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
@@ -1224,6 +1380,16 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
events@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
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==
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@@ -1269,6 +1435,11 @@ file-entry-cache@^6.0.1:
dependencies:
flat-cache "^3.0.4"
file-uri-to-path@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
filename-reserved-regex@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229"
@@ -1346,6 +1517,11 @@ fromentries@^1.2.0:
resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a"
integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==
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"
@@ -1403,6 +1579,11 @@ gh-pages@^4.0.0:
fs-extra "^8.1.0"
globby "^6.1.0"
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 sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@@ -1526,6 +1707,11 @@ html-escaper@^2.0.0:
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
ieee754@^1.1.13:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
ignore@^5.2.0:
version "5.2.4"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
@@ -1562,6 +1748,11 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
ini@~1.3.0:
version "1.3.8"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
@@ -1810,7 +2001,7 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
lodash@^4.17.14:
lodash@^4.17.14, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -1905,6 +2096,11 @@ micromatch@^4.0.4:
braces "^3.0.2"
picomatch "^2.3.1"
mimic-response@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
@@ -1936,11 +2132,21 @@ minimatch@^5.1.2:
dependencies:
brace-expansion "^2.0.1"
minimist@^1.2.0, minimist@^1.2.3:
version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
minimist@^1.2.6:
version "1.2.7"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18"
integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
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==
mocha@^10.0.0:
version "10.2.0"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8"
@@ -1983,6 +2189,11 @@ nanoid@3.3.3:
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25"
integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==
napi-build-utils@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e"
integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==
natural-compare-lite@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4"
@@ -1993,6 +2204,23 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
node-abi@^3.3.0:
version "3.75.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.75.0.tgz#2f929a91a90a0d02b325c43731314802357ed764"
integrity sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==
dependencies:
semver "^7.3.5"
node-addon-api@^3.0.2:
version "3.2.1"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
node-addon-api@^6.0.0:
version "6.1.0"
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76"
integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==
node-fetch@^2.6.1:
version "2.6.9"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6"
@@ -2000,6 +2228,20 @@ node-fetch@^2.6.1:
dependencies:
whatwg-url "^5.0.0"
node-gyp-build@^4.5.0:
version "4.8.4"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8"
integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==
node-hid@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/node-hid/-/node-hid-2.1.2.tgz#3145fa86ed4336a402a71e9f372c54213b88797c"
integrity sha512-qhCyQqrPpP93F/6Wc/xUR7L8mAJW0Z6R7HMQV8jCHHksAxNDe/4z4Un/H9CpLOT+5K39OPyt9tIQlavxWES3lg==
dependencies:
bindings "^1.5.0"
node-addon-api "^3.0.2"
prebuild-install "^7.1.1"
node-preload@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301"
@@ -2055,7 +2297,7 @@ object-assign@^4.0.1:
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
once@^1.3.0:
once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
@@ -2200,6 +2442,24 @@ pkg-dir@^4.1.0:
dependencies:
find-up "^4.0.0"
prebuild-install@^7.1.1:
version "7.1.3"
resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec"
integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==
dependencies:
detect-libc "^2.0.0"
expand-template "^2.0.3"
github-from-package "0.0.0"
minimist "^1.2.3"
mkdirp-classic "^0.5.3"
napi-build-utils "^2.0.0"
node-abi "^3.3.0"
pump "^3.0.0"
rc "^1.2.7"
simple-get "^4.0.0"
tar-fs "^2.0.0"
tunnel-agent "^0.6.0"
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -2224,6 +2484,14 @@ process-on-spawn@^1.0.0:
dependencies:
fromentries "^1.2.0"
pump@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8"
integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==
dependencies:
end-of-stream "^1.1.0"
once "^1.3.1"
punycode@^2.1.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
@@ -2241,6 +2509,25 @@ randombytes@^2.1.0:
dependencies:
safe-buffer "^5.1.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"
readable-stream@^3.1.1, readable-stream@^3.4.0:
version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
@@ -2334,7 +2621,14 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
safe-buffer@^5.1.0:
rxjs@^7.8.1:
version "7.8.2"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.2.tgz#955bc473ed8af11a002a2be52071bf475638607b"
integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==
dependencies:
tslib "^2.1.0"
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -2344,6 +2638,11 @@ semver@^6.0.0, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
semver@^7.3.5:
version "7.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
semver@^7.3.7, semver@^7.3.8:
version "7.3.8"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
@@ -2396,6 +2695,20 @@ signal-exit@^3.0.2:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
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@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
dependencies:
decompress-response "^6.0.0"
once "^1.3.1"
simple-concat "^1.0.0"
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
@@ -2445,6 +2758,13 @@ string-width@^4.1.0, string-width@^4.2.0:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
@@ -2467,6 +2787,11 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.
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 sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
strip-outer@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
@@ -2500,6 +2825,27 @@ supports-preserve-symlinks-flag@^1.0.0:
resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
tar-fs@^2.0.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5"
integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==
dependencies:
chownr "^1.1.1"
mkdirp-classic "^0.5.2"
pump "^3.0.0"
tar-stream "^2.1.4"
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==
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"
terser@^5.0.0:
version "5.16.2"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.16.2.tgz#8f495819439e8b5c150e7530fc434a6e70ea18b2"
@@ -2593,6 +2939,13 @@ tsutils@^3.21.0:
dependencies:
tslib "^1.8.1"
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
dependencies:
safe-buffer "^5.0.1"
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
@@ -2637,6 +2990,11 @@ typescript@^4.1.2:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
undici-types@~6.21.0:
version "6.21.0"
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb"
integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==
universalify@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
@@ -2657,6 +3015,20 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
usb@2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/usb/-/usb-2.9.0.tgz#8ae3b175f93bee559400bff33491eee63406b6a2"
integrity sha512-G0I/fPgfHUzWH8xo2KkDxTTFruUWfppgSFJ+bQxz/kVY2x15EQ/XDB7dqD1G432G4gBG4jYQuF3U7j/orSs5nw==
dependencies:
"@types/w3c-web-usb" "^1.0.6"
node-addon-api "^6.0.0"
node-gyp-build "^4.5.0"
util-deprecate@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"