├── tsconfig.json ├── .github ├── FUNDING.yml ├── renovate.json └── workflows │ └── CI.yml ├── rustfmt.toml ├── .yarnrc.yml ├── .cargo └── config.toml ├── src ├── lib.rs ├── signature.rs ├── err.rs ├── keypair.rs └── client.rs ├── .npmignore ├── __test__ └── index.spec.mjs ├── .gitattributes ├── example.mjs ├── Cargo.toml ├── package.json ├── README.md ├── index.d.ts ├── .gitignore ├── index.js └── yarn.lock /tsconfig.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [Brooooooklyn] -------------------------------------------------------------------------------- /rustfmt.toml: -------------------------------------------------------------------------------- 1 | tab_spaces = 2 2 | edition = "2021" 3 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | 3 | yarnPath: .yarn/releases/yarn-4.10.3.cjs 4 | -------------------------------------------------------------------------------- /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [target.x86_64-pc-windows-msvc] 2 | rustflags = ["-C", "target-feature=+crt-static"] -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | #![deny(clippy::all)] 2 | #![allow(clippy::type_complexity)] 3 | 4 | pub mod client; 5 | mod err; 6 | pub mod keypair; 7 | pub mod signature; 8 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | target 2 | Cargo.lock 3 | .cargo 4 | .github 5 | npm 6 | .eslintrc 7 | .prettierignore 8 | rustfmt.toml 9 | yarn.lock 10 | *.node 11 | .yarn 12 | __test__ 13 | renovate.json 14 | -------------------------------------------------------------------------------- /__test__/index.spec.mjs: -------------------------------------------------------------------------------- 1 | import test from "ava"; 2 | 3 | import { connect } from "../index.js"; 4 | 5 | test("connection failed without auth", async (t) => { 6 | if (process.platform !== "darwin" && process.platform !== "win32") { 7 | await t.throwsAsync(() => connect("github.com:22")); 8 | } else { 9 | await t.notThrowsAsync(() => connect("github.com:22")); 10 | } 11 | }); 12 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | 5 | *.ts text eol=lf merge=union 6 | *.tsx text eol=lf merge=union 7 | *.rs text eol=lf merge=union 8 | *.js text eol=lf merge=union 9 | *.json text eol=lf merge=union 10 | *.debug text eol=lf merge=union 11 | 12 | index.js linguist-detectable=false 13 | index.d.ts inguist-detectable=false 14 | -------------------------------------------------------------------------------- /src/signature.rs: -------------------------------------------------------------------------------- 1 | use napi_derive::napi; 2 | use russh::keys::ssh_key::SshSig; 3 | 4 | #[napi] 5 | pub struct Signature { 6 | pub(crate) inner: SshSig, 7 | } 8 | 9 | #[napi] 10 | impl Signature { 11 | #[napi] 12 | pub fn to_base64(&self) -> String { 13 | use base64::Engine; 14 | use russh::keys::ssh_encoding::Encode; 15 | let mut buf = Vec::new(); 16 | self.inner.encode(&mut buf).unwrap_or_default(); 17 | base64::prelude::BASE64_STANDARD.encode(&buf) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /example.mjs: -------------------------------------------------------------------------------- 1 | import { connect, checkKnownHosts } from './index.js' 2 | 3 | const host = '192.168.65.3' 4 | const port = 22 5 | 6 | const client = await connect(`${host}:${port}`, { 7 | checkServerKey: (key) => { 8 | return checkKnownHosts(host, port, key) 9 | }, 10 | authBanner: (banner) => { 11 | console.info(11111111, banner) 12 | } 13 | }) 14 | 15 | await client.authenticateKeyPair('lyn') 16 | 17 | const { status, output } = await client.exec('ls -la') 18 | console.log(status, output.toString('utf8')) 19 | -------------------------------------------------------------------------------- /src/err.rs: -------------------------------------------------------------------------------- 1 | pub(crate) trait IntoError { 2 | type Value; 3 | 4 | fn into_error(self) -> Result; 5 | } 6 | 7 | impl IntoError for Result { 8 | type Value = T; 9 | 10 | fn into_error(self) -> napi::Result { 11 | self.map_err(|err| napi::Error::new(napi::Status::GenericFailure, err.to_string())) 12 | } 13 | } 14 | 15 | impl IntoError for Result { 16 | type Value = T; 17 | 18 | fn into_error(self) -> napi::Result { 19 | self.map_err(|err| napi::Error::new(napi::Status::GenericFailure, err.to_string())) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | edition = "2021" 3 | name = "napi-rs_ssh" 4 | version = "0.0.0" 5 | 6 | [lib] 7 | crate-type = ["cdylib"] 8 | 9 | [dependencies] 10 | async-trait = "0.1" 11 | anyhow = "1" 12 | base64 = "0.22" 13 | dirs = "6" 14 | napi = { version = "3", default-features = false, features = [ 15 | "async", 16 | "error_anyhow", 17 | ] } 18 | napi-derive = { version = "3" } 19 | rand = "0.8" 20 | russh = { version = "0.54" } 21 | tokio = { version = "1", features = ["full"] } 22 | 23 | [target.'cfg(windows)'.dependencies] 24 | pageant = { version = "0.1" } 25 | 26 | [build-dependencies] 27 | napi-build = "2" 28 | 29 | [profile.release] 30 | lto = true 31 | codegen-units = 1 32 | strip = "symbols" 33 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:base", 5 | "group:allNonMajor", 6 | ":preserveSemverRanges", 7 | ":disablePeerDependencies" 8 | ], 9 | "labels": ["dependencies"], 10 | "packageRules": [ 11 | { 12 | "matchPackageNames": ["@napi/cli", "napi", "napi-build", "napi-derive"], 13 | "addLabels": ["napi-rs"], 14 | "groupName": "napi-rs" 15 | }, 16 | { 17 | "matchPackagePatterns": ["^eslint", "^@typescript-eslint"], 18 | "groupName": "linter" 19 | } 20 | ], 21 | "commitMessagePrefix": "chore: ", 22 | "commitMessageAction": "bump up", 23 | "commitMessageTopic": "{{depName}} version", 24 | "ignoreDeps": [] 25 | } 26 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@napi-rs/ssh", 3 | "version": "0.0.1", 4 | "main": "index.js", 5 | "types": "index.d.ts", 6 | "repository": { 7 | "url": "git@github.com:Brooooooklyn/ssh.git", 8 | "type": "git" 9 | }, 10 | "napi": { 11 | "binaryName": "ssh", 12 | "targets": [ 13 | "x86_64-apple-darwin", 14 | "aarch64-apple-darwin", 15 | "x86_64-pc-windows-msvc", 16 | "x86_64-unknown-linux-gnu", 17 | "aarch64-linux-android", 18 | "aarch64-unknown-linux-gnu", 19 | "aarch64-unknown-linux-musl", 20 | "aarch64-pc-windows-msvc", 21 | "armv7-unknown-linux-gnueabihf", 22 | "x86_64-unknown-linux-musl", 23 | "x86_64-unknown-freebsd", 24 | "i686-pc-windows-msvc" 25 | ] 26 | }, 27 | "license": "MIT", 28 | "devDependencies": { 29 | "@napi-rs/cli": "^3.4.1", 30 | "@types/node": "^24.9.2", 31 | "ava": "^6.4.1" 32 | }, 33 | "ava": { 34 | "timeout": "3m" 35 | }, 36 | "engines": { 37 | "node": ">= 10" 38 | }, 39 | "scripts": { 40 | "artifacts": "napi artifacts", 41 | "build": "napi build --platform --release", 42 | "build:debug": "napi build --platform", 43 | "prepublishOnly": "napi prepublish -t npm", 44 | "test": "ava", 45 | "universal": "napi universal", 46 | "version": "napi version" 47 | }, 48 | "packageManager": "yarn@4.10.3" 49 | } 50 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `@napi-rs/ssh` 2 | 3 | ![CI](https://github.com/Brooooooklyn/ssh/workflows/CI/badge.svg) 4 | [![install size](https://packagephobia.com/badge?p=@napi-rs/ssh)](https://packagephobia.com/result?p=@napi-rs/ssh) 5 | [![Downloads](https://img.shields.io/npm/dm/@napi-rs/ssh.svg?sanitize=true)](https://npmcharts.com/compare/@napi-rs/ssh?minimal=true) 6 | 7 | > 🚀 Help me to become a full-time open-source developer by [sponsoring me on Github](https://github.com/sponsors/Brooooooklyn) 8 | 9 | ## Usage 10 | 11 | ```js 12 | import { connect, checkKnownHosts } from '@napi-rs/ssh' 13 | 14 | const host = '192.168.65.3' 15 | const port = 22 16 | 17 | const client = await connect(`${host}:${port}`, { 18 | checkServerKey: (key) => { 19 | return checkKnownHosts(host, port, key) 20 | } 21 | }) 22 | 23 | await client.authenticateKeyPair('lyn') 24 | 25 | const { status, output } = await client.exec('ls -la') 26 | console.log(status, output.toString('utf8')) 27 | 28 | // 0 total 292 29 | // drwxr-x--- 11 lyn lyn 4096 Jan 23 06:39 . 30 | // drwxr-xr-x 3 root root 4096 Jan 19 06:50 .. 31 | // -rw------- 1 lyn lyn 2065 Jan 20 03:11 .bash_history 32 | // -rw-r--r-- 1 lyn lyn 220 Jan 6 2022 .bash_logout 33 | // -rw-r--r-- 1 lyn lyn 3792 Jan 19 09:11 .bashrc 34 | // drwx------ 5 lyn lyn 4096 Jan 20 03:28 .cache 35 | // -rw-r--r-- 1 lyn lyn 828 Jan 19 09:11 .profile 36 | // drwx------ 2 lyn lyn 4096 Jan 19 09:07 .ssh 37 | // drwxrwxr-x 3 lyn lyn 4096 Jan 19 09:59 .yarn 38 | // -rw-r--r-- 1 lyn lyn 3922 Jan 20 03:30 .zshrc 39 | ``` 40 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | /* auto-generated by NAPI-RS */ 2 | /* eslint-disable */ 3 | export declare class Client { 4 | isClosed(): boolean 5 | /** 6 | * # Safety 7 | * 8 | * close can not be called concurrently. 9 | */ 10 | authenticatePassword(user: string, password: string): Promise 11 | /** 12 | * # Safety 13 | * 14 | * Perform public key-based SSH authentication. 15 | * The key can be omitted to use the default private key. 16 | * The key can be a path to a private key file. 17 | */ 18 | authenticateKeyPair(user: string, key: string | KeyPair | undefined): Promise 19 | /** 20 | * # Safety 21 | * 22 | * exec can not be called concurrently. 23 | * The caller in Node.js must ensure that. 24 | */ 25 | exec(command: string): Promise 26 | disconnect(reason: DisconnectReason, description: string, languageTag: string): Promise 27 | } 28 | 29 | export declare class KeyPair { 30 | static generateEd25519(): KeyPair 31 | static generateRsa(bits: number, signatureHash: SignatureHash): KeyPair 32 | constructor(path: string, password?: string | undefined | null) 33 | clonePublicKey(): PublicKey 34 | name(): string 35 | /** Sign a slice using this algorithm. */ 36 | signDetached(toSign: Uint8Array): Signature 37 | } 38 | 39 | export declare class PublicKey { 40 | name(): string 41 | verifyDetached(data: Array, signature: Array): boolean 42 | /** Compute the key fingerprint, hashed with sha2-256. */ 43 | fingerprint(): string 44 | /** Only effect the `RSA` PublicKey */ 45 | setAlgorithm(algorithm: SignatureHash): void 46 | } 47 | 48 | export declare class Signature { 49 | toBase64(): string 50 | } 51 | 52 | export declare function checkKnownHosts(host: string, port: number, pubkey: PublicKey, path?: string | undefined | null): boolean 53 | 54 | /** The configuration of clients. */ 55 | export interface ClientConfig { 56 | /** The client ID string sent at the beginning of the protocol. */ 57 | clientId?: ClientId 58 | /** The bytes and time limits before key re-exchange. */ 59 | limits?: Limits 60 | /** The initial size of a channel (used for flow control). */ 61 | windowSize?: number 62 | /** The maximal size of a single packet. */ 63 | maximumPacketSize?: number 64 | /** Time after which the connection is garbage-collected. In milliseconds. */ 65 | inactivityTimeout?: number 66 | /** Whether to expect and wait for an authentication call. */ 67 | anonymous?: boolean 68 | } 69 | 70 | export interface ClientId { 71 | kind: ClientIdType 72 | id: string 73 | } 74 | 75 | export declare const enum ClientIdType { 76 | /** When sending the id, append RFC standard `\r 77 | `. Example: `SshId::Standard("SSH-2.0-acme")` */ 78 | Standard = 0, 79 | /** When sending the id, use this buffer as it is and do not append additional line terminators. */ 80 | Raw = 1 81 | } 82 | 83 | export interface Config { 84 | client?: ClientConfig 85 | checkServerKey?: ((err: Error | null, arg: PublicKey) => boolean | Promise | unknown) 86 | authBanner?: ((err: Error | null, arg: string) => void) 87 | } 88 | 89 | export declare function connect(addr: string, config?: Config | undefined | null): Promise 90 | 91 | /** A reason for disconnection. */ 92 | export declare const enum DisconnectReason { 93 | HostNotAllowedToConnect = 1, 94 | ProtocolError = 2, 95 | KeyExchangeFailed = 3, 96 | Reserved = 4, 97 | MACError = 5, 98 | CompressionError = 6, 99 | ServiceNotAvailable = 7, 100 | ProtocolVersionNotSupported = 8, 101 | HostKeyNotVerifiable = 9, 102 | ConnectionLost = 10, 103 | ByApplication = 11, 104 | TooManyConnections = 12, 105 | AuthCancelledByUser = 13, 106 | NoMoreAuthMethodsAvailable = 14, 107 | IllegalUserName = 15 108 | } 109 | 110 | export interface ExecOutput { 111 | status: number 112 | output: Buffer 113 | } 114 | 115 | export declare function learnKnownHosts(host: string, port: number, pubkey: PublicKey, path?: string | undefined | null): void 116 | 117 | /** 118 | * The number of bytes read/written, and the number of seconds before a key 119 | * re-exchange is requested. 120 | * The default value Following the recommendations of 121 | * https://tools.ietf.org/html/rfc4253#section-9 122 | */ 123 | export interface Limits { 124 | rekeyWriteLimit?: number 125 | rekeyReadLimit?: number 126 | /** In seconds. */ 127 | rekeyTimeLimit?: number 128 | } 129 | 130 | /** The hash function used for signing with RSA keys. */ 131 | export declare const enum SignatureHash { 132 | /** SHA2, 256 bits. */ 133 | SHA2_256 = 0, 134 | /** SHA2, 512 bits. */ 135 | SHA2_512 = 1, 136 | /** SHA1 */ 137 | SHA1 = 2 138 | } 139 | -------------------------------------------------------------------------------- /src/keypair.rs: -------------------------------------------------------------------------------- 1 | use napi::bindgen_prelude::*; 2 | use napi_derive::napi; 3 | use russh::keys::{self, HashAlg}; 4 | 5 | use crate::{err::IntoError, signature::Signature}; 6 | 7 | #[napi] 8 | /// The hash function used for signing with RSA keys. 9 | #[derive(Eq, PartialEq, Debug, Hash)] 10 | #[allow(non_camel_case_types)] 11 | pub enum SignatureHash { 12 | /// SHA2, 256 bits. 13 | SHA2_256, 14 | /// SHA2, 512 bits. 15 | SHA2_512, 16 | /// SHA1 17 | SHA1, 18 | } 19 | 20 | impl From for Option { 21 | fn from(hash: SignatureHash) -> Self { 22 | match hash { 23 | SignatureHash::SHA1 => None, // SHA1 is deprecated, use default 24 | SignatureHash::SHA2_256 => Some(HashAlg::Sha256), 25 | SignatureHash::SHA2_512 => Some(HashAlg::Sha512), 26 | } 27 | } 28 | } 29 | 30 | #[napi] 31 | pub struct PublicKey { 32 | inner: keys::PublicKey, 33 | } 34 | 35 | #[napi] 36 | impl PublicKey { 37 | pub(crate) fn new(inner: keys::PublicKey) -> Self { 38 | Self { inner } 39 | } 40 | 41 | #[napi] 42 | pub fn name(&self) -> String { 43 | self.inner.algorithm().as_str().to_string() 44 | } 45 | 46 | #[napi] 47 | pub fn verify_detached(&self, data: Vec, signature: Vec) -> bool { 48 | // Parse the signature and verify it 49 | use russh::keys::ssh_encoding::Decode; 50 | use russh::keys::ssh_key::SshSig; 51 | let Ok(sig) = SshSig::decode(&mut &signature[..]) else { 52 | return false; 53 | }; 54 | // Use empty namespace as we're not using SSH signature format with namespace 55 | self.inner.verify("", &data, &sig).is_ok() 56 | } 57 | 58 | #[napi] 59 | /// Compute the key fingerprint, hashed with sha2-256. 60 | pub fn fingerprint(&self) -> String { 61 | self.inner.fingerprint(HashAlg::Sha256).to_string() 62 | } 63 | 64 | #[napi] 65 | /// Only effect the `RSA` PublicKey 66 | pub fn set_algorithm(&mut self, _algorithm: SignatureHash) { 67 | // Note: The new ssh-key API doesn't support setting algorithm on PublicKey 68 | // This method is kept for backwards compatibility but is a no-op 69 | } 70 | } 71 | 72 | #[napi] 73 | pub struct KeyPair { 74 | pub(crate) inner: keys::PrivateKey, 75 | } 76 | 77 | #[napi] 78 | impl KeyPair { 79 | #[napi(factory)] 80 | pub fn generate_ed25519() -> Self { 81 | Self { 82 | inner: keys::PrivateKey::random(&mut rand::thread_rng(), keys::Algorithm::Ed25519).unwrap(), 83 | } 84 | } 85 | 86 | #[napi(factory)] 87 | pub fn generate_rsa(bits: u32, _signature_hash: SignatureHash) -> Result { 88 | // Note: The ssh-key crate generates RSA keys with a fixed bit size based on algorithm 89 | // For compatibility, we'll generate a standard RSA key 90 | let algorithm = match bits { 91 | 2048 => keys::Algorithm::Rsa { hash: None }, 92 | 4096 => keys::Algorithm::Rsa { hash: None }, 93 | _ => keys::Algorithm::Rsa { hash: None }, 94 | }; 95 | Ok(Self { 96 | inner: keys::PrivateKey::random(&mut rand::thread_rng(), algorithm).map_err(|err| { 97 | Error::new( 98 | Status::GenericFailure, 99 | format!("Generate rsa keypair failed: {err}"), 100 | ) 101 | })?, 102 | }) 103 | } 104 | 105 | #[napi(constructor)] 106 | pub fn new(path: String, password: Option) -> Result { 107 | Ok(Self { 108 | inner: keys::load_secret_key(path, password.as_deref()).into_error()?, 109 | }) 110 | } 111 | 112 | #[napi] 113 | pub fn clone_public_key(&self) -> Result { 114 | Ok(PublicKey { 115 | inner: self.inner.public_key().clone(), 116 | }) 117 | } 118 | 119 | #[napi] 120 | pub fn name(&self) -> String { 121 | self.inner.algorithm().as_str().to_string() 122 | } 123 | 124 | #[napi] 125 | /// Sign a slice using this algorithm. 126 | pub fn sign_detached(&self, to_sign: &[u8]) -> Result { 127 | let signature = self 128 | .inner 129 | .sign("", HashAlg::Sha256, to_sign) 130 | .map_err(|err| Error::new(Status::GenericFailure, format!("{err}")))?; 131 | Ok(Signature { inner: signature }) 132 | } 133 | } 134 | 135 | #[napi] 136 | pub fn check_known_hosts( 137 | host: String, 138 | port: u32, 139 | pubkey: &PublicKey, 140 | path: Option, 141 | ) -> Result { 142 | if let Some(p) = path { 143 | keys::check_known_hosts_path(&host, port as u16, &pubkey.inner, p) 144 | } else { 145 | keys::check_known_hosts(&host, port as u16, &pubkey.inner) 146 | } 147 | .into_error() 148 | } 149 | 150 | #[napi] 151 | pub fn learn_known_hosts( 152 | host: String, 153 | port: u32, 154 | pubkey: &PublicKey, 155 | path: Option, 156 | ) -> Result<()> { 157 | if let Some(p) = path { 158 | keys::known_hosts::learn_known_hosts_path(&host, port as u16, &pubkey.inner, p) 159 | } else { 160 | keys::known_hosts::learn_known_hosts(&host, port as u16, &pubkey.inner) 161 | } 162 | .into_error() 163 | } 164 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/node 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=node 3 | 4 | ### Node ### 5 | # Logs 6 | logs 7 | *.log 8 | npm-debug.log* 9 | yarn-debug.log* 10 | yarn-error.log* 11 | lerna-debug.log* 12 | 13 | # Diagnostic reports (https://nodejs.org/api/report.html) 14 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 15 | 16 | # Runtime data 17 | pids 18 | *.pid 19 | *.seed 20 | *.pid.lock 21 | 22 | # Directory for instrumented libs generated by jscoverage/JSCover 23 | lib-cov 24 | 25 | # Coverage directory used by tools like istanbul 26 | coverage 27 | *.lcov 28 | 29 | # nyc test coverage 30 | .nyc_output 31 | 32 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 33 | .grunt 34 | 35 | # Bower dependency directory (https://bower.io/) 36 | bower_components 37 | 38 | # node-waf configuration 39 | .lock-wscript 40 | 41 | # Compiled binary addons (https://nodejs.org/api/addons.html) 42 | build/Release 43 | 44 | # Dependency directories 45 | node_modules/ 46 | jspm_packages/ 47 | 48 | # TypeScript v1 declaration files 49 | typings/ 50 | 51 | # TypeScript cache 52 | *.tsbuildinfo 53 | 54 | # Optional npm cache directory 55 | .npm 56 | 57 | # Optional eslint cache 58 | .eslintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variables file 76 | .env 77 | .env.test 78 | 79 | # parcel-bundler cache (https://parceljs.org/) 80 | .cache 81 | 82 | # Next.js build output 83 | .next 84 | 85 | # Nuxt.js build / generate output 86 | .nuxt 87 | dist 88 | 89 | # Gatsby files 90 | .cache/ 91 | # Comment in the public line in if your project uses Gatsby and not Next.js 92 | # https://nextjs.org/blog/next-9-1#public-directory-support 93 | # public 94 | 95 | # vuepress build output 96 | .vuepress/dist 97 | 98 | # Serverless directories 99 | .serverless/ 100 | 101 | # FuseBox cache 102 | .fusebox/ 103 | 104 | # DynamoDB Local files 105 | .dynamodb/ 106 | 107 | # TernJS port file 108 | .tern-port 109 | 110 | # Stores VSCode versions used for testing VSCode extensions 111 | .vscode-test 112 | 113 | # End of https://www.toptal.com/developers/gitignore/api/node 114 | 115 | # Created by https://www.toptal.com/developers/gitignore/api/macos 116 | # Edit at https://www.toptal.com/developers/gitignore?templates=macos 117 | 118 | ### macOS ### 119 | # General 120 | .DS_Store 121 | .AppleDouble 122 | .LSOverride 123 | 124 | # Icon must end with two 125 | Icon 126 | 127 | 128 | # Thumbnails 129 | ._* 130 | 131 | # Files that might appear in the root of a volume 132 | .DocumentRevisions-V100 133 | .fseventsd 134 | .Spotlight-V100 135 | .TemporaryItems 136 | .Trashes 137 | .VolumeIcon.icns 138 | .com.apple.timemachine.donotpresent 139 | 140 | # Directories potentially created on remote AFP share 141 | .AppleDB 142 | .AppleDesktop 143 | Network Trash Folder 144 | Temporary Items 145 | .apdisk 146 | 147 | ### macOS Patch ### 148 | # iCloud generated files 149 | *.icloud 150 | 151 | # End of https://www.toptal.com/developers/gitignore/api/macos 152 | 153 | # Created by https://www.toptal.com/developers/gitignore/api/windows 154 | # Edit at https://www.toptal.com/developers/gitignore?templates=windows 155 | 156 | ### Windows ### 157 | # Windows thumbnail cache files 158 | Thumbs.db 159 | Thumbs.db:encryptable 160 | ehthumbs.db 161 | ehthumbs_vista.db 162 | 163 | # Dump file 164 | *.stackdump 165 | 166 | # Folder config file 167 | [Dd]esktop.ini 168 | 169 | # Recycle Bin used on file shares 170 | $RECYCLE.BIN/ 171 | 172 | # Windows Installer files 173 | *.cab 174 | *.msi 175 | *.msix 176 | *.msm 177 | *.msp 178 | 179 | # Windows shortcuts 180 | *.lnk 181 | 182 | # End of https://www.toptal.com/developers/gitignore/api/windows 183 | 184 | #Added by cargo 185 | 186 | /target 187 | Cargo.lock 188 | 189 | .pnp.* 190 | .yarn/* 191 | !.yarn/patches 192 | !.yarn/plugins 193 | !.yarn/releases 194 | !.yarn/sdks 195 | !.yarn/versions 196 | 197 | *.node 198 | 199 | 200 | ### Created by https://www.gitignore.io 201 | ### macOS ### 202 | # General 203 | .DS_Store 204 | .AppleDouble 205 | .LSOverride 206 | 207 | # Icon must end with two \r 208 | Icon 209 | 210 | # Thumbnails 211 | ._* 212 | 213 | # Files that might appear in the root of a volume 214 | .DocumentRevisions-V100 215 | .fseventsd 216 | .Spotlight-V100 217 | .TemporaryItems 218 | .Trashes 219 | .VolumeIcon.icns 220 | .com.apple.timemachine.donotpresent 221 | 222 | # Directories potentially created on remote AFP share 223 | .AppleDB 224 | .AppleDesktop 225 | Network Trash Folder 226 | Temporary Items 227 | .apdisk 228 | 229 | ### macOS Patch ### 230 | # iCloud generated files 231 | *.icloud 232 | 233 | 234 | 235 | ### Created by https://www.gitignore.io 236 | ### Linux ### 237 | *~ 238 | 239 | # temporary files which can be created if a process still has a handle open of a deleted file 240 | .fuse_hidden* 241 | 242 | # KDE directory preferences 243 | .directory 244 | 245 | # Linux trash folder which might appear on any partition or disk 246 | .Trash-* 247 | 248 | # .nfs files are created when an open file is removed but is still being accessed 249 | .nfs* 250 | 251 | 252 | 253 | ### Created by https://www.gitignore.io 254 | ### Windows ### 255 | # Windows thumbnail cache files 256 | Thumbs.db 257 | Thumbs.db:encryptable 258 | ehthumbs.db 259 | ehthumbs_vista.db 260 | 261 | # Dump file 262 | *.stackdump 263 | 264 | # Folder config file 265 | [Dd]esktop.ini 266 | 267 | # Recycle Bin used on file shares 268 | $RECYCLE.BIN/ 269 | 270 | # Windows Installer files 271 | *.cab 272 | *.msi 273 | *.msix 274 | *.msm 275 | *.msp 276 | 277 | # Windows shortcuts 278 | *.lnk 279 | 280 | 281 | 282 | ### Created by https://www.gitignore.io 283 | ### Node ### 284 | # Logs 285 | logs 286 | *.log 287 | npm-debug.log* 288 | yarn-debug.log* 289 | yarn-error.log* 290 | lerna-debug.log* 291 | .pnpm-debug.log* 292 | 293 | # Diagnostic reports (https://nodejs.org/api/report.html) 294 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 295 | 296 | # Runtime data 297 | pids 298 | *.pid 299 | *.seed 300 | *.pid.lock 301 | 302 | # Directory for instrumented libs generated by jscoverage/JSCover 303 | lib-cov 304 | 305 | # Coverage directory used by tools like istanbul 306 | coverage 307 | *.lcov 308 | 309 | # nyc test coverage 310 | .nyc_output 311 | 312 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 313 | .grunt 314 | 315 | # Bower dependency directory (https://bower.io/) 316 | bower_components 317 | 318 | # node-waf configuration 319 | .lock-wscript 320 | 321 | # Compiled binary addons (https://nodejs.org/api/addons.html) 322 | build/Release 323 | 324 | # Dependency directories 325 | node_modules/ 326 | jspm_packages/ 327 | 328 | # Snowpack dependency directory (https://snowpack.dev/) 329 | web_modules/ 330 | 331 | # TypeScript cache 332 | *.tsbuildinfo 333 | 334 | # Optional npm cache directory 335 | .npm 336 | 337 | # Optional eslint cache 338 | .eslintcache 339 | 340 | # Optional stylelint cache 341 | .stylelintcache 342 | 343 | # Microbundle cache 344 | .rpt2_cache/ 345 | .rts2_cache_cjs/ 346 | .rts2_cache_es/ 347 | .rts2_cache_umd/ 348 | 349 | # Optional REPL history 350 | .node_repl_history 351 | 352 | # Output of 'npm pack' 353 | *.tgz 354 | 355 | # Yarn Integrity file 356 | .yarn-integrity 357 | 358 | # dotenv environment variable files 359 | .env 360 | .env.development.local 361 | .env.test.local 362 | .env.production.local 363 | .env.local 364 | 365 | # parcel-bundler cache (https://parceljs.org/) 366 | .cache 367 | .parcel-cache 368 | 369 | # Next.js build output 370 | .next 371 | out 372 | 373 | # Nuxt.js build / generate output 374 | .nuxt 375 | dist 376 | 377 | # Gatsby files 378 | .cache/ 379 | # Comment in the public line in if your project uses Gatsby and not Next.js 380 | # https://nextjs.org/blog/next-9-1#public-directory-support 381 | # public 382 | 383 | # vuepress build output 384 | .vuepress/dist 385 | 386 | # vuepress v2.x temp and cache directory 387 | .temp 388 | .cache 389 | 390 | # Docusaurus cache and generated files 391 | .docusaurus 392 | 393 | # Serverless directories 394 | .serverless/ 395 | 396 | # FuseBox cache 397 | .fusebox/ 398 | 399 | # DynamoDB Local files 400 | .dynamodb/ 401 | 402 | # TernJS port file 403 | .tern-port 404 | 405 | # Stores VSCode versions used for testing VSCode extensions 406 | .vscode-test 407 | 408 | # yarn v2 409 | .yarn/cache 410 | .yarn/unplugged 411 | .yarn/build-state.yml 412 | .yarn/install-state.gz 413 | .pnp.* 414 | 415 | ### Node Patch ### 416 | # Serverless Webpack directories 417 | .webpack/ 418 | 419 | # Optional stylelint cache 420 | .stylelintcache 421 | 422 | # SvelteKit build / generate output 423 | .svelte-kit 424 | 425 | -------------------------------------------------------------------------------- /.github/workflows/CI.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | env: 3 | DEBUG: napi:* 4 | APP_NAME: ssh 5 | MACOSX_DEPLOYMENT_TARGET: '10.13' 6 | CARGO_INCREMENTAL: '1' 7 | 'on': 8 | push: 9 | branches: 10 | - main 11 | tags-ignore: 12 | - '**' 13 | paths-ignore: 14 | - '**/*.md' 15 | - LICENSE 16 | - '**/*.gitignore' 17 | - .editorconfig 18 | - docs/** 19 | pull_request: null 20 | concurrency: 21 | group: ${{ github.workflow }}-${{ github.ref }} 22 | cancel-in-progress: true 23 | jobs: 24 | lint: 25 | name: Lint 26 | runs-on: ubuntu-latest 27 | steps: 28 | - uses: actions/checkout@v6 29 | 30 | - name: Setup node 31 | uses: actions/setup-node@v6 32 | with: 33 | node-version: 24 34 | cache: 'yarn' 35 | 36 | - name: Install 37 | uses: dtolnay/rust-toolchain@stable 38 | with: 39 | components: clippy, rustfmt 40 | 41 | - name: Install dependencies 42 | run: yarn install 43 | 44 | - name: Cargo fmt 45 | run: cargo fmt -- --check 46 | 47 | - name: Clippy 48 | run: cargo clippy 49 | build: 50 | strategy: 51 | fail-fast: false 52 | matrix: 53 | settings: 54 | - host: macos-latest 55 | target: x86_64-apple-darwin 56 | build: yarn build --target x86_64-apple-darwin 57 | - host: windows-latest 58 | build: yarn build --target x86_64-pc-windows-msvc 59 | target: x86_64-pc-windows-msvc 60 | - host: windows-latest 61 | build: yarn build --target i686-pc-windows-msvc 62 | target: i686-pc-windows-msvc 63 | - host: ubuntu-24.04-arm 64 | target: x86_64-unknown-linux-gnu 65 | build: TARGET_CC=clang yarn build --target x86_64-unknown-linux-gnu --use-napi-cross 66 | - host: ubuntu-latest 67 | target: x86_64-unknown-linux-musl 68 | build: yarn build --target x86_64-unknown-linux-musl -x 69 | - host: macos-latest 70 | target: aarch64-apple-darwin 71 | build: yarn build --target aarch64-apple-darwin 72 | - host: ubuntu-latest 73 | target: aarch64-unknown-linux-gnu 74 | build: yarn build --target aarch64-unknown-linux-gnu -x 75 | - host: ubuntu-latest 76 | target: armv7-unknown-linux-gnueabihf 77 | build: AWS_LC_SYS_NO_JITTER_ENTROPY=1 yarn build --target armv7-unknown-linux-gnueabihf -x 78 | - host: ubuntu-latest 79 | target: aarch64-linux-android 80 | build: yarn build --target aarch64-linux-android 81 | - host: ubuntu-latest 82 | target: aarch64-unknown-linux-musl 83 | build: yarn build --target aarch64-unknown-linux-musl -x 84 | - host: windows-latest 85 | target: aarch64-pc-windows-msvc 86 | build: yarn build --target aarch64-pc-windows-msvc 87 | name: stable - ${{ matrix.settings.target }} - node@22 88 | runs-on: ${{ matrix.settings.host }} 89 | steps: 90 | - uses: actions/checkout@v6 91 | - name: Setup node 92 | uses: actions/setup-node@v6 93 | with: 94 | node-version: 24 95 | cache: yarn 96 | - name: Install 97 | uses: dtolnay/rust-toolchain@stable 98 | with: 99 | toolchain: stable 100 | targets: ${{ matrix.settings.target }} 101 | - name: Cache cargo 102 | uses: actions/cache@v5 103 | with: 104 | path: | 105 | ~/.cargo/registry/index/ 106 | ~/.cargo/registry/cache/ 107 | ~/.cargo/git/db/ 108 | ~/.napi-rs 109 | .cargo-cache 110 | target/ 111 | key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }} 112 | - uses: mlugg/setup-zig@v2 113 | with: 114 | version: 0.15.2 115 | - name: Install cargo-zigbuild 116 | uses: taiki-e/install-action@v2 117 | env: 118 | GITHUB_TOKEN: ${{ github.token }} 119 | with: 120 | tool: cargo-zigbuild 121 | - name: Install bindgen-cli 122 | uses: taiki-e/install-action@v2 123 | if: ${{ contains(matrix.settings.target, 'arm') }} 124 | env: 125 | GITHUB_TOKEN: ${{ github.token }} 126 | with: 127 | tool: bindgen-cli 128 | - name: Setup toolchain 129 | run: ${{ matrix.settings.setup }} 130 | if: ${{ matrix.settings.setup }} 131 | shell: bash 132 | - name: Install dependencies 133 | run: yarn install 134 | - name: Build 135 | run: ${{ matrix.settings.build }} 136 | shell: bash 137 | - name: Upload artifact 138 | uses: actions/upload-artifact@v6 139 | with: 140 | name: bindings-${{ matrix.settings.target }} 141 | path: ${{ env.APP_NAME }}.*.node 142 | if-no-files-found: error 143 | build-freebsd: 144 | runs-on: ubuntu-latest 145 | name: Build FreeBSD 146 | steps: 147 | - uses: actions/checkout@v6 148 | - name: Build 149 | id: build 150 | uses: cross-platform-actions/action@v0.29.0 151 | env: 152 | DEBUG: napi:* 153 | RUSTUP_IO_THREADS: 1 154 | with: 155 | operating_system: freebsd 156 | version: '14.3' 157 | memory: 8G 158 | cpu_count: 3 159 | environment_variables: 'DEBUG RUSTUP_IO_THREADS' 160 | shell: bash 161 | run: | 162 | sudo pkg install -y -f curl node libnghttp2 npm cmake llvm 163 | sudo npm install --location=global --ignore-scripts yarn 164 | curl https://sh.rustup.rs -sSf --output rustup.sh 165 | sh rustup.sh -y --profile minimal --default-toolchain stable 166 | source "$HOME/.cargo/env" 167 | echo "~~~~ rustc --version ~~~~" 168 | rustc --version 169 | echo "~~~~ node -v ~~~~" 170 | node -v 171 | echo "~~~~ yarn --version ~~~~" 172 | yarn --version 173 | pwd 174 | ls -lah 175 | whoami 176 | env 177 | freebsd-version 178 | yarn install 179 | yarn build 180 | strip -x *.node 181 | yarn test 182 | rm -rf node_modules 183 | rm -rf target 184 | rm -rf .yarn 185 | - name: Upload artifact 186 | uses: actions/upload-artifact@v6 187 | with: 188 | name: bindings-freebsd 189 | path: ${{ env.APP_NAME }}.*.node 190 | if-no-files-found: error 191 | test-macOS-windows-binding: 192 | name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }} 193 | needs: 194 | - build 195 | strategy: 196 | fail-fast: false 197 | matrix: 198 | settings: 199 | - host: windows-latest 200 | target: x86_64-pc-windows-msvc 201 | architecture: x64 202 | - host: windows-latest 203 | target: i686-pc-windows-msvc 204 | architecture: x86 205 | - host: macos-latest 206 | target: x86_64-apple-darwin 207 | architecture: x64 208 | - host: macos-latest 209 | target: aarch64-apple-darwin 210 | architecture: arm64 211 | node: 212 | - '20' 213 | - '22' 214 | runs-on: ${{ matrix.settings.host }} 215 | steps: 216 | - uses: actions/checkout@v6 217 | - name: Setup node 218 | uses: actions/setup-node@v6 219 | with: 220 | node-version: ${{ matrix.node }} 221 | cache: yarn 222 | architecture: ${{ matrix.settings.architecture }} 223 | - name: Install dependencies 224 | run: yarn install 225 | - name: Download artifacts 226 | uses: actions/download-artifact@v7 227 | with: 228 | name: bindings-${{ matrix.settings.target }} 229 | path: . 230 | - name: List packages 231 | run: ls -R . 232 | shell: bash 233 | - name: Test bindings 234 | run: yarn test 235 | test-linux-binding: 236 | name: Test ${{ matrix.target }} - node@${{ matrix.node }} 237 | needs: 238 | - build 239 | strategy: 240 | fail-fast: false 241 | matrix: 242 | target: 243 | - x86_64-unknown-linux-gnu 244 | - x86_64-unknown-linux-musl 245 | - aarch64-unknown-linux-gnu 246 | - aarch64-unknown-linux-musl 247 | - armv7-unknown-linux-gnueabihf 248 | node: 249 | - '20' 250 | - '22' 251 | runs-on: ${{ contains(matrix.target, 'aarch64') && 'ubuntu-24.04-arm' || 'ubuntu-latest' }} 252 | steps: 253 | - uses: actions/checkout@v6 254 | - name: Setup node 255 | uses: actions/setup-node@v6 256 | with: 257 | node-version: ${{ matrix.node }} 258 | cache: yarn 259 | - name: Output docker params 260 | id: docker 261 | run: | 262 | node -e " 263 | if ('${{ matrix.target }}'.startsWith('aarch64')) { 264 | console.log('PLATFORM=linux/arm64') 265 | } else if ('${{ matrix.target }}'.startsWith('armv7')) { 266 | console.log('PLATFORM=linux/arm/v7') 267 | } else { 268 | console.log('PLATFORM=linux/amd64') 269 | } 270 | " >> $GITHUB_OUTPUT 271 | node -e " 272 | if ('${{ matrix.target }}'.endsWith('-musl')) { 273 | console.log('IMAGE=node:${{ matrix.node }}-alpine') 274 | } else { 275 | console.log('IMAGE=node:${{ matrix.node }}-slim') 276 | } 277 | " >> $GITHUB_OUTPUT 278 | - name: Install dependencies 279 | run: | 280 | yarn config set --json supportedArchitectures.cpu '["current", "arm64", "x64", "arm"]' 281 | yarn config set --json supportedArchitectures.libc '["current", "musl", "gnu"]' 282 | yarn install 283 | - name: Download artifacts 284 | uses: actions/download-artifact@v7 285 | with: 286 | name: bindings-${{ matrix.target }} 287 | path: . 288 | - name: List packages 289 | run: ls -R . 290 | shell: bash 291 | - name: Set up QEMU 292 | uses: docker/setup-qemu-action@v3 293 | if: ${{ contains(matrix.target, 'armv7') }} 294 | with: 295 | platforms: all 296 | - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes 297 | if: ${{ contains(matrix.target, 'armv7') }} 298 | - name: Test bindings 299 | uses: addnab/docker-run-action@v3 300 | with: 301 | image: ${{ steps.docker.outputs.IMAGE }} 302 | options: -v ${{ github.workspace }}:${{ github.workspace }} -w ${{ github.workspace }} --platform ${{ steps.docker.outputs.PLATFORM }} 303 | run: yarn test 304 | publish: 305 | name: Publish 306 | runs-on: ubuntu-latest 307 | permissions: 308 | contents: write 309 | id-token: write 310 | needs: 311 | - lint 312 | - build-freebsd 313 | - test-macOS-windows-binding 314 | - test-linux-binding 315 | steps: 316 | - uses: actions/checkout@v6 317 | - name: Setup node 318 | uses: actions/setup-node@v6 319 | with: 320 | node-version: 24 321 | cache: yarn 322 | - name: Install dependencies 323 | run: yarn install 324 | - name: create npm dirs 325 | run: yarn napi create-npm-dirs 326 | - name: Download all artifacts 327 | uses: actions/download-artifact@v7 328 | with: 329 | path: artifacts 330 | - name: Move artifacts 331 | run: yarn artifacts 332 | - name: List packages 333 | run: ls -R ./npm 334 | shell: bash 335 | - name: Publish 336 | run: | 337 | npm config set provenance true 338 | if git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+$"; 339 | then 340 | echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc 341 | npm publish --access public 342 | elif git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+"; 343 | then 344 | echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc 345 | npm publish --tag next --access public 346 | else 347 | echo "Not a release, skipping publish" 348 | fi 349 | env: 350 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 351 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 352 | -------------------------------------------------------------------------------- /src/client.rs: -------------------------------------------------------------------------------- 1 | use std::future::Future; 2 | use std::sync::Arc; 3 | 4 | use async_trait::async_trait; 5 | use napi::{ 6 | bindgen_prelude::*, 7 | threadsafe_function::{ThreadsafeFunction, ThreadsafeFunctionCallMode, UnknownReturnValue}, 8 | }; 9 | use napi_derive::napi; 10 | use russh::client::{self, AuthResult, Session}; 11 | use russh::keys::{agent::client::AgentClient, load_secret_key, PublicKey as RusshPublicKey}; 12 | use tokio::io::AsyncWriteExt; 13 | #[cfg(not(windows))] 14 | use tokio::net::UnixStream as SshAgentStream; 15 | 16 | use crate::{ 17 | err::IntoError, 18 | keypair::{KeyPair, PublicKey}, 19 | }; 20 | 21 | #[napi] 22 | #[derive(Debug)] 23 | pub enum ClientIdType { 24 | /// When sending the id, append RFC standard `\r\n`. Example: `SshId::Standard("SSH-2.0-acme")` 25 | Standard, 26 | /// When sending the id, use this buffer as it is and do not append additional line terminators. 27 | Raw, 28 | } 29 | 30 | #[napi(object)] 31 | /// The number of bytes read/written, and the number of seconds before a key 32 | /// re-exchange is requested. 33 | /// The default value Following the recommendations of 34 | /// https://tools.ietf.org/html/rfc4253#section-9 35 | #[derive(Debug, Clone)] 36 | pub struct Limits { 37 | pub rekey_write_limit: Option, 38 | pub rekey_read_limit: Option, 39 | /// In seconds. 40 | pub rekey_time_limit: Option, 41 | } 42 | 43 | impl From for russh::Limits { 44 | fn from(limits: Limits) -> Self { 45 | Self { 46 | rekey_write_limit: limits.rekey_write_limit.unwrap_or(1 << 30 /* 1GB */) as usize, 47 | rekey_read_limit: limits.rekey_read_limit.unwrap_or(1 << 30 /* 1GB */) as usize, 48 | rekey_time_limit: std::time::Duration::from_secs( 49 | limits.rekey_time_limit.unwrap_or(3600) as u64 50 | ), 51 | } 52 | } 53 | } 54 | 55 | #[napi(object)] 56 | #[derive(Debug)] 57 | pub struct ClientId { 58 | pub kind: ClientIdType, 59 | pub id: String, 60 | } 61 | 62 | #[napi(object)] 63 | /// The configuration of clients. 64 | pub struct ClientConfig { 65 | /// The client ID string sent at the beginning of the protocol. 66 | pub client_id: Option, 67 | /// The bytes and time limits before key re-exchange. 68 | pub limits: Option, 69 | /// The initial size of a channel (used for flow control). 70 | pub window_size: Option, 71 | /// The maximal size of a single packet. 72 | pub maximum_packet_size: Option, 73 | /// Time after which the connection is garbage-collected. In milliseconds. 74 | pub inactivity_timeout: Option, 75 | /// Whether to expect and wait for an authentication call. 76 | pub anonymous: Option, 77 | } 78 | 79 | impl From for russh::client::Config { 80 | fn from(config: ClientConfig) -> Self { 81 | let mut russh_config = Self::default(); 82 | if let Some(client_id) = config.client_id { 83 | russh_config.client_id = match client_id.kind { 84 | ClientIdType::Standard => russh::SshId::Standard(client_id.id), 85 | ClientIdType::Raw => russh::SshId::Raw(client_id.id), 86 | }; 87 | } 88 | if let Some(limits) = config.limits { 89 | russh_config.limits = russh::Limits::from(limits); 90 | } 91 | if let Some(window_size) = config.window_size { 92 | russh_config.window_size = window_size; 93 | } 94 | if let Some(maximum_packet_size) = config.maximum_packet_size { 95 | russh_config.maximum_packet_size = maximum_packet_size; 96 | } 97 | russh_config.inactivity_timeout = config 98 | .inactivity_timeout 99 | .map(|timeout| std::time::Duration::from_millis(timeout as u64)); 100 | if let Some(anonymous) = config.anonymous { 101 | russh_config.anonymous = anonymous; 102 | } 103 | russh_config 104 | } 105 | } 106 | 107 | #[napi(object, object_to_js = false)] 108 | pub struct Config { 109 | pub client: Option, 110 | pub check_server_key: Option< 111 | ThreadsafeFunction, UnknownReturnValue>, PublicKey>, 112 | >, 113 | pub auth_banner: Option>, 114 | } 115 | 116 | pub struct ClientHandle { 117 | check_server_key: Option< 118 | ThreadsafeFunction, UnknownReturnValue>, PublicKey>, 119 | >, 120 | auth_banner: Option>, 121 | } 122 | 123 | #[async_trait] 124 | impl russh::client::Handler for ClientHandle { 125 | type Error = anyhow::Error; 126 | 127 | fn auth_banner( 128 | &mut self, 129 | banner: &str, 130 | _session: &mut Session, 131 | ) -> impl Future> + Send { 132 | let auth_banner = self.auth_banner.take(); 133 | let banner = banner.to_owned(); 134 | async move { 135 | if let Some(on_auth_banner) = auth_banner { 136 | on_auth_banner.call(Ok(banner), ThreadsafeFunctionCallMode::NonBlocking); 137 | }; 138 | Ok(()) 139 | } 140 | } 141 | 142 | fn check_server_key( 143 | &mut self, 144 | server_public_key: &RusshPublicKey, 145 | ) -> impl Future> + Send { 146 | // if `auth_banner` isn't called, drop the callback 147 | // or it will prevent the Node.js process to exit before GC 148 | if self.auth_banner.is_some() { 149 | drop(self.auth_banner.take()); 150 | } 151 | let check = self.check_server_key.take(); 152 | let server_public_key = server_public_key.clone(); 153 | async move { 154 | if let Some(check) = check { 155 | let check_result = check 156 | .call_async(Ok(PublicKey::new(server_public_key))) 157 | .await?; 158 | match check_result { 159 | Either3::A(a) => Ok(a), 160 | Either3::B(b) => { 161 | let result = b.await?; 162 | Ok(result) 163 | } 164 | Either3::C(_) => Ok(false), 165 | } 166 | } else { 167 | Ok(true) 168 | } 169 | } 170 | } 171 | } 172 | 173 | #[cfg(unix)] 174 | type SshAgentClient = AgentClient; 175 | #[cfg(windows)] 176 | type SshAgentClient = AgentClient; 177 | 178 | #[napi] 179 | pub struct Client { 180 | handle: client::Handle, 181 | _agent: SshAgentClient, 182 | } 183 | 184 | #[napi] 185 | pub async fn connect(addr: String, mut config: Option) -> Result { 186 | let client_config: client::Config = config 187 | .as_mut() 188 | .and_then(|c| c.client.take()) 189 | .map(|c| c.into()) 190 | .unwrap_or_default(); 191 | let check_server_key = config.as_mut().and_then(|c| c.check_server_key.take()); 192 | let auth_banner = config.as_mut().and_then(|c| c.auth_banner.take()); 193 | #[cfg(unix)] 194 | let agent = AgentClient::connect_env().await.into_error()?; 195 | #[cfg(windows)] 196 | let agent = AgentClient::connect_pageant().await; 197 | let handle = client::connect( 198 | Arc::new(client_config), 199 | addr, 200 | ClientHandle { 201 | check_server_key, 202 | auth_banner, 203 | }, 204 | ) 205 | .await?; 206 | Ok(Client::new(handle, agent)) 207 | } 208 | 209 | #[napi] 210 | impl Client { 211 | pub fn new(handle: client::Handle, agent: SshAgentClient) -> Self { 212 | Self { 213 | handle, 214 | _agent: agent, 215 | } 216 | } 217 | 218 | #[napi] 219 | pub fn is_closed(&self) -> bool { 220 | self.handle.is_closed() 221 | } 222 | 223 | #[napi] 224 | /// # Safety 225 | /// 226 | /// close can not be called concurrently. 227 | pub async unsafe fn authenticate_password( 228 | &mut self, 229 | user: String, 230 | password: String, 231 | ) -> Result { 232 | let auth_result = self 233 | .handle 234 | .authenticate_password(user, password) 235 | .await 236 | .into_error()?; 237 | Ok(matches!(auth_result, AuthResult::Success)) 238 | } 239 | 240 | #[napi] 241 | /// # Safety 242 | /// 243 | /// Perform public key-based SSH authentication. 244 | /// The key can be omitted to use the default private key. 245 | /// The key can be a path to a private key file. 246 | pub async unsafe fn authenticate_key_pair( 247 | &mut self, 248 | user: String, 249 | key: Either3, 250 | ) -> Result { 251 | let keypair = match key { 252 | Either3::A(path) => load_secret_key(path, None) 253 | .map_err(|err| Error::new(Status::GenericFailure, format!("{err}")))?, 254 | Either3::B(keypair) => keypair.inner.clone(), 255 | Either3::C(_) => { 256 | let path = { 257 | dirs::home_dir() 258 | .ok_or_else(|| { 259 | Error::new(Status::GenericFailure, "No home directory found".to_owned()) 260 | })? 261 | .join({ 262 | #[cfg(windows)] 263 | { 264 | "ssh" 265 | } 266 | #[cfg(not(windows))] 267 | { 268 | ".ssh" 269 | } 270 | }) 271 | .join("id_rsa") 272 | }; 273 | load_secret_key(path, None) 274 | .map_err(|err| Error::new(Status::GenericFailure, format!("{err}")))? 275 | } 276 | }; 277 | let auth_result = self 278 | .handle 279 | .authenticate_publickey( 280 | user, 281 | russh::keys::PrivateKeyWithHashAlg::new(Arc::new(keypair), None), 282 | ) 283 | .await 284 | .into_error()?; 285 | Ok(matches!(auth_result, AuthResult::Success)) 286 | } 287 | 288 | #[napi] 289 | /// # Safety 290 | /// 291 | /// exec can not be called concurrently. 292 | /// The caller in Node.js must ensure that. 293 | pub async unsafe fn exec(&mut self, command: String) -> Result { 294 | let mut channel = self.handle.channel_open_session().await.into_error()?; 295 | channel.exec(true, command).await.into_error()?; 296 | let mut output = Vec::new(); 297 | let mut status = 0; 298 | while let Some(msg) = channel.wait().await { 299 | match msg { 300 | russh::ChannelMsg::Data { ref data } => { 301 | output.write_all(data).await?; 302 | } 303 | russh::ChannelMsg::ExitStatus { exit_status } => { 304 | status = exit_status; 305 | } 306 | _ => {} 307 | } 308 | } 309 | Ok(ExecOutput { 310 | status, 311 | output: output.into(), 312 | }) 313 | } 314 | 315 | #[napi] 316 | pub async fn disconnect( 317 | &self, 318 | reason: DisconnectReason, 319 | description: String, 320 | language_tag: String, 321 | ) -> Result<()> { 322 | self 323 | .handle 324 | .disconnect(reason.into(), &description, &language_tag) 325 | .await 326 | .map_err(|err| Error::new(Status::GenericFailure, format!("Disconnect failed: {err}")))?; 327 | Ok(()) 328 | } 329 | } 330 | 331 | /// A reason for disconnection. 332 | #[napi] 333 | pub enum DisconnectReason { 334 | HostNotAllowedToConnect = 1, 335 | ProtocolError = 2, 336 | KeyExchangeFailed = 3, 337 | #[doc(hidden)] 338 | Reserved = 4, 339 | MACError = 5, 340 | CompressionError = 6, 341 | ServiceNotAvailable = 7, 342 | ProtocolVersionNotSupported = 8, 343 | HostKeyNotVerifiable = 9, 344 | ConnectionLost = 10, 345 | ByApplication = 11, 346 | TooManyConnections = 12, 347 | AuthCancelledByUser = 13, 348 | NoMoreAuthMethodsAvailable = 14, 349 | IllegalUserName = 15, 350 | } 351 | 352 | impl From for russh::Disconnect { 353 | fn from(value: DisconnectReason) -> Self { 354 | match value { 355 | DisconnectReason::HostNotAllowedToConnect => Self::HostNotAllowedToConnect, 356 | DisconnectReason::ProtocolError => Self::ProtocolError, 357 | DisconnectReason::KeyExchangeFailed => Self::KeyExchangeFailed, 358 | DisconnectReason::Reserved => Self::Reserved, 359 | DisconnectReason::MACError => Self::MACError, 360 | DisconnectReason::CompressionError => Self::CompressionError, 361 | DisconnectReason::ServiceNotAvailable => Self::ServiceNotAvailable, 362 | DisconnectReason::ProtocolVersionNotSupported => Self::ProtocolVersionNotSupported, 363 | DisconnectReason::HostKeyNotVerifiable => Self::HostKeyNotVerifiable, 364 | DisconnectReason::ConnectionLost => Self::ConnectionLost, 365 | DisconnectReason::ByApplication => Self::ByApplication, 366 | DisconnectReason::TooManyConnections => Self::TooManyConnections, 367 | DisconnectReason::AuthCancelledByUser => Self::AuthCancelledByUser, 368 | DisconnectReason::NoMoreAuthMethodsAvailable => Self::NoMoreAuthMethodsAvailable, 369 | DisconnectReason::IllegalUserName => Self::IllegalUserName, 370 | } 371 | } 372 | } 373 | 374 | #[napi(object)] 375 | pub struct ExecOutput { 376 | pub status: u32, 377 | pub output: Buffer, 378 | } 379 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // prettier-ignore 2 | /* eslint-disable */ 3 | // @ts-nocheck 4 | /* auto-generated by NAPI-RS */ 5 | 6 | const { readFileSync } = require('node:fs') 7 | let nativeBinding = null 8 | const loadErrors = [] 9 | 10 | const isMusl = () => { 11 | let musl = false 12 | if (process.platform === 'linux') { 13 | musl = isMuslFromFilesystem() 14 | if (musl === null) { 15 | musl = isMuslFromReport() 16 | } 17 | if (musl === null) { 18 | musl = isMuslFromChildProcess() 19 | } 20 | } 21 | return musl 22 | } 23 | 24 | const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-') 25 | 26 | const isMuslFromFilesystem = () => { 27 | try { 28 | return readFileSync('/usr/bin/ldd', 'utf-8').includes('musl') 29 | } catch { 30 | return null 31 | } 32 | } 33 | 34 | const isMuslFromReport = () => { 35 | let report = null 36 | if (typeof process.report?.getReport === 'function') { 37 | process.report.excludeNetwork = true 38 | report = process.report.getReport() 39 | } 40 | if (!report) { 41 | return null 42 | } 43 | if (report.header && report.header.glibcVersionRuntime) { 44 | return false 45 | } 46 | if (Array.isArray(report.sharedObjects)) { 47 | if (report.sharedObjects.some(isFileMusl)) { 48 | return true 49 | } 50 | } 51 | return false 52 | } 53 | 54 | const isMuslFromChildProcess = () => { 55 | try { 56 | return require('child_process').execSync('ldd --version', { encoding: 'utf8' }).includes('musl') 57 | } catch (e) { 58 | // If we reach this case, we don't know if the system is musl or not, so is better to just fallback to false 59 | return false 60 | } 61 | } 62 | 63 | function requireNative() { 64 | if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) { 65 | try { 66 | return require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH); 67 | } catch (err) { 68 | loadErrors.push(err) 69 | } 70 | } else if (process.platform === 'android') { 71 | if (process.arch === 'arm64') { 72 | try { 73 | return require('./ssh.android-arm64.node') 74 | } catch (e) { 75 | loadErrors.push(e) 76 | } 77 | try { 78 | const binding = require('@napi-rs/ssh-android-arm64') 79 | const bindingPackageVersion = require('@napi-rs/ssh-android-arm64/package.json').version 80 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 81 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 82 | } 83 | return binding 84 | } catch (e) { 85 | loadErrors.push(e) 86 | } 87 | } else if (process.arch === 'arm') { 88 | try { 89 | return require('./ssh.android-arm-eabi.node') 90 | } catch (e) { 91 | loadErrors.push(e) 92 | } 93 | try { 94 | const binding = require('@napi-rs/ssh-android-arm-eabi') 95 | const bindingPackageVersion = require('@napi-rs/ssh-android-arm-eabi/package.json').version 96 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 97 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 98 | } 99 | return binding 100 | } catch (e) { 101 | loadErrors.push(e) 102 | } 103 | } else { 104 | loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`)) 105 | } 106 | } else if (process.platform === 'win32') { 107 | if (process.arch === 'x64') { 108 | if (process.config?.variables?.shlib_suffix === 'dll.a' || process.config?.variables?.node_target_type === 'shared_library') { 109 | try { 110 | return require('./ssh.win32-x64-gnu.node') 111 | } catch (e) { 112 | loadErrors.push(e) 113 | } 114 | try { 115 | const binding = require('@napi-rs/ssh-win32-x64-gnu') 116 | const bindingPackageVersion = require('@napi-rs/ssh-win32-x64-gnu/package.json').version 117 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 118 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 119 | } 120 | return binding 121 | } catch (e) { 122 | loadErrors.push(e) 123 | } 124 | } else { 125 | try { 126 | return require('./ssh.win32-x64-msvc.node') 127 | } catch (e) { 128 | loadErrors.push(e) 129 | } 130 | try { 131 | const binding = require('@napi-rs/ssh-win32-x64-msvc') 132 | const bindingPackageVersion = require('@napi-rs/ssh-win32-x64-msvc/package.json').version 133 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 134 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 135 | } 136 | return binding 137 | } catch (e) { 138 | loadErrors.push(e) 139 | } 140 | } 141 | } else if (process.arch === 'ia32') { 142 | try { 143 | return require('./ssh.win32-ia32-msvc.node') 144 | } catch (e) { 145 | loadErrors.push(e) 146 | } 147 | try { 148 | const binding = require('@napi-rs/ssh-win32-ia32-msvc') 149 | const bindingPackageVersion = require('@napi-rs/ssh-win32-ia32-msvc/package.json').version 150 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 151 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 152 | } 153 | return binding 154 | } catch (e) { 155 | loadErrors.push(e) 156 | } 157 | } else if (process.arch === 'arm64') { 158 | try { 159 | return require('./ssh.win32-arm64-msvc.node') 160 | } catch (e) { 161 | loadErrors.push(e) 162 | } 163 | try { 164 | const binding = require('@napi-rs/ssh-win32-arm64-msvc') 165 | const bindingPackageVersion = require('@napi-rs/ssh-win32-arm64-msvc/package.json').version 166 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 167 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 168 | } 169 | return binding 170 | } catch (e) { 171 | loadErrors.push(e) 172 | } 173 | } else { 174 | loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`)) 175 | } 176 | } else if (process.platform === 'darwin') { 177 | try { 178 | return require('./ssh.darwin-universal.node') 179 | } catch (e) { 180 | loadErrors.push(e) 181 | } 182 | try { 183 | const binding = require('@napi-rs/ssh-darwin-universal') 184 | const bindingPackageVersion = require('@napi-rs/ssh-darwin-universal/package.json').version 185 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 186 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 187 | } 188 | return binding 189 | } catch (e) { 190 | loadErrors.push(e) 191 | } 192 | if (process.arch === 'x64') { 193 | try { 194 | return require('./ssh.darwin-x64.node') 195 | } catch (e) { 196 | loadErrors.push(e) 197 | } 198 | try { 199 | const binding = require('@napi-rs/ssh-darwin-x64') 200 | const bindingPackageVersion = require('@napi-rs/ssh-darwin-x64/package.json').version 201 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 202 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 203 | } 204 | return binding 205 | } catch (e) { 206 | loadErrors.push(e) 207 | } 208 | } else if (process.arch === 'arm64') { 209 | try { 210 | return require('./ssh.darwin-arm64.node') 211 | } catch (e) { 212 | loadErrors.push(e) 213 | } 214 | try { 215 | const binding = require('@napi-rs/ssh-darwin-arm64') 216 | const bindingPackageVersion = require('@napi-rs/ssh-darwin-arm64/package.json').version 217 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 218 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 219 | } 220 | return binding 221 | } catch (e) { 222 | loadErrors.push(e) 223 | } 224 | } else { 225 | loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`)) 226 | } 227 | } else if (process.platform === 'freebsd') { 228 | if (process.arch === 'x64') { 229 | try { 230 | return require('./ssh.freebsd-x64.node') 231 | } catch (e) { 232 | loadErrors.push(e) 233 | } 234 | try { 235 | const binding = require('@napi-rs/ssh-freebsd-x64') 236 | const bindingPackageVersion = require('@napi-rs/ssh-freebsd-x64/package.json').version 237 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 238 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 239 | } 240 | return binding 241 | } catch (e) { 242 | loadErrors.push(e) 243 | } 244 | } else if (process.arch === 'arm64') { 245 | try { 246 | return require('./ssh.freebsd-arm64.node') 247 | } catch (e) { 248 | loadErrors.push(e) 249 | } 250 | try { 251 | const binding = require('@napi-rs/ssh-freebsd-arm64') 252 | const bindingPackageVersion = require('@napi-rs/ssh-freebsd-arm64/package.json').version 253 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 254 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 255 | } 256 | return binding 257 | } catch (e) { 258 | loadErrors.push(e) 259 | } 260 | } else { 261 | loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`)) 262 | } 263 | } else if (process.platform === 'linux') { 264 | if (process.arch === 'x64') { 265 | if (isMusl()) { 266 | try { 267 | return require('./ssh.linux-x64-musl.node') 268 | } catch (e) { 269 | loadErrors.push(e) 270 | } 271 | try { 272 | const binding = require('@napi-rs/ssh-linux-x64-musl') 273 | const bindingPackageVersion = require('@napi-rs/ssh-linux-x64-musl/package.json').version 274 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 275 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 276 | } 277 | return binding 278 | } catch (e) { 279 | loadErrors.push(e) 280 | } 281 | } else { 282 | try { 283 | return require('./ssh.linux-x64-gnu.node') 284 | } catch (e) { 285 | loadErrors.push(e) 286 | } 287 | try { 288 | const binding = require('@napi-rs/ssh-linux-x64-gnu') 289 | const bindingPackageVersion = require('@napi-rs/ssh-linux-x64-gnu/package.json').version 290 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 291 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 292 | } 293 | return binding 294 | } catch (e) { 295 | loadErrors.push(e) 296 | } 297 | } 298 | } else if (process.arch === 'arm64') { 299 | if (isMusl()) { 300 | try { 301 | return require('./ssh.linux-arm64-musl.node') 302 | } catch (e) { 303 | loadErrors.push(e) 304 | } 305 | try { 306 | const binding = require('@napi-rs/ssh-linux-arm64-musl') 307 | const bindingPackageVersion = require('@napi-rs/ssh-linux-arm64-musl/package.json').version 308 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 309 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 310 | } 311 | return binding 312 | } catch (e) { 313 | loadErrors.push(e) 314 | } 315 | } else { 316 | try { 317 | return require('./ssh.linux-arm64-gnu.node') 318 | } catch (e) { 319 | loadErrors.push(e) 320 | } 321 | try { 322 | const binding = require('@napi-rs/ssh-linux-arm64-gnu') 323 | const bindingPackageVersion = require('@napi-rs/ssh-linux-arm64-gnu/package.json').version 324 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 325 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 326 | } 327 | return binding 328 | } catch (e) { 329 | loadErrors.push(e) 330 | } 331 | } 332 | } else if (process.arch === 'arm') { 333 | if (isMusl()) { 334 | try { 335 | return require('./ssh.linux-arm-musleabihf.node') 336 | } catch (e) { 337 | loadErrors.push(e) 338 | } 339 | try { 340 | const binding = require('@napi-rs/ssh-linux-arm-musleabihf') 341 | const bindingPackageVersion = require('@napi-rs/ssh-linux-arm-musleabihf/package.json').version 342 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 343 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 344 | } 345 | return binding 346 | } catch (e) { 347 | loadErrors.push(e) 348 | } 349 | } else { 350 | try { 351 | return require('./ssh.linux-arm-gnueabihf.node') 352 | } catch (e) { 353 | loadErrors.push(e) 354 | } 355 | try { 356 | const binding = require('@napi-rs/ssh-linux-arm-gnueabihf') 357 | const bindingPackageVersion = require('@napi-rs/ssh-linux-arm-gnueabihf/package.json').version 358 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 359 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 360 | } 361 | return binding 362 | } catch (e) { 363 | loadErrors.push(e) 364 | } 365 | } 366 | } else if (process.arch === 'loong64') { 367 | if (isMusl()) { 368 | try { 369 | return require('./ssh.linux-loong64-musl.node') 370 | } catch (e) { 371 | loadErrors.push(e) 372 | } 373 | try { 374 | const binding = require('@napi-rs/ssh-linux-loong64-musl') 375 | const bindingPackageVersion = require('@napi-rs/ssh-linux-loong64-musl/package.json').version 376 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 377 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 378 | } 379 | return binding 380 | } catch (e) { 381 | loadErrors.push(e) 382 | } 383 | } else { 384 | try { 385 | return require('./ssh.linux-loong64-gnu.node') 386 | } catch (e) { 387 | loadErrors.push(e) 388 | } 389 | try { 390 | const binding = require('@napi-rs/ssh-linux-loong64-gnu') 391 | const bindingPackageVersion = require('@napi-rs/ssh-linux-loong64-gnu/package.json').version 392 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 393 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 394 | } 395 | return binding 396 | } catch (e) { 397 | loadErrors.push(e) 398 | } 399 | } 400 | } else if (process.arch === 'riscv64') { 401 | if (isMusl()) { 402 | try { 403 | return require('./ssh.linux-riscv64-musl.node') 404 | } catch (e) { 405 | loadErrors.push(e) 406 | } 407 | try { 408 | const binding = require('@napi-rs/ssh-linux-riscv64-musl') 409 | const bindingPackageVersion = require('@napi-rs/ssh-linux-riscv64-musl/package.json').version 410 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 411 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 412 | } 413 | return binding 414 | } catch (e) { 415 | loadErrors.push(e) 416 | } 417 | } else { 418 | try { 419 | return require('./ssh.linux-riscv64-gnu.node') 420 | } catch (e) { 421 | loadErrors.push(e) 422 | } 423 | try { 424 | const binding = require('@napi-rs/ssh-linux-riscv64-gnu') 425 | const bindingPackageVersion = require('@napi-rs/ssh-linux-riscv64-gnu/package.json').version 426 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 427 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 428 | } 429 | return binding 430 | } catch (e) { 431 | loadErrors.push(e) 432 | } 433 | } 434 | } else if (process.arch === 'ppc64') { 435 | try { 436 | return require('./ssh.linux-ppc64-gnu.node') 437 | } catch (e) { 438 | loadErrors.push(e) 439 | } 440 | try { 441 | const binding = require('@napi-rs/ssh-linux-ppc64-gnu') 442 | const bindingPackageVersion = require('@napi-rs/ssh-linux-ppc64-gnu/package.json').version 443 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 444 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 445 | } 446 | return binding 447 | } catch (e) { 448 | loadErrors.push(e) 449 | } 450 | } else if (process.arch === 's390x') { 451 | try { 452 | return require('./ssh.linux-s390x-gnu.node') 453 | } catch (e) { 454 | loadErrors.push(e) 455 | } 456 | try { 457 | const binding = require('@napi-rs/ssh-linux-s390x-gnu') 458 | const bindingPackageVersion = require('@napi-rs/ssh-linux-s390x-gnu/package.json').version 459 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 460 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 461 | } 462 | return binding 463 | } catch (e) { 464 | loadErrors.push(e) 465 | } 466 | } else { 467 | loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`)) 468 | } 469 | } else if (process.platform === 'openharmony') { 470 | if (process.arch === 'arm64') { 471 | try { 472 | return require('./ssh.openharmony-arm64.node') 473 | } catch (e) { 474 | loadErrors.push(e) 475 | } 476 | try { 477 | const binding = require('@napi-rs/ssh-openharmony-arm64') 478 | const bindingPackageVersion = require('@napi-rs/ssh-openharmony-arm64/package.json').version 479 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 480 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 481 | } 482 | return binding 483 | } catch (e) { 484 | loadErrors.push(e) 485 | } 486 | } else if (process.arch === 'x64') { 487 | try { 488 | return require('./ssh.openharmony-x64.node') 489 | } catch (e) { 490 | loadErrors.push(e) 491 | } 492 | try { 493 | const binding = require('@napi-rs/ssh-openharmony-x64') 494 | const bindingPackageVersion = require('@napi-rs/ssh-openharmony-x64/package.json').version 495 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 496 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 497 | } 498 | return binding 499 | } catch (e) { 500 | loadErrors.push(e) 501 | } 502 | } else if (process.arch === 'arm') { 503 | try { 504 | return require('./ssh.openharmony-arm.node') 505 | } catch (e) { 506 | loadErrors.push(e) 507 | } 508 | try { 509 | const binding = require('@napi-rs/ssh-openharmony-arm') 510 | const bindingPackageVersion = require('@napi-rs/ssh-openharmony-arm/package.json').version 511 | if (bindingPackageVersion !== '0.0.1' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') { 512 | throw new Error(`Native binding package version mismatch, expected 0.0.1 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`) 513 | } 514 | return binding 515 | } catch (e) { 516 | loadErrors.push(e) 517 | } 518 | } else { 519 | loadErrors.push(new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`)) 520 | } 521 | } else { 522 | loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`)) 523 | } 524 | } 525 | 526 | nativeBinding = requireNative() 527 | 528 | if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) { 529 | let wasiBinding = null 530 | let wasiBindingError = null 531 | try { 532 | wasiBinding = require('./ssh.wasi.cjs') 533 | nativeBinding = wasiBinding 534 | } catch (err) { 535 | if (process.env.NAPI_RS_FORCE_WASI) { 536 | wasiBindingError = err 537 | } 538 | } 539 | if (!nativeBinding) { 540 | try { 541 | wasiBinding = require('@napi-rs/ssh-wasm32-wasi') 542 | nativeBinding = wasiBinding 543 | } catch (err) { 544 | if (process.env.NAPI_RS_FORCE_WASI) { 545 | wasiBindingError.cause = err 546 | loadErrors.push(err) 547 | } 548 | } 549 | } 550 | if (process.env.NAPI_RS_FORCE_WASI === 'error' && !wasiBinding) { 551 | const error = new Error('WASI binding not found and NAPI_RS_FORCE_WASI is set to error') 552 | error.cause = wasiBindingError 553 | throw error 554 | } 555 | } 556 | 557 | if (!nativeBinding) { 558 | if (loadErrors.length > 0) { 559 | throw new Error( 560 | `Cannot find native binding. ` + 561 | `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` + 562 | 'Please try `npm i` again after removing both package-lock.json and node_modules directory.', 563 | { 564 | cause: loadErrors.reduce((err, cur) => { 565 | cur.cause = err 566 | return cur 567 | }), 568 | }, 569 | ) 570 | } 571 | throw new Error(`Failed to load native binding`) 572 | } 573 | 574 | module.exports = nativeBinding 575 | module.exports.Client = nativeBinding.Client 576 | module.exports.KeyPair = nativeBinding.KeyPair 577 | module.exports.PublicKey = nativeBinding.PublicKey 578 | module.exports.Signature = nativeBinding.Signature 579 | module.exports.checkKnownHosts = nativeBinding.checkKnownHosts 580 | module.exports.ClientIdType = nativeBinding.ClientIdType 581 | module.exports.connect = nativeBinding.connect 582 | module.exports.DisconnectReason = nativeBinding.DisconnectReason 583 | module.exports.learnKnownHosts = nativeBinding.learnKnownHosts 584 | module.exports.SignatureHash = nativeBinding.SignatureHash 585 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # This file is generated by running "yarn install" inside your project. 2 | # Manual changes might be lost - proceed with caution! 3 | 4 | __metadata: 5 | version: 8 6 | cacheKey: 10c0 7 | 8 | "@emnapi/core@npm:^1.5.0": 9 | version: 1.6.0 10 | resolution: "@emnapi/core@npm:1.6.0" 11 | dependencies: 12 | "@emnapi/wasi-threads": "npm:1.1.0" 13 | tslib: "npm:^2.4.0" 14 | checksum: 10c0/40e384f39104a9f8260e671c0110f8618961afc564afb2e626af79175717a8b5e2d8b2ae3d30194d318a71247e0fc833601666233adfeb244c46cadc06c58a51 15 | languageName: node 16 | linkType: hard 17 | 18 | "@emnapi/runtime@npm:^1.5.0": 19 | version: 1.6.0 20 | resolution: "@emnapi/runtime@npm:1.6.0" 21 | dependencies: 22 | tslib: "npm:^2.4.0" 23 | checksum: 10c0/e3d2452a8fb83bb59fe60dfcf4cff99f9680c13c07dff8ad28639ccc8790151841ef626a67014bde132939bad73dfacc440ade8c3db2ab12693ea9c8ba4d37fb 24 | languageName: node 25 | linkType: hard 26 | 27 | "@emnapi/wasi-threads@npm:1.1.0": 28 | version: 1.1.0 29 | resolution: "@emnapi/wasi-threads@npm:1.1.0" 30 | dependencies: 31 | tslib: "npm:^2.4.0" 32 | checksum: 10c0/e6d54bf2b1e64cdd83d2916411e44e579b6ae35d5def0dea61a3c452d9921373044dff32a8b8473ae60c80692bdc39323e98b96a3f3d87ba6886b24dd0ef7ca1 33 | languageName: node 34 | linkType: hard 35 | 36 | "@inquirer/ansi@npm:^1.0.1": 37 | version: 1.0.1 38 | resolution: "@inquirer/ansi@npm:1.0.1" 39 | checksum: 10c0/b0da2f25bbbe197946e717603f95ad0eacb098fcab1c9296cdf21f7c68fca830f589bf3e1b6803ada8dae8ce5e67fd7bb0e00909185e905333a84daacb81b473 40 | languageName: node 41 | linkType: hard 42 | 43 | "@inquirer/checkbox@npm:^4.3.0": 44 | version: 4.3.0 45 | resolution: "@inquirer/checkbox@npm:4.3.0" 46 | dependencies: 47 | "@inquirer/ansi": "npm:^1.0.1" 48 | "@inquirer/core": "npm:^10.3.0" 49 | "@inquirer/figures": "npm:^1.0.14" 50 | "@inquirer/type": "npm:^3.0.9" 51 | yoctocolors-cjs: "npm:^2.1.2" 52 | peerDependencies: 53 | "@types/node": ">=18" 54 | peerDependenciesMeta: 55 | "@types/node": 56 | optional: true 57 | checksum: 10c0/d17b72063bf7b9b24a9bba530d6e1b553b8b8d84b9c221cec33480dfb11000554e041d9d1467248926844a91efd6cd07e753d1954ea9f80f2546543ae80161ff 58 | languageName: node 59 | linkType: hard 60 | 61 | "@inquirer/confirm@npm:^5.1.19": 62 | version: 5.1.19 63 | resolution: "@inquirer/confirm@npm:5.1.19" 64 | dependencies: 65 | "@inquirer/core": "npm:^10.3.0" 66 | "@inquirer/type": "npm:^3.0.9" 67 | peerDependencies: 68 | "@types/node": ">=18" 69 | peerDependenciesMeta: 70 | "@types/node": 71 | optional: true 72 | checksum: 10c0/bfd6a6caf8192d8d1a815ddfeae46629369477e1b3bf7092b7ba2706b1285c8760d7ad86e7b2e68a5fa49d8735b83a50642b21026e8fe284ffc5d2b36666fab7 73 | languageName: node 74 | linkType: hard 75 | 76 | "@inquirer/core@npm:^10.3.0": 77 | version: 10.3.0 78 | resolution: "@inquirer/core@npm:10.3.0" 79 | dependencies: 80 | "@inquirer/ansi": "npm:^1.0.1" 81 | "@inquirer/figures": "npm:^1.0.14" 82 | "@inquirer/type": "npm:^3.0.9" 83 | cli-width: "npm:^4.1.0" 84 | mute-stream: "npm:^2.0.0" 85 | signal-exit: "npm:^4.1.0" 86 | wrap-ansi: "npm:^6.2.0" 87 | yoctocolors-cjs: "npm:^2.1.2" 88 | peerDependencies: 89 | "@types/node": ">=18" 90 | peerDependenciesMeta: 91 | "@types/node": 92 | optional: true 93 | checksum: 10c0/174baa46ba9b4239a8e20d01d7ab890fd5d3d535c5473c864b0863d18d56b63a5dd0d657d646c0cb260965f4ed12089484f99d8abeaf0fa0961b619d708d8d7a 94 | languageName: node 95 | linkType: hard 96 | 97 | "@inquirer/editor@npm:^4.2.21": 98 | version: 4.2.21 99 | resolution: "@inquirer/editor@npm:4.2.21" 100 | dependencies: 101 | "@inquirer/core": "npm:^10.3.0" 102 | "@inquirer/external-editor": "npm:^1.0.2" 103 | "@inquirer/type": "npm:^3.0.9" 104 | peerDependencies: 105 | "@types/node": ">=18" 106 | peerDependenciesMeta: 107 | "@types/node": 108 | optional: true 109 | checksum: 10c0/ea3d75b03a8558df424914999970961e3ee78aae84ce5629f172054c83f03aefe03c50ba18be41b11909ebbe97251f8c3aadd0c8264637d4f59b245ac0cf5275 110 | languageName: node 111 | linkType: hard 112 | 113 | "@inquirer/expand@npm:^4.0.21": 114 | version: 4.0.21 115 | resolution: "@inquirer/expand@npm:4.0.21" 116 | dependencies: 117 | "@inquirer/core": "npm:^10.3.0" 118 | "@inquirer/type": "npm:^3.0.9" 119 | yoctocolors-cjs: "npm:^2.1.2" 120 | peerDependencies: 121 | "@types/node": ">=18" 122 | peerDependenciesMeta: 123 | "@types/node": 124 | optional: true 125 | checksum: 10c0/906272572e5ec4accda2eb6ce99265d1507253dae4c0416d45ac5900c012dba642c954fe7bddfd2743a0f921f4232a07a9f9eb291cb4a60a11f0026e07eadffd 126 | languageName: node 127 | linkType: hard 128 | 129 | "@inquirer/external-editor@npm:^1.0.2": 130 | version: 1.0.2 131 | resolution: "@inquirer/external-editor@npm:1.0.2" 132 | dependencies: 133 | chardet: "npm:^2.1.0" 134 | iconv-lite: "npm:^0.7.0" 135 | peerDependencies: 136 | "@types/node": ">=18" 137 | peerDependenciesMeta: 138 | "@types/node": 139 | optional: true 140 | checksum: 10c0/414a3a2a9733459c57452d84ef19ff002222303d19041580685681153132d2a30af8f90f269b3967c30c670fa689dbb7d4fc25a86dc66f029eebe90dc7467b0a 141 | languageName: node 142 | linkType: hard 143 | 144 | "@inquirer/figures@npm:^1.0.14": 145 | version: 1.0.14 146 | resolution: "@inquirer/figures@npm:1.0.14" 147 | checksum: 10c0/e19487d1d54db4ee9de2bd60792fa04c422b81ccfcf8307c8a8d385364c18622373e08a7f124d8c92383ef74edd20c3e3be1d7c2fdf31beccd5819c0d7809532 148 | languageName: node 149 | linkType: hard 150 | 151 | "@inquirer/input@npm:^4.2.5": 152 | version: 4.2.5 153 | resolution: "@inquirer/input@npm:4.2.5" 154 | dependencies: 155 | "@inquirer/core": "npm:^10.3.0" 156 | "@inquirer/type": "npm:^3.0.9" 157 | peerDependencies: 158 | "@types/node": ">=18" 159 | peerDependenciesMeta: 160 | "@types/node": 161 | optional: true 162 | checksum: 10c0/d12e92fde89c400059e614cb4649b5186bd084571958ac226e70a3337954350a565211bb76783daab20854cd1912c6dea4683038183c5bde0dbf126ff5dbc078 163 | languageName: node 164 | linkType: hard 165 | 166 | "@inquirer/number@npm:^3.0.21": 167 | version: 3.0.21 168 | resolution: "@inquirer/number@npm:3.0.21" 169 | dependencies: 170 | "@inquirer/core": "npm:^10.3.0" 171 | "@inquirer/type": "npm:^3.0.9" 172 | peerDependencies: 173 | "@types/node": ">=18" 174 | peerDependenciesMeta: 175 | "@types/node": 176 | optional: true 177 | checksum: 10c0/657209f8760db656f485005d92702f5cc798e64b45daa3f6791206448fe0156997165877a02cfa202c1c877dc361f97f4c993979335f1107f94734ff31b4b774 178 | languageName: node 179 | linkType: hard 180 | 181 | "@inquirer/password@npm:^4.0.21": 182 | version: 4.0.21 183 | resolution: "@inquirer/password@npm:4.0.21" 184 | dependencies: 185 | "@inquirer/ansi": "npm:^1.0.1" 186 | "@inquirer/core": "npm:^10.3.0" 187 | "@inquirer/type": "npm:^3.0.9" 188 | peerDependencies: 189 | "@types/node": ">=18" 190 | peerDependenciesMeta: 191 | "@types/node": 192 | optional: true 193 | checksum: 10c0/0d30c7e500fc611eea8e84db5688159221e1f4e4d8346b85b9d1d0a8b4b1f0bae7ee656bc05eec7cdadc271898a46ac634955c09c8c9605440c27d72d3502d45 194 | languageName: node 195 | linkType: hard 196 | 197 | "@inquirer/prompts@npm:^7.8.4": 198 | version: 7.9.0 199 | resolution: "@inquirer/prompts@npm:7.9.0" 200 | dependencies: 201 | "@inquirer/checkbox": "npm:^4.3.0" 202 | "@inquirer/confirm": "npm:^5.1.19" 203 | "@inquirer/editor": "npm:^4.2.21" 204 | "@inquirer/expand": "npm:^4.0.21" 205 | "@inquirer/input": "npm:^4.2.5" 206 | "@inquirer/number": "npm:^3.0.21" 207 | "@inquirer/password": "npm:^4.0.21" 208 | "@inquirer/rawlist": "npm:^4.1.9" 209 | "@inquirer/search": "npm:^3.2.0" 210 | "@inquirer/select": "npm:^4.4.0" 211 | peerDependencies: 212 | "@types/node": ">=18" 213 | peerDependenciesMeta: 214 | "@types/node": 215 | optional: true 216 | checksum: 10c0/e10a62b75a660a5dd272f322fd366a526393752f183bddbd485806a5cd0efb715917b16d9a6f661c81d13ee8ccd3c96bb663814808806b9ff7539ee46d479d87 217 | languageName: node 218 | linkType: hard 219 | 220 | "@inquirer/rawlist@npm:^4.1.9": 221 | version: 4.1.9 222 | resolution: "@inquirer/rawlist@npm:4.1.9" 223 | dependencies: 224 | "@inquirer/core": "npm:^10.3.0" 225 | "@inquirer/type": "npm:^3.0.9" 226 | yoctocolors-cjs: "npm:^2.1.2" 227 | peerDependencies: 228 | "@types/node": ">=18" 229 | peerDependenciesMeta: 230 | "@types/node": 231 | optional: true 232 | checksum: 10c0/ad7f9fd123b89960d500b1755ab2f6783f5a605ff4aeeb10d6eee765be41debde31b40067d03e814e2c382a198eb0b1c00eb7ebefa13088059b29eeafce7e924 233 | languageName: node 234 | linkType: hard 235 | 236 | "@inquirer/search@npm:^3.2.0": 237 | version: 3.2.0 238 | resolution: "@inquirer/search@npm:3.2.0" 239 | dependencies: 240 | "@inquirer/core": "npm:^10.3.0" 241 | "@inquirer/figures": "npm:^1.0.14" 242 | "@inquirer/type": "npm:^3.0.9" 243 | yoctocolors-cjs: "npm:^2.1.2" 244 | peerDependencies: 245 | "@types/node": ">=18" 246 | peerDependenciesMeta: 247 | "@types/node": 248 | optional: true 249 | checksum: 10c0/623eb5f53984d87a7f66fef73913d3129f09a4d0fb6a311f3020cb3559ad9d006d66c532f99010d1448518be38c9a1fbb5617d906ec9e361c7959bd7360173d9 250 | languageName: node 251 | linkType: hard 252 | 253 | "@inquirer/select@npm:^4.4.0": 254 | version: 4.4.0 255 | resolution: "@inquirer/select@npm:4.4.0" 256 | dependencies: 257 | "@inquirer/ansi": "npm:^1.0.1" 258 | "@inquirer/core": "npm:^10.3.0" 259 | "@inquirer/figures": "npm:^1.0.14" 260 | "@inquirer/type": "npm:^3.0.9" 261 | yoctocolors-cjs: "npm:^2.1.2" 262 | peerDependencies: 263 | "@types/node": ">=18" 264 | peerDependenciesMeta: 265 | "@types/node": 266 | optional: true 267 | checksum: 10c0/9ab3811342f293e49eff60c85117612226c54aebda09db7f2354eabb95df55e02a8a4a674cb3514c12cf7c3dc6df4ef1addc4e41e006f52c17d9cee50208643a 268 | languageName: node 269 | linkType: hard 270 | 271 | "@inquirer/type@npm:^3.0.9": 272 | version: 3.0.9 273 | resolution: "@inquirer/type@npm:3.0.9" 274 | peerDependencies: 275 | "@types/node": ">=18" 276 | peerDependenciesMeta: 277 | "@types/node": 278 | optional: true 279 | checksum: 10c0/bf036f9fac2519e7f710507ef1fab7c1149242a1e6490600fc18498175c0c0bc4a8f121592ab4eeb6b7b5acbc7cc6aedb0ad461bf4a12bc329e49168bbe7b61f 280 | languageName: node 281 | linkType: hard 282 | 283 | "@isaacs/cliui@npm:^8.0.2": 284 | version: 8.0.2 285 | resolution: "@isaacs/cliui@npm:8.0.2" 286 | dependencies: 287 | string-width: "npm:^5.1.2" 288 | string-width-cjs: "npm:string-width@^4.2.0" 289 | strip-ansi: "npm:^7.0.1" 290 | strip-ansi-cjs: "npm:strip-ansi@^6.0.1" 291 | wrap-ansi: "npm:^8.1.0" 292 | wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" 293 | checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e 294 | languageName: node 295 | linkType: hard 296 | 297 | "@isaacs/fs-minipass@npm:^4.0.0": 298 | version: 4.0.1 299 | resolution: "@isaacs/fs-minipass@npm:4.0.1" 300 | dependencies: 301 | minipass: "npm:^7.0.4" 302 | checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 303 | languageName: node 304 | linkType: hard 305 | 306 | "@mapbox/node-pre-gyp@npm:^2.0.0": 307 | version: 2.0.0 308 | resolution: "@mapbox/node-pre-gyp@npm:2.0.0" 309 | dependencies: 310 | consola: "npm:^3.2.3" 311 | detect-libc: "npm:^2.0.0" 312 | https-proxy-agent: "npm:^7.0.5" 313 | node-fetch: "npm:^2.6.7" 314 | nopt: "npm:^8.0.0" 315 | semver: "npm:^7.5.3" 316 | tar: "npm:^7.4.0" 317 | bin: 318 | node-pre-gyp: bin/node-pre-gyp 319 | checksum: 10c0/7d874c7f6f5560a87be7207f28d9a4e53b750085a82167608fd573aab8073645e95b3608f69e244df0e1d24e90a66525aeae708aba82ca73ff668ed0ab6abda6 320 | languageName: node 321 | linkType: hard 322 | 323 | "@napi-rs/cli@npm:^3.4.1": 324 | version: 3.4.1 325 | resolution: "@napi-rs/cli@npm:3.4.1" 326 | dependencies: 327 | "@inquirer/prompts": "npm:^7.8.4" 328 | "@napi-rs/cross-toolchain": "npm:^1.0.3" 329 | "@napi-rs/wasm-tools": "npm:^1.0.1" 330 | "@octokit/rest": "npm:^22.0.0" 331 | clipanion: "npm:^4.0.0-rc.4" 332 | colorette: "npm:^2.0.20" 333 | debug: "npm:^4.4.1" 334 | emnapi: "npm:^1.5.0" 335 | es-toolkit: "npm:^1.39.10" 336 | js-yaml: "npm:^4.1.0" 337 | semver: "npm:^7.7.2" 338 | typanion: "npm:^3.14.0" 339 | peerDependencies: 340 | "@emnapi/runtime": ^1.5.0 341 | peerDependenciesMeta: 342 | "@emnapi/runtime": 343 | optional: true 344 | emnapi: 345 | optional: true 346 | bin: 347 | napi: dist/cli.js 348 | napi-raw: cli.mjs 349 | checksum: 10c0/3071258f0b5767a6dfd5ae7939ba568d59658add40aa6e453aaab0b99a3c2b539f604e1d4fe2b8dba7f035e2ff680edb243eb818f22bd5fcb503aa15a8e4e706 350 | languageName: node 351 | linkType: hard 352 | 353 | "@napi-rs/cross-toolchain@npm:^1.0.3": 354 | version: 1.0.3 355 | resolution: "@napi-rs/cross-toolchain@npm:1.0.3" 356 | dependencies: 357 | "@napi-rs/lzma": "npm:^1.4.5" 358 | "@napi-rs/tar": "npm:^1.1.0" 359 | debug: "npm:^4.4.1" 360 | peerDependencies: 361 | "@napi-rs/cross-toolchain-arm64-target-aarch64": ^1.0.3 362 | "@napi-rs/cross-toolchain-arm64-target-armv7": ^1.0.3 363 | "@napi-rs/cross-toolchain-arm64-target-ppc64le": ^1.0.3 364 | "@napi-rs/cross-toolchain-arm64-target-s390x": ^1.0.3 365 | "@napi-rs/cross-toolchain-arm64-target-x86_64": ^1.0.3 366 | "@napi-rs/cross-toolchain-x64-target-aarch64": ^1.0.3 367 | "@napi-rs/cross-toolchain-x64-target-armv7": ^1.0.3 368 | "@napi-rs/cross-toolchain-x64-target-ppc64le": ^1.0.3 369 | "@napi-rs/cross-toolchain-x64-target-s390x": ^1.0.3 370 | "@napi-rs/cross-toolchain-x64-target-x86_64": ^1.0.3 371 | peerDependenciesMeta: 372 | "@napi-rs/cross-toolchain-arm64-target-aarch64": 373 | optional: true 374 | "@napi-rs/cross-toolchain-arm64-target-armv7": 375 | optional: true 376 | "@napi-rs/cross-toolchain-arm64-target-ppc64le": 377 | optional: true 378 | "@napi-rs/cross-toolchain-arm64-target-s390x": 379 | optional: true 380 | "@napi-rs/cross-toolchain-arm64-target-x86_64": 381 | optional: true 382 | "@napi-rs/cross-toolchain-x64-target-aarch64": 383 | optional: true 384 | "@napi-rs/cross-toolchain-x64-target-armv7": 385 | optional: true 386 | "@napi-rs/cross-toolchain-x64-target-ppc64le": 387 | optional: true 388 | "@napi-rs/cross-toolchain-x64-target-s390x": 389 | optional: true 390 | "@napi-rs/cross-toolchain-x64-target-x86_64": 391 | optional: true 392 | checksum: 10c0/fcc7877c1e47ba6bf4801a4154240d3130703524b1fed17e736126ce58b53960872b9933f8434e3e86b4635e4c7fe881228be0d237210dd96c2087244523750f 393 | languageName: node 394 | linkType: hard 395 | 396 | "@napi-rs/lzma-android-arm-eabi@npm:1.4.5": 397 | version: 1.4.5 398 | resolution: "@napi-rs/lzma-android-arm-eabi@npm:1.4.5" 399 | conditions: os=android & cpu=arm 400 | languageName: node 401 | linkType: hard 402 | 403 | "@napi-rs/lzma-android-arm64@npm:1.4.5": 404 | version: 1.4.5 405 | resolution: "@napi-rs/lzma-android-arm64@npm:1.4.5" 406 | conditions: os=android & cpu=arm64 407 | languageName: node 408 | linkType: hard 409 | 410 | "@napi-rs/lzma-darwin-arm64@npm:1.4.5": 411 | version: 1.4.5 412 | resolution: "@napi-rs/lzma-darwin-arm64@npm:1.4.5" 413 | conditions: os=darwin & cpu=arm64 414 | languageName: node 415 | linkType: hard 416 | 417 | "@napi-rs/lzma-darwin-x64@npm:1.4.5": 418 | version: 1.4.5 419 | resolution: "@napi-rs/lzma-darwin-x64@npm:1.4.5" 420 | conditions: os=darwin & cpu=x64 421 | languageName: node 422 | linkType: hard 423 | 424 | "@napi-rs/lzma-freebsd-x64@npm:1.4.5": 425 | version: 1.4.5 426 | resolution: "@napi-rs/lzma-freebsd-x64@npm:1.4.5" 427 | conditions: os=freebsd & cpu=x64 428 | languageName: node 429 | linkType: hard 430 | 431 | "@napi-rs/lzma-linux-arm-gnueabihf@npm:1.4.5": 432 | version: 1.4.5 433 | resolution: "@napi-rs/lzma-linux-arm-gnueabihf@npm:1.4.5" 434 | conditions: os=linux & cpu=arm 435 | languageName: node 436 | linkType: hard 437 | 438 | "@napi-rs/lzma-linux-arm64-gnu@npm:1.4.5": 439 | version: 1.4.5 440 | resolution: "@napi-rs/lzma-linux-arm64-gnu@npm:1.4.5" 441 | conditions: os=linux & cpu=arm64 & libc=glibc 442 | languageName: node 443 | linkType: hard 444 | 445 | "@napi-rs/lzma-linux-arm64-musl@npm:1.4.5": 446 | version: 1.4.5 447 | resolution: "@napi-rs/lzma-linux-arm64-musl@npm:1.4.5" 448 | conditions: os=linux & cpu=arm64 & libc=musl 449 | languageName: node 450 | linkType: hard 451 | 452 | "@napi-rs/lzma-linux-ppc64-gnu@npm:1.4.5": 453 | version: 1.4.5 454 | resolution: "@napi-rs/lzma-linux-ppc64-gnu@npm:1.4.5" 455 | conditions: os=linux & cpu=ppc64 & libc=glibc 456 | languageName: node 457 | linkType: hard 458 | 459 | "@napi-rs/lzma-linux-riscv64-gnu@npm:1.4.5": 460 | version: 1.4.5 461 | resolution: "@napi-rs/lzma-linux-riscv64-gnu@npm:1.4.5" 462 | conditions: os=linux & cpu=riscv64 & libc=glibc 463 | languageName: node 464 | linkType: hard 465 | 466 | "@napi-rs/lzma-linux-s390x-gnu@npm:1.4.5": 467 | version: 1.4.5 468 | resolution: "@napi-rs/lzma-linux-s390x-gnu@npm:1.4.5" 469 | conditions: os=linux & cpu=s390x & libc=glibc 470 | languageName: node 471 | linkType: hard 472 | 473 | "@napi-rs/lzma-linux-x64-gnu@npm:1.4.5": 474 | version: 1.4.5 475 | resolution: "@napi-rs/lzma-linux-x64-gnu@npm:1.4.5" 476 | conditions: os=linux & cpu=x64 & libc=glibc 477 | languageName: node 478 | linkType: hard 479 | 480 | "@napi-rs/lzma-linux-x64-musl@npm:1.4.5": 481 | version: 1.4.5 482 | resolution: "@napi-rs/lzma-linux-x64-musl@npm:1.4.5" 483 | conditions: os=linux & cpu=x64 & libc=musl 484 | languageName: node 485 | linkType: hard 486 | 487 | "@napi-rs/lzma-wasm32-wasi@npm:1.4.5": 488 | version: 1.4.5 489 | resolution: "@napi-rs/lzma-wasm32-wasi@npm:1.4.5" 490 | dependencies: 491 | "@napi-rs/wasm-runtime": "npm:^1.0.3" 492 | conditions: cpu=wasm32 493 | languageName: node 494 | linkType: hard 495 | 496 | "@napi-rs/lzma-win32-arm64-msvc@npm:1.4.5": 497 | version: 1.4.5 498 | resolution: "@napi-rs/lzma-win32-arm64-msvc@npm:1.4.5" 499 | conditions: os=win32 & cpu=arm64 500 | languageName: node 501 | linkType: hard 502 | 503 | "@napi-rs/lzma-win32-ia32-msvc@npm:1.4.5": 504 | version: 1.4.5 505 | resolution: "@napi-rs/lzma-win32-ia32-msvc@npm:1.4.5" 506 | conditions: os=win32 & cpu=ia32 507 | languageName: node 508 | linkType: hard 509 | 510 | "@napi-rs/lzma-win32-x64-msvc@npm:1.4.5": 511 | version: 1.4.5 512 | resolution: "@napi-rs/lzma-win32-x64-msvc@npm:1.4.5" 513 | conditions: os=win32 & cpu=x64 514 | languageName: node 515 | linkType: hard 516 | 517 | "@napi-rs/lzma@npm:^1.4.5": 518 | version: 1.4.5 519 | resolution: "@napi-rs/lzma@npm:1.4.5" 520 | dependencies: 521 | "@napi-rs/lzma-android-arm-eabi": "npm:1.4.5" 522 | "@napi-rs/lzma-android-arm64": "npm:1.4.5" 523 | "@napi-rs/lzma-darwin-arm64": "npm:1.4.5" 524 | "@napi-rs/lzma-darwin-x64": "npm:1.4.5" 525 | "@napi-rs/lzma-freebsd-x64": "npm:1.4.5" 526 | "@napi-rs/lzma-linux-arm-gnueabihf": "npm:1.4.5" 527 | "@napi-rs/lzma-linux-arm64-gnu": "npm:1.4.5" 528 | "@napi-rs/lzma-linux-arm64-musl": "npm:1.4.5" 529 | "@napi-rs/lzma-linux-ppc64-gnu": "npm:1.4.5" 530 | "@napi-rs/lzma-linux-riscv64-gnu": "npm:1.4.5" 531 | "@napi-rs/lzma-linux-s390x-gnu": "npm:1.4.5" 532 | "@napi-rs/lzma-linux-x64-gnu": "npm:1.4.5" 533 | "@napi-rs/lzma-linux-x64-musl": "npm:1.4.5" 534 | "@napi-rs/lzma-wasm32-wasi": "npm:1.4.5" 535 | "@napi-rs/lzma-win32-arm64-msvc": "npm:1.4.5" 536 | "@napi-rs/lzma-win32-ia32-msvc": "npm:1.4.5" 537 | "@napi-rs/lzma-win32-x64-msvc": "npm:1.4.5" 538 | dependenciesMeta: 539 | "@napi-rs/lzma-android-arm-eabi": 540 | optional: true 541 | "@napi-rs/lzma-android-arm64": 542 | optional: true 543 | "@napi-rs/lzma-darwin-arm64": 544 | optional: true 545 | "@napi-rs/lzma-darwin-x64": 546 | optional: true 547 | "@napi-rs/lzma-freebsd-x64": 548 | optional: true 549 | "@napi-rs/lzma-linux-arm-gnueabihf": 550 | optional: true 551 | "@napi-rs/lzma-linux-arm64-gnu": 552 | optional: true 553 | "@napi-rs/lzma-linux-arm64-musl": 554 | optional: true 555 | "@napi-rs/lzma-linux-ppc64-gnu": 556 | optional: true 557 | "@napi-rs/lzma-linux-riscv64-gnu": 558 | optional: true 559 | "@napi-rs/lzma-linux-s390x-gnu": 560 | optional: true 561 | "@napi-rs/lzma-linux-x64-gnu": 562 | optional: true 563 | "@napi-rs/lzma-linux-x64-musl": 564 | optional: true 565 | "@napi-rs/lzma-wasm32-wasi": 566 | optional: true 567 | "@napi-rs/lzma-win32-arm64-msvc": 568 | optional: true 569 | "@napi-rs/lzma-win32-ia32-msvc": 570 | optional: true 571 | "@napi-rs/lzma-win32-x64-msvc": 572 | optional: true 573 | checksum: 10c0/df098c99f904b54541e3a34feeb5878c98a4abf1ababf1d301d903b99d98402fff5eda49e1dd103bb4bf44a9217a5e1b17fb30b74044416561f8fe02ca098ee3 574 | languageName: node 575 | linkType: hard 576 | 577 | "@napi-rs/ssh@workspace:.": 578 | version: 0.0.0-use.local 579 | resolution: "@napi-rs/ssh@workspace:." 580 | dependencies: 581 | "@napi-rs/cli": "npm:^3.4.1" 582 | "@types/node": "npm:^24.9.2" 583 | ava: "npm:^6.4.1" 584 | languageName: unknown 585 | linkType: soft 586 | 587 | "@napi-rs/tar-android-arm-eabi@npm:1.1.0": 588 | version: 1.1.0 589 | resolution: "@napi-rs/tar-android-arm-eabi@npm:1.1.0" 590 | conditions: os=android & cpu=arm 591 | languageName: node 592 | linkType: hard 593 | 594 | "@napi-rs/tar-android-arm64@npm:1.1.0": 595 | version: 1.1.0 596 | resolution: "@napi-rs/tar-android-arm64@npm:1.1.0" 597 | conditions: os=android & cpu=arm64 598 | languageName: node 599 | linkType: hard 600 | 601 | "@napi-rs/tar-darwin-arm64@npm:1.1.0": 602 | version: 1.1.0 603 | resolution: "@napi-rs/tar-darwin-arm64@npm:1.1.0" 604 | conditions: os=darwin & cpu=arm64 605 | languageName: node 606 | linkType: hard 607 | 608 | "@napi-rs/tar-darwin-x64@npm:1.1.0": 609 | version: 1.1.0 610 | resolution: "@napi-rs/tar-darwin-x64@npm:1.1.0" 611 | conditions: os=darwin & cpu=x64 612 | languageName: node 613 | linkType: hard 614 | 615 | "@napi-rs/tar-freebsd-x64@npm:1.1.0": 616 | version: 1.1.0 617 | resolution: "@napi-rs/tar-freebsd-x64@npm:1.1.0" 618 | conditions: os=freebsd & cpu=x64 619 | languageName: node 620 | linkType: hard 621 | 622 | "@napi-rs/tar-linux-arm-gnueabihf@npm:1.1.0": 623 | version: 1.1.0 624 | resolution: "@napi-rs/tar-linux-arm-gnueabihf@npm:1.1.0" 625 | conditions: os=linux & cpu=arm 626 | languageName: node 627 | linkType: hard 628 | 629 | "@napi-rs/tar-linux-arm64-gnu@npm:1.1.0": 630 | version: 1.1.0 631 | resolution: "@napi-rs/tar-linux-arm64-gnu@npm:1.1.0" 632 | conditions: os=linux & cpu=arm64 & libc=glibc 633 | languageName: node 634 | linkType: hard 635 | 636 | "@napi-rs/tar-linux-arm64-musl@npm:1.1.0": 637 | version: 1.1.0 638 | resolution: "@napi-rs/tar-linux-arm64-musl@npm:1.1.0" 639 | conditions: os=linux & cpu=arm64 & libc=musl 640 | languageName: node 641 | linkType: hard 642 | 643 | "@napi-rs/tar-linux-ppc64-gnu@npm:1.1.0": 644 | version: 1.1.0 645 | resolution: "@napi-rs/tar-linux-ppc64-gnu@npm:1.1.0" 646 | conditions: os=linux & cpu=ppc64 & libc=glibc 647 | languageName: node 648 | linkType: hard 649 | 650 | "@napi-rs/tar-linux-s390x-gnu@npm:1.1.0": 651 | version: 1.1.0 652 | resolution: "@napi-rs/tar-linux-s390x-gnu@npm:1.1.0" 653 | conditions: os=linux & cpu=s390x & libc=glibc 654 | languageName: node 655 | linkType: hard 656 | 657 | "@napi-rs/tar-linux-x64-gnu@npm:1.1.0": 658 | version: 1.1.0 659 | resolution: "@napi-rs/tar-linux-x64-gnu@npm:1.1.0" 660 | conditions: os=linux & cpu=x64 & libc=glibc 661 | languageName: node 662 | linkType: hard 663 | 664 | "@napi-rs/tar-linux-x64-musl@npm:1.1.0": 665 | version: 1.1.0 666 | resolution: "@napi-rs/tar-linux-x64-musl@npm:1.1.0" 667 | conditions: os=linux & cpu=x64 & libc=musl 668 | languageName: node 669 | linkType: hard 670 | 671 | "@napi-rs/tar-wasm32-wasi@npm:1.1.0": 672 | version: 1.1.0 673 | resolution: "@napi-rs/tar-wasm32-wasi@npm:1.1.0" 674 | dependencies: 675 | "@napi-rs/wasm-runtime": "npm:^1.0.3" 676 | conditions: cpu=wasm32 677 | languageName: node 678 | linkType: hard 679 | 680 | "@napi-rs/tar-win32-arm64-msvc@npm:1.1.0": 681 | version: 1.1.0 682 | resolution: "@napi-rs/tar-win32-arm64-msvc@npm:1.1.0" 683 | conditions: os=win32 & cpu=arm64 684 | languageName: node 685 | linkType: hard 686 | 687 | "@napi-rs/tar-win32-ia32-msvc@npm:1.1.0": 688 | version: 1.1.0 689 | resolution: "@napi-rs/tar-win32-ia32-msvc@npm:1.1.0" 690 | conditions: os=win32 & cpu=ia32 691 | languageName: node 692 | linkType: hard 693 | 694 | "@napi-rs/tar-win32-x64-msvc@npm:1.1.0": 695 | version: 1.1.0 696 | resolution: "@napi-rs/tar-win32-x64-msvc@npm:1.1.0" 697 | conditions: os=win32 & cpu=x64 698 | languageName: node 699 | linkType: hard 700 | 701 | "@napi-rs/tar@npm:^1.1.0": 702 | version: 1.1.0 703 | resolution: "@napi-rs/tar@npm:1.1.0" 704 | dependencies: 705 | "@napi-rs/tar-android-arm-eabi": "npm:1.1.0" 706 | "@napi-rs/tar-android-arm64": "npm:1.1.0" 707 | "@napi-rs/tar-darwin-arm64": "npm:1.1.0" 708 | "@napi-rs/tar-darwin-x64": "npm:1.1.0" 709 | "@napi-rs/tar-freebsd-x64": "npm:1.1.0" 710 | "@napi-rs/tar-linux-arm-gnueabihf": "npm:1.1.0" 711 | "@napi-rs/tar-linux-arm64-gnu": "npm:1.1.0" 712 | "@napi-rs/tar-linux-arm64-musl": "npm:1.1.0" 713 | "@napi-rs/tar-linux-ppc64-gnu": "npm:1.1.0" 714 | "@napi-rs/tar-linux-s390x-gnu": "npm:1.1.0" 715 | "@napi-rs/tar-linux-x64-gnu": "npm:1.1.0" 716 | "@napi-rs/tar-linux-x64-musl": "npm:1.1.0" 717 | "@napi-rs/tar-wasm32-wasi": "npm:1.1.0" 718 | "@napi-rs/tar-win32-arm64-msvc": "npm:1.1.0" 719 | "@napi-rs/tar-win32-ia32-msvc": "npm:1.1.0" 720 | "@napi-rs/tar-win32-x64-msvc": "npm:1.1.0" 721 | dependenciesMeta: 722 | "@napi-rs/tar-android-arm-eabi": 723 | optional: true 724 | "@napi-rs/tar-android-arm64": 725 | optional: true 726 | "@napi-rs/tar-darwin-arm64": 727 | optional: true 728 | "@napi-rs/tar-darwin-x64": 729 | optional: true 730 | "@napi-rs/tar-freebsd-x64": 731 | optional: true 732 | "@napi-rs/tar-linux-arm-gnueabihf": 733 | optional: true 734 | "@napi-rs/tar-linux-arm64-gnu": 735 | optional: true 736 | "@napi-rs/tar-linux-arm64-musl": 737 | optional: true 738 | "@napi-rs/tar-linux-ppc64-gnu": 739 | optional: true 740 | "@napi-rs/tar-linux-s390x-gnu": 741 | optional: true 742 | "@napi-rs/tar-linux-x64-gnu": 743 | optional: true 744 | "@napi-rs/tar-linux-x64-musl": 745 | optional: true 746 | "@napi-rs/tar-wasm32-wasi": 747 | optional: true 748 | "@napi-rs/tar-win32-arm64-msvc": 749 | optional: true 750 | "@napi-rs/tar-win32-ia32-msvc": 751 | optional: true 752 | "@napi-rs/tar-win32-x64-msvc": 753 | optional: true 754 | checksum: 10c0/88a0ab081eacfa235266f14a0bc408b7581058b1f7e18b118c6f8e7012cca0dd91c5baf5de84e1d2eb8070386a7380aa4d8dedfc6f81e24ae9d0287ff50ae153 755 | languageName: node 756 | linkType: hard 757 | 758 | "@napi-rs/wasm-runtime@npm:^1.0.3": 759 | version: 1.0.7 760 | resolution: "@napi-rs/wasm-runtime@npm:1.0.7" 761 | dependencies: 762 | "@emnapi/core": "npm:^1.5.0" 763 | "@emnapi/runtime": "npm:^1.5.0" 764 | "@tybys/wasm-util": "npm:^0.10.1" 765 | checksum: 10c0/2d8635498136abb49d6dbf7395b78c63422292240963bf055f307b77aeafbde57ae2c0ceaaef215601531b36d6eb92a2cdd6f5ba90ed2aa8127c27aff9c4ae55 766 | languageName: node 767 | linkType: hard 768 | 769 | "@napi-rs/wasm-tools-android-arm-eabi@npm:1.0.1": 770 | version: 1.0.1 771 | resolution: "@napi-rs/wasm-tools-android-arm-eabi@npm:1.0.1" 772 | conditions: os=android & cpu=arm 773 | languageName: node 774 | linkType: hard 775 | 776 | "@napi-rs/wasm-tools-android-arm64@npm:1.0.1": 777 | version: 1.0.1 778 | resolution: "@napi-rs/wasm-tools-android-arm64@npm:1.0.1" 779 | conditions: os=android & cpu=arm64 780 | languageName: node 781 | linkType: hard 782 | 783 | "@napi-rs/wasm-tools-darwin-arm64@npm:1.0.1": 784 | version: 1.0.1 785 | resolution: "@napi-rs/wasm-tools-darwin-arm64@npm:1.0.1" 786 | conditions: os=darwin & cpu=arm64 787 | languageName: node 788 | linkType: hard 789 | 790 | "@napi-rs/wasm-tools-darwin-x64@npm:1.0.1": 791 | version: 1.0.1 792 | resolution: "@napi-rs/wasm-tools-darwin-x64@npm:1.0.1" 793 | conditions: os=darwin & cpu=x64 794 | languageName: node 795 | linkType: hard 796 | 797 | "@napi-rs/wasm-tools-freebsd-x64@npm:1.0.1": 798 | version: 1.0.1 799 | resolution: "@napi-rs/wasm-tools-freebsd-x64@npm:1.0.1" 800 | conditions: os=freebsd & cpu=x64 801 | languageName: node 802 | linkType: hard 803 | 804 | "@napi-rs/wasm-tools-linux-arm64-gnu@npm:1.0.1": 805 | version: 1.0.1 806 | resolution: "@napi-rs/wasm-tools-linux-arm64-gnu@npm:1.0.1" 807 | conditions: os=linux & cpu=arm64 & libc=glibc 808 | languageName: node 809 | linkType: hard 810 | 811 | "@napi-rs/wasm-tools-linux-arm64-musl@npm:1.0.1": 812 | version: 1.0.1 813 | resolution: "@napi-rs/wasm-tools-linux-arm64-musl@npm:1.0.1" 814 | conditions: os=linux & cpu=arm64 & libc=musl 815 | languageName: node 816 | linkType: hard 817 | 818 | "@napi-rs/wasm-tools-linux-x64-gnu@npm:1.0.1": 819 | version: 1.0.1 820 | resolution: "@napi-rs/wasm-tools-linux-x64-gnu@npm:1.0.1" 821 | conditions: os=linux & cpu=x64 & libc=glibc 822 | languageName: node 823 | linkType: hard 824 | 825 | "@napi-rs/wasm-tools-linux-x64-musl@npm:1.0.1": 826 | version: 1.0.1 827 | resolution: "@napi-rs/wasm-tools-linux-x64-musl@npm:1.0.1" 828 | conditions: os=linux & cpu=x64 & libc=musl 829 | languageName: node 830 | linkType: hard 831 | 832 | "@napi-rs/wasm-tools-wasm32-wasi@npm:1.0.1": 833 | version: 1.0.1 834 | resolution: "@napi-rs/wasm-tools-wasm32-wasi@npm:1.0.1" 835 | dependencies: 836 | "@napi-rs/wasm-runtime": "npm:^1.0.3" 837 | conditions: cpu=wasm32 838 | languageName: node 839 | linkType: hard 840 | 841 | "@napi-rs/wasm-tools-win32-arm64-msvc@npm:1.0.1": 842 | version: 1.0.1 843 | resolution: "@napi-rs/wasm-tools-win32-arm64-msvc@npm:1.0.1" 844 | conditions: os=win32 & cpu=arm64 845 | languageName: node 846 | linkType: hard 847 | 848 | "@napi-rs/wasm-tools-win32-ia32-msvc@npm:1.0.1": 849 | version: 1.0.1 850 | resolution: "@napi-rs/wasm-tools-win32-ia32-msvc@npm:1.0.1" 851 | conditions: os=win32 & cpu=ia32 852 | languageName: node 853 | linkType: hard 854 | 855 | "@napi-rs/wasm-tools-win32-x64-msvc@npm:1.0.1": 856 | version: 1.0.1 857 | resolution: "@napi-rs/wasm-tools-win32-x64-msvc@npm:1.0.1" 858 | conditions: os=win32 & cpu=x64 859 | languageName: node 860 | linkType: hard 861 | 862 | "@napi-rs/wasm-tools@npm:^1.0.1": 863 | version: 1.0.1 864 | resolution: "@napi-rs/wasm-tools@npm:1.0.1" 865 | dependencies: 866 | "@napi-rs/wasm-tools-android-arm-eabi": "npm:1.0.1" 867 | "@napi-rs/wasm-tools-android-arm64": "npm:1.0.1" 868 | "@napi-rs/wasm-tools-darwin-arm64": "npm:1.0.1" 869 | "@napi-rs/wasm-tools-darwin-x64": "npm:1.0.1" 870 | "@napi-rs/wasm-tools-freebsd-x64": "npm:1.0.1" 871 | "@napi-rs/wasm-tools-linux-arm64-gnu": "npm:1.0.1" 872 | "@napi-rs/wasm-tools-linux-arm64-musl": "npm:1.0.1" 873 | "@napi-rs/wasm-tools-linux-x64-gnu": "npm:1.0.1" 874 | "@napi-rs/wasm-tools-linux-x64-musl": "npm:1.0.1" 875 | "@napi-rs/wasm-tools-wasm32-wasi": "npm:1.0.1" 876 | "@napi-rs/wasm-tools-win32-arm64-msvc": "npm:1.0.1" 877 | "@napi-rs/wasm-tools-win32-ia32-msvc": "npm:1.0.1" 878 | "@napi-rs/wasm-tools-win32-x64-msvc": "npm:1.0.1" 879 | dependenciesMeta: 880 | "@napi-rs/wasm-tools-android-arm-eabi": 881 | optional: true 882 | "@napi-rs/wasm-tools-android-arm64": 883 | optional: true 884 | "@napi-rs/wasm-tools-darwin-arm64": 885 | optional: true 886 | "@napi-rs/wasm-tools-darwin-x64": 887 | optional: true 888 | "@napi-rs/wasm-tools-freebsd-x64": 889 | optional: true 890 | "@napi-rs/wasm-tools-linux-arm64-gnu": 891 | optional: true 892 | "@napi-rs/wasm-tools-linux-arm64-musl": 893 | optional: true 894 | "@napi-rs/wasm-tools-linux-x64-gnu": 895 | optional: true 896 | "@napi-rs/wasm-tools-linux-x64-musl": 897 | optional: true 898 | "@napi-rs/wasm-tools-wasm32-wasi": 899 | optional: true 900 | "@napi-rs/wasm-tools-win32-arm64-msvc": 901 | optional: true 902 | "@napi-rs/wasm-tools-win32-ia32-msvc": 903 | optional: true 904 | "@napi-rs/wasm-tools-win32-x64-msvc": 905 | optional: true 906 | checksum: 10c0/bee9258e0b16a2415acc57d9aa281fa50402b38f631aea28e3a8ecd16415cdfffade63313bca777e85c3a73b80cce899ac3dd35eba9104951d7da1eb28913122 907 | languageName: node 908 | linkType: hard 909 | 910 | "@nodelib/fs.scandir@npm:2.1.5": 911 | version: 2.1.5 912 | resolution: "@nodelib/fs.scandir@npm:2.1.5" 913 | dependencies: 914 | "@nodelib/fs.stat": "npm:2.0.5" 915 | run-parallel: "npm:^1.1.9" 916 | checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb 917 | languageName: node 918 | linkType: hard 919 | 920 | "@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": 921 | version: 2.0.5 922 | resolution: "@nodelib/fs.stat@npm:2.0.5" 923 | checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d 924 | languageName: node 925 | linkType: hard 926 | 927 | "@nodelib/fs.walk@npm:^1.2.3": 928 | version: 1.2.8 929 | resolution: "@nodelib/fs.walk@npm:1.2.8" 930 | dependencies: 931 | "@nodelib/fs.scandir": "npm:2.1.5" 932 | fastq: "npm:^1.6.0" 933 | checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 934 | languageName: node 935 | linkType: hard 936 | 937 | "@octokit/auth-token@npm:^6.0.0": 938 | version: 6.0.0 939 | resolution: "@octokit/auth-token@npm:6.0.0" 940 | checksum: 10c0/32ecc904c5f6f4e5d090bfcc679d70318690c0a0b5040cd9a25811ad9dcd44c33f2cf96b6dbee1cd56cf58fde28fb1819c01b58718aa5c971f79c822357cb5c0 941 | languageName: node 942 | linkType: hard 943 | 944 | "@octokit/core@npm:^7.0.2": 945 | version: 7.0.5 946 | resolution: "@octokit/core@npm:7.0.5" 947 | dependencies: 948 | "@octokit/auth-token": "npm:^6.0.0" 949 | "@octokit/graphql": "npm:^9.0.2" 950 | "@octokit/request": "npm:^10.0.4" 951 | "@octokit/request-error": "npm:^7.0.1" 952 | "@octokit/types": "npm:^15.0.0" 953 | before-after-hook: "npm:^4.0.0" 954 | universal-user-agent: "npm:^7.0.0" 955 | checksum: 10c0/09aeba5f9a6b58c4e7cdd59d883a1b787bc32b17fee3b6c73af47e9b8510dc1aa6e2399274e36106ca27485d4e7b2ffda28af306ad4819fa96cd90caecf15ae7 956 | languageName: node 957 | linkType: hard 958 | 959 | "@octokit/endpoint@npm:^11.0.1": 960 | version: 11.0.1 961 | resolution: "@octokit/endpoint@npm:11.0.1" 962 | dependencies: 963 | "@octokit/types": "npm:^15.0.0" 964 | universal-user-agent: "npm:^7.0.2" 965 | checksum: 10c0/a445c42a4cef357f7a181ac1dc5970db7d6c3bb36c81e10dd4032020873d4ec97402f08ebfa6ea747de8edd255ccf19a57cbb66dc4a05e5cff8c0445e29cd73d 966 | languageName: node 967 | linkType: hard 968 | 969 | "@octokit/graphql@npm:^9.0.2": 970 | version: 9.0.2 971 | resolution: "@octokit/graphql@npm:9.0.2" 972 | dependencies: 973 | "@octokit/request": "npm:^10.0.4" 974 | "@octokit/types": "npm:^15.0.0" 975 | universal-user-agent: "npm:^7.0.0" 976 | checksum: 10c0/aaba3de627475ac2be24d676be643c85bec089b1d9ef2c3a678fab03a525c0fd9b6c61622d190e84447ecb6aa9271882f8bcce5c278221337fd4be68d36acf10 977 | languageName: node 978 | linkType: hard 979 | 980 | "@octokit/openapi-types@npm:^26.0.0": 981 | version: 26.0.0 982 | resolution: "@octokit/openapi-types@npm:26.0.0" 983 | checksum: 10c0/671f12c1db70b4bc8c719ec7aa10de034925f4326db0fff22837afcc0b41fd1c015d164673ef5603c5ac787a430c514b821852bfbe6f06edc4a41ad3de342e94 984 | languageName: node 985 | linkType: hard 986 | 987 | "@octokit/plugin-paginate-rest@npm:^13.0.1": 988 | version: 13.2.1 989 | resolution: "@octokit/plugin-paginate-rest@npm:13.2.1" 990 | dependencies: 991 | "@octokit/types": "npm:^15.0.1" 992 | peerDependencies: 993 | "@octokit/core": ">=6" 994 | checksum: 10c0/16cd034ee6426f742514d0ca553a2c4355cd68c2eb9211030f3ec2538f4c833d587b3737bb720e34f98be8fae15acb07693d17314350cf067557abb4cb1598fb 995 | languageName: node 996 | linkType: hard 997 | 998 | "@octokit/plugin-request-log@npm:^6.0.0": 999 | version: 6.0.0 1000 | resolution: "@octokit/plugin-request-log@npm:6.0.0" 1001 | peerDependencies: 1002 | "@octokit/core": ">=6" 1003 | checksum: 10c0/40e46ad0c77235742d0bf698ab4e17df1ae06e0d7824ffc5867ed71e27de860875adb73d89629b823fe8647459a8f262c26ed1aa6ee374873fa94095f37df0bb 1004 | languageName: node 1005 | linkType: hard 1006 | 1007 | "@octokit/plugin-rest-endpoint-methods@npm:^16.0.0": 1008 | version: 16.1.1 1009 | resolution: "@octokit/plugin-rest-endpoint-methods@npm:16.1.1" 1010 | dependencies: 1011 | "@octokit/types": "npm:^15.0.1" 1012 | peerDependencies: 1013 | "@octokit/core": ">=6" 1014 | checksum: 10c0/3d5f2aca5c206a39d55139be32f8a18037a4e6c8b98d905681da7673c9430630e963bca604e1337edccc7a6861f535583b103f2c5af90b5515fd70b7db1bca47 1015 | languageName: node 1016 | linkType: hard 1017 | 1018 | "@octokit/request-error@npm:^7.0.1": 1019 | version: 7.0.1 1020 | resolution: "@octokit/request-error@npm:7.0.1" 1021 | dependencies: 1022 | "@octokit/types": "npm:^15.0.0" 1023 | checksum: 10c0/c3f29db87a8d59b8217cbda8cb32be4a553de21ab08bac7ec5909e7c4a4934a32a07575547049fb11a07f0eeec45d0ae5c38295995445adda4ae17b2c66cba85 1024 | languageName: node 1025 | linkType: hard 1026 | 1027 | "@octokit/request@npm:^10.0.4": 1028 | version: 10.0.5 1029 | resolution: "@octokit/request@npm:10.0.5" 1030 | dependencies: 1031 | "@octokit/endpoint": "npm:^11.0.1" 1032 | "@octokit/request-error": "npm:^7.0.1" 1033 | "@octokit/types": "npm:^15.0.0" 1034 | fast-content-type-parse: "npm:^3.0.0" 1035 | universal-user-agent: "npm:^7.0.2" 1036 | checksum: 10c0/66b607ec97280ce2a857826b7c862a48d81fdafe97c7b6b527ce7bf83b0f6eb706ce3df44eafb57c7ed0ee0b5f255db1c1471ed6d9152b8932e6e88feb845bba 1037 | languageName: node 1038 | linkType: hard 1039 | 1040 | "@octokit/rest@npm:^22.0.0": 1041 | version: 22.0.0 1042 | resolution: "@octokit/rest@npm:22.0.0" 1043 | dependencies: 1044 | "@octokit/core": "npm:^7.0.2" 1045 | "@octokit/plugin-paginate-rest": "npm:^13.0.1" 1046 | "@octokit/plugin-request-log": "npm:^6.0.0" 1047 | "@octokit/plugin-rest-endpoint-methods": "npm:^16.0.0" 1048 | checksum: 10c0/aea3714301f43fbadb22048045a7aef417cdefa997d1baf0b26860eaa9038fb033f7d4299eab06af57a03433871084cf38144fc5414caf80accce714e76d34e2 1049 | languageName: node 1050 | linkType: hard 1051 | 1052 | "@octokit/types@npm:^15.0.0, @octokit/types@npm:^15.0.1": 1053 | version: 15.0.1 1054 | resolution: "@octokit/types@npm:15.0.1" 1055 | dependencies: 1056 | "@octokit/openapi-types": "npm:^26.0.0" 1057 | checksum: 10c0/f1f8d8a988c6295d669461082936a4e27d5a021ff870ebb93b8afa8f227f6eb0fb520f98631af31fc56dea0cb84e15df65e736f408cde321693154e4432c575d 1058 | languageName: node 1059 | linkType: hard 1060 | 1061 | "@pkgjs/parseargs@npm:^0.11.0": 1062 | version: 0.11.0 1063 | resolution: "@pkgjs/parseargs@npm:0.11.0" 1064 | checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd 1065 | languageName: node 1066 | linkType: hard 1067 | 1068 | "@rollup/pluginutils@npm:^5.1.3": 1069 | version: 5.3.0 1070 | resolution: "@rollup/pluginutils@npm:5.3.0" 1071 | dependencies: 1072 | "@types/estree": "npm:^1.0.0" 1073 | estree-walker: "npm:^2.0.2" 1074 | picomatch: "npm:^4.0.2" 1075 | peerDependencies: 1076 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 1077 | peerDependenciesMeta: 1078 | rollup: 1079 | optional: true 1080 | checksum: 10c0/001834bf62d7cf5bac424d2617c113f7f7d3b2bf3c1778cbcccb72cdc957b68989f8e7747c782c2b911f1dde8257f56f8ac1e779e29e74e638e3f1e2cac2bcd0 1081 | languageName: node 1082 | linkType: hard 1083 | 1084 | "@sindresorhus/merge-streams@npm:^2.1.0": 1085 | version: 2.3.0 1086 | resolution: "@sindresorhus/merge-streams@npm:2.3.0" 1087 | checksum: 10c0/69ee906f3125fb2c6bb6ec5cdd84e8827d93b49b3892bce8b62267116cc7e197b5cccf20c160a1d32c26014ecd14470a72a5e3ee37a58f1d6dadc0db1ccf3894 1088 | languageName: node 1089 | linkType: hard 1090 | 1091 | "@tybys/wasm-util@npm:^0.10.1": 1092 | version: 0.10.1 1093 | resolution: "@tybys/wasm-util@npm:0.10.1" 1094 | dependencies: 1095 | tslib: "npm:^2.4.0" 1096 | checksum: 10c0/b255094f293794c6d2289300c5fbcafbb5532a3aed3a5ffd2f8dc1828e639b88d75f6a376dd8f94347a44813fd7a7149d8463477a9a49525c8b2dcaa38c2d1e8 1097 | languageName: node 1098 | linkType: hard 1099 | 1100 | "@types/estree@npm:^1.0.0": 1101 | version: 1.0.8 1102 | resolution: "@types/estree@npm:1.0.8" 1103 | checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 1104 | languageName: node 1105 | linkType: hard 1106 | 1107 | "@types/node@npm:^24.9.2": 1108 | version: 24.9.2 1109 | resolution: "@types/node@npm:24.9.2" 1110 | dependencies: 1111 | undici-types: "npm:~7.16.0" 1112 | checksum: 10c0/7905d43f65cee72ef475fe76316e10bbf6ac5d08a7f0f6c38f2b6285d7ca3009e8fcafc8f8a1d2bf3f55889c9c278dbb203a9081fd0cf2d6d62161703924c6fa 1113 | languageName: node 1114 | linkType: hard 1115 | 1116 | "@vercel/nft@npm:^0.29.4": 1117 | version: 0.29.4 1118 | resolution: "@vercel/nft@npm:0.29.4" 1119 | dependencies: 1120 | "@mapbox/node-pre-gyp": "npm:^2.0.0" 1121 | "@rollup/pluginutils": "npm:^5.1.3" 1122 | acorn: "npm:^8.6.0" 1123 | acorn-import-attributes: "npm:^1.9.5" 1124 | async-sema: "npm:^3.1.1" 1125 | bindings: "npm:^1.4.0" 1126 | estree-walker: "npm:2.0.2" 1127 | glob: "npm:^10.4.5" 1128 | graceful-fs: "npm:^4.2.9" 1129 | node-gyp-build: "npm:^4.2.2" 1130 | picomatch: "npm:^4.0.2" 1131 | resolve-from: "npm:^5.0.0" 1132 | bin: 1133 | nft: out/cli.js 1134 | checksum: 10c0/84ba32c685f9d7c2c849b1e8c963d3b7eb09d122e666143ed97c3776f5b04a4745605e1d29fd81383f72b1d1c0d7d58e39f06dc92f021b5de079dfa4e8523574 1135 | languageName: node 1136 | linkType: hard 1137 | 1138 | "abbrev@npm:^3.0.0": 1139 | version: 3.0.1 1140 | resolution: "abbrev@npm:3.0.1" 1141 | checksum: 10c0/21ba8f574ea57a3106d6d35623f2c4a9111d9ee3e9a5be47baed46ec2457d2eac46e07a5c4a60186f88cb98abbe3e24f2d4cca70bc2b12f1692523e2209a9ccf 1142 | languageName: node 1143 | linkType: hard 1144 | 1145 | "acorn-import-attributes@npm:^1.9.5": 1146 | version: 1.9.5 1147 | resolution: "acorn-import-attributes@npm:1.9.5" 1148 | peerDependencies: 1149 | acorn: ^8 1150 | checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d 1151 | languageName: node 1152 | linkType: hard 1153 | 1154 | "acorn-walk@npm:^8.3.4": 1155 | version: 8.3.4 1156 | resolution: "acorn-walk@npm:8.3.4" 1157 | dependencies: 1158 | acorn: "npm:^8.11.0" 1159 | checksum: 10c0/76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 1160 | languageName: node 1161 | linkType: hard 1162 | 1163 | "acorn@npm:^8.11.0, acorn@npm:^8.15.0, acorn@npm:^8.6.0": 1164 | version: 8.15.0 1165 | resolution: "acorn@npm:8.15.0" 1166 | bin: 1167 | acorn: bin/acorn 1168 | checksum: 10c0/dec73ff59b7d6628a01eebaece7f2bdb8bb62b9b5926dcad0f8931f2b8b79c2be21f6c68ac095592adb5adb15831a3635d9343e6a91d028bbe85d564875ec3ec 1169 | languageName: node 1170 | linkType: hard 1171 | 1172 | "agent-base@npm:^7.1.2": 1173 | version: 7.1.4 1174 | resolution: "agent-base@npm:7.1.4" 1175 | checksum: 10c0/c2c9ab7599692d594b6a161559ada307b7a624fa4c7b03e3afdb5a5e31cd0e53269115b620fcab024c5ac6a6f37fa5eb2e004f076ad30f5f7e6b8b671f7b35fe 1176 | languageName: node 1177 | linkType: hard 1178 | 1179 | "ansi-regex@npm:^5.0.1": 1180 | version: 5.0.1 1181 | resolution: "ansi-regex@npm:5.0.1" 1182 | checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 1183 | languageName: node 1184 | linkType: hard 1185 | 1186 | "ansi-regex@npm:^6.0.1": 1187 | version: 6.2.2 1188 | resolution: "ansi-regex@npm:6.2.2" 1189 | checksum: 10c0/05d4acb1d2f59ab2cf4b794339c7b168890d44dda4bf0ce01152a8da0213aca207802f930442ce8cd22d7a92f44907664aac6508904e75e038fa944d2601b30f 1190 | languageName: node 1191 | linkType: hard 1192 | 1193 | "ansi-styles@npm:^4.0.0": 1194 | version: 4.3.0 1195 | resolution: "ansi-styles@npm:4.3.0" 1196 | dependencies: 1197 | color-convert: "npm:^2.0.1" 1198 | checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 1199 | languageName: node 1200 | linkType: hard 1201 | 1202 | "ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": 1203 | version: 6.2.3 1204 | resolution: "ansi-styles@npm:6.2.3" 1205 | checksum: 10c0/23b8a4ce14e18fb854693b95351e286b771d23d8844057ed2e7d083cd3e708376c3323707ec6a24365f7d7eda3ca00327fe04092e29e551499ec4c8b7bfac868 1206 | languageName: node 1207 | linkType: hard 1208 | 1209 | "argparse@npm:^1.0.7": 1210 | version: 1.0.10 1211 | resolution: "argparse@npm:1.0.10" 1212 | dependencies: 1213 | sprintf-js: "npm:~1.0.2" 1214 | checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de 1215 | languageName: node 1216 | linkType: hard 1217 | 1218 | "argparse@npm:^2.0.1": 1219 | version: 2.0.1 1220 | resolution: "argparse@npm:2.0.1" 1221 | checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e 1222 | languageName: node 1223 | linkType: hard 1224 | 1225 | "array-find-index@npm:^1.0.1": 1226 | version: 1.0.2 1227 | resolution: "array-find-index@npm:1.0.2" 1228 | checksum: 10c0/86b9485c74ddd324feab807e10a6de3f9c1683856267236fac4bb4d4667ada6463e106db3f6c540ae6b720e0442b590ec701d13676df4c6af30ebf4da09b4f57 1229 | languageName: node 1230 | linkType: hard 1231 | 1232 | "arrgv@npm:^1.0.2": 1233 | version: 1.0.2 1234 | resolution: "arrgv@npm:1.0.2" 1235 | checksum: 10c0/7e6e782e6b749923ac7cbc4048ef6fe0844c4a59bfc8932fcd4c44566ba25eed46501f94dd7cf3c7297da88f3f599ca056bfb77d0c2484aebc92f04239f69124 1236 | languageName: node 1237 | linkType: hard 1238 | 1239 | "arrify@npm:^3.0.0": 1240 | version: 3.0.0 1241 | resolution: "arrify@npm:3.0.0" 1242 | checksum: 10c0/2e26601b8486f29780f1f70f7ac05a226755814c2a3ab42e196748f650af1dc310cd575a11dd4b9841c70fd7460b2dd2b8fe6fb7a3375878e2660706efafa58e 1243 | languageName: node 1244 | linkType: hard 1245 | 1246 | "async-sema@npm:^3.1.1": 1247 | version: 3.1.1 1248 | resolution: "async-sema@npm:3.1.1" 1249 | checksum: 10c0/a16da9f7f2dbdd00a969bf264b7ad331b59df3eac2b38f529b881c5cc8662594e68ed096d927ec2aabdc13454379cdc6d677bcdb0a3d2db338fb4be17957832b 1250 | languageName: node 1251 | linkType: hard 1252 | 1253 | "ava@npm:^6.4.1": 1254 | version: 6.4.1 1255 | resolution: "ava@npm:6.4.1" 1256 | dependencies: 1257 | "@vercel/nft": "npm:^0.29.4" 1258 | acorn: "npm:^8.15.0" 1259 | acorn-walk: "npm:^8.3.4" 1260 | ansi-styles: "npm:^6.2.1" 1261 | arrgv: "npm:^1.0.2" 1262 | arrify: "npm:^3.0.0" 1263 | callsites: "npm:^4.2.0" 1264 | cbor: "npm:^10.0.9" 1265 | chalk: "npm:^5.4.1" 1266 | chunkd: "npm:^2.0.1" 1267 | ci-info: "npm:^4.3.0" 1268 | ci-parallel-vars: "npm:^1.0.1" 1269 | cli-truncate: "npm:^4.0.0" 1270 | code-excerpt: "npm:^4.0.0" 1271 | common-path-prefix: "npm:^3.0.0" 1272 | concordance: "npm:^5.0.4" 1273 | currently-unhandled: "npm:^0.4.1" 1274 | debug: "npm:^4.4.1" 1275 | emittery: "npm:^1.2.0" 1276 | figures: "npm:^6.1.0" 1277 | globby: "npm:^14.1.0" 1278 | ignore-by-default: "npm:^2.1.0" 1279 | indent-string: "npm:^5.0.0" 1280 | is-plain-object: "npm:^5.0.0" 1281 | is-promise: "npm:^4.0.0" 1282 | matcher: "npm:^5.0.0" 1283 | memoize: "npm:^10.1.0" 1284 | ms: "npm:^2.1.3" 1285 | p-map: "npm:^7.0.3" 1286 | package-config: "npm:^5.0.0" 1287 | picomatch: "npm:^4.0.2" 1288 | plur: "npm:^5.1.0" 1289 | pretty-ms: "npm:^9.2.0" 1290 | resolve-cwd: "npm:^3.0.0" 1291 | stack-utils: "npm:^2.0.6" 1292 | strip-ansi: "npm:^7.1.0" 1293 | supertap: "npm:^3.0.1" 1294 | temp-dir: "npm:^3.0.0" 1295 | write-file-atomic: "npm:^6.0.0" 1296 | yargs: "npm:^17.7.2" 1297 | peerDependencies: 1298 | "@ava/typescript": "*" 1299 | peerDependenciesMeta: 1300 | "@ava/typescript": 1301 | optional: true 1302 | bin: 1303 | ava: entrypoints/cli.mjs 1304 | checksum: 10c0/21972df1031ef46533ea1b7daa132a5fc66841c8a221b6901163d12d2a1cac39bfd8a6d3459da7eb9344fa90fc02f237f2fe2aac8785d04bf5894fa43625be28 1305 | languageName: node 1306 | linkType: hard 1307 | 1308 | "balanced-match@npm:^1.0.0": 1309 | version: 1.0.2 1310 | resolution: "balanced-match@npm:1.0.2" 1311 | checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee 1312 | languageName: node 1313 | linkType: hard 1314 | 1315 | "before-after-hook@npm:^4.0.0": 1316 | version: 4.0.0 1317 | resolution: "before-after-hook@npm:4.0.0" 1318 | checksum: 10c0/9f8ae8d1b06142bcfb9ef6625226b5e50348bb11210f266660eddcf9734e0db6f9afc4cb48397ee3f5ac0a3728f3ae401cdeea88413f7bed748a71db84657be2 1319 | languageName: node 1320 | linkType: hard 1321 | 1322 | "bindings@npm:^1.4.0": 1323 | version: 1.5.0 1324 | resolution: "bindings@npm:1.5.0" 1325 | dependencies: 1326 | file-uri-to-path: "npm:1.0.0" 1327 | checksum: 10c0/3dab2491b4bb24124252a91e656803eac24292473e56554e35bbfe3cc1875332cfa77600c3bac7564049dc95075bf6fcc63a4609920ff2d64d0fe405fcf0d4ba 1328 | languageName: node 1329 | linkType: hard 1330 | 1331 | "blueimp-md5@npm:^2.10.0": 1332 | version: 2.19.0 1333 | resolution: "blueimp-md5@npm:2.19.0" 1334 | checksum: 10c0/85d04343537dd99a288c62450341dcce7380d3454c81f8e5a971ddd80307d6f9ef51b5b92ad7d48aaaa92fd6d3a1f6b2f4fada068faae646887f7bfabc17a346 1335 | languageName: node 1336 | linkType: hard 1337 | 1338 | "brace-expansion@npm:^2.0.1": 1339 | version: 2.0.2 1340 | resolution: "brace-expansion@npm:2.0.2" 1341 | dependencies: 1342 | balanced-match: "npm:^1.0.0" 1343 | checksum: 10c0/6d117a4c793488af86b83172deb6af143e94c17bc53b0b3cec259733923b4ca84679d506ac261f4ba3c7ed37c46018e2ff442f9ce453af8643ecd64f4a54e6cf 1344 | languageName: node 1345 | linkType: hard 1346 | 1347 | "braces@npm:^3.0.3": 1348 | version: 3.0.3 1349 | resolution: "braces@npm:3.0.3" 1350 | dependencies: 1351 | fill-range: "npm:^7.1.1" 1352 | checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 1353 | languageName: node 1354 | linkType: hard 1355 | 1356 | "callsites@npm:^4.2.0": 1357 | version: 4.2.0 1358 | resolution: "callsites@npm:4.2.0" 1359 | checksum: 10c0/8f7e269ec09fc0946bb22d838a8bc7932e1909ab4a833b964749f4d0e8bdeaa1f253287c4f911f61781f09620b6925ccd19a5ea4897489c4e59442c660c312a3 1360 | languageName: node 1361 | linkType: hard 1362 | 1363 | "cbor@npm:^10.0.9": 1364 | version: 10.0.11 1365 | resolution: "cbor@npm:10.0.11" 1366 | dependencies: 1367 | nofilter: "npm:^3.0.2" 1368 | checksum: 10c0/0cb6fb3d5e98c7af4443200ff107049f6132b5649b8a0e586940ca811e5ab5622bf3d0a36f154f43107acfd9685cc462e6eac77876ef4c060bcec96c71b90d8a 1369 | languageName: node 1370 | linkType: hard 1371 | 1372 | "chalk@npm:^5.4.1": 1373 | version: 5.6.2 1374 | resolution: "chalk@npm:5.6.2" 1375 | checksum: 10c0/99a4b0f0e7991796b1e7e3f52dceb9137cae2a9dfc8fc0784a550dc4c558e15ab32ed70b14b21b52beb2679b4892b41a0aa44249bcb996f01e125d58477c6976 1376 | languageName: node 1377 | linkType: hard 1378 | 1379 | "chardet@npm:^2.1.0": 1380 | version: 2.1.0 1381 | resolution: "chardet@npm:2.1.0" 1382 | checksum: 10c0/d1b03e47371851ed72741a898281d58f8a9b577aeea6fdfa75a86832898b36c550b3ad057e66d50d774a9cebd9f56c66b6880e4fe75e387794538ba7565b0b6f 1383 | languageName: node 1384 | linkType: hard 1385 | 1386 | "chownr@npm:^3.0.0": 1387 | version: 3.0.0 1388 | resolution: "chownr@npm:3.0.0" 1389 | checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 1390 | languageName: node 1391 | linkType: hard 1392 | 1393 | "chunkd@npm:^2.0.1": 1394 | version: 2.0.1 1395 | resolution: "chunkd@npm:2.0.1" 1396 | checksum: 10c0/4e0c5aac6048ecedfa4cd0a5f6c4f010c70a7b7645aeca7bfeb47cb0733c3463054f0ced3f2667b2e0e67edd75d68a8e05481b01115ba3f8a952a93026254504 1397 | languageName: node 1398 | linkType: hard 1399 | 1400 | "ci-info@npm:^4.3.0": 1401 | version: 4.3.1 1402 | resolution: "ci-info@npm:4.3.1" 1403 | checksum: 10c0/7dd82000f514d76ddfe7775e4cb0d66e5c638f5fa0e2a3be29557e898da0d32ac04f231217d414d07fb968b1fbc6d980ee17ddde0d2c516f23da9cfff608f6c1 1404 | languageName: node 1405 | linkType: hard 1406 | 1407 | "ci-parallel-vars@npm:^1.0.1": 1408 | version: 1.0.1 1409 | resolution: "ci-parallel-vars@npm:1.0.1" 1410 | checksum: 10c0/80952f699cbbc146092b077b4f3e28d085620eb4e6be37f069b4dbb3db0ee70e8eec3beef4ebe70ff60631e9fc743b9d0869678489f167442cac08b260e5ac08 1411 | languageName: node 1412 | linkType: hard 1413 | 1414 | "cli-truncate@npm:^4.0.0": 1415 | version: 4.0.0 1416 | resolution: "cli-truncate@npm:4.0.0" 1417 | dependencies: 1418 | slice-ansi: "npm:^5.0.0" 1419 | string-width: "npm:^7.0.0" 1420 | checksum: 10c0/d7f0b73e3d9b88cb496e6c086df7410b541b56a43d18ade6a573c9c18bd001b1c3fba1ad578f741a4218fdc794d042385f8ac02c25e1c295a2d8b9f3cb86eb4c 1421 | languageName: node 1422 | linkType: hard 1423 | 1424 | "cli-width@npm:^4.1.0": 1425 | version: 4.1.0 1426 | resolution: "cli-width@npm:4.1.0" 1427 | checksum: 10c0/1fbd56413578f6117abcaf858903ba1f4ad78370a4032f916745fa2c7e390183a9d9029cf837df320b0fdce8137668e522f60a30a5f3d6529ff3872d265a955f 1428 | languageName: node 1429 | linkType: hard 1430 | 1431 | "clipanion@npm:^4.0.0-rc.4": 1432 | version: 4.0.0-rc.4 1433 | resolution: "clipanion@npm:4.0.0-rc.4" 1434 | dependencies: 1435 | typanion: "npm:^3.8.0" 1436 | peerDependencies: 1437 | typanion: "*" 1438 | checksum: 10c0/047b415b59a5e9777d00690fba563ccc850eca6bf27790a88d1deea3ecc8a89840ae9aed554ff284cc698a9f3f20256e43c25ff4a7c4c90a71e5e7d9dca61dd1 1439 | languageName: node 1440 | linkType: hard 1441 | 1442 | "cliui@npm:^8.0.1": 1443 | version: 8.0.1 1444 | resolution: "cliui@npm:8.0.1" 1445 | dependencies: 1446 | string-width: "npm:^4.2.0" 1447 | strip-ansi: "npm:^6.0.1" 1448 | wrap-ansi: "npm:^7.0.0" 1449 | checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 1450 | languageName: node 1451 | linkType: hard 1452 | 1453 | "code-excerpt@npm:^4.0.0": 1454 | version: 4.0.0 1455 | resolution: "code-excerpt@npm:4.0.0" 1456 | dependencies: 1457 | convert-to-spaces: "npm:^2.0.1" 1458 | checksum: 10c0/b6c5a06e039cecd2ab6a0e10ee0831de8362107d1f298ca3558b5f9004cb8e0260b02dd6c07f57b9a0e346c76864d2873311ee1989809fdeb05bd5fbbadde773 1459 | languageName: node 1460 | linkType: hard 1461 | 1462 | "color-convert@npm:^2.0.1": 1463 | version: 2.0.1 1464 | resolution: "color-convert@npm:2.0.1" 1465 | dependencies: 1466 | color-name: "npm:~1.1.4" 1467 | checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 1468 | languageName: node 1469 | linkType: hard 1470 | 1471 | "color-name@npm:~1.1.4": 1472 | version: 1.1.4 1473 | resolution: "color-name@npm:1.1.4" 1474 | checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 1475 | languageName: node 1476 | linkType: hard 1477 | 1478 | "colorette@npm:^2.0.20": 1479 | version: 2.0.20 1480 | resolution: "colorette@npm:2.0.20" 1481 | checksum: 10c0/e94116ff33b0ff56f3b83b9ace895e5bf87c2a7a47b3401b8c3f3226e050d5ef76cf4072fb3325f9dc24d1698f9b730baf4e05eeaf861d74a1883073f4c98a40 1482 | languageName: node 1483 | linkType: hard 1484 | 1485 | "common-path-prefix@npm:^3.0.0": 1486 | version: 3.0.0 1487 | resolution: "common-path-prefix@npm:3.0.0" 1488 | checksum: 10c0/c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb 1489 | languageName: node 1490 | linkType: hard 1491 | 1492 | "concordance@npm:^5.0.4": 1493 | version: 5.0.4 1494 | resolution: "concordance@npm:5.0.4" 1495 | dependencies: 1496 | date-time: "npm:^3.1.0" 1497 | esutils: "npm:^2.0.3" 1498 | fast-diff: "npm:^1.2.0" 1499 | js-string-escape: "npm:^1.0.1" 1500 | lodash: "npm:^4.17.15" 1501 | md5-hex: "npm:^3.0.1" 1502 | semver: "npm:^7.3.2" 1503 | well-known-symbols: "npm:^2.0.0" 1504 | checksum: 10c0/59b440f330df3a7c9aa148ba588b3e99aed86acab225b4f01ffcea34ace4cf11f817e31153254e8f38ed48508998dad40b9106951a743c334d751f7ab21afb8a 1505 | languageName: node 1506 | linkType: hard 1507 | 1508 | "consola@npm:^3.2.3": 1509 | version: 3.4.2 1510 | resolution: "consola@npm:3.4.2" 1511 | checksum: 10c0/7cebe57ecf646ba74b300bcce23bff43034ed6fbec9f7e39c27cee1dc00df8a21cd336b466ad32e304ea70fba04ec9e890c200270de9a526ce021ba8a7e4c11a 1512 | languageName: node 1513 | linkType: hard 1514 | 1515 | "convert-to-spaces@npm:^2.0.1": 1516 | version: 2.0.1 1517 | resolution: "convert-to-spaces@npm:2.0.1" 1518 | checksum: 10c0/d90aa0e3b6a27f9d5265a8d32def3c5c855b3e823a9db1f26d772f8146d6b91020a2fdfd905ce8048a73fad3aaf836fef8188c67602c374405e2ae8396c4ac46 1519 | languageName: node 1520 | linkType: hard 1521 | 1522 | "cross-spawn@npm:^7.0.6": 1523 | version: 7.0.6 1524 | resolution: "cross-spawn@npm:7.0.6" 1525 | dependencies: 1526 | path-key: "npm:^3.1.0" 1527 | shebang-command: "npm:^2.0.0" 1528 | which: "npm:^2.0.1" 1529 | checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 1530 | languageName: node 1531 | linkType: hard 1532 | 1533 | "currently-unhandled@npm:^0.4.1": 1534 | version: 0.4.1 1535 | resolution: "currently-unhandled@npm:0.4.1" 1536 | dependencies: 1537 | array-find-index: "npm:^1.0.1" 1538 | checksum: 10c0/32d197689ec32f035910202c1abb0dc6424dce01d7b51779c685119b380d98535c110ffff67a262fc7e367612a7dfd30d3d3055f9a6634b5a9dd1302de7ef11c 1539 | languageName: node 1540 | linkType: hard 1541 | 1542 | "date-time@npm:^3.1.0": 1543 | version: 3.1.0 1544 | resolution: "date-time@npm:3.1.0" 1545 | dependencies: 1546 | time-zone: "npm:^1.0.0" 1547 | checksum: 10c0/aa3e2e930d74b0b9e90f69de7a16d3376e30f21f1f4ce9a2311d8fec32d760e776efea752dafad0ce188187265235229013036202be053fc2d7979813bfb6ded 1548 | languageName: node 1549 | linkType: hard 1550 | 1551 | "debug@npm:4, debug@npm:^4.4.1": 1552 | version: 4.4.3 1553 | resolution: "debug@npm:4.4.3" 1554 | dependencies: 1555 | ms: "npm:^2.1.3" 1556 | peerDependenciesMeta: 1557 | supports-color: 1558 | optional: true 1559 | checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6 1560 | languageName: node 1561 | linkType: hard 1562 | 1563 | "detect-libc@npm:^2.0.0": 1564 | version: 2.1.2 1565 | resolution: "detect-libc@npm:2.1.2" 1566 | checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 1567 | languageName: node 1568 | linkType: hard 1569 | 1570 | "eastasianwidth@npm:^0.2.0": 1571 | version: 0.2.0 1572 | resolution: "eastasianwidth@npm:0.2.0" 1573 | checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 1574 | languageName: node 1575 | linkType: hard 1576 | 1577 | "emittery@npm:^1.2.0": 1578 | version: 1.2.0 1579 | resolution: "emittery@npm:1.2.0" 1580 | checksum: 10c0/3b16d67b2cbbc19d44fa124684039956dc94c376cefa8c7b29f4c934d9d370e6819f642cddaa343b83b1fc03fda554a1498e12f5861caf9d6f6394ff4b6e808a 1581 | languageName: node 1582 | linkType: hard 1583 | 1584 | "emnapi@npm:^1.5.0": 1585 | version: 1.6.0 1586 | resolution: "emnapi@npm:1.6.0" 1587 | peerDependencies: 1588 | node-addon-api: ">= 6.1.0" 1589 | peerDependenciesMeta: 1590 | node-addon-api: 1591 | optional: true 1592 | checksum: 10c0/3078dccebacbeafbd6a96fda30072cf83e4a5492e9928b9542effebf9c468e1402fdefe6e140fa66d683ed4cf7f46dd4d9f0fdc15db395043f5d5994678c7df9 1593 | languageName: node 1594 | linkType: hard 1595 | 1596 | "emoji-regex@npm:^10.3.0": 1597 | version: 10.6.0 1598 | resolution: "emoji-regex@npm:10.6.0" 1599 | checksum: 10c0/1e4aa097bb007301c3b4b1913879ae27327fdc48e93eeefefe3b87e495eb33c5af155300be951b4349ff6ac084f4403dc9eff970acba7c1c572d89396a9a32d7 1600 | languageName: node 1601 | linkType: hard 1602 | 1603 | "emoji-regex@npm:^8.0.0": 1604 | version: 8.0.0 1605 | resolution: "emoji-regex@npm:8.0.0" 1606 | checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 1607 | languageName: node 1608 | linkType: hard 1609 | 1610 | "emoji-regex@npm:^9.2.2": 1611 | version: 9.2.2 1612 | resolution: "emoji-regex@npm:9.2.2" 1613 | checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 1614 | languageName: node 1615 | linkType: hard 1616 | 1617 | "es-toolkit@npm:^1.39.10": 1618 | version: 1.41.0 1619 | resolution: "es-toolkit@npm:1.41.0" 1620 | dependenciesMeta: 1621 | "@trivago/prettier-plugin-sort-imports@4.3.0": 1622 | unplugged: true 1623 | prettier-plugin-sort-re-exports@0.0.1: 1624 | unplugged: true 1625 | checksum: 10c0/4edcc19984df0e521d222082d055f131233cada9277de3f427311ecd43dc99442dc66a39f86b1b10c298c5a72133231928eb91668c0bff4f11e12af8b6d758a3 1626 | languageName: node 1627 | linkType: hard 1628 | 1629 | "escalade@npm:^3.1.1": 1630 | version: 3.2.0 1631 | resolution: "escalade@npm:3.2.0" 1632 | checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 1633 | languageName: node 1634 | linkType: hard 1635 | 1636 | "escape-string-regexp@npm:^2.0.0": 1637 | version: 2.0.0 1638 | resolution: "escape-string-regexp@npm:2.0.0" 1639 | checksum: 10c0/2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 1640 | languageName: node 1641 | linkType: hard 1642 | 1643 | "escape-string-regexp@npm:^5.0.0": 1644 | version: 5.0.0 1645 | resolution: "escape-string-regexp@npm:5.0.0" 1646 | checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 1647 | languageName: node 1648 | linkType: hard 1649 | 1650 | "esprima@npm:^4.0.0": 1651 | version: 4.0.1 1652 | resolution: "esprima@npm:4.0.1" 1653 | bin: 1654 | esparse: ./bin/esparse.js 1655 | esvalidate: ./bin/esvalidate.js 1656 | checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 1657 | languageName: node 1658 | linkType: hard 1659 | 1660 | "estree-walker@npm:2.0.2, estree-walker@npm:^2.0.2": 1661 | version: 2.0.2 1662 | resolution: "estree-walker@npm:2.0.2" 1663 | checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af 1664 | languageName: node 1665 | linkType: hard 1666 | 1667 | "esutils@npm:^2.0.3": 1668 | version: 2.0.3 1669 | resolution: "esutils@npm:2.0.3" 1670 | checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 1671 | languageName: node 1672 | linkType: hard 1673 | 1674 | "fast-content-type-parse@npm:^3.0.0": 1675 | version: 3.0.0 1676 | resolution: "fast-content-type-parse@npm:3.0.0" 1677 | checksum: 10c0/06251880c83b7118af3a5e66e8bcee60d44f48b39396fc60acc2b4630bd5f3e77552b999b5c8e943d45a818854360e5e97164c374ec4b562b4df96a2cdf2e188 1678 | languageName: node 1679 | linkType: hard 1680 | 1681 | "fast-diff@npm:^1.2.0": 1682 | version: 1.3.0 1683 | resolution: "fast-diff@npm:1.3.0" 1684 | checksum: 10c0/5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 1685 | languageName: node 1686 | linkType: hard 1687 | 1688 | "fast-glob@npm:^3.3.3": 1689 | version: 3.3.3 1690 | resolution: "fast-glob@npm:3.3.3" 1691 | dependencies: 1692 | "@nodelib/fs.stat": "npm:^2.0.2" 1693 | "@nodelib/fs.walk": "npm:^1.2.3" 1694 | glob-parent: "npm:^5.1.2" 1695 | merge2: "npm:^1.3.0" 1696 | micromatch: "npm:^4.0.8" 1697 | checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe 1698 | languageName: node 1699 | linkType: hard 1700 | 1701 | "fastq@npm:^1.6.0": 1702 | version: 1.19.1 1703 | resolution: "fastq@npm:1.19.1" 1704 | dependencies: 1705 | reusify: "npm:^1.0.4" 1706 | checksum: 10c0/ebc6e50ac7048daaeb8e64522a1ea7a26e92b3cee5cd1c7f2316cdca81ba543aa40a136b53891446ea5c3a67ec215fbaca87ad405f102dd97012f62916905630 1707 | languageName: node 1708 | linkType: hard 1709 | 1710 | "figures@npm:^6.1.0": 1711 | version: 6.1.0 1712 | resolution: "figures@npm:6.1.0" 1713 | dependencies: 1714 | is-unicode-supported: "npm:^2.0.0" 1715 | checksum: 10c0/9159df4264d62ef447a3931537de92f5012210cf5135c35c010df50a2169377581378149abfe1eb238bd6acbba1c0d547b1f18e0af6eee49e30363cedaffcfe4 1716 | languageName: node 1717 | linkType: hard 1718 | 1719 | "file-uri-to-path@npm:1.0.0": 1720 | version: 1.0.0 1721 | resolution: "file-uri-to-path@npm:1.0.0" 1722 | checksum: 10c0/3b545e3a341d322d368e880e1c204ef55f1d45cdea65f7efc6c6ce9e0c4d22d802d5629320eb779d006fe59624ac17b0e848d83cc5af7cd101f206cb704f5519 1723 | languageName: node 1724 | linkType: hard 1725 | 1726 | "fill-range@npm:^7.1.1": 1727 | version: 7.1.1 1728 | resolution: "fill-range@npm:7.1.1" 1729 | dependencies: 1730 | to-regex-range: "npm:^5.0.1" 1731 | checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 1732 | languageName: node 1733 | linkType: hard 1734 | 1735 | "find-up-simple@npm:^1.0.0": 1736 | version: 1.0.1 1737 | resolution: "find-up-simple@npm:1.0.1" 1738 | checksum: 10c0/ad34de157b7db925d50ff78302fefb28e309f3bc947c93ffca0f9b0bccf9cf1a2dc57d805d5c94ec9fc60f4838f5dbdfd2a48ecd77c23015fa44c6dd5f60bc40 1739 | languageName: node 1740 | linkType: hard 1741 | 1742 | "foreground-child@npm:^3.1.0": 1743 | version: 3.3.1 1744 | resolution: "foreground-child@npm:3.3.1" 1745 | dependencies: 1746 | cross-spawn: "npm:^7.0.6" 1747 | signal-exit: "npm:^4.0.1" 1748 | checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 1749 | languageName: node 1750 | linkType: hard 1751 | 1752 | "get-caller-file@npm:^2.0.5": 1753 | version: 2.0.5 1754 | resolution: "get-caller-file@npm:2.0.5" 1755 | checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde 1756 | languageName: node 1757 | linkType: hard 1758 | 1759 | "get-east-asian-width@npm:^1.0.0": 1760 | version: 1.4.0 1761 | resolution: "get-east-asian-width@npm:1.4.0" 1762 | checksum: 10c0/4e481d418e5a32061c36fbb90d1b225a254cc5b2df5f0b25da215dcd335a3c111f0c2023ffda43140727a9cafb62dac41d022da82c08f31083ee89f714ee3b83 1763 | languageName: node 1764 | linkType: hard 1765 | 1766 | "glob-parent@npm:^5.1.2": 1767 | version: 5.1.2 1768 | resolution: "glob-parent@npm:5.1.2" 1769 | dependencies: 1770 | is-glob: "npm:^4.0.1" 1771 | checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee 1772 | languageName: node 1773 | linkType: hard 1774 | 1775 | "glob@npm:^10.4.5": 1776 | version: 10.4.5 1777 | resolution: "glob@npm:10.4.5" 1778 | dependencies: 1779 | foreground-child: "npm:^3.1.0" 1780 | jackspeak: "npm:^3.1.2" 1781 | minimatch: "npm:^9.0.4" 1782 | minipass: "npm:^7.1.2" 1783 | package-json-from-dist: "npm:^1.0.0" 1784 | path-scurry: "npm:^1.11.1" 1785 | bin: 1786 | glob: dist/esm/bin.mjs 1787 | checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e 1788 | languageName: node 1789 | linkType: hard 1790 | 1791 | "globby@npm:^14.1.0": 1792 | version: 14.1.0 1793 | resolution: "globby@npm:14.1.0" 1794 | dependencies: 1795 | "@sindresorhus/merge-streams": "npm:^2.1.0" 1796 | fast-glob: "npm:^3.3.3" 1797 | ignore: "npm:^7.0.3" 1798 | path-type: "npm:^6.0.0" 1799 | slash: "npm:^5.1.0" 1800 | unicorn-magic: "npm:^0.3.0" 1801 | checksum: 10c0/527a1063c5958255969620c6fa4444a2b2e9278caddd571d46dfbfa307cb15977afb746e84d682ba5b6c94fc081e8997f80ff05dd235441ba1cb16f86153e58e 1802 | languageName: node 1803 | linkType: hard 1804 | 1805 | "graceful-fs@npm:^4.2.9": 1806 | version: 4.2.11 1807 | resolution: "graceful-fs@npm:4.2.11" 1808 | checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 1809 | languageName: node 1810 | linkType: hard 1811 | 1812 | "https-proxy-agent@npm:^7.0.5": 1813 | version: 7.0.6 1814 | resolution: "https-proxy-agent@npm:7.0.6" 1815 | dependencies: 1816 | agent-base: "npm:^7.1.2" 1817 | debug: "npm:4" 1818 | checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac 1819 | languageName: node 1820 | linkType: hard 1821 | 1822 | "iconv-lite@npm:^0.7.0": 1823 | version: 0.7.0 1824 | resolution: "iconv-lite@npm:0.7.0" 1825 | dependencies: 1826 | safer-buffer: "npm:>= 2.1.2 < 3.0.0" 1827 | checksum: 10c0/2382400469071c55b6746c531eed5fa4d033e5db6690b7331fb2a5f59a30d7a9782932e92253db26df33c1cf46fa200a3fbe524a2a7c62037c762283f188ec2f 1828 | languageName: node 1829 | linkType: hard 1830 | 1831 | "ignore-by-default@npm:^2.1.0": 1832 | version: 2.1.0 1833 | resolution: "ignore-by-default@npm:2.1.0" 1834 | checksum: 10c0/3a6040dac25ed9da39dee73bf1634fdd1e15b0eb7cf52a6bdec81c310565782d8811c104ce40acb3d690d61c5fc38a91c78e6baee830a8a2232424dbc6b66981 1835 | languageName: node 1836 | linkType: hard 1837 | 1838 | "ignore@npm:^7.0.3": 1839 | version: 7.0.5 1840 | resolution: "ignore@npm:7.0.5" 1841 | checksum: 10c0/ae00db89fe873064a093b8999fe4cc284b13ef2a178636211842cceb650b9c3e390d3339191acb145d81ed5379d2074840cf0c33a20bdbd6f32821f79eb4ad5d 1842 | languageName: node 1843 | linkType: hard 1844 | 1845 | "imurmurhash@npm:^0.1.4": 1846 | version: 0.1.4 1847 | resolution: "imurmurhash@npm:0.1.4" 1848 | checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 1849 | languageName: node 1850 | linkType: hard 1851 | 1852 | "indent-string@npm:^5.0.0": 1853 | version: 5.0.0 1854 | resolution: "indent-string@npm:5.0.0" 1855 | checksum: 10c0/8ee77b57d92e71745e133f6f444d6fa3ed503ad0e1bcd7e80c8da08b42375c07117128d670589725ed07b1978065803fa86318c309ba45415b7fe13e7f170220 1856 | languageName: node 1857 | linkType: hard 1858 | 1859 | "irregular-plurals@npm:^3.3.0": 1860 | version: 3.5.0 1861 | resolution: "irregular-plurals@npm:3.5.0" 1862 | checksum: 10c0/7c033bbe7325e5a6e0a26949cc6863b6ce273403d4cd5b93bd99b33fecb6605b0884097c4259c23ed0c52c2133bf7d1cdcdd7a0630e8c325161fe269b3447918 1863 | languageName: node 1864 | linkType: hard 1865 | 1866 | "is-extglob@npm:^2.1.1": 1867 | version: 2.1.1 1868 | resolution: "is-extglob@npm:2.1.1" 1869 | checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 1870 | languageName: node 1871 | linkType: hard 1872 | 1873 | "is-fullwidth-code-point@npm:^3.0.0": 1874 | version: 3.0.0 1875 | resolution: "is-fullwidth-code-point@npm:3.0.0" 1876 | checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc 1877 | languageName: node 1878 | linkType: hard 1879 | 1880 | "is-fullwidth-code-point@npm:^4.0.0": 1881 | version: 4.0.0 1882 | resolution: "is-fullwidth-code-point@npm:4.0.0" 1883 | checksum: 10c0/df2a717e813567db0f659c306d61f2f804d480752526886954a2a3e2246c7745fd07a52b5fecf2b68caf0a6c79dcdace6166fdf29cc76ed9975cc334f0a018b8 1884 | languageName: node 1885 | linkType: hard 1886 | 1887 | "is-glob@npm:^4.0.1": 1888 | version: 4.0.3 1889 | resolution: "is-glob@npm:4.0.3" 1890 | dependencies: 1891 | is-extglob: "npm:^2.1.1" 1892 | checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a 1893 | languageName: node 1894 | linkType: hard 1895 | 1896 | "is-number@npm:^7.0.0": 1897 | version: 7.0.0 1898 | resolution: "is-number@npm:7.0.0" 1899 | checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 1900 | languageName: node 1901 | linkType: hard 1902 | 1903 | "is-plain-object@npm:^5.0.0": 1904 | version: 5.0.0 1905 | resolution: "is-plain-object@npm:5.0.0" 1906 | checksum: 10c0/893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c 1907 | languageName: node 1908 | linkType: hard 1909 | 1910 | "is-promise@npm:^4.0.0": 1911 | version: 4.0.0 1912 | resolution: "is-promise@npm:4.0.0" 1913 | checksum: 10c0/ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 1914 | languageName: node 1915 | linkType: hard 1916 | 1917 | "is-unicode-supported@npm:^2.0.0": 1918 | version: 2.1.0 1919 | resolution: "is-unicode-supported@npm:2.1.0" 1920 | checksum: 10c0/a0f53e9a7c1fdbcf2d2ef6e40d4736fdffff1c9f8944c75e15425118ff3610172c87bf7bc6c34d3903b04be59790bb2212ddbe21ee65b5a97030fc50370545a5 1921 | languageName: node 1922 | linkType: hard 1923 | 1924 | "isexe@npm:^2.0.0": 1925 | version: 2.0.0 1926 | resolution: "isexe@npm:2.0.0" 1927 | checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d 1928 | languageName: node 1929 | linkType: hard 1930 | 1931 | "jackspeak@npm:^3.1.2": 1932 | version: 3.4.3 1933 | resolution: "jackspeak@npm:3.4.3" 1934 | dependencies: 1935 | "@isaacs/cliui": "npm:^8.0.2" 1936 | "@pkgjs/parseargs": "npm:^0.11.0" 1937 | dependenciesMeta: 1938 | "@pkgjs/parseargs": 1939 | optional: true 1940 | checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 1941 | languageName: node 1942 | linkType: hard 1943 | 1944 | "js-string-escape@npm:^1.0.1": 1945 | version: 1.0.1 1946 | resolution: "js-string-escape@npm:1.0.1" 1947 | checksum: 10c0/2c33b9ff1ba6b84681c51ca0997e7d5a1639813c95d5b61cb7ad47e55cc28fa4a0b1935c3d218710d8e6bcee5d0cd8c44755231e3a4e45fc604534d9595a3628 1948 | languageName: node 1949 | linkType: hard 1950 | 1951 | "js-yaml@npm:^3.14.1": 1952 | version: 3.14.1 1953 | resolution: "js-yaml@npm:3.14.1" 1954 | dependencies: 1955 | argparse: "npm:^1.0.7" 1956 | esprima: "npm:^4.0.0" 1957 | bin: 1958 | js-yaml: bin/js-yaml.js 1959 | checksum: 10c0/6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b 1960 | languageName: node 1961 | linkType: hard 1962 | 1963 | "js-yaml@npm:^4.1.0": 1964 | version: 4.1.0 1965 | resolution: "js-yaml@npm:4.1.0" 1966 | dependencies: 1967 | argparse: "npm:^2.0.1" 1968 | bin: 1969 | js-yaml: bin/js-yaml.js 1970 | checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f 1971 | languageName: node 1972 | linkType: hard 1973 | 1974 | "load-json-file@npm:^7.0.1": 1975 | version: 7.0.1 1976 | resolution: "load-json-file@npm:7.0.1" 1977 | checksum: 10c0/7117459608a0b6329c7f78e6e1f541b3162dd901c29dd5af721fec8b270177d2e3d7999c971f344fff04daac368d052732e2c7146014bc84d15e0b636975e19a 1978 | languageName: node 1979 | linkType: hard 1980 | 1981 | "lodash@npm:^4.17.15": 1982 | version: 4.17.21 1983 | resolution: "lodash@npm:4.17.21" 1984 | checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c 1985 | languageName: node 1986 | linkType: hard 1987 | 1988 | "lru-cache@npm:^10.2.0": 1989 | version: 10.4.3 1990 | resolution: "lru-cache@npm:10.4.3" 1991 | checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb 1992 | languageName: node 1993 | linkType: hard 1994 | 1995 | "matcher@npm:^5.0.0": 1996 | version: 5.0.0 1997 | resolution: "matcher@npm:5.0.0" 1998 | dependencies: 1999 | escape-string-regexp: "npm:^5.0.0" 2000 | checksum: 10c0/eda5471fc9d5b7264d63c81727824adc3585ddb5cfdc5fce5a9b7c86f946ff181610735d330b1c37a84811df872d1290bf4e9401d2be2a414204343701144b18 2001 | languageName: node 2002 | linkType: hard 2003 | 2004 | "md5-hex@npm:^3.0.1": 2005 | version: 3.0.1 2006 | resolution: "md5-hex@npm:3.0.1" 2007 | dependencies: 2008 | blueimp-md5: "npm:^2.10.0" 2009 | checksum: 10c0/ee2b4d8da16b527b3a3fe4d7a96720f43afd07b46a82d49421208b5a126235fb75cfb30b80d4029514772c8844273f940bddfbf4155c787f968f3be4060d01e4 2010 | languageName: node 2011 | linkType: hard 2012 | 2013 | "memoize@npm:^10.1.0": 2014 | version: 10.2.0 2015 | resolution: "memoize@npm:10.2.0" 2016 | dependencies: 2017 | mimic-function: "npm:^5.0.1" 2018 | checksum: 10c0/8a5891f313e8db82bab4bb9694752aab40c11ce3bf9b8cc32228ebaf87e14e8109a23b37ceef32baadbedc09af2c4dd0d361a93e9e591bb0ed9e23f728e1ce9f 2019 | languageName: node 2020 | linkType: hard 2021 | 2022 | "merge2@npm:^1.3.0": 2023 | version: 1.4.1 2024 | resolution: "merge2@npm:1.4.1" 2025 | checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb 2026 | languageName: node 2027 | linkType: hard 2028 | 2029 | "micromatch@npm:^4.0.8": 2030 | version: 4.0.8 2031 | resolution: "micromatch@npm:4.0.8" 2032 | dependencies: 2033 | braces: "npm:^3.0.3" 2034 | picomatch: "npm:^2.3.1" 2035 | checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 2036 | languageName: node 2037 | linkType: hard 2038 | 2039 | "mimic-function@npm:^5.0.1": 2040 | version: 5.0.1 2041 | resolution: "mimic-function@npm:5.0.1" 2042 | checksum: 10c0/f3d9464dd1816ecf6bdf2aec6ba32c0728022039d992f178237d8e289b48764fee4131319e72eedd4f7f094e22ded0af836c3187a7edc4595d28dd74368fd81d 2043 | languageName: node 2044 | linkType: hard 2045 | 2046 | "minimatch@npm:^9.0.4": 2047 | version: 9.0.5 2048 | resolution: "minimatch@npm:9.0.5" 2049 | dependencies: 2050 | brace-expansion: "npm:^2.0.1" 2051 | checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed 2052 | languageName: node 2053 | linkType: hard 2054 | 2055 | "minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.4, minipass@npm:^7.1.2": 2056 | version: 7.1.2 2057 | resolution: "minipass@npm:7.1.2" 2058 | checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 2059 | languageName: node 2060 | linkType: hard 2061 | 2062 | "minizlib@npm:^3.1.0": 2063 | version: 3.1.0 2064 | resolution: "minizlib@npm:3.1.0" 2065 | dependencies: 2066 | minipass: "npm:^7.1.2" 2067 | checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec 2068 | languageName: node 2069 | linkType: hard 2070 | 2071 | "ms@npm:^2.1.3": 2072 | version: 2.1.3 2073 | resolution: "ms@npm:2.1.3" 2074 | checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 2075 | languageName: node 2076 | linkType: hard 2077 | 2078 | "mute-stream@npm:^2.0.0": 2079 | version: 2.0.0 2080 | resolution: "mute-stream@npm:2.0.0" 2081 | checksum: 10c0/2cf48a2087175c60c8dcdbc619908b49c07f7adcfc37d29236b0c5c612d6204f789104c98cc44d38acab7b3c96f4a3ec2cfdc4934d0738d876dbefa2a12c69f4 2082 | languageName: node 2083 | linkType: hard 2084 | 2085 | "node-fetch@npm:^2.6.7": 2086 | version: 2.7.0 2087 | resolution: "node-fetch@npm:2.7.0" 2088 | dependencies: 2089 | whatwg-url: "npm:^5.0.0" 2090 | peerDependencies: 2091 | encoding: ^0.1.0 2092 | peerDependenciesMeta: 2093 | encoding: 2094 | optional: true 2095 | checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 2096 | languageName: node 2097 | linkType: hard 2098 | 2099 | "node-gyp-build@npm:^4.2.2": 2100 | version: 4.8.4 2101 | resolution: "node-gyp-build@npm:4.8.4" 2102 | bin: 2103 | node-gyp-build: bin.js 2104 | node-gyp-build-optional: optional.js 2105 | node-gyp-build-test: build-test.js 2106 | checksum: 10c0/444e189907ece2081fe60e75368784f7782cfddb554b60123743dfb89509df89f1f29c03bbfa16b3a3e0be3f48799a4783f487da6203245fa5bed239ba7407e1 2107 | languageName: node 2108 | linkType: hard 2109 | 2110 | "nofilter@npm:^3.0.2": 2111 | version: 3.1.0 2112 | resolution: "nofilter@npm:3.1.0" 2113 | checksum: 10c0/92459f3864a067b347032263f0b536223cbfc98153913b5dce350cb39c8470bc1813366e41993f22c33cc6400c0f392aa324a4b51e24c22040635c1cdb046499 2114 | languageName: node 2115 | linkType: hard 2116 | 2117 | "nopt@npm:^8.0.0": 2118 | version: 8.1.0 2119 | resolution: "nopt@npm:8.1.0" 2120 | dependencies: 2121 | abbrev: "npm:^3.0.0" 2122 | bin: 2123 | nopt: bin/nopt.js 2124 | checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef 2125 | languageName: node 2126 | linkType: hard 2127 | 2128 | "p-map@npm:^7.0.3": 2129 | version: 7.0.3 2130 | resolution: "p-map@npm:7.0.3" 2131 | checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c 2132 | languageName: node 2133 | linkType: hard 2134 | 2135 | "package-config@npm:^5.0.0": 2136 | version: 5.0.0 2137 | resolution: "package-config@npm:5.0.0" 2138 | dependencies: 2139 | find-up-simple: "npm:^1.0.0" 2140 | load-json-file: "npm:^7.0.1" 2141 | checksum: 10c0/f6c48930700b73a41d839bf2898b628d23665827488a4f34aed2d05e4a99d7a70a70ada115c3546765947fbc8accff94c0779da21ea084b25df47cb774531eeb 2142 | languageName: node 2143 | linkType: hard 2144 | 2145 | "package-json-from-dist@npm:^1.0.0": 2146 | version: 1.0.1 2147 | resolution: "package-json-from-dist@npm:1.0.1" 2148 | checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b 2149 | languageName: node 2150 | linkType: hard 2151 | 2152 | "parse-ms@npm:^4.0.0": 2153 | version: 4.0.0 2154 | resolution: "parse-ms@npm:4.0.0" 2155 | checksum: 10c0/a7900f4f1ebac24cbf5e9708c16fb2fd482517fad353aecd7aefb8c2ba2f85ce017913ccb8925d231770404780df46244ea6fec598b3bde6490882358b4d2d16 2156 | languageName: node 2157 | linkType: hard 2158 | 2159 | "path-key@npm:^3.1.0": 2160 | version: 3.1.1 2161 | resolution: "path-key@npm:3.1.1" 2162 | checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c 2163 | languageName: node 2164 | linkType: hard 2165 | 2166 | "path-scurry@npm:^1.11.1": 2167 | version: 1.11.1 2168 | resolution: "path-scurry@npm:1.11.1" 2169 | dependencies: 2170 | lru-cache: "npm:^10.2.0" 2171 | minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" 2172 | checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d 2173 | languageName: node 2174 | linkType: hard 2175 | 2176 | "path-type@npm:^6.0.0": 2177 | version: 6.0.0 2178 | resolution: "path-type@npm:6.0.0" 2179 | checksum: 10c0/55baa8b1187d6dc683d5a9cfcc866168d6adff58e5db91126795376d818eee46391e00b2a4d53e44d844c7524a7d96aa68cc68f4f3e500d3d069a39e6535481c 2180 | languageName: node 2181 | linkType: hard 2182 | 2183 | "picomatch@npm:^2.3.1": 2184 | version: 2.3.1 2185 | resolution: "picomatch@npm:2.3.1" 2186 | checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be 2187 | languageName: node 2188 | linkType: hard 2189 | 2190 | "picomatch@npm:^4.0.2": 2191 | version: 4.0.3 2192 | resolution: "picomatch@npm:4.0.3" 2193 | checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2 2194 | languageName: node 2195 | linkType: hard 2196 | 2197 | "plur@npm:^5.1.0": 2198 | version: 5.1.0 2199 | resolution: "plur@npm:5.1.0" 2200 | dependencies: 2201 | irregular-plurals: "npm:^3.3.0" 2202 | checksum: 10c0/26bb622b8545fcfd47bbf56fbcca66c08693708a232e403fa3589e00003c56c14231ac57c7588ca5db83ef4be1f61383402c4ea954000768f779f8aef6eb6da8 2203 | languageName: node 2204 | linkType: hard 2205 | 2206 | "pretty-ms@npm:^9.2.0": 2207 | version: 9.3.0 2208 | resolution: "pretty-ms@npm:9.3.0" 2209 | dependencies: 2210 | parse-ms: "npm:^4.0.0" 2211 | checksum: 10c0/555ea39a1de48a30601938aedb76d682871d33b6dee015281c37108921514b11e1792928b1648c2e5589acc73c8ef0fb5e585fb4c718e340a28b86799e90fb34 2212 | languageName: node 2213 | linkType: hard 2214 | 2215 | "queue-microtask@npm:^1.2.2": 2216 | version: 1.2.3 2217 | resolution: "queue-microtask@npm:1.2.3" 2218 | checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 2219 | languageName: node 2220 | linkType: hard 2221 | 2222 | "require-directory@npm:^2.1.1": 2223 | version: 2.1.1 2224 | resolution: "require-directory@npm:2.1.1" 2225 | checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 2226 | languageName: node 2227 | linkType: hard 2228 | 2229 | "resolve-cwd@npm:^3.0.0": 2230 | version: 3.0.0 2231 | resolution: "resolve-cwd@npm:3.0.0" 2232 | dependencies: 2233 | resolve-from: "npm:^5.0.0" 2234 | checksum: 10c0/e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 2235 | languageName: node 2236 | linkType: hard 2237 | 2238 | "resolve-from@npm:^5.0.0": 2239 | version: 5.0.0 2240 | resolution: "resolve-from@npm:5.0.0" 2241 | checksum: 10c0/b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 2242 | languageName: node 2243 | linkType: hard 2244 | 2245 | "reusify@npm:^1.0.4": 2246 | version: 1.1.0 2247 | resolution: "reusify@npm:1.1.0" 2248 | checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa 2249 | languageName: node 2250 | linkType: hard 2251 | 2252 | "run-parallel@npm:^1.1.9": 2253 | version: 1.2.0 2254 | resolution: "run-parallel@npm:1.2.0" 2255 | dependencies: 2256 | queue-microtask: "npm:^1.2.2" 2257 | checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 2258 | languageName: node 2259 | linkType: hard 2260 | 2261 | "safer-buffer@npm:>= 2.1.2 < 3.0.0": 2262 | version: 2.1.2 2263 | resolution: "safer-buffer@npm:2.1.2" 2264 | checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 2265 | languageName: node 2266 | linkType: hard 2267 | 2268 | "semver@npm:^7.3.2, semver@npm:^7.5.3, semver@npm:^7.7.2": 2269 | version: 7.7.3 2270 | resolution: "semver@npm:7.7.3" 2271 | bin: 2272 | semver: bin/semver.js 2273 | checksum: 10c0/4afe5c986567db82f44c8c6faef8fe9df2a9b1d98098fc1721f57c696c4c21cebd572f297fc21002f81889492345b8470473bc6f4aff5fb032a6ea59ea2bc45e 2274 | languageName: node 2275 | linkType: hard 2276 | 2277 | "serialize-error@npm:^7.0.1": 2278 | version: 7.0.1 2279 | resolution: "serialize-error@npm:7.0.1" 2280 | dependencies: 2281 | type-fest: "npm:^0.13.1" 2282 | checksum: 10c0/7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 2283 | languageName: node 2284 | linkType: hard 2285 | 2286 | "shebang-command@npm:^2.0.0": 2287 | version: 2.0.0 2288 | resolution: "shebang-command@npm:2.0.0" 2289 | dependencies: 2290 | shebang-regex: "npm:^3.0.0" 2291 | checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e 2292 | languageName: node 2293 | linkType: hard 2294 | 2295 | "shebang-regex@npm:^3.0.0": 2296 | version: 3.0.0 2297 | resolution: "shebang-regex@npm:3.0.0" 2298 | checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 2299 | languageName: node 2300 | linkType: hard 2301 | 2302 | "signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": 2303 | version: 4.1.0 2304 | resolution: "signal-exit@npm:4.1.0" 2305 | checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 2306 | languageName: node 2307 | linkType: hard 2308 | 2309 | "slash@npm:^5.1.0": 2310 | version: 5.1.0 2311 | resolution: "slash@npm:5.1.0" 2312 | checksum: 10c0/eb48b815caf0bdc390d0519d41b9e0556a14380f6799c72ba35caf03544d501d18befdeeef074bc9c052acf69654bc9e0d79d7f1de0866284137a40805299eb3 2313 | languageName: node 2314 | linkType: hard 2315 | 2316 | "slice-ansi@npm:^5.0.0": 2317 | version: 5.0.0 2318 | resolution: "slice-ansi@npm:5.0.0" 2319 | dependencies: 2320 | ansi-styles: "npm:^6.0.0" 2321 | is-fullwidth-code-point: "npm:^4.0.0" 2322 | checksum: 10c0/2d4d40b2a9d5cf4e8caae3f698fe24ae31a4d778701724f578e984dcb485ec8c49f0c04dab59c401821e80fcdfe89cace9c66693b0244e40ec485d72e543914f 2323 | languageName: node 2324 | linkType: hard 2325 | 2326 | "sprintf-js@npm:~1.0.2": 2327 | version: 1.0.3 2328 | resolution: "sprintf-js@npm:1.0.3" 2329 | checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb 2330 | languageName: node 2331 | linkType: hard 2332 | 2333 | "stack-utils@npm:^2.0.6": 2334 | version: 2.0.6 2335 | resolution: "stack-utils@npm:2.0.6" 2336 | dependencies: 2337 | escape-string-regexp: "npm:^2.0.0" 2338 | checksum: 10c0/651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a 2339 | languageName: node 2340 | linkType: hard 2341 | 2342 | "string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": 2343 | version: 4.2.3 2344 | resolution: "string-width@npm:4.2.3" 2345 | dependencies: 2346 | emoji-regex: "npm:^8.0.0" 2347 | is-fullwidth-code-point: "npm:^3.0.0" 2348 | strip-ansi: "npm:^6.0.1" 2349 | checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b 2350 | languageName: node 2351 | linkType: hard 2352 | 2353 | "string-width@npm:^5.0.1, string-width@npm:^5.1.2": 2354 | version: 5.1.2 2355 | resolution: "string-width@npm:5.1.2" 2356 | dependencies: 2357 | eastasianwidth: "npm:^0.2.0" 2358 | emoji-regex: "npm:^9.2.2" 2359 | strip-ansi: "npm:^7.0.1" 2360 | checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca 2361 | languageName: node 2362 | linkType: hard 2363 | 2364 | "string-width@npm:^7.0.0": 2365 | version: 7.2.0 2366 | resolution: "string-width@npm:7.2.0" 2367 | dependencies: 2368 | emoji-regex: "npm:^10.3.0" 2369 | get-east-asian-width: "npm:^1.0.0" 2370 | strip-ansi: "npm:^7.1.0" 2371 | checksum: 10c0/eb0430dd43f3199c7a46dcbf7a0b34539c76fe3aa62763d0b0655acdcbdf360b3f66f3d58ca25ba0205f42ea3491fa00f09426d3b7d3040e506878fc7664c9b9 2372 | languageName: node 2373 | linkType: hard 2374 | 2375 | "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": 2376 | version: 6.0.1 2377 | resolution: "strip-ansi@npm:6.0.1" 2378 | dependencies: 2379 | ansi-regex: "npm:^5.0.1" 2380 | checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 2381 | languageName: node 2382 | linkType: hard 2383 | 2384 | "strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": 2385 | version: 7.1.2 2386 | resolution: "strip-ansi@npm:7.1.2" 2387 | dependencies: 2388 | ansi-regex: "npm:^6.0.1" 2389 | checksum: 10c0/0d6d7a023de33368fd042aab0bf48f4f4077abdfd60e5393e73c7c411e85e1b3a83507c11af2e656188511475776215df9ca589b4da2295c9455cc399ce1858b 2390 | languageName: node 2391 | linkType: hard 2392 | 2393 | "supertap@npm:^3.0.1": 2394 | version: 3.0.1 2395 | resolution: "supertap@npm:3.0.1" 2396 | dependencies: 2397 | indent-string: "npm:^5.0.0" 2398 | js-yaml: "npm:^3.14.1" 2399 | serialize-error: "npm:^7.0.1" 2400 | strip-ansi: "npm:^7.0.1" 2401 | checksum: 10c0/8164674f2e280cab875f0fef5bb36c15553c13e29697ff92f4e0d6bc62149f0303a89eee47535413ed145ea72e14a24d065bab233059d48a499ec5ebb4566b0f 2402 | languageName: node 2403 | linkType: hard 2404 | 2405 | "tar@npm:^7.4.0": 2406 | version: 7.5.1 2407 | resolution: "tar@npm:7.5.1" 2408 | dependencies: 2409 | "@isaacs/fs-minipass": "npm:^4.0.0" 2410 | chownr: "npm:^3.0.0" 2411 | minipass: "npm:^7.1.2" 2412 | minizlib: "npm:^3.1.0" 2413 | yallist: "npm:^5.0.0" 2414 | checksum: 10c0/0dad0596a61586180981133b20c32cfd93c5863c5b7140d646714e6ea8ec84583b879e5dc3928a4d683be6e6109ad7ea3de1cf71986d5194f81b3a016c8858c9 2415 | languageName: node 2416 | linkType: hard 2417 | 2418 | "temp-dir@npm:^3.0.0": 2419 | version: 3.0.0 2420 | resolution: "temp-dir@npm:3.0.0" 2421 | checksum: 10c0/a86978a400984cd5f315b77ebf3fe53bb58c61f192278cafcb1f3fb32d584a21dc8e08b93171d7874b7cc972234d3455c467306cc1bfc4524b622e5ad3bfd671 2422 | languageName: node 2423 | linkType: hard 2424 | 2425 | "time-zone@npm:^1.0.0": 2426 | version: 1.0.0 2427 | resolution: "time-zone@npm:1.0.0" 2428 | checksum: 10c0/d00ebd885039109011b6e2423ebbf225160927333c2ade6d833e9cc4676db20759f1f3855fafde00d1bd668c243a6aa68938ce71fe58aab0d514e820d59c1d81 2429 | languageName: node 2430 | linkType: hard 2431 | 2432 | "to-regex-range@npm:^5.0.1": 2433 | version: 5.0.1 2434 | resolution: "to-regex-range@npm:5.0.1" 2435 | dependencies: 2436 | is-number: "npm:^7.0.0" 2437 | checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 2438 | languageName: node 2439 | linkType: hard 2440 | 2441 | "tr46@npm:~0.0.3": 2442 | version: 0.0.3 2443 | resolution: "tr46@npm:0.0.3" 2444 | checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 2445 | languageName: node 2446 | linkType: hard 2447 | 2448 | "tslib@npm:^2.4.0": 2449 | version: 2.8.1 2450 | resolution: "tslib@npm:2.8.1" 2451 | checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 2452 | languageName: node 2453 | linkType: hard 2454 | 2455 | "typanion@npm:^3.14.0, typanion@npm:^3.8.0": 2456 | version: 3.14.0 2457 | resolution: "typanion@npm:3.14.0" 2458 | checksum: 10c0/8b03b19844e6955bfd906c31dc781bae6d7f1fb3ce4fe24b7501557013d4889ae5cefe671dafe98d87ead0adceb8afcb8bc16df7dc0bd2b7331bac96f3a7cae2 2459 | languageName: node 2460 | linkType: hard 2461 | 2462 | "type-fest@npm:^0.13.1": 2463 | version: 0.13.1 2464 | resolution: "type-fest@npm:0.13.1" 2465 | checksum: 10c0/0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b 2466 | languageName: node 2467 | linkType: hard 2468 | 2469 | "undici-types@npm:~7.16.0": 2470 | version: 7.16.0 2471 | resolution: "undici-types@npm:7.16.0" 2472 | checksum: 10c0/3033e2f2b5c9f1504bdc5934646cb54e37ecaca0f9249c983f7b1fc2e87c6d18399ebb05dc7fd5419e02b2e915f734d872a65da2e3eeed1813951c427d33cc9a 2473 | languageName: node 2474 | linkType: hard 2475 | 2476 | "unicorn-magic@npm:^0.3.0": 2477 | version: 0.3.0 2478 | resolution: "unicorn-magic@npm:0.3.0" 2479 | checksum: 10c0/0a32a997d6c15f1c2a077a15b1c4ca6f268d574cf5b8975e778bb98e6f8db4ef4e86dfcae4e158cd4c7e38fb4dd383b93b13eefddc7f178dea13d3ac8a603271 2480 | languageName: node 2481 | linkType: hard 2482 | 2483 | "universal-user-agent@npm:^7.0.0, universal-user-agent@npm:^7.0.2": 2484 | version: 7.0.3 2485 | resolution: "universal-user-agent@npm:7.0.3" 2486 | checksum: 10c0/6043be466a9bb96c0ce82392842d9fddf4c37e296f7bacc2cb25f47123990eb436c82df824644f9c5070a94dbdb117be17f66d54599ab143648ec57ef93dbcc8 2487 | languageName: node 2488 | linkType: hard 2489 | 2490 | "webidl-conversions@npm:^3.0.0": 2491 | version: 3.0.1 2492 | resolution: "webidl-conversions@npm:3.0.1" 2493 | checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db 2494 | languageName: node 2495 | linkType: hard 2496 | 2497 | "well-known-symbols@npm:^2.0.0": 2498 | version: 2.0.0 2499 | resolution: "well-known-symbols@npm:2.0.0" 2500 | checksum: 10c0/cb6c12e98877e8952ec28d13ae6f4fdb54ae1cb49b16a728720276dadd76c930e6cb0e174af3a4620054dd2752546f842540122920c6e31410208abd4958ee6b 2501 | languageName: node 2502 | linkType: hard 2503 | 2504 | "whatwg-url@npm:^5.0.0": 2505 | version: 5.0.0 2506 | resolution: "whatwg-url@npm:5.0.0" 2507 | dependencies: 2508 | tr46: "npm:~0.0.3" 2509 | webidl-conversions: "npm:^3.0.0" 2510 | checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 2511 | languageName: node 2512 | linkType: hard 2513 | 2514 | "which@npm:^2.0.1": 2515 | version: 2.0.2 2516 | resolution: "which@npm:2.0.2" 2517 | dependencies: 2518 | isexe: "npm:^2.0.0" 2519 | bin: 2520 | node-which: ./bin/node-which 2521 | checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f 2522 | languageName: node 2523 | linkType: hard 2524 | 2525 | "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": 2526 | version: 7.0.0 2527 | resolution: "wrap-ansi@npm:7.0.0" 2528 | dependencies: 2529 | ansi-styles: "npm:^4.0.0" 2530 | string-width: "npm:^4.1.0" 2531 | strip-ansi: "npm:^6.0.0" 2532 | checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da 2533 | languageName: node 2534 | linkType: hard 2535 | 2536 | "wrap-ansi@npm:^6.2.0": 2537 | version: 6.2.0 2538 | resolution: "wrap-ansi@npm:6.2.0" 2539 | dependencies: 2540 | ansi-styles: "npm:^4.0.0" 2541 | string-width: "npm:^4.1.0" 2542 | strip-ansi: "npm:^6.0.0" 2543 | checksum: 10c0/baad244e6e33335ea24e86e51868fe6823626e3a3c88d9a6674642afff1d34d9a154c917e74af8d845fd25d170c4ea9cf69a47133c3f3656e1252b3d462d9f6c 2544 | languageName: node 2545 | linkType: hard 2546 | 2547 | "wrap-ansi@npm:^8.1.0": 2548 | version: 8.1.0 2549 | resolution: "wrap-ansi@npm:8.1.0" 2550 | dependencies: 2551 | ansi-styles: "npm:^6.1.0" 2552 | string-width: "npm:^5.0.1" 2553 | strip-ansi: "npm:^7.0.1" 2554 | checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 2555 | languageName: node 2556 | linkType: hard 2557 | 2558 | "write-file-atomic@npm:^6.0.0": 2559 | version: 6.0.0 2560 | resolution: "write-file-atomic@npm:6.0.0" 2561 | dependencies: 2562 | imurmurhash: "npm:^0.1.4" 2563 | signal-exit: "npm:^4.0.1" 2564 | checksum: 10c0/ae2f1c27474758a9aca92037df6c1dd9cb94c4e4983451210bd686bfe341f142662f6aa5913095e572ab037df66b1bfe661ed4ce4c0369ed0e8219e28e141786 2565 | languageName: node 2566 | linkType: hard 2567 | 2568 | "y18n@npm:^5.0.5": 2569 | version: 5.0.8 2570 | resolution: "y18n@npm:5.0.8" 2571 | checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 2572 | languageName: node 2573 | linkType: hard 2574 | 2575 | "yallist@npm:^5.0.0": 2576 | version: 5.0.0 2577 | resolution: "yallist@npm:5.0.0" 2578 | checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 2579 | languageName: node 2580 | linkType: hard 2581 | 2582 | "yargs-parser@npm:^21.1.1": 2583 | version: 21.1.1 2584 | resolution: "yargs-parser@npm:21.1.1" 2585 | checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 2586 | languageName: node 2587 | linkType: hard 2588 | 2589 | "yargs@npm:^17.7.2": 2590 | version: 17.7.2 2591 | resolution: "yargs@npm:17.7.2" 2592 | dependencies: 2593 | cliui: "npm:^8.0.1" 2594 | escalade: "npm:^3.1.1" 2595 | get-caller-file: "npm:^2.0.5" 2596 | require-directory: "npm:^2.1.1" 2597 | string-width: "npm:^4.2.3" 2598 | y18n: "npm:^5.0.5" 2599 | yargs-parser: "npm:^21.1.1" 2600 | checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 2601 | languageName: node 2602 | linkType: hard 2603 | 2604 | "yoctocolors-cjs@npm:^2.1.2": 2605 | version: 2.1.3 2606 | resolution: "yoctocolors-cjs@npm:2.1.3" 2607 | checksum: 10c0/584168ef98eb5d913473a4858dce128803c4a6cd87c0f09e954fa01126a59a33ab9e513b633ad9ab953786ed16efdd8c8700097a51635aafaeed3fef7712fa79 2608 | languageName: node 2609 | linkType: hard 2610 | --------------------------------------------------------------------------------