├── Transform ├── .gitignore ├── update.sh ├── index.d.ts ├── src ├── asset.rs ├── main.rs ├── lib.rs ├── parser.rs ├── args.rs ├── default.rs ├── content.rs └── convert.rs ├── LICENSE ├── Cargo.toml ├── package.json ├── cli.js ├── install.ps1 ├── .github └── workflows │ ├── release.yml │ └── npm-publish.yml ├── index.js ├── installation.md ├── install.sh ├── README.md ├── yarn.lock └── Cargo.lock /Transform: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /docs 3 | /node_modules -------------------------------------------------------------------------------- /update.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "🔄 Checking for QuickIcon updates..." 4 | curl -fsSL https://raw.githubusercontent.com/azeezabass2005/quickicon/main/install.sh | bash -s -- --update -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | /* auto-generated by NAPI-RS */ 2 | 3 | export function convertSvgToReact( 4 | svgContent: string, 5 | componentName: string, 6 | isJavascript: boolean, 7 | destinationFolder: string, 8 | size: number, 9 | ): Promise; 10 | 11 | export function validateSvg(content: string): boolean; -------------------------------------------------------------------------------- /src/asset.rs: -------------------------------------------------------------------------------- 1 | pub static QUICK_ICON: &str = r#" 2 | ________ .__ __ .___ 3 | \_____ \ __ __|__| ____ | | __ | | ____ ____ ____ 4 | / / \ \| | \ |/ ___\| |/ / | |/ ___\/ _ \ / \ 5 | / \_/. \ | / \ \___| < | \ \__( <_> ) | \ 6 | \_____\ \_/____/|__|\___ >__|_ \ |___|\___ >____/|___| / 7 | \__> \/ \/ \/ \/ 8 | "#; -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Fola 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use clap::Parser; 2 | use dialoguer::console::style; 3 | use asset::{QUICK_ICON}; 4 | use args::Args; 5 | 6 | use crate::{convert::SvgToReact}; 7 | 8 | mod args; 9 | mod parser; 10 | mod asset; 11 | mod content; 12 | mod convert; 13 | mod default; 14 | 15 | #[tokio::main] 16 | async fn main() { 17 | let args = Args::parse(); 18 | println!("{}", style(QUICK_ICON).blue()); 19 | let config = default::get_and_save_config(&args).unwrap(); 20 | 21 | match content::get_content(&args).await { 22 | Ok(content) => { 23 | match SvgToReact::new(content, args.icon_name, config).convert_and_save() { 24 | Ok(path) => { 25 | let msg = style(format!("🎉 Your icon has been generated and you can find it in: {:?}", path)).green(); 26 | println!("{}", msg); 27 | }, 28 | Err(err) => { 29 | println!("An error occurred when generating the component: {}", style(err).red()); 30 | } 31 | } 32 | }, 33 | Err(err_message) => { 34 | println!("An error occurred while reading content: {}", style(err_message).red()); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | #[cfg(feature = "napi")] 2 | use napi_derive::napi; 3 | 4 | #[cfg(feature = "napi")] 5 | #[napi] 6 | pub async fn convert_svg_to_react( 7 | svg_content: String, 8 | component_name: String, 9 | is_javascript: bool, 10 | destination_folder: String, 11 | size: u32, 12 | ) -> napi::Result { 13 | use std::path::PathBuf; 14 | use crate::convert::SvgToReact; 15 | use crate::default::Config; 16 | 17 | let config = Config { 18 | is_javascript, 19 | destination_folder: PathBuf::from(destination_folder), 20 | size, 21 | }; 22 | 23 | let converter = SvgToReact::new(svg_content, component_name, config); 24 | 25 | match converter.convert_and_save() { 26 | Ok(path) => Ok(format!("{:?}", path)), 27 | Err(e) => Err(napi::Error::from_reason(e.to_string())), 28 | } 29 | } 30 | 31 | #[cfg(feature = "napi")] 32 | #[napi] 33 | pub fn validate_svg(content: String) -> bool { 34 | use regex::Regex; 35 | let re = Regex::new(r"(?s)]*>.*?").unwrap(); 36 | re.is_match(&content) 37 | } 38 | 39 | // Re-export modules for binary usage 40 | pub mod args; 41 | pub mod parser; 42 | pub mod asset; 43 | pub mod content; 44 | pub mod convert; 45 | pub mod default; -------------------------------------------------------------------------------- /src/parser.rs: -------------------------------------------------------------------------------- 1 | use std::{path::PathBuf}; 2 | 3 | use regex::Regex; 4 | 5 | /// Parses the directory where the icon is to be stored 6 | pub fn directory_parser(s: &str) -> Result { 7 | match PathBuf::try_from(s) { 8 | Ok(_path) => { 9 | Ok(s.to_string()) 10 | }, 11 | Err(_) => { 12 | Err("Invalid icon destination".to_string()) 13 | } 14 | } 15 | } 16 | 17 | /// Checks if the size is actually a valid value 18 | pub fn size_parser(s: &str) -> Result { 19 | let num = s.parse::(); 20 | match num { 21 | Ok(num) => { 22 | if num > 0 { 23 | return Ok(num); 24 | } else { 25 | return Err("The size of the icon cannot be 0".to_string()); 26 | } 27 | }, 28 | Err(_) => { 29 | return Err("Please enter a valid number greater than 0 for the size".to_string()) 30 | } 31 | } 32 | } 33 | 34 | /// Checks if a string is actually an svg 35 | pub fn svg_validator(s: &str) -> bool { 36 | let pattern = r#"(?s)]*>.*?"#; 37 | let re = Regex::new(pattern).unwrap(); 38 | let tag = re.captures(&s); 39 | match tag { 40 | None => false, 41 | Some(_) => true 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "quickicon" 3 | version = "0.1.0" 4 | edition = "2021" 5 | authors = ["Fola azeezabass2005@gmail.com"] 6 | description = "Convert SVGs to React components instantly from clipboard, files, or URLs" 7 | license = "MIT" 8 | repository = "https://github.com/azeezabass2005/quickicon" 9 | keywords = ["svg", "react", "cli", "component", "icon"] 10 | categories = ["command-line-utilities", "development-tools"] 11 | 12 | [[bin]] 13 | name = "quickicon" 14 | path = "src/main.rs" 15 | 16 | [lib] 17 | name = "quickicon" 18 | crate-type = ["cdylib", "lib"] 19 | 20 | 21 | [dependencies] 22 | clap = { version = "4.5.48", features = ["derive"] } 23 | arboard = "3.6.1" 24 | regex = "1.11.3" 25 | serde = { version = "1.0", features = ["derive"] } 26 | serde_json = "1.0" 27 | reqwest = { version = "0.12", features = ["json", "rustls-tls"], default-features = false } 28 | tokio = { version = "1", features = ["full"] } 29 | dialoguer = "0.12.0" 30 | napi = { version = "3.3.0", features = ["async"], optional = true } 31 | napi-derive = { version = "3.2.5", optional = true } 32 | 33 | 34 | [build-dependencies] 35 | napi-build = { version = "2.2.3", optional = true } 36 | 37 | 38 | [features] 39 | default = [] 40 | napi = ["dep:napi", "dep:napi-derive", "dep:napi-build"] 41 | 42 | [profile.release] 43 | lto = true 44 | codegen-units = 1 45 | strip = true -------------------------------------------------------------------------------- /src/args.rs: -------------------------------------------------------------------------------- 1 | use clap::{Parser}; 2 | use crate::parser::{directory_parser, size_parser}; 3 | 4 | #[derive(Parser, PartialEq, Debug)] 5 | #[command(version)] 6 | pub struct Args { 7 | /// Use JavaScript instead of TypeScript (use --language=typescript to switch back) 8 | #[arg(long, short, value_name = "LANG", value_parser = ["typescript", "javascript"])] 9 | pub language: Option, 10 | 11 | /// The name of the react component for the icon e.g EyeIcon 12 | #[arg( 13 | long, 14 | short, 15 | )] 16 | pub icon_name: String, 17 | 18 | /// The path to the file on your computer or the online url 19 | #[arg( 20 | long, 21 | short, 22 | )] 23 | pub path: Option, 24 | 25 | /// The destination folder of the icon 26 | #[arg( 27 | long, 28 | short, 29 | value_parser = directory_parser 30 | )] 31 | pub destination: Option, 32 | 33 | /// Specify custom size of the icon you want to create, defaults to 24 34 | #[ 35 | arg( 36 | long, 37 | short, 38 | value_parser = size_parser 39 | ) 40 | ] 41 | pub size: Option, 42 | 43 | /// Remember the folder destination and the language for subsequent icons 44 | #[arg( 45 | long, 46 | short = 'D' 47 | )] 48 | pub default: bool, 49 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "quickicon", 3 | "version": "0.1.0", 4 | "description": "Convert SVGs to React components instantly from clipboard, files, or URLs", 5 | "main": "index.js", 6 | "types": "index.d.ts", 7 | "bin": { 8 | "quickicon": "./cli.js" 9 | }, 10 | "napi": { 11 | "binaryName": "quickicon", 12 | "targets": [ 13 | "aarch64-apple-darwin", 14 | "aarch64-pc-windows-msvc", 15 | "aarch64-unknown-linux-gnu", 16 | "armv7-unknown-linux-gnueabihf", 17 | "x86_64-apple-darwin", 18 | "x86_64-pc-windows-msvc", 19 | "x86_64-unknown-linux-gnu", 20 | "x86_64-unknown-linux-musl" 21 | ] 22 | }, 23 | "files": [ 24 | "index.js", 25 | "index.d.ts", 26 | "cli.js", 27 | "!src" 28 | ], 29 | "scripts": { 30 | "artifacts": "napi artifacts", 31 | "build": "napi build --platform --release --features napi", 32 | "build:debug": "napi build --platform --features napi", 33 | "prepublishOnly": "napi prepublish -t npm", 34 | "version": "napi version" 35 | }, 36 | "keywords": [ 37 | "svg", 38 | "react", 39 | "icon", 40 | "component", 41 | "cli", 42 | "converter" 43 | ], 44 | "author": "Fola azeezabass2005@gmail.com", 45 | "license": "MIT", 46 | "repository": { 47 | "type": "git", 48 | "url": "https://github.com/azeezabass2005/quickicon.git" 49 | }, 50 | "devDependencies": { 51 | "@napi-rs/cli": "3.3.0" 52 | }, 53 | "engines": { 54 | "node": ">= 20" 55 | } 56 | } -------------------------------------------------------------------------------- /cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const { spawnSync } = require('child_process'); 4 | const path = require('path'); 5 | const fs = require('fs'); 6 | 7 | // Determine the platform-specific binary name 8 | function getBinaryPath() { 9 | const platform = process.platform; 10 | const arch = process.arch; 11 | 12 | let binaryName = 'quickicon'; 13 | if (platform === 'win32') { 14 | binaryName = 'quickicon.exe'; 15 | } 16 | 17 | const optionalDeps = { 18 | 'linux-x64-gnu': 'quickicon-linux-x64-gnu', 19 | 'linux-arm64-gnu': 'quickicon-linux-arm64-gnu', 20 | 'linux-x64-musl': 'quickicon-linux-x64-musl', 21 | 'darwin-x64': 'quickicon-darwin-x64', 22 | 'darwin-arm64': 'quickicon-darwin-arm64', 23 | 'win32-x64-msvc': 'quickicon-win32-x64-msvc', 24 | 'win32-arm64-msvc': 'quickicon-win32-arm64-msvc', 25 | 'linux-arm-gnueabihf': 'quickicon-linux-arm-gnueabihf' 26 | }; 27 | 28 | const key = `${platform}-${arch === 'x64' ? 'x64' : 'arm64'}`; 29 | const packageName = optionalDeps[key]; 30 | 31 | if (packageName) { 32 | const binaryPath = path.join( 33 | __dirname, 34 | 'node_modules', 35 | packageName, 36 | binaryName 37 | ); 38 | 39 | if (fs.existsSync(binaryPath)) { 40 | return binaryPath; 41 | } 42 | } 43 | 44 | const fallbackPath = path.join(__dirname, binaryName); 45 | if (fs.existsSync(fallbackPath)) { 46 | return fallbackPath; 47 | } 48 | 49 | console.error('Error: Could not find quickicon binary for your platform.'); 50 | console.error(`Platform: ${platform}, Architecture: ${arch}`); 51 | process.exit(1); 52 | } 53 | 54 | const binaryPath = getBinaryPath(); 55 | const result = spawnSync(binaryPath, process.argv.slice(2), { 56 | stdio: 'inherit', 57 | }); 58 | 59 | process.exit(result.status || 0); -------------------------------------------------------------------------------- /src/default.rs: -------------------------------------------------------------------------------- 1 | use std::{fs, path::PathBuf}; 2 | 3 | use crate::args::Args; 4 | use serde::{Serialize, Deserialize}; 5 | use serde_json; 6 | 7 | #[derive(Serialize, Deserialize, Debug)] 8 | pub struct Config { 9 | pub is_javascript: bool, 10 | pub destination_folder: PathBuf, 11 | pub size: u32, 12 | } 13 | 14 | /// Get the config if it's not provided and saves it as default if specified in the argument 15 | pub fn get_and_save_config(args: &Args) -> Result> { 16 | let config_file_path = PathBuf::from("./quickicon.json"); 17 | let default_destination = PathBuf::from("./public/assets/icon"); 18 | let default_size = 24; 19 | 20 | let mut config = if config_file_path.exists() { 21 | serde_json::from_str(&fs::read_to_string(&config_file_path)?).unwrap_or_else(|_| Config { 22 | is_javascript: false, 23 | destination_folder: default_destination, 24 | size: default_size 25 | }) 26 | } else { 27 | Config { 28 | is_javascript: false, 29 | destination_folder: default_destination, 30 | size: default_size 31 | } 32 | }; 33 | 34 | if let Some(dest) = &args.destination { 35 | config.destination_folder = PathBuf::from(dest); 36 | } 37 | 38 | if let Some(lang) = &args.language { 39 | config.is_javascript = lang == "javascript"; 40 | } 41 | 42 | if let Some(size) = args.size { 43 | config.size = size 44 | } 45 | 46 | if args.default { 47 | save_config(&config_file_path, &config)?; 48 | } 49 | 50 | Ok(config) 51 | } 52 | 53 | fn save_config(path: &PathBuf, config: &Config) -> Result<(), Box> { 54 | let json_config = serde_json::to_string(config)?; 55 | fs::write(path, json_config)?; 56 | Ok(()) 57 | } -------------------------------------------------------------------------------- /src/content.rs: -------------------------------------------------------------------------------- 1 | use std::{fs, path::PathBuf}; 2 | use crate::{args::Args, parser::svg_validator}; 3 | use arboard::Clipboard; 4 | use regex::Regex; 5 | 6 | pub async fn get_content(args: &Args) -> Result> { 7 | match &args.path { 8 | Some(path) => { 9 | // What I want to do here is read the file or read the url 10 | 11 | if path.starts_with("https://") || path.starts_with("www.") { 12 | let response = reqwest::get(path).await?; 13 | let body = response.text().await?; 14 | 15 | let pattern = r#"(?s)]*>.*?"#; 16 | 17 | let re = Regex::new(pattern)?; 18 | let tag = re.captures(&body); 19 | match tag { 20 | None => { 21 | return Err("There is no svg returned from the provided url".into()); 22 | }, 23 | Some(svg_tag) => { 24 | return Ok(svg_tag[0].to_string()); 25 | } 26 | } 27 | } else { 28 | let path = PathBuf::try_from(path).unwrap(); 29 | 30 | if let Some(extension) = path.extension() { 31 | if extension == "svg" || extension == "txt" { 32 | match fs::read_to_string(path) { 33 | Ok(content) => { 34 | if svg_validator(&content) { 35 | Ok(content) 36 | } else { 37 | Err("The file you provided does not contain a valid svg element.".into()) 38 | } 39 | }, 40 | Err(_err) => { 41 | Err("An error occurred while reading the provided svg file".into()) 42 | } 43 | } 44 | } else { 45 | Err("Only .svg or .txt files are allowed".into()) 46 | } 47 | } else { 48 | Err("File has no extension and only .svg or .txt files are allowed".into()) 49 | } 50 | } 51 | }, 52 | None => { 53 | let mut clipboard = Clipboard::new().unwrap(); 54 | let clipboard_text_content = clipboard.get_text().unwrap(); 55 | if svg_validator(&clipboard_text_content) { 56 | Ok(clipboard_text_content) 57 | } else { 58 | Err("Your clipboard text content is not a valid svg.".into()) 59 | } 60 | 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /install.ps1: -------------------------------------------------------------------------------- 1 | # Installer Script for Windows 2 | 3 | $ErrorActionPreference = "Stop" 4 | 5 | $Repo = "azeezabass2005/quickicon" 6 | $InstallDir = if ($env:QUICKICON_INSTALL_DIR) { $env:QUICKICON_INSTALL_DIR } else { "$env:LOCALAPPDATA\quickicon" } 7 | $BinDir = "$InstallDir\bin" 8 | 9 | Write-Host "QuickIcon Installer" -ForegroundColor Green 10 | Write-Host "================================" 11 | 12 | $Arch = if ([Environment]::Is64BitOperatingSystem) { "x86_64" } else { "x86" } 13 | Write-Host "Detected architecture: $Arch" -ForegroundColor Yellow 14 | 15 | Write-Host "Fetching latest release..." 16 | try { 17 | $LatestRelease = (Invoke-RestMethod -Uri "https://api.github.com/repos/$Repo/releases/latest").tag_name 18 | Write-Host "Latest version: $LatestRelease" -ForegroundColor Green 19 | } catch { 20 | Write-Host "Failed to fetch latest release" -ForegroundColor Red 21 | exit 1 22 | } 23 | 24 | $BinaryName = "quickicon-windows-$Arch.exe" 25 | $DownloadUrl = "https://github.com/$Repo/releases/download/$LatestRelease/$BinaryName.zip" 26 | 27 | Write-Host "Downloading from: $DownloadUrl" 28 | 29 | $TmpDir = New-Item -ItemType Directory -Path "$env:TEMP\quickicon-install-$(Get-Random)" -Force 30 | 31 | try { 32 | $ZipPath = "$TmpDir\quickicon.zip" 33 | Invoke-WebRequest -Uri $DownloadUrl -OutFile $ZipPath 34 | 35 | if (-not (Test-Path $ZipPath)) { 36 | throw "Download failed" 37 | } 38 | 39 | Write-Host "Extracting..." 40 | Expand-Archive -Path $ZipPath -DestinationPath $TmpDir -Force 41 | 42 | New-Item -ItemType Directory -Path $InstallDir -Force | Out-Null 43 | New-Item -ItemType Directory -Path $BinDir -Force | Out-Null 44 | 45 | Write-Host "Installing to $BinDir..." 46 | Copy-Item -Path "$TmpDir\quickicon.exe" -Destination "$BinDir\quickicon.exe" -Force 47 | 48 | Write-Host "Installation complete!" -ForegroundColor Green 49 | Write-Host "" 50 | Write-Host "QuickIcon has been installed to: $BinDir" 51 | Write-Host "" 52 | 53 | $CurrentPath = [Environment]::GetEnvironmentVariable("Path", "User") 54 | if ($CurrentPath -notlike "*$BinDir*") { 55 | Write-Host "Adding to PATH..." -ForegroundColor Yellow 56 | 57 | $NewPath = "$CurrentPath;$BinDir" 58 | [Environment]::SetEnvironmentVariable("Path", $NewPath, "User") 59 | 60 | Write-Host "✓ Added to PATH" -ForegroundColor Green 61 | Write-Host "" 62 | Write-Host "Please restart your terminal for PATH changes to take effect." -ForegroundColor Yellow 63 | } else { 64 | Write-Host "✓ Already in PATH" -ForegroundColor Green 65 | Write-Host "You can now use 'quickicon' command!" -ForegroundColor Green 66 | } 67 | 68 | Write-Host "" 69 | Write-Host "Get started:" 70 | Write-Host " quickicon --icon-name MyIcon --path ./icon.svg" 71 | Write-Host "" 72 | Write-Host "For help:" 73 | Write-Host " quickicon --help" 74 | 75 | } catch { 76 | Write-Host "Installation failed: $_" -ForegroundColor Red 77 | exit 1 78 | } finally { 79 | Remove-Item -Path $TmpDir -Recurse -Force -ErrorAction SilentlyContinue 80 | } -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' 7 | workflow_dispatch: 8 | 9 | permissions: 10 | contents: write 11 | 12 | jobs: 13 | create-release: 14 | runs-on: ubuntu-latest 15 | outputs: 16 | upload_url: ${{ steps.create_release.outputs.upload_url }} 17 | version: ${{ steps.get_version.outputs.version }} 18 | steps: 19 | - name: Get version from tag 20 | id: get_version 21 | run: echo "version=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT 22 | 23 | - name: Create Release 24 | id: create_release 25 | uses: actions/create-release@v1 26 | env: 27 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 28 | with: 29 | tag_name: ${{ github.ref }} 30 | release_name: Release ${{ github.ref }} 31 | draft: false 32 | prerelease: false 33 | 34 | build-release: 35 | needs: create-release 36 | strategy: 37 | fail-fast: false 38 | matrix: 39 | include: 40 | # Linux x86_64 41 | - os: ubuntu-latest 42 | target: x86_64-unknown-linux-gnu 43 | asset_name: quickicon-linux-x86_64 44 | 45 | # Linux ARM64 46 | - os: ubuntu-latest 47 | target: aarch64-unknown-linux-gnu 48 | asset_name: quickicon-linux-aarch64 49 | 50 | # macOS x86_64 (Intel) 51 | - os: macos-latest 52 | target: x86_64-apple-darwin 53 | asset_name: quickicon-macos-x86_64 54 | 55 | # macOS ARM64 (Apple Silicon) 56 | - os: macos-latest 57 | target: aarch64-apple-darwin 58 | asset_name: quickicon-macos-aarch64 59 | 60 | # Windows x86_64 61 | - os: windows-latest 62 | target: x86_64-pc-windows-msvc 63 | asset_name: quickicon-windows-x86_64.exe 64 | 65 | runs-on: ${{ matrix.os }} 66 | 67 | steps: 68 | - name: Checkout code 69 | uses: actions/checkout@v4 70 | 71 | - name: Install Rust 72 | uses: dtolnay/rust-toolchain@stable 73 | with: 74 | targets: ${{ matrix.target }} 75 | 76 | - name: Install Linux dependencies 77 | if: runner.os == 'Linux' 78 | run: | 79 | sudo apt-get update 80 | sudo apt-get install -y pkg-config libssl-dev 81 | 82 | - name: Install cross-compilation tools (Linux ARM64) 83 | if: matrix.target == 'aarch64-unknown-linux-gnu' 84 | run: | 85 | sudo apt-get install -y gcc-aarch64-linux-gnu 86 | 87 | - name: Build (Unix) 88 | if: runner.os != 'Windows' 89 | run: | 90 | export PKG_CONFIG_ALLOW_CROSS=1 91 | 92 | # Set linker for aarch64 cross-compilation 93 | if [ "${{ matrix.target }}" = "aarch64-unknown-linux-gnu" ]; then 94 | export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc 95 | export RUSTFLAGS="-C linker=aarch64-linux-gnu-gcc" 96 | fi 97 | 98 | cargo build --release --target ${{ matrix.target }} 99 | shell: bash 100 | 101 | - name: Build (Windows) 102 | if: runner.os == 'Windows' 103 | run: | 104 | # No OpenSSL needed for rustls 105 | # $env:OPENSSL_STATIC = "1" 106 | cargo build --release --target ${{ matrix.target }} 107 | shell: pwsh 108 | 109 | - name: Prepare binary (Unix) 110 | if: matrix.os != 'windows-latest' 111 | run: | 112 | cd target/${{ matrix.target }}/release 113 | strip quickicon || true 114 | chmod +x quickicon 115 | tar czf ${{ matrix.asset_name }}.tar.gz quickicon 116 | mv ${{ matrix.asset_name }}.tar.gz ../../../ 117 | 118 | - name: Prepare binary (Windows) 119 | if: matrix.os == 'windows-latest' 120 | run: | 121 | cd target/${{ matrix.target }}/release 122 | 7z a ../../../${{ matrix.asset_name }}.zip quickicon.exe 123 | 124 | - name: Upload Release Asset (Unix) 125 | if: matrix.os != 'windows-latest' 126 | uses: actions/upload-release-asset@v1 127 | env: 128 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 129 | with: 130 | upload_url: ${{ needs.create-release.outputs.upload_url }} 131 | asset_path: ./${{ matrix.asset_name }}.tar.gz 132 | asset_name: ${{ matrix.asset_name }}.tar.gz 133 | asset_content_type: application/gzip 134 | 135 | - name: Upload Release Asset (Windows) 136 | if: matrix.os == 'windows-latest' 137 | uses: actions/upload-release-asset@v1 138 | env: 139 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 140 | with: 141 | upload_url: ${{ needs.create-release.outputs.upload_url }} 142 | asset_path: ./${{ matrix.asset_name }}.zip 143 | asset_name: ${{ matrix.asset_name }}.zip 144 | asset_content_type: application/zip -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { existsSync, readFileSync } = require('fs'); 2 | const { join } = require('path'); 3 | 4 | const { platform, arch } = process; 5 | 6 | let nativeBinding = null; 7 | let localFileExisted = false; 8 | let loadError = null; 9 | 10 | function isMusl() { 11 | if (!process.report || typeof process.report.getReport !== 'function') { 12 | try { 13 | const lddPath = require('child_process').execSync('which ldd').toString().trim(); 14 | return readFileSync(lddPath, 'utf8').includes('musl'); 15 | } catch (e) { 16 | return true; 17 | } 18 | } else { 19 | const { glibcVersionRuntime } = process.report.getReport().header; 20 | return !glibcVersionRuntime; 21 | } 22 | } 23 | 24 | switch (platform) { 25 | case 'android': 26 | switch (arch) { 27 | case 'arm64': 28 | localFileExisted = existsSync(join(__dirname, 'quickicon.android-arm64.node')); 29 | try { 30 | if (localFileExisted) { 31 | nativeBinding = require('./quickicon.android-arm64.node'); 32 | } else { 33 | nativeBinding = require('@quickicon/android-arm64'); 34 | } 35 | } catch (e) { 36 | loadError = e; 37 | } 38 | break; 39 | case 'arm': 40 | localFileExisted = existsSync(join(__dirname, 'quickicon.android-arm-eabi.node')); 41 | try { 42 | if (localFileExisted) { 43 | nativeBinding = require('./quickicon.android-arm-eabi.node'); 44 | } else { 45 | nativeBinding = require('@quickicon/android-arm-eabi'); 46 | } 47 | } catch (e) { 48 | loadError = e; 49 | } 50 | break; 51 | default: 52 | throw new Error(`Unsupported architecture on Android ${arch}`); 53 | } 54 | break; 55 | case 'win32': 56 | switch (arch) { 57 | case 'x64': 58 | localFileExisted = existsSync(join(__dirname, 'quickicon.win32-x64-msvc.node')); 59 | try { 60 | if (localFileExisted) { 61 | nativeBinding = require('./quickicon.win32-x64-msvc.node'); 62 | } else { 63 | nativeBinding = require('@quickicon/win32-x64-msvc'); 64 | } 65 | } catch (e) { 66 | loadError = e; 67 | } 68 | break; 69 | case 'ia32': 70 | localFileExisted = existsSync(join(__dirname, 'quickicon.win32-ia32-msvc.node')); 71 | try { 72 | if (localFileExisted) { 73 | nativeBinding = require('./quickicon.win32-ia32-msvc.node'); 74 | } else { 75 | nativeBinding = require('@quickicon/win32-ia32-msvc'); 76 | } 77 | } catch (e) { 78 | loadError = e; 79 | } 80 | break; 81 | case 'arm64': 82 | localFileExisted = existsSync(join(__dirname, 'quickicon.win32-arm64-msvc.node')); 83 | try { 84 | if (localFileExisted) { 85 | nativeBinding = require('./quickicon.win32-arm64-msvc.node'); 86 | } else { 87 | nativeBinding = require('@quickicon/win32-arm64-msvc'); 88 | } 89 | } catch (e) { 90 | loadError = e; 91 | } 92 | break; 93 | default: 94 | throw new Error(`Unsupported architecture on Windows: ${arch}`); 95 | } 96 | break; 97 | case 'darwin': 98 | localFileExisted = existsSync(join(__dirname, 'quickicon.darwin-universal.node')); 99 | try { 100 | if (localFileExisted) { 101 | nativeBinding = require('./quickicon.darwin-universal.node'); 102 | } else { 103 | nativeBinding = require('@quickicon/darwin-universal'); 104 | } 105 | break; 106 | } catch {} 107 | switch (arch) { 108 | case 'x64': 109 | localFileExisted = existsSync(join(__dirname, 'quickicon.darwin-x64.node')); 110 | try { 111 | if (localFileExisted) { 112 | nativeBinding = require('./quickicon.darwin-x64.node'); 113 | } else { 114 | nativeBinding = require('@quickicon/darwin-x64'); 115 | } 116 | } catch (e) { 117 | loadError = e; 118 | } 119 | break; 120 | case 'arm64': 121 | localFileExisted = existsSync(join(__dirname, 'quickicon.darwin-arm64.node')); 122 | try { 123 | if (localFileExisted) { 124 | nativeBinding = require('./quickicon.darwin-arm64.node'); 125 | } else { 126 | nativeBinding = require('@quickicon/darwin-arm64'); 127 | } 128 | } catch (e) { 129 | loadError = e; 130 | } 131 | break; 132 | default: 133 | throw new Error(`Unsupported architecture on macOS: ${arch}`); 134 | } 135 | break; 136 | case 'freebsd': 137 | if (arch !== 'x64') { 138 | throw new Error(`Unsupported architecture on FreeBSD: ${arch}`); 139 | } 140 | localFileExisted = existsSync(join(__dirname, 'quickicon.freebsd-x64.node')); 141 | try { 142 | if (localFileExisted) { 143 | nativeBinding = require('./quickicon.freebsd-x64.node'); 144 | } else { 145 | nativeBinding = require('@quickicon/freebsd-x64'); 146 | } 147 | } catch (e) { 148 | loadError = e; 149 | } 150 | break; 151 | case 'linux': 152 | switch (arch) { 153 | case 'x64': 154 | if (isMusl()) { 155 | localFileExisted = existsSync(join(__dirname, 'quickicon.linux-x64-musl.node')); 156 | try { 157 | if (localFileExisted) { 158 | nativeBinding = require('./quickicon.linux-x64-musl.node'); 159 | } else { 160 | nativeBinding = require('@quickicon/linux-x64-musl'); 161 | } 162 | } catch (e) { 163 | loadError = e; 164 | } 165 | } else { 166 | localFileExisted = existsSync(join(__dirname, 'quickicon.linux-x64-gnu.node')); 167 | try { 168 | if (localFileExisted) { 169 | nativeBinding = require('./quickicon.linux-x64-gnu.node'); 170 | } else { 171 | nativeBinding = require('@quickicon/linux-x64-gnu'); 172 | } 173 | } catch (e) { 174 | loadError = e; 175 | } 176 | } 177 | break; 178 | case 'arm64': 179 | if (isMusl()) { 180 | localFileExisted = existsSync(join(__dirname, 'quickicon.linux-arm64-musl.node')); 181 | try { 182 | if (localFileExisted) { 183 | nativeBinding = require('./quickicon.linux-arm64-musl.node'); 184 | } else { 185 | nativeBinding = require('@quickicon/linux-arm64-musl'); 186 | } 187 | } catch (e) { 188 | loadError = e; 189 | } 190 | } else { 191 | localFileExisted = existsSync(join(__dirname, 'quickicon.linux-arm64-gnu.node')); 192 | try { 193 | if (localFileExisted) { 194 | nativeBinding = require('./quickicon.linux-arm64-gnu.node'); 195 | } else { 196 | nativeBinding = require('@quickicon/linux-arm64-gnu'); 197 | } 198 | } catch (e) { 199 | loadError = e; 200 | } 201 | } 202 | break; 203 | case 'arm': 204 | localFileExisted = existsSync(join(__dirname, 'quickicon.linux-arm-gnueabihf.node')); 205 | try { 206 | if (localFileExisted) { 207 | nativeBinding = require('./quickicon.linux-arm-gnueabihf.node'); 208 | } else { 209 | nativeBinding = require('@quickicon/linux-arm-gnueabihf'); 210 | } 211 | } catch (e) { 212 | loadError = e; 213 | } 214 | break; 215 | default: 216 | throw new Error(`Unsupported architecture on Linux: ${arch}`); 217 | } 218 | break; 219 | default: 220 | throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`); 221 | } 222 | 223 | if (!nativeBinding) { 224 | if (loadError) { 225 | throw loadError; 226 | } 227 | throw new Error(`Failed to load native binding`); 228 | } 229 | 230 | const { convertSvgToReact, validateSvg } = nativeBinding; 231 | 232 | module.exports.convertSvgToReact = convertSvgToReact; 233 | module.exports.validateSvg = validateSvg; -------------------------------------------------------------------------------- /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | name: NPM Publish 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' 7 | workflow_dispatch: 8 | 9 | permissions: 10 | contents: write 11 | id-token: write 12 | 13 | jobs: 14 | build: 15 | strategy: 16 | fail-fast: false 17 | matrix: 18 | settings: 19 | - host: macos-latest 20 | target: x86_64-apple-darwin 21 | build: yarn build --target x86_64-apple-darwin 22 | - host: macos-latest 23 | target: aarch64-apple-darwin 24 | build: yarn build --target aarch64-apple-darwin 25 | - host: windows-latest 26 | target: x86_64-pc-windows-msvc 27 | build: yarn build --target x86_64-pc-windows-msvc 28 | - host: windows-latest 29 | target: aarch64-pc-windows-msvc 30 | build: yarn build --target aarch64-pc-windows-msvc 31 | - host: ubuntu-latest 32 | target: x86_64-unknown-linux-gnu 33 | build: yarn build --target x86_64-unknown-linux-gnu 34 | - host: ubuntu-latest 35 | target: x86_64-unknown-linux-musl 36 | build: yarn build --target x86_64-unknown-linux-musl 37 | - host: ubuntu-latest 38 | target: aarch64-unknown-linux-gnu 39 | build: yarn build --target aarch64-unknown-linux-gnu 40 | # Having little issues with the musl ring library, I will come back to this later, for now Alipine Users should just use gnu version. 41 | # - host: ubuntu-latest 42 | # target: aarch64-unknown-linux-musl 43 | # build: yarn build --target aarch64-unknown-linux-musl 44 | - host: ubuntu-latest 45 | target: armv7-unknown-linux-gnueabihf 46 | build: yarn build --target armv7-unknown-linux-gnueabihf 47 | 48 | name: Build ${{ matrix.settings.target }} 49 | runs-on: ${{ matrix.settings.host }} 50 | 51 | steps: 52 | - uses: actions/checkout@v4 53 | 54 | - name: Setup Node.js 55 | uses: actions/setup-node@v4 56 | with: 57 | node-version: 20 58 | cache: yarn 59 | 60 | - name: Install Rust 61 | uses: dtolnay/rust-toolchain@stable 62 | with: 63 | targets: ${{ matrix.settings.target }} 64 | 65 | - name: Setup Rust cache 66 | uses: Swatinem/rust-cache@v2 67 | with: 68 | key: ${{ matrix.settings.target }} 69 | 70 | - name: Install dependencies 71 | run: yarn install --frozen-lockfile 72 | 73 | - name: Install Linux dependencies 74 | if: runner.os == 'Linux' 75 | run: | 76 | sudo apt-get update 77 | sudo apt-get install -y pkg-config libssl-dev 78 | 79 | - name: Setup musl tools (Linux musl) 80 | if: contains(matrix.settings.target, 'musl') 81 | run: | 82 | sudo apt-get update 83 | sudo apt-get install -y musl-tools 84 | # For aarch64 musl, use the correct package 85 | if [ "${{ matrix.settings.target }}" = "aarch64-unknown-linux-musl" ]; then 86 | sudo apt-get install -y musl-dev musl 87 | fi 88 | 89 | - name: Setup cross-compile tools (Linux ARM) 90 | if: contains(matrix.settings.target, 'aarch64-unknown-linux') || contains(matrix.settings.target, 'armv7') 91 | run: | 92 | sudo apt-get update 93 | sudo apt-get install -y gcc-aarch64-linux-gnu gcc-arm-linux-gnueabihf 94 | # Also install the corresponding standard libraries 95 | sudo apt-get install -y libc6-dev-arm64-cross libc6-dev-armhf-cross 96 | 97 | - name: Build (Unix) 98 | if: runner.os != 'Windows' 99 | run: | 100 | # Set linker for cross-compilation 101 | if [ "${{ matrix.settings.target }}" = "aarch64-unknown-linux-gnu" ]; then 102 | export CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc 103 | export RUSTFLAGS="-C linker=aarch64-linux-gnu-gcc" 104 | elif [ "${{ matrix.settings.target }}" = "armv7-unknown-linux-gnueabihf" ]; then 105 | export CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc 106 | export RUSTFLAGS="-C linker=arm-linux-gnueabihf-gcc" 107 | elif [ "${{ matrix.settings.target }}" = "aarch64-unknown-linux-musl" ]; then 108 | # For musl, we need to use the correct linker and flags 109 | export RUSTFLAGS="-C linker=musl-gcc -C link-arg=-lc -C link-arg=-lm" 110 | elif echo "${{ matrix.settings.target }}" | grep "musl" > /dev/null; then 111 | # For other musl targets 112 | export RUSTFLAGS="-C link-arg=-lc -C link-arg=-lm" 113 | fi 114 | 115 | # Set up cross-compilation environment 116 | export PKG_CONFIG_ALLOW_CROSS=1 117 | export RUST_BACKTRACE=1 118 | 119 | ${{ matrix.settings.build }} 120 | shell: bash 121 | 122 | - name: Build (Windows) 123 | if: runner.os == 'Windows' 124 | run: | 125 | # No OpenSSL needed for rustls 126 | # $env:OPENSSL_STATIC = "1" 127 | ${{ matrix.settings.build }} 128 | shell: pwsh 129 | 130 | - name: Upload artifact 131 | uses: actions/upload-artifact@v4 132 | with: 133 | name: bindings-${{ matrix.settings.target }} 134 | path: | 135 | *.node 136 | if-no-files-found: error 137 | 138 | publish: 139 | name: Publish to NPM 140 | runs-on: ubuntu-latest 141 | needs: build 142 | 143 | steps: 144 | - uses: actions/checkout@v4 145 | 146 | - name: Setup Node.js 147 | uses: actions/setup-node@v4 148 | with: 149 | node-version: 20 150 | cache: yarn 151 | registry-url: 'https://registry.npmjs.org' 152 | 153 | - name: Install dependencies 154 | run: yarn install --frozen-lockfile 155 | 156 | - name: Download all artifacts 157 | uses: actions/download-artifact@v4 158 | with: 159 | path: artifacts 160 | 161 | - name: Move artifacts manually 162 | run: | 163 | # Create the npm directory structure manually 164 | mkdir -p npm 165 | 166 | # Create all the target directories first 167 | mkdir -p npm/darwin-arm64 168 | mkdir -p npm/darwin-x64 169 | mkdir -p npm/win32-arm64-msvc 170 | mkdir -p npm/win32-x64-msvc 171 | mkdir -p npm/linux-arm64-gnu 172 | mkdir -p npm/linux-arm-gnueabihf 173 | mkdir -p npm/linux-x64-gnu 174 | mkdir -p npm/linux-x64-musl 175 | 176 | # Copy each .node file to the correct directory 177 | cp artifacts/bindings-aarch64-apple-darwin/*.node npm/darwin-arm64/quickicon.darwin-arm64.node 178 | cp artifacts/bindings-x86_64-apple-darwin/*.node npm/darwin-x64/quickicon.darwin-x64.node 179 | cp artifacts/bindings-aarch64-pc-windows-msvc/*.node npm/win32-arm64-msvc/quickicon.win32-arm64-msvc.node 180 | cp artifacts/bindings-x86_64-pc-windows-msvc/*.node npm/win32-x64-msvc/quickicon.win32-x64-msvc.node 181 | cp artifacts/bindings-aarch64-unknown-linux-gnu/*.node npm/linux-arm64-gnu/quickicon.linux-arm64-gnu.node 182 | cp artifacts/bindings-armv7-unknown-linux-gnueabihf/*.node npm/linux-arm-gnueabihf/quickicon.linux-arm-gnueabihf.node 183 | cp artifacts/bindings-x86_64-unknown-linux-gnu/*.node npm/linux-x64-gnu/quickicon.linux-x64-gnu.node 184 | cp artifacts/bindings-x86_64-unknown-linux-musl/*.node npm/linux-x64-musl/quickicon.linux-x64-musl.node 185 | 186 | # Copy the main JS files to the root npm directory 187 | cp index.js npm/ 188 | cp index.d.ts npm/ 189 | cp cli.js npm/ 190 | cp README.md npm/ || true 191 | cp package.json npm/ || true 192 | 193 | echo "Manual artifacts copy completed successfully" 194 | 195 | - name: List packages 196 | run: ls -R ./npm 197 | shell: bash 198 | 199 | - name: Publish to NPM 200 | run: | 201 | npm config set provenance true 202 | if git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+$"; then 203 | echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc 204 | npm publish --access public 205 | elif git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+"; then 206 | echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc 207 | npm publish --tag next --access public 208 | else 209 | echo "Not a release, skipping publish" 210 | fi 211 | env: 212 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 213 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /installation.md: -------------------------------------------------------------------------------- 1 | # Installation Guide 2 | 3 | QuickIcon can be installed in multiple ways depending on your platform and preferences. 4 | 5 | ## Table of Contents 6 | - [Quick Install (Recommended)](#quick-install-recommended) 7 | - [npm/yarn Installation](#npmyarn-installation) 8 | - [Manual Installation](#manual-installation) 9 | - [From Source](#from-source) 10 | - [Platform-Specific Notes](#platform-specific-notes) 11 | - [Verification](#verification) 12 | - [Troubleshooting](#troubleshooting) 13 | 14 | --- 15 | 16 | ## Quick Install (Recommended) 17 | 18 | ### Linux / macOS 19 | 20 | ```bash 21 | curl -fsSL https://raw.githubusercontent.com/azeezabass2005/quickicon/main/install.sh | bash 22 | ``` 23 | 24 | Or with wget: 25 | ```bash 26 | wget -qO- https://raw.githubusercontent.com/azeezabass2005/quickicon/main/install.sh | bash 27 | ``` 28 | 29 | ### Windows (PowerShell) 30 | 31 | Run PowerShell as Administrator: 32 | ```powershell 33 | irm https://raw.githubusercontent.com/azeezabass2005/quickicon/main/install.ps1 | iex 34 | ``` 35 | 36 | Or download and run: 37 | ```powershell 38 | Invoke-WebRequest -Uri "https://raw.githubusercontent.com/azeezabass2005/quickicon/main/install.ps1" -OutFile "install.ps1" 39 | .\install.ps1 40 | ``` 41 | 42 | 82 | 83 | ## Manual Installation 84 | 85 | ### 1. Download Pre-built Binaries 86 | 87 | Visit the [Releases page](https://github.com/azeezabass2005/quickicon/releases) and download the appropriate binary for your system: 88 | 89 | #### Linux 90 | - **x86_64**: `quickicon-linux-x86_64.tar.gz` 91 | - **ARM64**: `quickicon-linux-aarch64.tar.gz` 92 | 93 | #### macOS 94 | - **Intel (x86_64)**: `quickicon-macos-x86_64.tar.gz` 95 | - **Apple Silicon (ARM64)**: `quickicon-macos-aarch64.tar.gz` 96 | 97 | #### Windows 98 | - **64-bit**: `quickicon-windows-x86_64.exe.zip` 99 | 100 | ### 2. Extract and Install 101 | 102 | #### Linux / macOS 103 | 104 | ```bash 105 | # Extract the archive 106 | tar -xzf quickicon-*.tar.gz 107 | 108 | # Move to a directory in your PATH 109 | sudo mv quickicon /usr/local/bin/ 110 | 111 | # Make it executable (if needed) 112 | chmod +x /usr/local/bin/quickicon 113 | 114 | # Verify installation 115 | quickicon --help 116 | ``` 117 | 118 | #### Windows 119 | 120 | 1. Extract the ZIP file 121 | 2. Move `quickicon.exe` to a directory in your PATH (e.g., `C:\Program Files\quickicon\`) 122 | 3. Add that directory to your system PATH: 123 | - Right-click **This PC** → **Properties** 124 | - Click **Advanced system settings** 125 | - Click **Environment Variables** 126 | - Under **System Variables**, find and edit **Path** 127 | - Add the directory containing `quickicon.exe` 128 | 4. Restart your terminal and verify: 129 | ```powershell 130 | quickicon --help 131 | ``` 132 | 133 | --- 134 | 135 | ## From Source 136 | 137 | If you have Rust installed, you can build from source. 138 | 139 | ### Prerequisites 140 | 141 | - Rust 1.70.0 or higher ([install Rust](https://rustup.rs/)) 142 | - Git 143 | 144 | ### Build and Install 145 | 146 | ```bash 147 | # Clone the repository 148 | git clone https://github.com/azeezabass2005/quickicon.git 149 | cd quickicon 150 | 151 | # Build and install 152 | cargo install --path . 153 | 154 | # Verify installation 155 | quickicon --help 156 | ``` 157 | 158 | ### Development Build 159 | 160 | ```bash 161 | # Build without installing 162 | cargo build --release 163 | 164 | # The binary will be at target/release/quickicon 165 | ./target/release/quickicon --help 166 | ``` 167 | 168 | --- 169 | 170 | ## Platform-Specific Notes 171 | 172 | ### Linux 173 | 174 | #### Ubuntu/Debian 175 | No additional dependencies required. If you encounter issues with clipboard access, install: 176 | ```bash 177 | sudo apt-get install xclip xsel 178 | ``` 179 | 180 | #### Fedora/RHEL 181 | ```bash 182 | sudo dnf install xclip xsel 183 | ``` 184 | 185 | #### Arch Linux 186 | ```bash 187 | sudo pacman -S xclip xsel 188 | ``` 189 | 190 | #### Wayland Users 191 | For Wayland clipboard support: 192 | ```bash 193 | sudo apt-get install wl-clipboard # Ubuntu/Debian 194 | sudo dnf install wl-clipboard # Fedora 195 | ``` 196 | 197 | ### macOS 198 | 199 | #### Permissions 200 | On first run, you may need to grant clipboard access: 201 | 1. Go to **System Preferences** → **Security & Privacy** → **Privacy** 202 | 2. Grant access to **Accessibility** or **Automation** if prompted 203 | 204 | #### Homebrew (Coming Soon) 205 | ```bash 206 | brew install quickicon 207 | ``` 208 | 209 | ### Windows 210 | 211 | #### Windows Defender 212 | Windows Defender may flag the binary on first run. This is a false positive. You can: 213 | 1. Click **More info** → **Run anyway** 214 | 2. Or add an exclusion in Windows Security 215 | 216 | #### PowerShell Execution Policy 217 | If the installer script fails, you may need to adjust the execution policy: 218 | ```powershell 219 | Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 220 | ``` 221 | 222 | --- 223 | 224 | ## Verification 225 | 226 | After installation, verify QuickIcon is working: 227 | 228 | ```bash 229 | # Check version 230 | quickicon --version 231 | 232 | # View help 233 | quickicon --help 234 | 235 | # Test with a simple icon 236 | echo '' | quickicon --icon-name TestIcon 237 | ``` 238 | 239 | --- 240 | 241 | ## Troubleshooting 242 | 243 | ### "Command not found" error 244 | 245 | **Linux/macOS:** 246 | ```bash 247 | # Check if the binary is in your PATH 248 | which quickicon 249 | 250 | # If not found, add to PATH (add to ~/.bashrc or ~/.zshrc) 251 | export PATH="$PATH:$HOME/.local/bin" 252 | 253 | # Reload shell configuration 254 | source ~/.bashrc # or ~/.zshrc 255 | ``` 256 | 257 | **Windows:** 258 | ```powershell 259 | # Check if in PATH 260 | where.exe quickicon 261 | 262 | # If not found, add the installation directory to your PATH (see Manual Installation) 263 | ``` 264 | 265 | ### npm installation fails 266 | 267 | Try with sudo (Linux/macOS): 268 | ```bash 269 | sudo npm install -g quickicon 270 | ``` 271 | 272 | Or use a node version manager like [nvm](https://github.com/nvm-sh/nvm): 273 | ```bash 274 | nvm install 18 275 | nvm use 18 276 | npm install -g quickicon 277 | ``` 278 | 279 | ### Permission denied on Linux/macOS 280 | 281 | ```bash 282 | # Make the binary executable 283 | chmod +x /path/to/quickicon 284 | 285 | # Or reinstall with proper permissions 286 | sudo mv quickicon /usr/local/bin/ 287 | ``` 288 | 289 | ### Clipboard issues on Linux 290 | 291 | Install clipboard utilities: 292 | ```bash 293 | # For X11 294 | sudo apt-get install xclip xsel 295 | 296 | # For Wayland 297 | sudo apt-get install wl-clipboard 298 | ``` 299 | 300 | ### Windows SmartScreen warning 301 | 302 | This is normal for new executables. Click **More info** → **Run anyway**. 303 | 304 | To permanently allow: 305 | 1. Right-click the executable → **Properties** 306 | 2. Check **Unblock** at the bottom 307 | 3. Click **Apply** 308 | 309 | ### Build from source fails 310 | 311 | Ensure you have the latest Rust: 312 | ```bash 313 | rustup update stable 314 | cargo clean 315 | cargo build --release 316 | ``` 317 | 318 | --- 319 | 320 | ## Updating QuickIcon 321 | 322 | ### Via npm 323 | ```bash 324 | npm update -g quickicon 325 | ``` 326 | 327 | ### Via install script 328 | Re-run the installation script - it will automatically fetch the latest version. 329 | 330 | ### Manual update 331 | Download the latest binary from [Releases](https://github.com/azeezabass2005/quickicon/releases) and replace the existing one. 332 | 333 | --- 334 | 335 | ## Uninstallation 336 | 337 | ### npm installation 338 | ```bash 339 | npm uninstall -g quickicon 340 | ``` 341 | 342 | ### Manual installation (Linux/macOS) 343 | ```bash 344 | sudo rm /usr/local/bin/quickicon 345 | # Or wherever you installed it 346 | rm ~/.local/bin/quickicon 347 | rm -rf ~/.quickicon 348 | ``` 349 | 350 | ### Manual installation (Windows) 351 | 1. Delete `quickicon.exe` from your installation directory 352 | 2. Remove the directory from your PATH 353 | 3. Delete the `%LOCALAPPDATA%\quickicon` folder 354 | 355 | --- 356 | 357 | ## Getting Help 358 | 359 | If you encounter issues not covered here: 360 | 361 | 1. Check [existing issues](https://github.com/azeezabass2005/quickicon/issues) 362 | 2. Open a [new issue](https://github.com/azeezabass2005/quickicon/issues/new) 363 | 3. Join the [discussions](https://github.com/azeezabass2005/quickicon/discussions) 364 | 365 | Include the following information when reporting issues: 366 | - Operating system and version 367 | - Installation method 368 | - QuickIcon version (`quickicon --version`) 369 | - Complete error message 370 | - Steps to reproduce -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | RED='\033[0;31m' 6 | GREEN='\033[0;32m' 7 | YELLOW='\033[1;33m' 8 | BLUE='\033[0;34m' 9 | NC='\033[0m' 10 | 11 | REPO="azeezabass2005/quickicon" 12 | INSTALL_DIR="${INSTALL_DIR:-$HOME/.quickicon}" 13 | BIN_DIR="${BIN_DIR:-$HOME/.local/bin}" 14 | 15 | # Check for uninstall flag 16 | if [ "$1" = "--uninstall" ] || [ "$1" = "-u" ]; then 17 | echo -e "${YELLOW}Uninstalling QuickIcon...${NC}" 18 | 19 | # Remove installation directory 20 | if [ -d "$INSTALL_DIR" ]; then 21 | rm -rf "$INSTALL_DIR" 22 | echo -e "${GREEN}✓ Removed $INSTALL_DIR${NC}" 23 | fi 24 | 25 | # Remove symlink 26 | if [ -L "$BIN_DIR/quickicon" ]; then 27 | rm -f "$BIN_DIR/quickicon" 28 | echo -e "${GREEN}✓ Removed symlink $BIN_DIR/quickicon${NC}" 29 | fi 30 | 31 | # Remove from system bin if exists 32 | if [ -L "/usr/local/bin/quickicon" ]; then 33 | rm -f "/usr/local/bin/quickicon" 34 | echo -e "${GREEN}✓ Removed system symlink /usr/local/bin/quickicon${NC}" 35 | fi 36 | 37 | echo -e "${GREEN}🎉 QuickIcon uninstalled successfully!${NC}" 38 | echo "" 39 | echo "Note: PATH configuration in your shell rc file was not removed." 40 | echo "You can manually remove the line containing '$BIN_DIR' if desired." 41 | exit 0 42 | fi 43 | 44 | # Check for update flag or if already installed 45 | CURRENT_VERSION="" 46 | if [ -f "$INSTALL_DIR/version.info" ]; then 47 | source "$INSTALL_DIR/version.info" 2>/dev/null || true 48 | CURRENT_VERSION="$VERSION" 49 | fi 50 | 51 | IS_UPDATE=false 52 | if [ -n "$CURRENT_VERSION" ]; then 53 | if [ "$1" = "--update" ] || [ "$1" = "-U" ]; then 54 | IS_UPDATE=true 55 | echo -e "${BLUE}Updating QuickIcon...${NC}" 56 | echo -e "Current version: ${YELLOW}$CURRENT_VERSION${NC}" 57 | else 58 | echo -e "${YELLOW}QuickIcon $CURRENT_VERSION is already installed.${NC}" 59 | echo "" 60 | echo "To update to the latest version, run:" 61 | echo -e " ${GREEN}curl -fsSL https://raw.githubusercontent.com/azeezabass2005/quickicon/main/install.sh | bash -s -- --update${NC}" 62 | echo "" 63 | echo "Or continue with reinstallation:" 64 | read -p "Do you want to reinstall? (y/N): " -n 1 -r 65 | echo "" 66 | if [[ ! $REPLY =~ ^[Yy]$ ]]; then 67 | echo "Installation cancelled." 68 | exit 0 69 | fi 70 | IS_UPDATE=true 71 | fi 72 | fi 73 | 74 | if [ "$IS_UPDATE" = true ]; then 75 | echo -e "${BLUE}🔄 Updating QuickIcon...${NC}" 76 | else 77 | echo -e "${GREEN}QuickIcon Installer${NC}" 78 | fi 79 | echo "================================" 80 | 81 | OS=$(uname -s | tr '[:upper:]' '[:lower:]') 82 | ARCH=$(uname -m) 83 | 84 | case "$OS" in 85 | linux*) 86 | OS="linux" 87 | ;; 88 | darwin*) 89 | OS="macos" 90 | ;; 91 | *) 92 | echo -e "${RED}Unsupported OS: $OS${NC}" 93 | exit 1 94 | ;; 95 | esac 96 | 97 | case "$ARCH" in 98 | x86_64|amd64) 99 | ARCH="x86_64" 100 | ;; 101 | aarch64|arm64) 102 | ARCH="aarch64" 103 | ;; 104 | *) 105 | echo -e "${RED}Unsupported architecture: $ARCH${NC}" 106 | exit 1 107 | ;; 108 | esac 109 | 110 | BINARY_NAME="quickicon-${OS}-${ARCH}" 111 | echo -e "Detected: ${YELLOW}${OS} ${ARCH}${NC}" 112 | 113 | echo "Fetching latest release..." 114 | LATEST_RELEASE=$(curl -s "https://api.github.com/repos/${REPO}/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') 115 | 116 | if [ -z "$LATEST_RELEASE" ]; then 117 | echo -e "${RED}Failed to fetch latest release${NC}" 118 | exit 1 119 | fi 120 | 121 | # Check if update is needed 122 | if [ "$IS_UPDATE" = true ] && [ "$CURRENT_VERSION" = "$LATEST_RELEASE" ]; then 123 | echo -e "${GREEN}✅ You already have the latest version $LATEST_RELEASE${NC}" 124 | exit 0 125 | fi 126 | 127 | if [ "$IS_UPDATE" = true ]; then 128 | echo -e "Updating from ${YELLOW}$CURRENT_VERSION${NC} to ${GREEN}$LATEST_RELEASE${NC}" 129 | else 130 | echo -e "Latest version: ${GREEN}${LATEST_RELEASE}${NC}" 131 | fi 132 | 133 | DOWNLOAD_URL="https://github.com/${REPO}/releases/download/${LATEST_RELEASE}/${BINARY_NAME}.tar.gz" 134 | 135 | echo "Downloading from: $DOWNLOAD_URL" 136 | 137 | TMP_DIR=$(mktemp -d) 138 | trap "rm -rf $TMP_DIR" EXIT 139 | 140 | curl -sL "$DOWNLOAD_URL" -o "$TMP_DIR/quickicon.tar.gz" 141 | 142 | if [ $? -ne 0 ]; then 143 | echo -e "${RED}Download failed${NC}" 144 | exit 1 145 | fi 146 | 147 | echo "Extracting..." 148 | tar -xzf "$TMP_DIR/quickicon.tar.gz" -C "$TMP_DIR" 149 | 150 | # Backup old version if updating 151 | BACKUP_DIR="" 152 | if [ "$IS_UPDATE" = true ] && [ -d "$INSTALL_DIR" ]; then 153 | BACKUP_DIR="/tmp/quickicon-backup-$(date +%s)" 154 | mkdir -p "$BACKUP_DIR" 155 | cp -r "$INSTALL_DIR"/* "$BACKUP_DIR/" 2>/dev/null || true 156 | echo -e "${BLUE}📦 Backed up current version to $BACKUP_DIR${NC}" 157 | fi 158 | 159 | mkdir -p "$INSTALL_DIR" 160 | mkdir -p "$BIN_DIR" 161 | 162 | echo "Installing to $INSTALL_DIR..." 163 | mv "$TMP_DIR/quickicon" "$INSTALL_DIR/quickicon" 164 | chmod +x "$INSTALL_DIR/quickicon" 165 | 166 | # Create/update version file 167 | echo "VERSION=$LATEST_RELEASE" > "$INSTALL_DIR/version.info" 168 | echo "INSTALL_DATE=$(date -Iseconds)" >> "$INSTALL_DIR/version.info" 169 | echo "BIN_DIR=$BIN_DIR" >> "$INSTALL_DIR/version.info" 170 | echo "PREVIOUS_VERSION=$CURRENT_VERSION" >> "$INSTALL_DIR/version.info" 171 | 172 | # Update symlinks 173 | ln -sf "$INSTALL_DIR/quickicon" "$BIN_DIR/quickicon" 174 | 175 | # Auto-detect and update shell configuration (only on fresh install) 176 | if [ "$IS_UPDATE" = false ]; then 177 | detect_and_update_shell() { 178 | local shell_rc="" 179 | local current_shell="" 180 | 181 | # Detect current shell 182 | if [ -n "$ZSH_VERSION" ]; then 183 | current_shell="zsh" 184 | shell_rc="$HOME/.zshrc" 185 | elif [ -n "$BASH_VERSION" ]; then 186 | current_shell="bash" 187 | # macOS bash uses .bash_profile by default 188 | if [ "$OS" = "macos" ]; then 189 | shell_rc="$HOME/.bash_profile" 190 | else 191 | shell_rc="$HOME/.bashrc" 192 | fi 193 | else 194 | # Fallback detection 195 | current_shell=$(basename "$SHELL") 196 | case $current_shell in 197 | zsh) 198 | shell_rc="$HOME/.zshrc" 199 | ;; 200 | bash) 201 | shell_rc="$HOME/.bash_profile" 202 | ;; 203 | *) 204 | shell_rc="$HOME/.profile" 205 | ;; 206 | esac 207 | fi 208 | 209 | echo "$shell_rc" 210 | } 211 | 212 | update_path_in_shell() { 213 | local shell_rc="$1" 214 | local path_line="export PATH=\"\$PATH:$BIN_DIR\"" 215 | 216 | # Create shell rc file if it doesn't exist 217 | touch "$shell_rc" 218 | 219 | # Check if PATH modification already exists 220 | if grep -q "export PATH.*$BIN_DIR" "$shell_rc" 2>/dev/null; then 221 | echo -e "${GREEN}✓ PATH already configured in $shell_rc${NC}" 222 | return 0 223 | fi 224 | 225 | # Add PATH configuration 226 | echo "" >> "$shell_rc" 227 | echo "# QuickIcon CLI - https://github.com/azeezabass2005/quickicon" >> "$shell_rc" 228 | echo "$path_line" >> "$shell_rc" 229 | 230 | echo -e "${GREEN}✓ Added $BIN_DIR to PATH in $shell_rc${NC}" 231 | return 1 232 | } 233 | 234 | # Try system-wide installation first on macOS (no PATH modification needed) 235 | try_system_install() { 236 | if [ "$OS" = "macos" ] && [ -w "/usr/local/bin" ]; then 237 | echo "Installing system-wide to /usr/local/bin..." 238 | ln -sf "$INSTALL_DIR/quickicon" "/usr/local/bin/quickicon" 239 | echo "SYSTEM_LINK=/usr/local/bin/quickicon" >> "$INSTALL_DIR/version.info" 240 | echo -e "${GREEN}✓ Installed system-wide to /usr/local/bin${NC}" 241 | return 0 242 | fi 243 | return 1 244 | } 245 | 246 | # Try system install first (macOS only) 247 | if try_system_install; then 248 | echo -e "${GREEN}🎉 You can now use 'quickicon' command!${NC}" 249 | else 250 | # Auto-configure shell 251 | SHELL_RC=$(detect_and_update_shell) 252 | echo "Detected shell configuration: $SHELL_RC" 253 | 254 | if update_path_in_shell "$SHELL_RC"; then 255 | echo -e "${GREEN}🎉 You can now use 'quickicon' command!${NC}" 256 | else 257 | echo "" 258 | echo -e "${YELLOW}⚠ Shell configuration updated!${NC}" 259 | echo "" 260 | echo "To use quickicon immediately, run:" 261 | echo -e " ${GREEN}source $SHELL_RC${NC}" 262 | echo "" 263 | echo "Or simply restart your terminal." 264 | echo "" 265 | echo -e "${GREEN}After that, you can use 'quickicon' command!${NC}" 266 | fi 267 | fi 268 | else 269 | # For updates, just confirm success 270 | echo -e "${GREEN}🎉 QuickIcon updated successfully!${NC}" 271 | echo -e "From ${YELLOW}$CURRENT_VERSION${NC} to ${GREEN}$LATEST_RELEASE${NC}" 272 | 273 | # Clean up backup after successful update 274 | if [ -n "$BACKUP_DIR" ] && [ -d "$BACKUP_DIR" ]; then 275 | rm -rf "$BACKUP_DIR" 276 | fi 277 | fi 278 | 279 | echo "" 280 | echo -e "${GREEN}✓ QuickIcon ${LATEST_RELEASE} is ready!${NC}" 281 | echo "" 282 | echo "Get started:" 283 | echo " quickicon --icon-name MyIcon --path ./icon.svg" 284 | echo "" 285 | echo "For help:" 286 | echo " quickicon --help" 287 | echo "" 288 | echo -e "${YELLOW}Management commands:${NC}" 289 | echo " Update: curl -fsSL ... | bash -s -- --update" 290 | echo " Remove: curl -fsSL ... | bash -s -- --uninstall" -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # QuickIcon CLI 2 | 3 | > Transform SVG files into React components instantly from your clipboard, local files, or remote URLs. 4 | 5 | ![QuickIcon Demo](https://imgur.com/gtwviic.gif) 6 | 7 | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 8 | 9 | 10 | ## 🚀 What is QuickIcon? 11 | 12 | QuickIcon is a blazingly fast command-line tool built with Rust that converts SVG files into ready-to-use React components with proper TypeScript typings, customizable props, and automatic attribute conversion. Stop manually converting SVG attributes to camelCase or wrapping SVGs in component boilerplate! 13 | 14 | ### ✨ Features 15 | 16 | - 📋 **Clipboard Support** - Copy an SVG, run one command 17 | - 🌐 **Remote URLs** - Fetch SVGs directly from the web 18 | - 📁 **Local Files** - Process `.svg` files from your filesystem 19 | - ⚛️ **React Components** - Generates functional components with proper props 20 | - 🎨 **Smart Defaults** - Automatic size and color props with sensible defaults 21 | - 📝 **TypeScript & JavaScript** - Full support for both languages 22 | - 💾 **Configuration Persistence** - Remember your preferences with `quickicon.json` 23 | - 🔄 **Attribute Conversion** - Automatic HTML-to-JSX attribute transformation (40+ attributes) 24 | - ⚡ **Blazingly Fast** - Built with Rust for maximum performance 25 | - 🌍 **Cross-Platform** - Works on Linux, macOS, and Windows 26 | 27 | ## 📦 Installation 28 | 29 | ### Quick Install (Recommended) 30 | 31 | #### Linux / macOS 32 | ```bash 33 | curl -fsSL https://raw.githubusercontent.com/azeezabass2005/quickicon/main/install.sh | bash 34 | ``` 35 | 36 | #### Windows (PowerShell - Run as Administrator) 37 | ```powershell 38 | irm https://raw.githubusercontent.com/azeezabass2005/quickicon/main/install.ps1 | iex 39 | ``` 40 | 41 | 51 | 52 | ### Other Installation Methods 53 | 54 | See [INSTALLATION.md](INSTALLATION.md) for: 55 | - Manual installation 56 | - Building from source 57 | - Platform-specific instructions 58 | - Troubleshooting 59 | 60 | ## 🎯 Quick Start 61 | 62 | ### Basic Usage 63 | 64 | 1. **From Clipboard** (Copy any SVG first) 65 | ```bash 66 | quickicon --icon-name MyIcon 67 | ``` 68 | 69 | 2. **From Local File** 70 | ```bash 71 | quickicon --icon-name MyIcon --path ./icons/heart.svg 72 | ``` 73 | 74 | 3. **From Remote URL** 75 | ```bash 76 | quickicon --icon-name MyIcon --path https://example.com/icon.svg 77 | ``` 78 | 79 | ### Example Output 80 | 81 | Given an SVG input: 82 | ```xml 83 | 84 | 85 | 86 | ``` 87 | 88 | QuickIcon generates (`MyIcon.tsx`): 89 | ```typescript 90 | import React, {SVGProps} from "react"; 91 | 92 | interface MyIconProps extends SVGProps { 93 | size?: `${number}` | number; 94 | color?: string; 95 | } 96 | 97 | const MyIcon = ({ 98 | size = 24, 99 | color = '#111827', 100 | ...props 101 | } : MyIconProps) => { 102 | return ( 103 | 104 | 105 | 106 | ); 107 | }; 108 | 109 | export default MyIcon; 110 | 111 | // Usage examples: 112 | // 113 | // 114 | // 115 | ``` 116 | 117 | ## 📖 Command Reference 118 | 119 | ### Options 120 | 121 | | Flag | Short | Description | Default | 122 | |------|-------|-------------|---------| 123 | | `--icon-name` | `-n` | Name of the React component (required) | - | 124 | | `--path` | `-p` | Path to local file or remote URL | Clipboard | 125 | | `--destination` | `-d` | Output directory for the component | `./public/assets/icon` | 126 | | `--size` | `-s` | The default size props of the component (number) | `24` | 127 | | `--language` | -l | To change the language to ts or js | `ts` | 128 | | `--default` | `-D` | Save settings to `quickicon.json` | false | 129 | 130 | ### Examples 131 | 132 | **Generate TypeScript component from clipboard:** 133 | ```bash 134 | quickicon --icon-name UserIcon 135 | ``` 136 | 137 | **Generate JavaScript component:** 138 | ```bash 139 | quickicon --icon-name UserIcon --language javascript 140 | ``` 141 | 142 | **Custom destination folder:** 143 | ```bash 144 | quickicon --icon-name UserIcon --destination ./src/components/icons 145 | ``` 146 | 147 | **Save as default configuration:** 148 | ```bash 149 | quickicon --icon-name UserIcon --destination ./src/icons --default 150 | ``` 151 | 152 | **From remote URL:** 153 | ```bash 154 | quickicon -n GithubIcon -p https://api.iconify.design/mdi/github.svg 155 | ``` 156 | 157 | **Using npx (no global install needed):** 158 | ```bash 159 | npx quickicon --icon-name MyIcon --path ./icon.svg 160 | ``` 161 | 162 | ## ⚙️ Configuration 163 | 164 | QuickIcon can save your preferences in a `quickicon.json` file in your project root. 165 | 166 | ### Creating Configuration 167 | 168 | Use the `--default` flag to save current settings: 169 | ```bash 170 | quickicon --icon-name MyIcon --destination ./src/icons --language javascript --default 171 | ``` 172 | 173 | This creates `quickicon.json`: 174 | ```json 175 | { 176 | "is_javascript": true, 177 | "destination_folder": "./src/icons" 178 | } 179 | ``` 180 | 181 | ### Using Saved Configuration 182 | 183 | Once saved, simply run: 184 | ```bash 185 | quickicon --icon-name AnotherIcon 186 | ``` 187 | 188 | QuickIcon will use your saved preferences automatically. 189 | 190 | ## 🔧 How It Works 191 | 192 | QuickIcon performs several transformations: 193 | 194 | 1. **Attribute Conversion**: Converts 40+ SVG attributes to React-compatible camelCase 195 | - `fill-rule` → `fillRule` 196 | - `stroke-width` → `strokeWidth` 197 | - `clip-path` → `clipPath` 198 | - `class` → `className` 199 | - And many more... 200 | 201 | 2. **Style Conversion**: Transforms inline styles to React format 202 | - `style="background-color: red"` → `style={{ backgroundColor: 'red' }}` 203 | 204 | 3. **Dimension Props**: Replaces hardcoded dimensions 205 | - `width="24"` → `width={size}` 206 | - `height="24"` → `height={size}` 207 | 208 | 4. **Color Props**: Makes colors customizable 209 | - `fill="#000000"` → `fill={color}` 210 | - `stroke="#123456"` → `stroke={color}` 211 | 212 | 5. **Props Spreading**: Adds flexibility 213 | - Adds `{...props}` to root SVG element for maximum customization 214 | 215 | ## 🛡️ Supported Formats 216 | 217 | ### Input Sources 218 | - ✅ Clipboard text (SVG content) 219 | - ✅ Local `.svg` files 220 | - ✅ Local `.txt` files containing SVG 221 | - ✅ Remote URLs (http/https) 222 | 223 | ### Output Languages 224 | - ✅ TypeScript (`.tsx`) 225 | - ✅ JavaScript (`.jsx`) 226 | 227 | ### Framework Support 228 | - ✅ React (v16.8+) 229 | - ⏳ Vue (coming soon) 230 | - ⏳ Svelte (coming soon) 231 | - ⏳ Angular (coming soon) 232 | 233 | **Note:** Version 0.1.0 focuses on React. Support for additional frameworks is planned for future releases. Star the repo to stay updated! 234 | 235 | ## 🎬 Demo 236 | 237 | ```bash 238 | # Copy this SVG: 239 | 240 | 241 | 242 | 243 | # Run: 244 | quickicon --icon-name RocketIcon 245 | 246 | # Output: src/assets/icon/RocketIcon.tsx created! ✨ 247 | ``` 248 | 249 | ## 🐛 Troubleshooting 250 | 251 | ### "Your clipboard text content is not a valid svg" 252 | - Ensure you've copied valid SVG markup 253 | - Check that the SVG starts with `` 254 | - The content must be well-formed XML 255 | 256 | ### "An icon already exists at..." 257 | - A component with that name already exists at the destination 258 | - Choose a different name or delete the existing file 259 | - Or use a different destination folder with `--destination` 260 | 261 | ### "Command not found" after installation 262 | - **Linux/macOS**: Add `$HOME/.local/bin` to your PATH 263 | - **Windows**: Restart your terminal after installation 264 | - See [INSTALLATION.md](INSTALLATION.md) for detailed troubleshooting 265 | 266 | ### Clipboard issues on Linux 267 | Install clipboard utilities: 268 | ```bash 269 | sudo apt-get install xclip xsel # For X11 270 | sudo apt-get install wl-clipboard # For Wayland 271 | ``` 272 | 273 | For more troubleshooting, see [INSTALLATION.md](INSTALLATION.md#troubleshooting). 274 | 275 | ## 🤝 Contributing 276 | 277 | Contributions are welcome! Here's how you can help: 278 | 279 | 1. Fork the repository 280 | 2. Create a feature branch (`git checkout -b feature/amazing-feature`) 281 | 3. Commit your changes (`git commit -m 'Add amazing feature'`) 282 | 4. Push to the branch (`git push origin feature/amazing-feature`) 283 | 5. Open a Pull Request 284 | 285 | ### Development Setup 286 | 287 | ```bash 288 | # Clone your fork 289 | git clone https://github.com/azeezabass2005/quickicon.git 290 | cd quickicon 291 | 292 | # Build 293 | cargo build 294 | 295 | # Run tests 296 | cargo test 297 | 298 | # Run locally 299 | cargo run -- --icon-name TestIcon --path ./test.svg 300 | 301 | # # Build for npm 302 | # npm install 303 | # npm run build 304 | ``` 305 | 306 | ## 📝 Roadmap 307 | 308 | - [ ] Interactive mode with prompts 309 | - [ ] Batch processing multiple SVGs 310 | - [ ] Custom component templates 311 | - [ ] RGB/RGBA color support 312 | - [ ] SVG optimization options 313 | - [ ] GitHub Action integration 314 | - [ ] VS Code extension 315 | - [ ] Figma Plugin 316 | - [ ] Homebrew formula 317 | 318 | ## 🏗️ Tech Stack 319 | 320 | - **Language**: Rust 🦀 321 | - **CLI**: [clap](https://github.com/clap-rs/clap) 322 | - **Clipboard**: [arboard](https://github.com/1Password/arboard) 323 | - **HTTP**: [reqwest](https://github.com/seanmonstar/reqwest) 324 | - **Regex**: [regex](https://github.com/rust-lang/regex) 325 | - **Node Bindings**: [napi-rs](https://napi.rs/) 326 | 327 | ## 📄 License 328 | 329 | This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. 330 | 331 | ## 👏 Acknowledgments 332 | 333 | - Built with [Rust](https://www.rust-lang.org/) for blazing performance 334 | - Inspired by the need to speed up React development workflows 335 | - Thanks to all contributors and users! 336 | 337 | ## 📧 Support & Community 338 | 339 | - 🐛 [Report a Bug](https://github.com/azeezabass2005/quickicon/issues/new?labels=bug) 340 | - 💡 [Request a Feature](https://github.com/azeezabass2005/quickicon/issues/new?labels=enhancement) 341 | - 💬 [Discussions](https://github.com/azeezabass2005/quickicon/discussions) 342 | 343 | 344 | ## 📊 Stats 345 | 346 | ![GitHub stars](https://img.shields.io/github/stars/azeezabass2005/quickicon?style=social) 347 | ![GitHub forks](https://img.shields.io/github/forks/azeezabass2005/quickicon?style=social) 348 | 349 | --- 350 | 351 | **Made with ❤️ and ☕ by Fola** 352 | 353 | If QuickIcon saves you time, consider: 354 | - ⭐ Starring the repo 355 | - 🐦 Sharing on Twitter 356 | - 💼 Sharing on LinkedIn 357 | - ☕ [Buying me a coffee](https://buymeacoffee.com/rustyfola) 358 | 359 | **QuickIcon** - Because life's too short for manual SVG conversion! ⚡ -------------------------------------------------------------------------------- /src/convert.rs: -------------------------------------------------------------------------------- 1 | use std::{collections::HashMap, fs, path::PathBuf}; 2 | 3 | use regex::Regex; 4 | 5 | use crate::default::Config; 6 | 7 | pub struct SvgToReact { 8 | svg_string: String, 9 | component_name: String, 10 | config: Config, 11 | } 12 | 13 | impl SvgToReact { 14 | pub fn new(svg_string: String, component_name: String, config: Config) -> Self { 15 | SvgToReact { svg_string, component_name, config } 16 | } 17 | 18 | /// Processes the svg, generates the component and save the component to a file 19 | pub fn convert_and_save(&self) -> Result> { 20 | self.check_component_existence()?; 21 | let processed_svg = self.process_svg()?; 22 | let component = self.wrap_in_component(&processed_svg); 23 | let path = self.save_to_file(&component)?; 24 | Ok(path) 25 | } 26 | 27 | /// Convert attributes, extract colors and dimensions 28 | fn process_svg(&self) -> Result> { 29 | let mut svg = self.svg_string.clone(); 30 | 31 | svg = self.convert_attributes(&svg)?; 32 | svg = self.convert_inline_styles(&svg)?; 33 | svg = self.replace_dimensions(&svg)?; 34 | svg = self.replace_colors(&svg)?; 35 | svg = self.spread_props(&svg); 36 | 37 | Ok(svg) 38 | 39 | } 40 | 41 | /// Converts all the hyphenated attributes to camelCase 42 | fn convert_attributes(&self, svg: &str) -> Result> { 43 | let attributes_map = self.get_attributes(); 44 | let mut result = svg.to_string(); 45 | for (html_attr, xml_attr) in attributes_map.iter() { 46 | let pattern = format!(r#"{}="#, html_attr); 47 | let re = Regex::new(&pattern)?; 48 | result = re.replace_all(&result, format!(r#"{}="#, xml_attr)).to_string(); 49 | } 50 | Ok(result) 51 | } 52 | 53 | /// Returns all the mapping of HTML Attributes to XML Attributes 54 | fn get_attributes(&self) -> HashMap<&str, &str> { 55 | let mut map = HashMap::new(); 56 | map.insert("fill-rule", "fillRule"); 57 | map.insert("clip-rule", "clipRule"); 58 | map.insert("stroke-width", "strokeWidth"); 59 | map.insert("stroke-linecap", "strokeLinecap"); 60 | map.insert("stroke-linejoin", "strokeLinejoin"); 61 | map.insert("stroke-dasharray", "strokeDasharray"); 62 | map.insert("stroke-dashoffset", "strokeDashoffset"); 63 | map.insert("stroke-miterlimit", "strokeMiterlimit"); 64 | map.insert("stroke-opacity", "strokeOpacity"); 65 | map.insert("fill-opacity", "fillOpacity"); 66 | map.insert("stop-color", "stopColor"); 67 | map.insert("stop-opacity", "stopOpacity"); 68 | map.insert("marker-start", "markerStart"); 69 | map.insert("marker-mid", "markerMid"); 70 | map.insert("marker-end", "markerEnd"); 71 | map.insert("clip-path", "clipPath"); 72 | map.insert("color-interpolation", "colorInterpolation"); 73 | map.insert("color-interpolation-filters", "colorInterpolationFilters"); 74 | map.insert("flood-color", "floodColor"); 75 | map.insert("flood-opacity", "floodOpacity"); 76 | map.insert("lighting-color", "lightingColor"); 77 | map.insert("mask-type", "maskType"); 78 | map.insert("text-anchor", "textAnchor"); 79 | map.insert("text-decoration", "textDecoration"); 80 | map.insert("text-rendering", "textRendering"); 81 | map.insert("vector-effect", "vectorEffect"); 82 | map.insert("writing-mode", "writingMode"); 83 | map.insert("font-family", "fontFamily"); 84 | map.insert("font-size", "fontSize"); 85 | map.insert("font-weight", "fontWeight"); 86 | map.insert("font-style", "fontStyle"); 87 | map.insert("font-variant", "fontVariant"); 88 | map.insert("font-stretch", "fontStretch"); 89 | map.insert("dominant-baseline", "dominantBaseline"); 90 | map.insert("alignment-baseline", "alignmentBaseline"); 91 | map.insert("baseline-shift", "baselineShift"); 92 | map.insert("shape-rendering", "shapeRendering"); 93 | map.insert("color-profile", "colorProfile"); 94 | map.insert("enable-background", "enableBackground"); 95 | map.insert("glyph-orientation-horizontal", "glyphOrientationHorizontal"); 96 | map.insert("glyph-orientation-vertical", "glyphOrientationVertical"); 97 | map.insert("kerning", "kerning"); 98 | map.insert("letter-spacing", "letterSpacing"); 99 | map.insert("word-spacing", "wordSpacing"); 100 | map.insert("xml:lang", "xmlLang"); 101 | map.insert("xml:space", "xmlSpace"); 102 | map.insert("xmlns:xlink", "xmlnsXlink"); 103 | map.insert("xlink:href", "xlinkHref"); 104 | map.insert("xlink:show", "xlinkShow"); 105 | map.insert("xlink:actuate", "xlinkActuate"); 106 | map.insert("xlink:type", "xlinkType"); 107 | map.insert("xlink:role", "xlinkRole"); 108 | map.insert("xlink:title", "xlinkTitle"); 109 | map.insert("class", "className"); 110 | 111 | map 112 | 113 | } 114 | 115 | /// Converts the inline styles from html format to react double bracket format 116 | fn convert_inline_styles(&self, svg: &str) -> Result> { 117 | let re = Regex::new(r#"style="([^"]*)""#)?; 118 | Ok(re.replace_all(svg, |caps: ®ex::Captures| { 119 | let style_string = &caps[1]; 120 | let style_object = self.parse_style_to_object(&style_string); 121 | format!("style={{{{ {} }}}}", style_object) 122 | }).to_string()) 123 | } 124 | 125 | fn parse_style_to_object(&self, style_string: &str) -> String { 126 | style_string 127 | .split(";") 128 | .filter(|s| !s.trim().is_empty()) 129 | .map(|property| { 130 | let parts: Vec<&str> = property.split(":").collect(); 131 | if parts.len() == 2 { 132 | let key = self.css_key_to_camel_case(parts[0].trim()); 133 | let value = parts[1].trim(); 134 | format!("{}: '{}'", key, value) 135 | } else { 136 | String::new() 137 | } 138 | }) 139 | .filter(|s| !s.trim().is_empty()) 140 | .collect::>() 141 | .join(",") 142 | } 143 | 144 | /// Converts css key for inline css to camelCase 145 | fn css_key_to_camel_case(&self, key: &str) -> String { 146 | key 147 | .split("-") 148 | .enumerate() 149 | .map(|(i, s)| { 150 | if i == 0 { 151 | s.to_string() 152 | } else { 153 | let mut chars = s.chars(); 154 | match chars.next() { 155 | None => String::new(), 156 | Some(first_character) => { 157 | first_character.to_uppercase().chain(chars).collect() 158 | } 159 | } 160 | } 161 | }) 162 | .collect::() 163 | } 164 | 165 | /// Replace hardcoded width/height with props 166 | fn replace_dimensions(&self, svg: &str) -> Result> { 167 | let mut result = svg.to_string(); 168 | 169 | let width_re = Regex::new(r#"width="(\d+)""#)?; 170 | result = width_re.replace(&result, "width={size}").to_string(); 171 | 172 | let height_re = Regex::new(r#"height="(\d+)""#)?; 173 | result = height_re.replace(&result, "height={size}").to_string(); 174 | 175 | Ok(result) 176 | } 177 | 178 | fn replace_colors(&self, svg: &str) -> Result> { 179 | let mut result = svg.to_string(); 180 | 181 | let color_patterns = vec![ 182 | r##"fill="#[0-9A-Fa-f]{6}""##, 183 | r##"fill="#[0-9A-Fa-f]{3}""##, 184 | r##"stroke="#[0-9A-Fa-f]{6}""##, 185 | r##"stroke="#[0-9A-Fa-f]{3}""##, 186 | ]; 187 | 188 | for pattern in color_patterns { 189 | let re = Regex::new(pattern)?; 190 | result = re 191 | .replace_all(&result, |caps: ®ex::Captures| { 192 | let matched = &caps[0]; 193 | if matched.contains("white") || matched.contains("#fff") || matched.contains("#FFF") { 194 | matched.to_string() 195 | } else if matched.starts_with("fill=") { 196 | "fill={color}".to_string() 197 | } else { 198 | "stroke={color}".to_string() 199 | } 200 | }) 201 | .to_string(); 202 | } 203 | 204 | Ok(result) 205 | } 206 | 207 | fn spread_props(&self, svg: &str) -> String { 208 | svg.replacen(">", " {...props}>", 1).trim().to_string() 209 | } 210 | 211 | fn wrap_in_component(&self, processed_svg: &str) -> String { 212 | let indented_svg = self.indent_svg(processed_svg, 4); 213 | 214 | let mut import_line = format!(r#"import React, {{SVGProps}} from "react"; 215 | 216 | interface {}Props extends SVGProps {{ 217 | size?: `${{number}}` | number; 218 | color?: string; 219 | }}"#, self.component_name); 220 | let mut props_type = format!(r#" : {}Props"#, self.component_name); 221 | if self.config.is_javascript { 222 | import_line = r#"import React from "react""#.to_string(); 223 | props_type = "".to_string(); 224 | } 225 | 226 | format!( 227 | r##"{} 228 | 229 | const {} = ({{ 230 | size = {}, 231 | color = '#111827', 232 | ...props 233 | }}{}) => {{ 234 | return ( 235 | {} 236 | ); 237 | }}; 238 | 239 | export default {}; 240 | 241 | // Usage examples: 242 | // <{} /> 243 | // <{} size={{32}} color="#3B82F6" /> 244 | // <{} size="32" color="#3B82F6" /> 245 | // <{} className="hover:opacity-80" /> 246 | "##, 247 | import_line, 248 | self.component_name, 249 | self.config.size, 250 | props_type, 251 | indented_svg, 252 | self.component_name, 253 | self.component_name, 254 | self.component_name, 255 | self.component_name, 256 | self.component_name 257 | ) 258 | } 259 | 260 | /// Indent SVG content 261 | fn indent_svg(&self, svg: &str, spaces: usize) -> String { 262 | let mut result = String::new(); 263 | let mut level = 2; 264 | let indent_str = " ".repeat(spaces); 265 | 266 | // Split by tags but keep them 267 | let replaced = svg 268 | .replace(">", ">\n") 269 | .replace("<", "\n<"); 270 | let tokens = replaced 271 | .lines() 272 | .map(|l| l.trim()) 273 | .filter(|l| !l.is_empty()); 274 | 275 | for token in tokens { 276 | if token.starts_with(" 0 { 278 | level -= 1; 279 | } 280 | result.push_str(&format!("{}{}\n", indent_str.repeat(level), token)); 281 | } else if token.starts_with("<") && token.ends_with("/>") { 282 | result.push_str(&format!("{}{}\n", indent_str.repeat(level), token)); 283 | } else if token.starts_with("<") { 284 | result.push_str(&format!("{}{}\n", indent_str.repeat(level), token)); 285 | level += 1; 286 | } else { 287 | result.push_str(&format!("{}{}\n", indent_str.repeat(level), token)); 288 | } 289 | } 290 | 291 | result 292 | } 293 | 294 | /// Save component to file 295 | fn save_to_file(&self, component: &str) -> Result> { 296 | fs::create_dir_all(&self.config.destination_folder)?; 297 | let file_path = self.generate_file_path(); 298 | fs::write(&file_path, component)?; 299 | 300 | Ok(file_path) 301 | } 302 | 303 | /// It generates the full file path 304 | fn generate_file_path(&self) -> PathBuf { 305 | let mut file_name = format!("{}.tsx", self.component_name); 306 | if self.config.is_javascript { 307 | file_name = format!("{}.jsx", self.component_name); 308 | } 309 | self.config.destination_folder.join(file_name) 310 | } 311 | 312 | fn check_component_existence(&self) -> Result<(), String> { 313 | let file_path = self.generate_file_path(); 314 | if file_path.exists() { 315 | Err(format!("An icon already exists at: {:?}", file_path).to_string()) 316 | } else { 317 | Ok(()) 318 | } 319 | } 320 | 321 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@emnapi/core@^1.5.0": 6 | version "1.5.0" 7 | resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.5.0.tgz#85cd84537ec989cebb2343606a1ee663ce4edaf0" 8 | integrity sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg== 9 | dependencies: 10 | "@emnapi/wasi-threads" "1.1.0" 11 | tslib "^2.4.0" 12 | 13 | "@emnapi/runtime@^1.5.0": 14 | version "1.5.0" 15 | resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.5.0.tgz#9aebfcb9b17195dce3ab53c86787a6b7d058db73" 16 | integrity sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ== 17 | dependencies: 18 | tslib "^2.4.0" 19 | 20 | "@emnapi/wasi-threads@1.1.0": 21 | version "1.1.0" 22 | resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz#60b2102fddc9ccb78607e4a3cf8403ea69be41bf" 23 | integrity sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ== 24 | dependencies: 25 | tslib "^2.4.0" 26 | 27 | "@inquirer/ansi@^1.0.0": 28 | version "1.0.0" 29 | resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.0.tgz#29525c673caf36c12e719712830705b9c31f0462" 30 | integrity sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA== 31 | 32 | "@inquirer/checkbox@^4.2.4": 33 | version "4.2.4" 34 | resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.2.4.tgz#efa6f280477a0821c610e502b1c80f167f17ba2e" 35 | integrity sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw== 36 | dependencies: 37 | "@inquirer/ansi" "^1.0.0" 38 | "@inquirer/core" "^10.2.2" 39 | "@inquirer/figures" "^1.0.13" 40 | "@inquirer/type" "^3.0.8" 41 | yoctocolors-cjs "^2.1.2" 42 | 43 | "@inquirer/confirm@^5.1.18": 44 | version "5.1.18" 45 | resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.18.tgz#0b76e5082d834c0e3528023705b867fc1222d535" 46 | integrity sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw== 47 | dependencies: 48 | "@inquirer/core" "^10.2.2" 49 | "@inquirer/type" "^3.0.8" 50 | 51 | "@inquirer/core@^10.2.2": 52 | version "10.2.2" 53 | resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.2.2.tgz#d31eb50ba0c76b26e7703c2c0d1d0518144c23ab" 54 | integrity sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA== 55 | dependencies: 56 | "@inquirer/ansi" "^1.0.0" 57 | "@inquirer/figures" "^1.0.13" 58 | "@inquirer/type" "^3.0.8" 59 | cli-width "^4.1.0" 60 | mute-stream "^2.0.0" 61 | signal-exit "^4.1.0" 62 | wrap-ansi "^6.2.0" 63 | yoctocolors-cjs "^2.1.2" 64 | 65 | "@inquirer/editor@^4.2.20": 66 | version "4.2.20" 67 | resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.20.tgz#25c3ceeaed91f62135832c3792c650b4d8102dc7" 68 | integrity sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g== 69 | dependencies: 70 | "@inquirer/core" "^10.2.2" 71 | "@inquirer/external-editor" "^1.0.2" 72 | "@inquirer/type" "^3.0.8" 73 | 74 | "@inquirer/expand@^4.0.20": 75 | version "4.0.20" 76 | resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.20.tgz#7c2b542ccd0d0c85428263c6d56308b880b12cb2" 77 | integrity sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow== 78 | dependencies: 79 | "@inquirer/core" "^10.2.2" 80 | "@inquirer/type" "^3.0.8" 81 | yoctocolors-cjs "^2.1.2" 82 | 83 | "@inquirer/external-editor@^1.0.2": 84 | version "1.0.2" 85 | resolved "https://registry.yarnpkg.com/@inquirer/external-editor/-/external-editor-1.0.2.tgz#dc16e7064c46c53be09918db639ff780718c071a" 86 | integrity sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ== 87 | dependencies: 88 | chardet "^2.1.0" 89 | iconv-lite "^0.7.0" 90 | 91 | "@inquirer/figures@^1.0.13": 92 | version "1.0.13" 93 | resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.13.tgz#ad0afd62baab1c23175115a9b62f511b6a751e45" 94 | integrity sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw== 95 | 96 | "@inquirer/input@^4.2.4": 97 | version "4.2.4" 98 | resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.2.4.tgz#8a8b79c9fe31cc036082404b26b601cca0cb6f30" 99 | integrity sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw== 100 | dependencies: 101 | "@inquirer/core" "^10.2.2" 102 | "@inquirer/type" "^3.0.8" 103 | 104 | "@inquirer/number@^3.0.20": 105 | version "3.0.20" 106 | resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.20.tgz#bfbc9cfd5f2730d86036ef124ec151fbd5ea669b" 107 | integrity sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg== 108 | dependencies: 109 | "@inquirer/core" "^10.2.2" 110 | "@inquirer/type" "^3.0.8" 111 | 112 | "@inquirer/password@^4.0.20": 113 | version "4.0.20" 114 | resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.20.tgz#931c2a321cc09a63d790199702d3930a3e864830" 115 | integrity sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug== 116 | dependencies: 117 | "@inquirer/ansi" "^1.0.0" 118 | "@inquirer/core" "^10.2.2" 119 | "@inquirer/type" "^3.0.8" 120 | 121 | "@inquirer/prompts@^7.8.4": 122 | version "7.8.6" 123 | resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.8.6.tgz#697e411535ae3b37a25fb35774ecf4d53a0e9f92" 124 | integrity sha512-68JhkiojicX9SBUD8FE/pSKbOKtwoyaVj1kwqLfvjlVXZvOy3iaSWX4dCLsZyYx/5Ur07Fq+yuDNOen+5ce6ig== 125 | dependencies: 126 | "@inquirer/checkbox" "^4.2.4" 127 | "@inquirer/confirm" "^5.1.18" 128 | "@inquirer/editor" "^4.2.20" 129 | "@inquirer/expand" "^4.0.20" 130 | "@inquirer/input" "^4.2.4" 131 | "@inquirer/number" "^3.0.20" 132 | "@inquirer/password" "^4.0.20" 133 | "@inquirer/rawlist" "^4.1.8" 134 | "@inquirer/search" "^3.1.3" 135 | "@inquirer/select" "^4.3.4" 136 | 137 | "@inquirer/rawlist@^4.1.8": 138 | version "4.1.8" 139 | resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.1.8.tgz#a254a385b715a133dcf42a31161aee8827846a53" 140 | integrity sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg== 141 | dependencies: 142 | "@inquirer/core" "^10.2.2" 143 | "@inquirer/type" "^3.0.8" 144 | yoctocolors-cjs "^2.1.2" 145 | 146 | "@inquirer/search@^3.1.3": 147 | version "3.1.3" 148 | resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.1.3.tgz#3a4d725c596617ab9a516906fea9d8347ea5c28f" 149 | integrity sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q== 150 | dependencies: 151 | "@inquirer/core" "^10.2.2" 152 | "@inquirer/figures" "^1.0.13" 153 | "@inquirer/type" "^3.0.8" 154 | yoctocolors-cjs "^2.1.2" 155 | 156 | "@inquirer/select@^4.3.4": 157 | version "4.3.4" 158 | resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.3.4.tgz#e50e0c2539631ba93e26adc225a9e0e232883833" 159 | integrity sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA== 160 | dependencies: 161 | "@inquirer/ansi" "^1.0.0" 162 | "@inquirer/core" "^10.2.2" 163 | "@inquirer/figures" "^1.0.13" 164 | "@inquirer/type" "^3.0.8" 165 | yoctocolors-cjs "^2.1.2" 166 | 167 | "@inquirer/type@^3.0.8": 168 | version "3.0.8" 169 | resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.8.tgz#efc293ba0ed91e90e6267f1aacc1c70d20b8b4e8" 170 | integrity sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw== 171 | 172 | "@napi-rs/cli@3.3.0": 173 | version "3.3.0" 174 | resolved "https://registry.yarnpkg.com/@napi-rs/cli/-/cli-3.3.0.tgz#9bdeabeccc914874da153f6b3e656635de6781cb" 175 | integrity sha512-ff2fG6Y4ro4M4YOeDTonUrGPGG+96BfLLGvKGa6WNuXBtWGO0/20rG11mpwsFMwwO8xM7q0QZl3e2BvdedUABw== 176 | dependencies: 177 | "@inquirer/prompts" "^7.8.4" 178 | "@napi-rs/cross-toolchain" "^1.0.3" 179 | "@napi-rs/wasm-tools" "^1.0.1" 180 | "@octokit/rest" "^22.0.0" 181 | clipanion "^4.0.0-rc.4" 182 | colorette "^2.0.20" 183 | debug "^4.4.1" 184 | emnapi "^1.5.0" 185 | es-toolkit "^1.39.10" 186 | js-yaml "^4.1.0" 187 | semver "^7.7.2" 188 | typanion "^3.14.0" 189 | 190 | "@napi-rs/cross-toolchain@^1.0.3": 191 | version "1.0.3" 192 | resolved "https://registry.yarnpkg.com/@napi-rs/cross-toolchain/-/cross-toolchain-1.0.3.tgz#8e345d0c9a8aeeaf9287e7af1d4ce83476681373" 193 | integrity sha512-ENPfLe4937bsKVTDA6zdABx4pq9w0tHqRrJHyaGxgaPq03a2Bd1unD5XSKjXJjebsABJ+MjAv1A2OvCgK9yehg== 194 | dependencies: 195 | "@napi-rs/lzma" "^1.4.5" 196 | "@napi-rs/tar" "^1.1.0" 197 | debug "^4.4.1" 198 | 199 | "@napi-rs/lzma-android-arm-eabi@1.4.5": 200 | version "1.4.5" 201 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-android-arm-eabi/-/lzma-android-arm-eabi-1.4.5.tgz#c6722a1d7201e269fdb6ba997d28cb41223e515c" 202 | integrity sha512-Up4gpyw2SacmyKWWEib06GhiDdF+H+CCU0LAV8pnM4aJIDqKKd5LHSlBht83Jut6frkB0vwEPmAkv4NjQ5u//Q== 203 | 204 | "@napi-rs/lzma-android-arm64@1.4.5": 205 | version "1.4.5" 206 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-android-arm64/-/lzma-android-arm64-1.4.5.tgz#05df61667e84419e0550200b48169057b734806f" 207 | integrity sha512-uwa8sLlWEzkAM0MWyoZJg0JTD3BkPknvejAFG2acUA1raXM8jLrqujWCdOStisXhqQjZ2nDMp3FV6cs//zjfuQ== 208 | 209 | "@napi-rs/lzma-darwin-arm64@1.4.5": 210 | version "1.4.5" 211 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-darwin-arm64/-/lzma-darwin-arm64-1.4.5.tgz#c37a01c53f25cb7f014870d2ea6c5576138bcaaa" 212 | integrity sha512-0Y0TQLQ2xAjVabrMDem1NhIssOZzF/y/dqetc6OT8mD3xMTDtF8u5BqZoX3MyPc9FzpsZw4ksol+w7DsxHrpMA== 213 | 214 | "@napi-rs/lzma-darwin-x64@1.4.5": 215 | version "1.4.5" 216 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-darwin-x64/-/lzma-darwin-x64-1.4.5.tgz#555b1dd65d7b104d28b2a12d925d7059226c7f4b" 217 | integrity sha512-vR2IUyJY3En+V1wJkwmbGWcYiT8pHloTAWdW4pG24+51GIq+intst6Uf6D/r46citObGZrlX0QvMarOkQeHWpw== 218 | 219 | "@napi-rs/lzma-freebsd-x64@1.4.5": 220 | version "1.4.5" 221 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-freebsd-x64/-/lzma-freebsd-x64-1.4.5.tgz#683beff15b37774ec91e1de7b4d337894bf43694" 222 | integrity sha512-XpnYQC5SVovO35tF0xGkbHYjsS6kqyNCjuaLQ2dbEblFRr5cAZVvsJ/9h7zj/5FluJPJRDojVNxGyRhTp4z2lw== 223 | 224 | "@napi-rs/lzma-linux-arm-gnueabihf@1.4.5": 225 | version "1.4.5" 226 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-arm-gnueabihf/-/lzma-linux-arm-gnueabihf-1.4.5.tgz#505f659a9131474b7270afa4a4e9caf709c4d213" 227 | integrity sha512-ic1ZZMoRfRMwtSwxkyw4zIlbDZGC6davC9r+2oX6x9QiF247BRqqT94qGeL5ZP4Vtz0Hyy7TEViWhx5j6Bpzvw== 228 | 229 | "@napi-rs/lzma-linux-arm64-gnu@1.4.5": 230 | version "1.4.5" 231 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-arm64-gnu/-/lzma-linux-arm64-gnu-1.4.5.tgz#ecbb944635fa004a9415d1f50f165bc0d26d3807" 232 | integrity sha512-asEp7FPd7C1Yi6DQb45a3KPHKOFBSfGuJWXcAd4/bL2Fjetb2n/KK2z14yfW8YC/Fv6x3rBM0VAZKmJuz4tysg== 233 | 234 | "@napi-rs/lzma-linux-arm64-musl@1.4.5": 235 | version "1.4.5" 236 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-arm64-musl/-/lzma-linux-arm64-musl-1.4.5.tgz#c0d17f40ce2db0b075469a28f233fd8ce31fbb95" 237 | integrity sha512-yWjcPDgJ2nIL3KNvi4536dlT/CcCWO0DUyEOlBs/SacG7BeD6IjGh6yYzd3/X1Y3JItCbZoDoLUH8iB1lTXo3w== 238 | 239 | "@napi-rs/lzma-linux-ppc64-gnu@1.4.5": 240 | version "1.4.5" 241 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-ppc64-gnu/-/lzma-linux-ppc64-gnu-1.4.5.tgz#2f17b9d1fc920c6c511d2086c7623752172c2f07" 242 | integrity sha512-0XRhKuIU/9ZjT4WDIG/qnX7Xz7mSQHYZo9Gb3MP2gcvBgr6BA4zywQ9k3gmQaPn9ECE+CZg2V7DV7kT+x2pUMQ== 243 | 244 | "@napi-rs/lzma-linux-riscv64-gnu@1.4.5": 245 | version "1.4.5" 246 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-riscv64-gnu/-/lzma-linux-riscv64-gnu-1.4.5.tgz#63c2a4e1157586252186e39604370d5b29c6db85" 247 | integrity sha512-QrqDIPEUUB23GCpyQj/QFyMlr8SGxxyExeZz9OWFnHfb70kXdTLWrHS/hEI1Ru+lSbQ/6xRqeoGyQ4Aqdg+/RA== 248 | 249 | "@napi-rs/lzma-linux-s390x-gnu@1.4.5": 250 | version "1.4.5" 251 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-s390x-gnu/-/lzma-linux-s390x-gnu-1.4.5.tgz#6f2ca44bf5c5bef1b31d7516bf15d63c35cdf59f" 252 | integrity sha512-k8RVM5aMhW86E9H0QXdquwojew4H3SwPxbRVbl49/COJQWCUjGi79X6mYruMnMPEznZinUiT1jgKbFo2A00NdA== 253 | 254 | "@napi-rs/lzma-linux-x64-gnu@1.4.5": 255 | version "1.4.5" 256 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.4.5.tgz#54879d88a9c370687b5463c7c1b6208b718c1ab2" 257 | integrity sha512-6rMtBgnIq2Wcl1rQdZsnM+rtCcVCbws1nF8S2NzaUsVaZv8bjrPiAa0lwg4Eqnn1d9lgwqT+cZgm5m+//K08Kw== 258 | 259 | "@napi-rs/lzma-linux-x64-musl@1.4.5": 260 | version "1.4.5" 261 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-x64-musl/-/lzma-linux-x64-musl-1.4.5.tgz#412705f6925f10f45122bd0f3e2fb6e597bed4f8" 262 | integrity sha512-eiadGBKi7Vd0bCArBUOO/qqRYPHt/VQVvGyYvDFt6C2ZSIjlD+HuOl+2oS1sjf4CFjK4eDIog6EdXnL0NE6iyQ== 263 | 264 | "@napi-rs/lzma-wasm32-wasi@1.4.5": 265 | version "1.4.5" 266 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-wasm32-wasi/-/lzma-wasm32-wasi-1.4.5.tgz#4b74abfd144371123cb6f5b7bad5bae868206ecf" 267 | integrity sha512-+VyHHlr68dvey6fXc2hehw9gHVFIW3TtGF1XkcbAu65qVXsA9D/T+uuoRVqhE+JCyFHFrO0ixRbZDRK1XJt1sA== 268 | dependencies: 269 | "@napi-rs/wasm-runtime" "^1.0.3" 270 | 271 | "@napi-rs/lzma-win32-arm64-msvc@1.4.5": 272 | version "1.4.5" 273 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-win32-arm64-msvc/-/lzma-win32-arm64-msvc-1.4.5.tgz#7ed8c80d588fa244a7fd55249cb0d011d04bf984" 274 | integrity sha512-eewnqvIyyhHi3KaZtBOJXohLvwwN27gfS2G/YDWdfHlbz1jrmfeHAmzMsP5qv8vGB+T80TMHNkro4kYjeh6Deg== 275 | 276 | "@napi-rs/lzma-win32-ia32-msvc@1.4.5": 277 | version "1.4.5" 278 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-win32-ia32-msvc/-/lzma-win32-ia32-msvc-1.4.5.tgz#e6f70ca87bd88370102aa610ee9e44ec28911b46" 279 | integrity sha512-OeacFVRCJOKNU/a0ephUfYZ2Yt+NvaHze/4TgOwJ0J0P4P7X1mHzN+ig9Iyd74aQDXYqc7kaCXA2dpAOcH87Cg== 280 | 281 | "@napi-rs/lzma-win32-x64-msvc@1.4.5": 282 | version "1.4.5" 283 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma-win32-x64-msvc/-/lzma-win32-x64-msvc-1.4.5.tgz#ecfcfe364e805915608ce0ff41ed4c950fdb51b8" 284 | integrity sha512-T4I1SamdSmtyZgDXGAGP+y5LEK5vxHUFwe8mz6D4R7Sa5/WCxTcCIgPJ9BD7RkpO17lzhlaM2vmVvMy96Lvk9Q== 285 | 286 | "@napi-rs/lzma@^1.4.5": 287 | version "1.4.5" 288 | resolved "https://registry.yarnpkg.com/@napi-rs/lzma/-/lzma-1.4.5.tgz#43e17cdfe332a3f33fa640422da348db3d8825e1" 289 | integrity sha512-zS5LuN1OBPAyZpda2ZZgYOEDC+xecUdAGnrvbYzjnLXkrq/OBC3B9qcRvlxbDR3k5H/gVfvef1/jyUqPknqjbg== 290 | optionalDependencies: 291 | "@napi-rs/lzma-android-arm-eabi" "1.4.5" 292 | "@napi-rs/lzma-android-arm64" "1.4.5" 293 | "@napi-rs/lzma-darwin-arm64" "1.4.5" 294 | "@napi-rs/lzma-darwin-x64" "1.4.5" 295 | "@napi-rs/lzma-freebsd-x64" "1.4.5" 296 | "@napi-rs/lzma-linux-arm-gnueabihf" "1.4.5" 297 | "@napi-rs/lzma-linux-arm64-gnu" "1.4.5" 298 | "@napi-rs/lzma-linux-arm64-musl" "1.4.5" 299 | "@napi-rs/lzma-linux-ppc64-gnu" "1.4.5" 300 | "@napi-rs/lzma-linux-riscv64-gnu" "1.4.5" 301 | "@napi-rs/lzma-linux-s390x-gnu" "1.4.5" 302 | "@napi-rs/lzma-linux-x64-gnu" "1.4.5" 303 | "@napi-rs/lzma-linux-x64-musl" "1.4.5" 304 | "@napi-rs/lzma-wasm32-wasi" "1.4.5" 305 | "@napi-rs/lzma-win32-arm64-msvc" "1.4.5" 306 | "@napi-rs/lzma-win32-ia32-msvc" "1.4.5" 307 | "@napi-rs/lzma-win32-x64-msvc" "1.4.5" 308 | 309 | "@napi-rs/tar-android-arm-eabi@1.1.0": 310 | version "1.1.0" 311 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-android-arm-eabi/-/tar-android-arm-eabi-1.1.0.tgz#08ae6ebbaf38d416954a28ca09bf77410d5b0c2b" 312 | integrity sha512-h2Ryndraj/YiKgMV/r5by1cDusluYIRT0CaE0/PekQ4u+Wpy2iUVqvzVU98ZPnhXaNeYxEvVJHNGafpOfaD0TA== 313 | 314 | "@napi-rs/tar-android-arm64@1.1.0": 315 | version "1.1.0" 316 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-android-arm64/-/tar-android-arm64-1.1.0.tgz#825a76140116f89d7e930245bda9f70b196da565" 317 | integrity sha512-DJFyQHr1ZxNZorm/gzc1qBNLF/FcKzcH0V0Vwan5P+o0aE2keQIGEjJ09FudkF9v6uOuJjHCVDdK6S6uHtShAw== 318 | 319 | "@napi-rs/tar-darwin-arm64@1.1.0": 320 | version "1.1.0" 321 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-darwin-arm64/-/tar-darwin-arm64-1.1.0.tgz#8821616c40ea52ec2c00a055be56bf28dee76013" 322 | integrity sha512-Zz2sXRzjIX4e532zD6xm2SjXEym6MkvfCvL2RMpG2+UwNVDVscHNcz3d47Pf3sysP2e2af7fBB3TIoK2f6trPw== 323 | 324 | "@napi-rs/tar-darwin-x64@1.1.0": 325 | version "1.1.0" 326 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-darwin-x64/-/tar-darwin-x64-1.1.0.tgz#4a975e41932a145c58181cb43c8f483c3858e359" 327 | integrity sha512-EI+CptIMNweT0ms9S3mkP/q+J6FNZ1Q6pvpJOEcWglRfyfQpLqjlC0O+dptruTPE8VamKYuqdjxfqD8hifZDOA== 328 | 329 | "@napi-rs/tar-freebsd-x64@1.1.0": 330 | version "1.1.0" 331 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-freebsd-x64/-/tar-freebsd-x64-1.1.0.tgz#5ebc0633f257b258aacc59ac1420835513ed0967" 332 | integrity sha512-J0PIqX+pl6lBIAckL/c87gpodLbjZB1OtIK+RDscKC9NLdpVv6VGOxzUV/fYev/hctcE8EfkLbgFOfpmVQPg2g== 333 | 334 | "@napi-rs/tar-linux-arm-gnueabihf@1.1.0": 335 | version "1.1.0" 336 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-arm-gnueabihf/-/tar-linux-arm-gnueabihf-1.1.0.tgz#1d309bd4f46f0490353d9608e79d260cf6c7cd43" 337 | integrity sha512-SLgIQo3f3EjkZ82ZwvrEgFvMdDAhsxCYjyoSuWfHCz0U16qx3SuGCp8+FYOPYCECHN3ZlGjXnoAIt9ERd0dEUg== 338 | 339 | "@napi-rs/tar-linux-arm64-gnu@1.1.0": 340 | version "1.1.0" 341 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-arm64-gnu/-/tar-linux-arm64-gnu-1.1.0.tgz#88d974821f3f8e9ee6948b4d51c78c019dee88ad" 342 | integrity sha512-d014cdle52EGaH6GpYTQOP9Py7glMO1zz/+ynJPjjzYFSxvdYx0byrjumZk2UQdIyGZiJO2MEFpCkEEKFSgPYA== 343 | 344 | "@napi-rs/tar-linux-arm64-musl@1.1.0": 345 | version "1.1.0" 346 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-arm64-musl/-/tar-linux-arm64-musl-1.1.0.tgz#ab2baee7b288df5e68cef0b2d12fa79d2a551b58" 347 | integrity sha512-L/y1/26q9L/uBqiW/JdOb/Dc94egFvNALUZV2WCGKQXc6UByPBMgdiEyW2dtoYxYYYYc+AKD+jr+wQPcvX2vrQ== 348 | 349 | "@napi-rs/tar-linux-ppc64-gnu@1.1.0": 350 | version "1.1.0" 351 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-ppc64-gnu/-/tar-linux-ppc64-gnu-1.1.0.tgz#7500e60d27849ba36fa4802a346249974e7ecf74" 352 | integrity sha512-EPE1K/80RQvPbLRJDJs1QmCIcH+7WRi0F73+oTe1582y9RtfGRuzAkzeBuAGRXAQEjRQw/RjtNqr6UTJ+8UuWQ== 353 | 354 | "@napi-rs/tar-linux-s390x-gnu@1.1.0": 355 | version "1.1.0" 356 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-s390x-gnu/-/tar-linux-s390x-gnu-1.1.0.tgz#cfc0923bfad1dea8ef9da22148a8d4932aa52d08" 357 | integrity sha512-B2jhWiB1ffw1nQBqLUP1h4+J1ovAxBOoe5N2IqDMOc63fsPZKNqF1PvO/dIem8z7LL4U4bsfmhy3gBfu547oNQ== 358 | 359 | "@napi-rs/tar-linux-x64-gnu@1.1.0": 360 | version "1.1.0" 361 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-x64-gnu/-/tar-linux-x64-gnu-1.1.0.tgz#5fdf9e1bb12b10a951c6ab03268a9f8d9788c929" 362 | integrity sha512-tbZDHnb9617lTnsDMGo/eAMZxnsQFnaRe+MszRqHguKfMwkisc9CCJnks/r1o84u5fECI+J/HOrKXgczq/3Oww== 363 | 364 | "@napi-rs/tar-linux-x64-musl@1.1.0": 365 | version "1.1.0" 366 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-linux-x64-musl/-/tar-linux-x64-musl-1.1.0.tgz#f001fc0a0a2996dcf99e787a15eade8dce215e91" 367 | integrity sha512-dV6cODlzbO8u6Anmv2N/ilQHq/AWz0xyltuXoLU3yUyXbZcnWYZuB2rL8OBGPmqNcD+x9NdScBNXh7vWN0naSQ== 368 | 369 | "@napi-rs/tar-wasm32-wasi@1.1.0": 370 | version "1.1.0" 371 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-wasm32-wasi/-/tar-wasm32-wasi-1.1.0.tgz#c1c7df7738b23f1cdbcff261d5bea6968d0a3c9a" 372 | integrity sha512-jIa9nb2HzOrfH0F8QQ9g3WE4aMH5vSI5/1NYVNm9ysCmNjCCtMXCAhlI3WKCdm/DwHf0zLqdrrtDFXODcNaqMw== 373 | dependencies: 374 | "@napi-rs/wasm-runtime" "^1.0.3" 375 | 376 | "@napi-rs/tar-win32-arm64-msvc@1.1.0": 377 | version "1.1.0" 378 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-win32-arm64-msvc/-/tar-win32-arm64-msvc-1.1.0.tgz#4c8519eab28021e1eda0847433cab949d5389833" 379 | integrity sha512-vfpG71OB0ijtjemp3WTdmBKJm9R70KM8vsSExMsIQtV0lVzP07oM1CW6JbNRPXNLhRoue9ofYLiUDk8bE0Hckg== 380 | 381 | "@napi-rs/tar-win32-ia32-msvc@1.1.0": 382 | version "1.1.0" 383 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-win32-ia32-msvc/-/tar-win32-ia32-msvc-1.1.0.tgz#4f61af0da2c53b23f7d58c77970eaa4449e8eb79" 384 | integrity sha512-hGPyPW60YSpOSgzfy68DLBHgi6HxkAM+L59ZZZPMQ0TOXjQg+p2EW87+TjZfJOkSpbYiEkULwa/f4a2hcVjsqQ== 385 | 386 | "@napi-rs/tar-win32-x64-msvc@1.1.0": 387 | version "1.1.0" 388 | resolved "https://registry.yarnpkg.com/@napi-rs/tar-win32-x64-msvc/-/tar-win32-x64-msvc-1.1.0.tgz#eb63fb44ecde001cce6be238f175e66a06c15035" 389 | integrity sha512-L6Ed1DxXK9YSCMyvpR8MiNAyKNkQLjsHsHK9E0qnHa8NzLFqzDKhvs5LfnWxM2kJ+F7m/e5n9zPm24kHb3LsVw== 390 | 391 | "@napi-rs/tar@^1.1.0": 392 | version "1.1.0" 393 | resolved "https://registry.yarnpkg.com/@napi-rs/tar/-/tar-1.1.0.tgz#acecd9e29f705a3f534d5fb3d8aa36b3266727d0" 394 | integrity sha512-7cmzIu+Vbupriudo7UudoMRH2OA3cTw67vva8MxeoAe5S7vPFI7z0vp0pMXiA25S8IUJefImQ90FeJjl8fjEaQ== 395 | optionalDependencies: 396 | "@napi-rs/tar-android-arm-eabi" "1.1.0" 397 | "@napi-rs/tar-android-arm64" "1.1.0" 398 | "@napi-rs/tar-darwin-arm64" "1.1.0" 399 | "@napi-rs/tar-darwin-x64" "1.1.0" 400 | "@napi-rs/tar-freebsd-x64" "1.1.0" 401 | "@napi-rs/tar-linux-arm-gnueabihf" "1.1.0" 402 | "@napi-rs/tar-linux-arm64-gnu" "1.1.0" 403 | "@napi-rs/tar-linux-arm64-musl" "1.1.0" 404 | "@napi-rs/tar-linux-ppc64-gnu" "1.1.0" 405 | "@napi-rs/tar-linux-s390x-gnu" "1.1.0" 406 | "@napi-rs/tar-linux-x64-gnu" "1.1.0" 407 | "@napi-rs/tar-linux-x64-musl" "1.1.0" 408 | "@napi-rs/tar-wasm32-wasi" "1.1.0" 409 | "@napi-rs/tar-win32-arm64-msvc" "1.1.0" 410 | "@napi-rs/tar-win32-ia32-msvc" "1.1.0" 411 | "@napi-rs/tar-win32-x64-msvc" "1.1.0" 412 | 413 | "@napi-rs/wasm-runtime@^1.0.3": 414 | version "1.0.6" 415 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.6.tgz#ba6cf875b7bf96052d0de29a91b029c94c6e9a48" 416 | integrity sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g== 417 | dependencies: 418 | "@emnapi/core" "^1.5.0" 419 | "@emnapi/runtime" "^1.5.0" 420 | "@tybys/wasm-util" "^0.10.1" 421 | 422 | "@napi-rs/wasm-tools-android-arm-eabi@1.0.1": 423 | version "1.0.1" 424 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-android-arm-eabi/-/wasm-tools-android-arm-eabi-1.0.1.tgz#a709f93ddd95508a4ef949b5ceff2b2e85b676f7" 425 | integrity sha512-lr07E/l571Gft5v4aA1dI8koJEmF1F0UigBbsqg9OWNzg80H3lDPO+auv85y3T/NHE3GirDk7x/D3sLO57vayw== 426 | 427 | "@napi-rs/wasm-tools-android-arm64@1.0.1": 428 | version "1.0.1" 429 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-android-arm64/-/wasm-tools-android-arm64-1.0.1.tgz#304b5761b4fcc871b876ebd34975c72c9d11a7fc" 430 | integrity sha512-WDR7S+aRLV6LtBJAg5fmjKkTZIdrEnnQxgdsb7Cf8pYiMWBHLU+LC49OUVppQ2YSPY0+GeYm9yuZWW3kLjJ7Bg== 431 | 432 | "@napi-rs/wasm-tools-darwin-arm64@1.0.1": 433 | version "1.0.1" 434 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-darwin-arm64/-/wasm-tools-darwin-arm64-1.0.1.tgz#dafb4330986a8b46e8de1603ea2f6932a19634c6" 435 | integrity sha512-qWTI+EEkiN0oIn/N2gQo7+TVYil+AJ20jjuzD2vATS6uIjVz+Updeqmszi7zq7rdFTLp6Ea3/z4kDKIfZwmR9g== 436 | 437 | "@napi-rs/wasm-tools-darwin-x64@1.0.1": 438 | version "1.0.1" 439 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-darwin-x64/-/wasm-tools-darwin-x64-1.0.1.tgz#0919e63714ee0a52b1120f6452bbc3a4d793ce3c" 440 | integrity sha512-bA6hubqtHROR5UI3tToAF/c6TDmaAgF0SWgo4rADHtQ4wdn0JeogvOk50gs2TYVhKPE2ZD2+qqt7oBKB+sxW3A== 441 | 442 | "@napi-rs/wasm-tools-freebsd-x64@1.0.1": 443 | version "1.0.1" 444 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-freebsd-x64/-/wasm-tools-freebsd-x64-1.0.1.tgz#1f50a2d5d5af041c55634f43f623ae49192bce9c" 445 | integrity sha512-90+KLBkD9hZEjPQW1MDfwSt5J1L46EUKacpCZWyRuL6iIEO5CgWU0V/JnEgFsDOGyyYtiTvHc5bUdUTWd4I9Vg== 446 | 447 | "@napi-rs/wasm-tools-linux-arm64-gnu@1.0.1": 448 | version "1.0.1" 449 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-linux-arm64-gnu/-/wasm-tools-linux-arm64-gnu-1.0.1.tgz#6106d5e65a25ec2ae417c2fcfebd5c8f14d80e84" 450 | integrity sha512-rG0QlS65x9K/u3HrKafDf8cFKj5wV2JHGfl8abWgKew0GVPyp6vfsDweOwHbWAjcHtp2LHi6JHoW80/MTHm52Q== 451 | 452 | "@napi-rs/wasm-tools-linux-arm64-musl@1.0.1": 453 | version "1.0.1" 454 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-linux-arm64-musl/-/wasm-tools-linux-arm64-musl-1.0.1.tgz#0eb3d4d1fbc1938b0edd907423840365ebc53859" 455 | integrity sha512-jAasbIvjZXCgX0TCuEFQr+4D6Lla/3AAVx2LmDuMjgG4xoIXzjKWl7c4chuaD+TI+prWT0X6LJcdzFT+ROKGHQ== 456 | 457 | "@napi-rs/wasm-tools-linux-x64-gnu@1.0.1": 458 | version "1.0.1" 459 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-linux-x64-gnu/-/wasm-tools-linux-x64-gnu-1.0.1.tgz#5de6a567083a83efed16d046f47b680cbe7c9b53" 460 | integrity sha512-Plgk5rPqqK2nocBGajkMVbGm010Z7dnUgq0wtnYRZbzWWxwWcXfZMPa8EYxrK4eE8SzpI7VlZP1tdVsdjgGwMw== 461 | 462 | "@napi-rs/wasm-tools-linux-x64-musl@1.0.1": 463 | version "1.0.1" 464 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-linux-x64-musl/-/wasm-tools-linux-x64-musl-1.0.1.tgz#04cc17ef12b4e5012f2d0e46b09cabe473566e5a" 465 | integrity sha512-GW7AzGuWxtQkyHknHWYFdR0CHmW6is8rG2Rf4V6GNmMpmwtXt/ItWYWtBe4zqJWycMNazpfZKSw/BpT7/MVCXQ== 466 | 467 | "@napi-rs/wasm-tools-wasm32-wasi@1.0.1": 468 | version "1.0.1" 469 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-wasm32-wasi/-/wasm-tools-wasm32-wasi-1.0.1.tgz#6ced3bd03428c854397f00509b1694c3af857a0f" 470 | integrity sha512-/nQVSTrqSsn7YdAc2R7Ips/tnw5SPUcl3D7QrXCNGPqjbatIspnaexvaOYNyKMU6xPu+pc0BTnKVmqhlJJCPLA== 471 | dependencies: 472 | "@napi-rs/wasm-runtime" "^1.0.3" 473 | 474 | "@napi-rs/wasm-tools-win32-arm64-msvc@1.0.1": 475 | version "1.0.1" 476 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-win32-arm64-msvc/-/wasm-tools-win32-arm64-msvc-1.0.1.tgz#e776f66eb637eee312b562e987c0a5871ddc6dac" 477 | integrity sha512-PFi7oJIBu5w7Qzh3dwFea3sHRO3pojMsaEnUIy22QvsW+UJfNQwJCryVrpoUt8m4QyZXI+saEq/0r4GwdoHYFQ== 478 | 479 | "@napi-rs/wasm-tools-win32-ia32-msvc@1.0.1": 480 | version "1.0.1" 481 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-win32-ia32-msvc/-/wasm-tools-win32-ia32-msvc-1.0.1.tgz#9167919a62d24cb3a46f01fada26fee38aeaf884" 482 | integrity sha512-gXkuYzxQsgkj05Zaq+KQTkHIN83dFAwMcTKa2aQcpYPRImFm2AQzEyLtpXmyCWzJ0F9ZYAOmbSyrNew8/us6bw== 483 | 484 | "@napi-rs/wasm-tools-win32-x64-msvc@1.0.1": 485 | version "1.0.1" 486 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools-win32-x64-msvc/-/wasm-tools-win32-x64-msvc-1.0.1.tgz#f896ab29a83605795bb12cf2cfc1a215bc830c65" 487 | integrity sha512-rEAf05nol3e3eei2sRButmgXP+6ATgm0/38MKhz9Isne82T4rPIMYsCIFj0kOisaGeVwoi2fnm7O9oWp5YVnYQ== 488 | 489 | "@napi-rs/wasm-tools@^1.0.1": 490 | version "1.0.1" 491 | resolved "https://registry.yarnpkg.com/@napi-rs/wasm-tools/-/wasm-tools-1.0.1.tgz#f54caa0132322fd5275690b2aeb581d11539262f" 492 | integrity sha512-enkZYyuCdo+9jneCPE/0fjIta4wWnvVN9hBo2HuiMpRF0q3lzv1J6b/cl7i0mxZUKhBrV3aCKDBQnCOhwKbPmQ== 493 | optionalDependencies: 494 | "@napi-rs/wasm-tools-android-arm-eabi" "1.0.1" 495 | "@napi-rs/wasm-tools-android-arm64" "1.0.1" 496 | "@napi-rs/wasm-tools-darwin-arm64" "1.0.1" 497 | "@napi-rs/wasm-tools-darwin-x64" "1.0.1" 498 | "@napi-rs/wasm-tools-freebsd-x64" "1.0.1" 499 | "@napi-rs/wasm-tools-linux-arm64-gnu" "1.0.1" 500 | "@napi-rs/wasm-tools-linux-arm64-musl" "1.0.1" 501 | "@napi-rs/wasm-tools-linux-x64-gnu" "1.0.1" 502 | "@napi-rs/wasm-tools-linux-x64-musl" "1.0.1" 503 | "@napi-rs/wasm-tools-wasm32-wasi" "1.0.1" 504 | "@napi-rs/wasm-tools-win32-arm64-msvc" "1.0.1" 505 | "@napi-rs/wasm-tools-win32-ia32-msvc" "1.0.1" 506 | "@napi-rs/wasm-tools-win32-x64-msvc" "1.0.1" 507 | 508 | "@octokit/auth-token@^6.0.0": 509 | version "6.0.0" 510 | resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-6.0.0.tgz#b02e9c08a2d8937df09a2a981f226ad219174c53" 511 | integrity sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w== 512 | 513 | "@octokit/core@^7.0.2": 514 | version "7.0.5" 515 | resolved "https://registry.yarnpkg.com/@octokit/core/-/core-7.0.5.tgz#2611ed0a0b99a278f67e4ffdfedaea4577ca3241" 516 | integrity sha512-t54CUOsFMappY1Jbzb7fetWeO0n6K0k/4+/ZpkS+3Joz8I4VcvY9OiEBFRYISqaI2fq5sCiPtAjRDOzVYG8m+Q== 517 | dependencies: 518 | "@octokit/auth-token" "^6.0.0" 519 | "@octokit/graphql" "^9.0.2" 520 | "@octokit/request" "^10.0.4" 521 | "@octokit/request-error" "^7.0.1" 522 | "@octokit/types" "^15.0.0" 523 | before-after-hook "^4.0.0" 524 | universal-user-agent "^7.0.0" 525 | 526 | "@octokit/endpoint@^11.0.1": 527 | version "11.0.1" 528 | resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-11.0.1.tgz#16c510afbe873174f2091b747abe3c21769e6b55" 529 | integrity sha512-7P1dRAZxuWAOPI7kXfio88trNi/MegQ0IJD3vfgC3b+LZo1Qe6gRJc2v0mz2USWWJOKrB2h5spXCzGbw+fAdqA== 530 | dependencies: 531 | "@octokit/types" "^15.0.0" 532 | universal-user-agent "^7.0.2" 533 | 534 | "@octokit/graphql@^9.0.2": 535 | version "9.0.2" 536 | resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-9.0.2.tgz#910a626d1e11c385357d1579cc1840f1725aa6ef" 537 | integrity sha512-iz6KzZ7u95Fzy9Nt2L8cG88lGRMr/qy1Q36ih/XVzMIlPDMYwaNLE/ENhqmIzgPrlNWiYJkwmveEetvxAgFBJw== 538 | dependencies: 539 | "@octokit/request" "^10.0.4" 540 | "@octokit/types" "^15.0.0" 541 | universal-user-agent "^7.0.0" 542 | 543 | "@octokit/openapi-types@^26.0.0": 544 | version "26.0.0" 545 | resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-26.0.0.tgz#a528b560dbc4f02040dc08d19575498d57fff19d" 546 | integrity sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA== 547 | 548 | "@octokit/plugin-paginate-rest@^13.0.1": 549 | version "13.2.0" 550 | resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.2.0.tgz#d051d4c4c5fdc802be63530853993360e4314dd4" 551 | integrity sha512-YuAlyjR8o5QoRSOvMHxSJzPtogkNMgeMv2mpccrvdUGeC3MKyfi/hS+KiFwyH/iRKIKyx+eIMsDjbt3p9r2GYA== 552 | dependencies: 553 | "@octokit/types" "^15.0.0" 554 | 555 | "@octokit/plugin-request-log@^6.0.0": 556 | version "6.0.0" 557 | resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz#de1c1e557df6c08adb631bf78264fa741e01b317" 558 | integrity sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q== 559 | 560 | "@octokit/plugin-rest-endpoint-methods@^16.0.0": 561 | version "16.1.0" 562 | resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.1.0.tgz#eb17ce9e37327dcf7b15f4b31244d7f0b58491d1" 563 | integrity sha512-nCsyiKoGRnhH5LkH8hJEZb9swpqOcsW+VXv1QoyUNQXJeVODG4+xM6UICEqyqe9XFr6LkL8BIiFCPev8zMDXPw== 564 | dependencies: 565 | "@octokit/types" "^15.0.0" 566 | 567 | "@octokit/request-error@^7.0.1": 568 | version "7.0.1" 569 | resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-7.0.1.tgz#2651faef1ed387583d73d9a38452b216a5c6975d" 570 | integrity sha512-CZpFwV4+1uBrxu7Cw8E5NCXDWFNf18MSY23TdxCBgjw1tXXHvTrZVsXlW8hgFTOLw8RQR1BBrMvYRtuyaijHMA== 571 | dependencies: 572 | "@octokit/types" "^15.0.0" 573 | 574 | "@octokit/request@^10.0.4": 575 | version "10.0.5" 576 | resolved "https://registry.yarnpkg.com/@octokit/request/-/request-10.0.5.tgz#bbe476579db7876af783a10b802bdc37903c2220" 577 | integrity sha512-TXnouHIYLtgDhKo+N6mXATnDBkV05VwbR0TtMWpgTHIoQdRQfCSzmy/LGqR1AbRMbijq/EckC/E3/ZNcU92NaQ== 578 | dependencies: 579 | "@octokit/endpoint" "^11.0.1" 580 | "@octokit/request-error" "^7.0.1" 581 | "@octokit/types" "^15.0.0" 582 | fast-content-type-parse "^3.0.0" 583 | universal-user-agent "^7.0.2" 584 | 585 | "@octokit/rest@^22.0.0": 586 | version "22.0.0" 587 | resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-22.0.0.tgz#9026f47dacba9c605da3d43cce9432c4c532dc5a" 588 | integrity sha512-z6tmTu9BTnw51jYGulxrlernpsQYXpui1RK21vmXn8yF5bp6iX16yfTtJYGK5Mh1qDkvDOmp2n8sRMcQmR8jiA== 589 | dependencies: 590 | "@octokit/core" "^7.0.2" 591 | "@octokit/plugin-paginate-rest" "^13.0.1" 592 | "@octokit/plugin-request-log" "^6.0.0" 593 | "@octokit/plugin-rest-endpoint-methods" "^16.0.0" 594 | 595 | "@octokit/types@^15.0.0": 596 | version "15.0.0" 597 | resolved "https://registry.yarnpkg.com/@octokit/types/-/types-15.0.0.tgz#6afe9b012115284ded9bf779e90d04081e0eadd3" 598 | integrity sha512-8o6yDfmoGJUIeR9OfYU0/TUJTnMPG2r68+1yEdUeG2Fdqpj8Qetg0ziKIgcBm0RW/j29H41WP37CYCEhp6GoHQ== 599 | dependencies: 600 | "@octokit/openapi-types" "^26.0.0" 601 | 602 | "@tybys/wasm-util@^0.10.1": 603 | version "0.10.1" 604 | resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.1.tgz#ecddd3205cf1e2d5274649ff0eedd2991ed7f414" 605 | integrity sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg== 606 | dependencies: 607 | tslib "^2.4.0" 608 | 609 | ansi-regex@^5.0.1: 610 | version "5.0.1" 611 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 612 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 613 | 614 | ansi-styles@^4.0.0: 615 | version "4.3.0" 616 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 617 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 618 | dependencies: 619 | color-convert "^2.0.1" 620 | 621 | argparse@^2.0.1: 622 | version "2.0.1" 623 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 624 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 625 | 626 | before-after-hook@^4.0.0: 627 | version "4.0.0" 628 | resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-4.0.0.tgz#cf1447ab9160df6a40f3621da64d6ffc36050cb9" 629 | integrity sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ== 630 | 631 | chardet@^2.1.0: 632 | version "2.1.0" 633 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-2.1.0.tgz#1007f441a1ae9f9199a4a67f6e978fb0aa9aa3fe" 634 | integrity sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA== 635 | 636 | cli-width@^4.1.0: 637 | version "4.1.0" 638 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" 639 | integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== 640 | 641 | clipanion@^4.0.0-rc.4: 642 | version "4.0.0-rc.4" 643 | resolved "https://registry.yarnpkg.com/clipanion/-/clipanion-4.0.0-rc.4.tgz#7191a940e47ef197e5f18c9cbbe419278b5f5903" 644 | integrity sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q== 645 | dependencies: 646 | typanion "^3.8.0" 647 | 648 | color-convert@^2.0.1: 649 | version "2.0.1" 650 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 651 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 652 | dependencies: 653 | color-name "~1.1.4" 654 | 655 | color-name@~1.1.4: 656 | version "1.1.4" 657 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 658 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 659 | 660 | colorette@^2.0.20: 661 | version "2.0.20" 662 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" 663 | integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== 664 | 665 | debug@^4.4.1: 666 | version "4.4.3" 667 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" 668 | integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== 669 | dependencies: 670 | ms "^2.1.3" 671 | 672 | emnapi@^1.5.0: 673 | version "1.5.0" 674 | resolved "https://registry.yarnpkg.com/emnapi/-/emnapi-1.5.0.tgz#aeb335a958c09c18c930836b46281f46707d80e9" 675 | integrity sha512-adAaiwTxMnHbq1u2LUf+AfDR5MYrxDVBtezGspxwk5e/Zb6KHkGNdfuMU4JBIVm6ASY06K8KalhOPUht92MsnA== 676 | 677 | emoji-regex@^8.0.0: 678 | version "8.0.0" 679 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 680 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 681 | 682 | es-toolkit@^1.39.10: 683 | version "1.39.10" 684 | resolved "https://registry.yarnpkg.com/es-toolkit/-/es-toolkit-1.39.10.tgz#513407af73e79f9940e7ec7650f2e6dceeaf1d81" 685 | integrity sha512-E0iGnTtbDhkeczB0T+mxmoVlT4YNweEKBLq7oaU4p11mecdsZpNWOglI4895Vh4usbQ+LsJiuLuI2L0Vdmfm2w== 686 | 687 | fast-content-type-parse@^3.0.0: 688 | version "3.0.0" 689 | resolved "https://registry.yarnpkg.com/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz#5590b6c807cc598be125e6740a9fde589d2b7afb" 690 | integrity sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg== 691 | 692 | iconv-lite@^0.7.0: 693 | version "0.7.0" 694 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.0.tgz#c50cd80e6746ca8115eb98743afa81aa0e147a3e" 695 | integrity sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ== 696 | dependencies: 697 | safer-buffer ">= 2.1.2 < 3.0.0" 698 | 699 | is-fullwidth-code-point@^3.0.0: 700 | version "3.0.0" 701 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 702 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 703 | 704 | js-yaml@^4.1.0: 705 | version "4.1.0" 706 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 707 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 708 | dependencies: 709 | argparse "^2.0.1" 710 | 711 | ms@^2.1.3: 712 | version "2.1.3" 713 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 714 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 715 | 716 | mute-stream@^2.0.0: 717 | version "2.0.0" 718 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b" 719 | integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== 720 | 721 | "safer-buffer@>= 2.1.2 < 3.0.0": 722 | version "2.1.2" 723 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 724 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 725 | 726 | semver@^7.7.2: 727 | version "7.7.2" 728 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" 729 | integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== 730 | 731 | signal-exit@^4.1.0: 732 | version "4.1.0" 733 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" 734 | integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== 735 | 736 | string-width@^4.1.0: 737 | version "4.2.3" 738 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 739 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 740 | dependencies: 741 | emoji-regex "^8.0.0" 742 | is-fullwidth-code-point "^3.0.0" 743 | strip-ansi "^6.0.1" 744 | 745 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 746 | version "6.0.1" 747 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 748 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 749 | dependencies: 750 | ansi-regex "^5.0.1" 751 | 752 | tslib@^2.4.0: 753 | version "2.8.1" 754 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" 755 | integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== 756 | 757 | typanion@^3.14.0, typanion@^3.8.0: 758 | version "3.14.0" 759 | resolved "https://registry.yarnpkg.com/typanion/-/typanion-3.14.0.tgz#a766a91810ce8258033975733e836c43a2929b94" 760 | integrity sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug== 761 | 762 | universal-user-agent@^7.0.0, universal-user-agent@^7.0.2: 763 | version "7.0.3" 764 | resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-7.0.3.tgz#c05870a58125a2dc00431f2df815a77fe69736be" 765 | integrity sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A== 766 | 767 | wrap-ansi@^6.2.0: 768 | version "6.2.0" 769 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 770 | integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 771 | dependencies: 772 | ansi-styles "^4.0.0" 773 | string-width "^4.1.0" 774 | strip-ansi "^6.0.0" 775 | 776 | yoctocolors-cjs@^2.1.2: 777 | version "2.1.3" 778 | resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz#7e4964ea8ec422b7a40ac917d3a344cfd2304baa" 779 | integrity sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw== 780 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.25.1" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.1" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 | 20 | [[package]] 21 | name = "aho-corasick" 22 | version = "1.1.3" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 25 | dependencies = [ 26 | "memchr", 27 | ] 28 | 29 | [[package]] 30 | name = "anstream" 31 | version = "0.6.20" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" 34 | dependencies = [ 35 | "anstyle", 36 | "anstyle-parse", 37 | "anstyle-query", 38 | "anstyle-wincon", 39 | "colorchoice", 40 | "is_terminal_polyfill", 41 | "utf8parse", 42 | ] 43 | 44 | [[package]] 45 | name = "anstyle" 46 | version = "1.0.11" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" 49 | 50 | [[package]] 51 | name = "anstyle-parse" 52 | version = "0.2.7" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 55 | dependencies = [ 56 | "utf8parse", 57 | ] 58 | 59 | [[package]] 60 | name = "anstyle-query" 61 | version = "1.1.4" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" 64 | dependencies = [ 65 | "windows-sys 0.60.2", 66 | ] 67 | 68 | [[package]] 69 | name = "anstyle-wincon" 70 | version = "3.0.10" 71 | source = "registry+https://github.com/rust-lang/crates.io-index" 72 | checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" 73 | dependencies = [ 74 | "anstyle", 75 | "once_cell_polyfill", 76 | "windows-sys 0.60.2", 77 | ] 78 | 79 | [[package]] 80 | name = "arboard" 81 | version = "3.6.1" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" 84 | dependencies = [ 85 | "clipboard-win", 86 | "image", 87 | "log", 88 | "objc2", 89 | "objc2-app-kit", 90 | "objc2-core-foundation", 91 | "objc2-core-graphics", 92 | "objc2-foundation", 93 | "parking_lot", 94 | "percent-encoding", 95 | "windows-sys 0.60.2", 96 | "x11rb", 97 | ] 98 | 99 | [[package]] 100 | name = "atomic-waker" 101 | version = "1.1.2" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 104 | 105 | [[package]] 106 | name = "autocfg" 107 | version = "1.5.0" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 110 | 111 | [[package]] 112 | name = "backtrace" 113 | version = "0.3.76" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" 116 | dependencies = [ 117 | "addr2line", 118 | "cfg-if", 119 | "libc", 120 | "miniz_oxide", 121 | "object", 122 | "rustc-demangle", 123 | "windows-link", 124 | ] 125 | 126 | [[package]] 127 | name = "base64" 128 | version = "0.22.1" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 131 | 132 | [[package]] 133 | name = "bitflags" 134 | version = "2.9.4" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" 137 | 138 | [[package]] 139 | name = "bumpalo" 140 | version = "3.19.0" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 143 | 144 | [[package]] 145 | name = "bytemuck" 146 | version = "1.23.2" 147 | source = "registry+https://github.com/rust-lang/crates.io-index" 148 | checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" 149 | 150 | [[package]] 151 | name = "byteorder-lite" 152 | version = "0.1.0" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" 155 | 156 | [[package]] 157 | name = "bytes" 158 | version = "1.10.1" 159 | source = "registry+https://github.com/rust-lang/crates.io-index" 160 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 161 | 162 | [[package]] 163 | name = "cc" 164 | version = "1.2.40" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" 167 | dependencies = [ 168 | "find-msvc-tools", 169 | "shlex", 170 | ] 171 | 172 | [[package]] 173 | name = "cfg-if" 174 | version = "1.0.3" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 177 | 178 | [[package]] 179 | name = "cfg_aliases" 180 | version = "0.2.1" 181 | source = "registry+https://github.com/rust-lang/crates.io-index" 182 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 183 | 184 | [[package]] 185 | name = "clap" 186 | version = "4.5.48" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" 189 | dependencies = [ 190 | "clap_builder", 191 | "clap_derive", 192 | ] 193 | 194 | [[package]] 195 | name = "clap_builder" 196 | version = "4.5.48" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" 199 | dependencies = [ 200 | "anstream", 201 | "anstyle", 202 | "clap_lex", 203 | "strsim", 204 | ] 205 | 206 | [[package]] 207 | name = "clap_derive" 208 | version = "4.5.47" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" 211 | dependencies = [ 212 | "heck", 213 | "proc-macro2", 214 | "quote", 215 | "syn", 216 | ] 217 | 218 | [[package]] 219 | name = "clap_lex" 220 | version = "0.7.5" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" 223 | 224 | [[package]] 225 | name = "clipboard-win" 226 | version = "5.4.1" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" 229 | dependencies = [ 230 | "error-code", 231 | ] 232 | 233 | [[package]] 234 | name = "colorchoice" 235 | version = "1.0.4" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 238 | 239 | [[package]] 240 | name = "console" 241 | version = "0.16.1" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "b430743a6eb14e9764d4260d4c0d8123087d504eeb9c48f2b2a5e810dd369df4" 244 | dependencies = [ 245 | "encode_unicode", 246 | "libc", 247 | "once_cell", 248 | "unicode-width", 249 | "windows-sys 0.61.1", 250 | ] 251 | 252 | [[package]] 253 | name = "convert_case" 254 | version = "0.8.0" 255 | source = "registry+https://github.com/rust-lang/crates.io-index" 256 | checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" 257 | dependencies = [ 258 | "unicode-segmentation", 259 | ] 260 | 261 | [[package]] 262 | name = "crc32fast" 263 | version = "1.5.0" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" 266 | dependencies = [ 267 | "cfg-if", 268 | ] 269 | 270 | [[package]] 271 | name = "crunchy" 272 | version = "0.2.4" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" 275 | 276 | [[package]] 277 | name = "ctor" 278 | version = "0.5.0" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "67773048316103656a637612c4a62477603b777d91d9c62ff2290f9cde178fdb" 281 | dependencies = [ 282 | "ctor-proc-macro", 283 | "dtor", 284 | ] 285 | 286 | [[package]] 287 | name = "ctor-proc-macro" 288 | version = "0.0.6" 289 | source = "registry+https://github.com/rust-lang/crates.io-index" 290 | checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" 291 | 292 | [[package]] 293 | name = "dialoguer" 294 | version = "0.12.0" 295 | source = "registry+https://github.com/rust-lang/crates.io-index" 296 | checksum = "25f104b501bf2364e78d0d3974cbc774f738f5865306ed128e1e0d7499c0ad96" 297 | dependencies = [ 298 | "console", 299 | "shell-words", 300 | "tempfile", 301 | "zeroize", 302 | ] 303 | 304 | [[package]] 305 | name = "dispatch2" 306 | version = "0.3.0" 307 | source = "registry+https://github.com/rust-lang/crates.io-index" 308 | checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" 309 | dependencies = [ 310 | "bitflags", 311 | "objc2", 312 | ] 313 | 314 | [[package]] 315 | name = "displaydoc" 316 | version = "0.2.5" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 319 | dependencies = [ 320 | "proc-macro2", 321 | "quote", 322 | "syn", 323 | ] 324 | 325 | [[package]] 326 | name = "dtor" 327 | version = "0.1.0" 328 | source = "registry+https://github.com/rust-lang/crates.io-index" 329 | checksum = "e58a0764cddb55ab28955347b45be00ade43d4d6f3ba4bf3dc354e4ec9432934" 330 | dependencies = [ 331 | "dtor-proc-macro", 332 | ] 333 | 334 | [[package]] 335 | name = "dtor-proc-macro" 336 | version = "0.0.6" 337 | source = "registry+https://github.com/rust-lang/crates.io-index" 338 | checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" 339 | 340 | [[package]] 341 | name = "encode_unicode" 342 | version = "1.0.0" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" 345 | 346 | [[package]] 347 | name = "errno" 348 | version = "0.3.14" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 351 | dependencies = [ 352 | "libc", 353 | "windows-sys 0.61.1", 354 | ] 355 | 356 | [[package]] 357 | name = "error-code" 358 | version = "3.3.2" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" 361 | 362 | [[package]] 363 | name = "fastrand" 364 | version = "2.3.0" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 367 | 368 | [[package]] 369 | name = "fax" 370 | version = "0.2.6" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" 373 | dependencies = [ 374 | "fax_derive", 375 | ] 376 | 377 | [[package]] 378 | name = "fax_derive" 379 | version = "0.2.0" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" 382 | dependencies = [ 383 | "proc-macro2", 384 | "quote", 385 | "syn", 386 | ] 387 | 388 | [[package]] 389 | name = "fdeflate" 390 | version = "0.3.7" 391 | source = "registry+https://github.com/rust-lang/crates.io-index" 392 | checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" 393 | dependencies = [ 394 | "simd-adler32", 395 | ] 396 | 397 | [[package]] 398 | name = "find-msvc-tools" 399 | version = "0.1.3" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" 402 | 403 | [[package]] 404 | name = "flate2" 405 | version = "1.1.2" 406 | source = "registry+https://github.com/rust-lang/crates.io-index" 407 | checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 408 | dependencies = [ 409 | "crc32fast", 410 | "miniz_oxide", 411 | ] 412 | 413 | [[package]] 414 | name = "fnv" 415 | version = "1.0.7" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 418 | 419 | [[package]] 420 | name = "form_urlencoded" 421 | version = "1.2.2" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 424 | dependencies = [ 425 | "percent-encoding", 426 | ] 427 | 428 | [[package]] 429 | name = "futures-channel" 430 | version = "0.3.31" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 433 | dependencies = [ 434 | "futures-core", 435 | ] 436 | 437 | [[package]] 438 | name = "futures-core" 439 | version = "0.3.31" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 442 | 443 | [[package]] 444 | name = "futures-task" 445 | version = "0.3.31" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 448 | 449 | [[package]] 450 | name = "futures-util" 451 | version = "0.3.31" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 454 | dependencies = [ 455 | "futures-core", 456 | "futures-task", 457 | "pin-project-lite", 458 | "pin-utils", 459 | ] 460 | 461 | [[package]] 462 | name = "gethostname" 463 | version = "1.0.2" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55" 466 | dependencies = [ 467 | "rustix", 468 | "windows-targets 0.52.6", 469 | ] 470 | 471 | [[package]] 472 | name = "getrandom" 473 | version = "0.2.16" 474 | source = "registry+https://github.com/rust-lang/crates.io-index" 475 | checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 476 | dependencies = [ 477 | "cfg-if", 478 | "js-sys", 479 | "libc", 480 | "wasi 0.11.1+wasi-snapshot-preview1", 481 | "wasm-bindgen", 482 | ] 483 | 484 | [[package]] 485 | name = "getrandom" 486 | version = "0.3.3" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 489 | dependencies = [ 490 | "cfg-if", 491 | "js-sys", 492 | "libc", 493 | "r-efi", 494 | "wasi 0.14.7+wasi-0.2.4", 495 | "wasm-bindgen", 496 | ] 497 | 498 | [[package]] 499 | name = "gimli" 500 | version = "0.32.3" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" 503 | 504 | [[package]] 505 | name = "half" 506 | version = "2.6.0" 507 | source = "registry+https://github.com/rust-lang/crates.io-index" 508 | checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" 509 | dependencies = [ 510 | "cfg-if", 511 | "crunchy", 512 | ] 513 | 514 | [[package]] 515 | name = "heck" 516 | version = "0.5.0" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 519 | 520 | [[package]] 521 | name = "http" 522 | version = "1.3.1" 523 | source = "registry+https://github.com/rust-lang/crates.io-index" 524 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 525 | dependencies = [ 526 | "bytes", 527 | "fnv", 528 | "itoa", 529 | ] 530 | 531 | [[package]] 532 | name = "http-body" 533 | version = "1.0.1" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 536 | dependencies = [ 537 | "bytes", 538 | "http", 539 | ] 540 | 541 | [[package]] 542 | name = "http-body-util" 543 | version = "0.1.3" 544 | source = "registry+https://github.com/rust-lang/crates.io-index" 545 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 546 | dependencies = [ 547 | "bytes", 548 | "futures-core", 549 | "http", 550 | "http-body", 551 | "pin-project-lite", 552 | ] 553 | 554 | [[package]] 555 | name = "httparse" 556 | version = "1.10.1" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 559 | 560 | [[package]] 561 | name = "hyper" 562 | version = "1.7.0" 563 | source = "registry+https://github.com/rust-lang/crates.io-index" 564 | checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 565 | dependencies = [ 566 | "atomic-waker", 567 | "bytes", 568 | "futures-channel", 569 | "futures-core", 570 | "http", 571 | "http-body", 572 | "httparse", 573 | "itoa", 574 | "pin-project-lite", 575 | "pin-utils", 576 | "smallvec", 577 | "tokio", 578 | "want", 579 | ] 580 | 581 | [[package]] 582 | name = "hyper-rustls" 583 | version = "0.27.7" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" 586 | dependencies = [ 587 | "http", 588 | "hyper", 589 | "hyper-util", 590 | "rustls", 591 | "rustls-pki-types", 592 | "tokio", 593 | "tokio-rustls", 594 | "tower-service", 595 | "webpki-roots", 596 | ] 597 | 598 | [[package]] 599 | name = "hyper-util" 600 | version = "0.1.17" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 603 | dependencies = [ 604 | "base64", 605 | "bytes", 606 | "futures-channel", 607 | "futures-core", 608 | "futures-util", 609 | "http", 610 | "http-body", 611 | "hyper", 612 | "ipnet", 613 | "libc", 614 | "percent-encoding", 615 | "pin-project-lite", 616 | "socket2", 617 | "tokio", 618 | "tower-service", 619 | "tracing", 620 | ] 621 | 622 | [[package]] 623 | name = "icu_collections" 624 | version = "2.0.0" 625 | source = "registry+https://github.com/rust-lang/crates.io-index" 626 | checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 627 | dependencies = [ 628 | "displaydoc", 629 | "potential_utf", 630 | "yoke", 631 | "zerofrom", 632 | "zerovec", 633 | ] 634 | 635 | [[package]] 636 | name = "icu_locale_core" 637 | version = "2.0.0" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 640 | dependencies = [ 641 | "displaydoc", 642 | "litemap", 643 | "tinystr", 644 | "writeable", 645 | "zerovec", 646 | ] 647 | 648 | [[package]] 649 | name = "icu_normalizer" 650 | version = "2.0.0" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 653 | dependencies = [ 654 | "displaydoc", 655 | "icu_collections", 656 | "icu_normalizer_data", 657 | "icu_properties", 658 | "icu_provider", 659 | "smallvec", 660 | "zerovec", 661 | ] 662 | 663 | [[package]] 664 | name = "icu_normalizer_data" 665 | version = "2.0.0" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 668 | 669 | [[package]] 670 | name = "icu_properties" 671 | version = "2.0.1" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 674 | dependencies = [ 675 | "displaydoc", 676 | "icu_collections", 677 | "icu_locale_core", 678 | "icu_properties_data", 679 | "icu_provider", 680 | "potential_utf", 681 | "zerotrie", 682 | "zerovec", 683 | ] 684 | 685 | [[package]] 686 | name = "icu_properties_data" 687 | version = "2.0.1" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 690 | 691 | [[package]] 692 | name = "icu_provider" 693 | version = "2.0.0" 694 | source = "registry+https://github.com/rust-lang/crates.io-index" 695 | checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 696 | dependencies = [ 697 | "displaydoc", 698 | "icu_locale_core", 699 | "stable_deref_trait", 700 | "tinystr", 701 | "writeable", 702 | "yoke", 703 | "zerofrom", 704 | "zerotrie", 705 | "zerovec", 706 | ] 707 | 708 | [[package]] 709 | name = "idna" 710 | version = "1.1.0" 711 | source = "registry+https://github.com/rust-lang/crates.io-index" 712 | checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 713 | dependencies = [ 714 | "idna_adapter", 715 | "smallvec", 716 | "utf8_iter", 717 | ] 718 | 719 | [[package]] 720 | name = "idna_adapter" 721 | version = "1.2.1" 722 | source = "registry+https://github.com/rust-lang/crates.io-index" 723 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 724 | dependencies = [ 725 | "icu_normalizer", 726 | "icu_properties", 727 | ] 728 | 729 | [[package]] 730 | name = "image" 731 | version = "0.25.8" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "529feb3e6769d234375c4cf1ee2ce713682b8e76538cb13f9fc23e1400a591e7" 734 | dependencies = [ 735 | "bytemuck", 736 | "byteorder-lite", 737 | "moxcms", 738 | "num-traits", 739 | "png", 740 | "tiff", 741 | ] 742 | 743 | [[package]] 744 | name = "io-uring" 745 | version = "0.7.10" 746 | source = "registry+https://github.com/rust-lang/crates.io-index" 747 | checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" 748 | dependencies = [ 749 | "bitflags", 750 | "cfg-if", 751 | "libc", 752 | ] 753 | 754 | [[package]] 755 | name = "ipnet" 756 | version = "2.11.0" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 759 | 760 | [[package]] 761 | name = "iri-string" 762 | version = "0.7.8" 763 | source = "registry+https://github.com/rust-lang/crates.io-index" 764 | checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 765 | dependencies = [ 766 | "memchr", 767 | "serde", 768 | ] 769 | 770 | [[package]] 771 | name = "is_terminal_polyfill" 772 | version = "1.70.1" 773 | source = "registry+https://github.com/rust-lang/crates.io-index" 774 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 775 | 776 | [[package]] 777 | name = "itoa" 778 | version = "1.0.15" 779 | source = "registry+https://github.com/rust-lang/crates.io-index" 780 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 781 | 782 | [[package]] 783 | name = "js-sys" 784 | version = "0.3.81" 785 | source = "registry+https://github.com/rust-lang/crates.io-index" 786 | checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" 787 | dependencies = [ 788 | "once_cell", 789 | "wasm-bindgen", 790 | ] 791 | 792 | [[package]] 793 | name = "libc" 794 | version = "0.2.176" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" 797 | 798 | [[package]] 799 | name = "libloading" 800 | version = "0.8.9" 801 | source = "registry+https://github.com/rust-lang/crates.io-index" 802 | checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" 803 | dependencies = [ 804 | "cfg-if", 805 | "windows-link", 806 | ] 807 | 808 | [[package]] 809 | name = "linux-raw-sys" 810 | version = "0.11.0" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 813 | 814 | [[package]] 815 | name = "litemap" 816 | version = "0.8.0" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 819 | 820 | [[package]] 821 | name = "lock_api" 822 | version = "0.4.13" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 825 | dependencies = [ 826 | "autocfg", 827 | "scopeguard", 828 | ] 829 | 830 | [[package]] 831 | name = "log" 832 | version = "0.4.28" 833 | source = "registry+https://github.com/rust-lang/crates.io-index" 834 | checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 835 | 836 | [[package]] 837 | name = "lru-slab" 838 | version = "0.1.2" 839 | source = "registry+https://github.com/rust-lang/crates.io-index" 840 | checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" 841 | 842 | [[package]] 843 | name = "memchr" 844 | version = "2.7.6" 845 | source = "registry+https://github.com/rust-lang/crates.io-index" 846 | checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 847 | 848 | [[package]] 849 | name = "miniz_oxide" 850 | version = "0.8.9" 851 | source = "registry+https://github.com/rust-lang/crates.io-index" 852 | checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 853 | dependencies = [ 854 | "adler2", 855 | "simd-adler32", 856 | ] 857 | 858 | [[package]] 859 | name = "mio" 860 | version = "1.0.4" 861 | source = "registry+https://github.com/rust-lang/crates.io-index" 862 | checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 863 | dependencies = [ 864 | "libc", 865 | "wasi 0.11.1+wasi-snapshot-preview1", 866 | "windows-sys 0.59.0", 867 | ] 868 | 869 | [[package]] 870 | name = "moxcms" 871 | version = "0.7.5" 872 | source = "registry+https://github.com/rust-lang/crates.io-index" 873 | checksum = "ddd32fa8935aeadb8a8a6b6b351e40225570a37c43de67690383d87ef170cd08" 874 | dependencies = [ 875 | "num-traits", 876 | "pxfm", 877 | ] 878 | 879 | [[package]] 880 | name = "napi" 881 | version = "3.3.0" 882 | source = "registry+https://github.com/rust-lang/crates.io-index" 883 | checksum = "f1b74e3dce5230795bb4d2821b941706dee733c7308752507254b0497f39cad7" 884 | dependencies = [ 885 | "bitflags", 886 | "ctor", 887 | "napi-build", 888 | "napi-sys", 889 | "nohash-hasher", 890 | "rustc-hash", 891 | "tokio", 892 | ] 893 | 894 | [[package]] 895 | name = "napi-build" 896 | version = "2.2.3" 897 | source = "registry+https://github.com/rust-lang/crates.io-index" 898 | checksum = "dcae8ad5609d14afb3a3b91dee88c757016261b151e9dcecabf1b2a31a6cab14" 899 | 900 | [[package]] 901 | name = "napi-derive" 902 | version = "3.2.5" 903 | source = "registry+https://github.com/rust-lang/crates.io-index" 904 | checksum = "7552d5a579b834614bbd496db5109f1b9f1c758f08224b0dee1e408333adf0d0" 905 | dependencies = [ 906 | "convert_case", 907 | "ctor", 908 | "napi-derive-backend", 909 | "proc-macro2", 910 | "quote", 911 | "syn", 912 | ] 913 | 914 | [[package]] 915 | name = "napi-derive-backend" 916 | version = "2.2.0" 917 | source = "registry+https://github.com/rust-lang/crates.io-index" 918 | checksum = "5f6a81ac7486b70f2532a289603340862c06eea5a1e650c1ffeda2ce1238516a" 919 | dependencies = [ 920 | "convert_case", 921 | "proc-macro2", 922 | "quote", 923 | "semver", 924 | "syn", 925 | ] 926 | 927 | [[package]] 928 | name = "napi-sys" 929 | version = "3.0.0" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "3e4e7135a8f97aa0f1509cce21a8a1f9dcec1b50d8dee006b48a5adb69a9d64d" 932 | dependencies = [ 933 | "libloading", 934 | ] 935 | 936 | [[package]] 937 | name = "nohash-hasher" 938 | version = "0.2.0" 939 | source = "registry+https://github.com/rust-lang/crates.io-index" 940 | checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" 941 | 942 | [[package]] 943 | name = "num-traits" 944 | version = "0.2.19" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 947 | dependencies = [ 948 | "autocfg", 949 | ] 950 | 951 | [[package]] 952 | name = "objc2" 953 | version = "0.6.2" 954 | source = "registry+https://github.com/rust-lang/crates.io-index" 955 | checksum = "561f357ba7f3a2a61563a186a163d0a3a5247e1089524a3981d49adb775078bc" 956 | dependencies = [ 957 | "objc2-encode", 958 | ] 959 | 960 | [[package]] 961 | name = "objc2-app-kit" 962 | version = "0.3.1" 963 | source = "registry+https://github.com/rust-lang/crates.io-index" 964 | checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" 965 | dependencies = [ 966 | "bitflags", 967 | "objc2", 968 | "objc2-core-graphics", 969 | "objc2-foundation", 970 | ] 971 | 972 | [[package]] 973 | name = "objc2-core-foundation" 974 | version = "0.3.1" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" 977 | dependencies = [ 978 | "bitflags", 979 | "dispatch2", 980 | "objc2", 981 | ] 982 | 983 | [[package]] 984 | name = "objc2-core-graphics" 985 | version = "0.3.1" 986 | source = "registry+https://github.com/rust-lang/crates.io-index" 987 | checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" 988 | dependencies = [ 989 | "bitflags", 990 | "dispatch2", 991 | "objc2", 992 | "objc2-core-foundation", 993 | "objc2-io-surface", 994 | ] 995 | 996 | [[package]] 997 | name = "objc2-encode" 998 | version = "4.1.0" 999 | source = "registry+https://github.com/rust-lang/crates.io-index" 1000 | checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" 1001 | 1002 | [[package]] 1003 | name = "objc2-foundation" 1004 | version = "0.3.1" 1005 | source = "registry+https://github.com/rust-lang/crates.io-index" 1006 | checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" 1007 | dependencies = [ 1008 | "bitflags", 1009 | "objc2", 1010 | "objc2-core-foundation", 1011 | ] 1012 | 1013 | [[package]] 1014 | name = "objc2-io-surface" 1015 | version = "0.3.1" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" 1018 | dependencies = [ 1019 | "bitflags", 1020 | "objc2", 1021 | "objc2-core-foundation", 1022 | ] 1023 | 1024 | [[package]] 1025 | name = "object" 1026 | version = "0.37.3" 1027 | source = "registry+https://github.com/rust-lang/crates.io-index" 1028 | checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" 1029 | dependencies = [ 1030 | "memchr", 1031 | ] 1032 | 1033 | [[package]] 1034 | name = "once_cell" 1035 | version = "1.21.3" 1036 | source = "registry+https://github.com/rust-lang/crates.io-index" 1037 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1038 | 1039 | [[package]] 1040 | name = "once_cell_polyfill" 1041 | version = "1.70.1" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 1044 | 1045 | [[package]] 1046 | name = "parking_lot" 1047 | version = "0.12.4" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 1050 | dependencies = [ 1051 | "lock_api", 1052 | "parking_lot_core", 1053 | ] 1054 | 1055 | [[package]] 1056 | name = "parking_lot_core" 1057 | version = "0.9.11" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 1060 | dependencies = [ 1061 | "cfg-if", 1062 | "libc", 1063 | "redox_syscall", 1064 | "smallvec", 1065 | "windows-targets 0.52.6", 1066 | ] 1067 | 1068 | [[package]] 1069 | name = "percent-encoding" 1070 | version = "2.3.2" 1071 | source = "registry+https://github.com/rust-lang/crates.io-index" 1072 | checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 1073 | 1074 | [[package]] 1075 | name = "pin-project-lite" 1076 | version = "0.2.16" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1079 | 1080 | [[package]] 1081 | name = "pin-utils" 1082 | version = "0.1.0" 1083 | source = "registry+https://github.com/rust-lang/crates.io-index" 1084 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1085 | 1086 | [[package]] 1087 | name = "png" 1088 | version = "0.18.0" 1089 | source = "registry+https://github.com/rust-lang/crates.io-index" 1090 | checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" 1091 | dependencies = [ 1092 | "bitflags", 1093 | "crc32fast", 1094 | "fdeflate", 1095 | "flate2", 1096 | "miniz_oxide", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "potential_utf" 1101 | version = "0.1.3" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" 1104 | dependencies = [ 1105 | "zerovec", 1106 | ] 1107 | 1108 | [[package]] 1109 | name = "ppv-lite86" 1110 | version = "0.2.21" 1111 | source = "registry+https://github.com/rust-lang/crates.io-index" 1112 | checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 1113 | dependencies = [ 1114 | "zerocopy", 1115 | ] 1116 | 1117 | [[package]] 1118 | name = "proc-macro2" 1119 | version = "1.0.101" 1120 | source = "registry+https://github.com/rust-lang/crates.io-index" 1121 | checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 1122 | dependencies = [ 1123 | "unicode-ident", 1124 | ] 1125 | 1126 | [[package]] 1127 | name = "pxfm" 1128 | version = "0.1.24" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "83f9b339b02259ada5c0f4a389b7fb472f933aa17ce176fd2ad98f28bb401fde" 1131 | dependencies = [ 1132 | "num-traits", 1133 | ] 1134 | 1135 | [[package]] 1136 | name = "quick-error" 1137 | version = "2.0.1" 1138 | source = "registry+https://github.com/rust-lang/crates.io-index" 1139 | checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" 1140 | 1141 | [[package]] 1142 | name = "quickicon" 1143 | version = "0.1.0" 1144 | dependencies = [ 1145 | "arboard", 1146 | "clap", 1147 | "dialoguer", 1148 | "napi", 1149 | "napi-build", 1150 | "napi-derive", 1151 | "regex", 1152 | "reqwest", 1153 | "serde", 1154 | "serde_json", 1155 | "tokio", 1156 | ] 1157 | 1158 | [[package]] 1159 | name = "quinn" 1160 | version = "0.11.9" 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" 1162 | checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" 1163 | dependencies = [ 1164 | "bytes", 1165 | "cfg_aliases", 1166 | "pin-project-lite", 1167 | "quinn-proto", 1168 | "quinn-udp", 1169 | "rustc-hash", 1170 | "rustls", 1171 | "socket2", 1172 | "thiserror", 1173 | "tokio", 1174 | "tracing", 1175 | "web-time", 1176 | ] 1177 | 1178 | [[package]] 1179 | name = "quinn-proto" 1180 | version = "0.11.13" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" 1183 | dependencies = [ 1184 | "bytes", 1185 | "getrandom 0.3.3", 1186 | "lru-slab", 1187 | "rand", 1188 | "ring", 1189 | "rustc-hash", 1190 | "rustls", 1191 | "rustls-pki-types", 1192 | "slab", 1193 | "thiserror", 1194 | "tinyvec", 1195 | "tracing", 1196 | "web-time", 1197 | ] 1198 | 1199 | [[package]] 1200 | name = "quinn-udp" 1201 | version = "0.5.14" 1202 | source = "registry+https://github.com/rust-lang/crates.io-index" 1203 | checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" 1204 | dependencies = [ 1205 | "cfg_aliases", 1206 | "libc", 1207 | "once_cell", 1208 | "socket2", 1209 | "tracing", 1210 | "windows-sys 0.52.0", 1211 | ] 1212 | 1213 | [[package]] 1214 | name = "quote" 1215 | version = "1.0.40" 1216 | source = "registry+https://github.com/rust-lang/crates.io-index" 1217 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1218 | dependencies = [ 1219 | "proc-macro2", 1220 | ] 1221 | 1222 | [[package]] 1223 | name = "r-efi" 1224 | version = "5.3.0" 1225 | source = "registry+https://github.com/rust-lang/crates.io-index" 1226 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 1227 | 1228 | [[package]] 1229 | name = "rand" 1230 | version = "0.9.2" 1231 | source = "registry+https://github.com/rust-lang/crates.io-index" 1232 | checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 1233 | dependencies = [ 1234 | "rand_chacha", 1235 | "rand_core", 1236 | ] 1237 | 1238 | [[package]] 1239 | name = "rand_chacha" 1240 | version = "0.9.0" 1241 | source = "registry+https://github.com/rust-lang/crates.io-index" 1242 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 1243 | dependencies = [ 1244 | "ppv-lite86", 1245 | "rand_core", 1246 | ] 1247 | 1248 | [[package]] 1249 | name = "rand_core" 1250 | version = "0.9.3" 1251 | source = "registry+https://github.com/rust-lang/crates.io-index" 1252 | checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 1253 | dependencies = [ 1254 | "getrandom 0.3.3", 1255 | ] 1256 | 1257 | [[package]] 1258 | name = "redox_syscall" 1259 | version = "0.5.17" 1260 | source = "registry+https://github.com/rust-lang/crates.io-index" 1261 | checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" 1262 | dependencies = [ 1263 | "bitflags", 1264 | ] 1265 | 1266 | [[package]] 1267 | name = "regex" 1268 | version = "1.11.3" 1269 | source = "registry+https://github.com/rust-lang/crates.io-index" 1270 | checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" 1271 | dependencies = [ 1272 | "aho-corasick", 1273 | "memchr", 1274 | "regex-automata", 1275 | "regex-syntax", 1276 | ] 1277 | 1278 | [[package]] 1279 | name = "regex-automata" 1280 | version = "0.4.11" 1281 | source = "registry+https://github.com/rust-lang/crates.io-index" 1282 | checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" 1283 | dependencies = [ 1284 | "aho-corasick", 1285 | "memchr", 1286 | "regex-syntax", 1287 | ] 1288 | 1289 | [[package]] 1290 | name = "regex-syntax" 1291 | version = "0.8.6" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" 1294 | 1295 | [[package]] 1296 | name = "reqwest" 1297 | version = "0.12.23" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" 1300 | dependencies = [ 1301 | "base64", 1302 | "bytes", 1303 | "futures-core", 1304 | "http", 1305 | "http-body", 1306 | "http-body-util", 1307 | "hyper", 1308 | "hyper-rustls", 1309 | "hyper-util", 1310 | "js-sys", 1311 | "log", 1312 | "percent-encoding", 1313 | "pin-project-lite", 1314 | "quinn", 1315 | "rustls", 1316 | "rustls-pki-types", 1317 | "serde", 1318 | "serde_json", 1319 | "serde_urlencoded", 1320 | "sync_wrapper", 1321 | "tokio", 1322 | "tokio-rustls", 1323 | "tower", 1324 | "tower-http", 1325 | "tower-service", 1326 | "url", 1327 | "wasm-bindgen", 1328 | "wasm-bindgen-futures", 1329 | "web-sys", 1330 | "webpki-roots", 1331 | ] 1332 | 1333 | [[package]] 1334 | name = "ring" 1335 | version = "0.17.14" 1336 | source = "registry+https://github.com/rust-lang/crates.io-index" 1337 | checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 1338 | dependencies = [ 1339 | "cc", 1340 | "cfg-if", 1341 | "getrandom 0.2.16", 1342 | "libc", 1343 | "untrusted", 1344 | "windows-sys 0.52.0", 1345 | ] 1346 | 1347 | [[package]] 1348 | name = "rustc-demangle" 1349 | version = "0.1.26" 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" 1351 | checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 1352 | 1353 | [[package]] 1354 | name = "rustc-hash" 1355 | version = "2.1.1" 1356 | source = "registry+https://github.com/rust-lang/crates.io-index" 1357 | checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 1358 | 1359 | [[package]] 1360 | name = "rustix" 1361 | version = "1.1.2" 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" 1363 | checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 1364 | dependencies = [ 1365 | "bitflags", 1366 | "errno", 1367 | "libc", 1368 | "linux-raw-sys", 1369 | "windows-sys 0.61.1", 1370 | ] 1371 | 1372 | [[package]] 1373 | name = "rustls" 1374 | version = "0.23.32" 1375 | source = "registry+https://github.com/rust-lang/crates.io-index" 1376 | checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" 1377 | dependencies = [ 1378 | "once_cell", 1379 | "ring", 1380 | "rustls-pki-types", 1381 | "rustls-webpki", 1382 | "subtle", 1383 | "zeroize", 1384 | ] 1385 | 1386 | [[package]] 1387 | name = "rustls-pki-types" 1388 | version = "1.12.0" 1389 | source = "registry+https://github.com/rust-lang/crates.io-index" 1390 | checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 1391 | dependencies = [ 1392 | "web-time", 1393 | "zeroize", 1394 | ] 1395 | 1396 | [[package]] 1397 | name = "rustls-webpki" 1398 | version = "0.103.7" 1399 | source = "registry+https://github.com/rust-lang/crates.io-index" 1400 | checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" 1401 | dependencies = [ 1402 | "ring", 1403 | "rustls-pki-types", 1404 | "untrusted", 1405 | ] 1406 | 1407 | [[package]] 1408 | name = "rustversion" 1409 | version = "1.0.22" 1410 | source = "registry+https://github.com/rust-lang/crates.io-index" 1411 | checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 1412 | 1413 | [[package]] 1414 | name = "ryu" 1415 | version = "1.0.20" 1416 | source = "registry+https://github.com/rust-lang/crates.io-index" 1417 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1418 | 1419 | [[package]] 1420 | name = "scopeguard" 1421 | version = "1.2.0" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1424 | 1425 | [[package]] 1426 | name = "semver" 1427 | version = "1.0.27" 1428 | source = "registry+https://github.com/rust-lang/crates.io-index" 1429 | checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 1430 | 1431 | [[package]] 1432 | name = "serde" 1433 | version = "1.0.228" 1434 | source = "registry+https://github.com/rust-lang/crates.io-index" 1435 | checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 1436 | dependencies = [ 1437 | "serde_core", 1438 | "serde_derive", 1439 | ] 1440 | 1441 | [[package]] 1442 | name = "serde_core" 1443 | version = "1.0.228" 1444 | source = "registry+https://github.com/rust-lang/crates.io-index" 1445 | checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 1446 | dependencies = [ 1447 | "serde_derive", 1448 | ] 1449 | 1450 | [[package]] 1451 | name = "serde_derive" 1452 | version = "1.0.228" 1453 | source = "registry+https://github.com/rust-lang/crates.io-index" 1454 | checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 1455 | dependencies = [ 1456 | "proc-macro2", 1457 | "quote", 1458 | "syn", 1459 | ] 1460 | 1461 | [[package]] 1462 | name = "serde_json" 1463 | version = "1.0.145" 1464 | source = "registry+https://github.com/rust-lang/crates.io-index" 1465 | checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 1466 | dependencies = [ 1467 | "itoa", 1468 | "memchr", 1469 | "ryu", 1470 | "serde", 1471 | "serde_core", 1472 | ] 1473 | 1474 | [[package]] 1475 | name = "serde_urlencoded" 1476 | version = "0.7.1" 1477 | source = "registry+https://github.com/rust-lang/crates.io-index" 1478 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1479 | dependencies = [ 1480 | "form_urlencoded", 1481 | "itoa", 1482 | "ryu", 1483 | "serde", 1484 | ] 1485 | 1486 | [[package]] 1487 | name = "shell-words" 1488 | version = "1.1.0" 1489 | source = "registry+https://github.com/rust-lang/crates.io-index" 1490 | checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" 1491 | 1492 | [[package]] 1493 | name = "shlex" 1494 | version = "1.3.0" 1495 | source = "registry+https://github.com/rust-lang/crates.io-index" 1496 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1497 | 1498 | [[package]] 1499 | name = "signal-hook-registry" 1500 | version = "1.4.6" 1501 | source = "registry+https://github.com/rust-lang/crates.io-index" 1502 | checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" 1503 | dependencies = [ 1504 | "libc", 1505 | ] 1506 | 1507 | [[package]] 1508 | name = "simd-adler32" 1509 | version = "0.3.7" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 1512 | 1513 | [[package]] 1514 | name = "slab" 1515 | version = "0.4.11" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 1518 | 1519 | [[package]] 1520 | name = "smallvec" 1521 | version = "1.15.1" 1522 | source = "registry+https://github.com/rust-lang/crates.io-index" 1523 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 1524 | 1525 | [[package]] 1526 | name = "socket2" 1527 | version = "0.6.0" 1528 | source = "registry+https://github.com/rust-lang/crates.io-index" 1529 | checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 1530 | dependencies = [ 1531 | "libc", 1532 | "windows-sys 0.59.0", 1533 | ] 1534 | 1535 | [[package]] 1536 | name = "stable_deref_trait" 1537 | version = "1.2.0" 1538 | source = "registry+https://github.com/rust-lang/crates.io-index" 1539 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1540 | 1541 | [[package]] 1542 | name = "strsim" 1543 | version = "0.11.1" 1544 | source = "registry+https://github.com/rust-lang/crates.io-index" 1545 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1546 | 1547 | [[package]] 1548 | name = "subtle" 1549 | version = "2.6.1" 1550 | source = "registry+https://github.com/rust-lang/crates.io-index" 1551 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1552 | 1553 | [[package]] 1554 | name = "syn" 1555 | version = "2.0.106" 1556 | source = "registry+https://github.com/rust-lang/crates.io-index" 1557 | checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 1558 | dependencies = [ 1559 | "proc-macro2", 1560 | "quote", 1561 | "unicode-ident", 1562 | ] 1563 | 1564 | [[package]] 1565 | name = "sync_wrapper" 1566 | version = "1.0.2" 1567 | source = "registry+https://github.com/rust-lang/crates.io-index" 1568 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1569 | dependencies = [ 1570 | "futures-core", 1571 | ] 1572 | 1573 | [[package]] 1574 | name = "synstructure" 1575 | version = "0.13.2" 1576 | source = "registry+https://github.com/rust-lang/crates.io-index" 1577 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 1578 | dependencies = [ 1579 | "proc-macro2", 1580 | "quote", 1581 | "syn", 1582 | ] 1583 | 1584 | [[package]] 1585 | name = "tempfile" 1586 | version = "3.23.0" 1587 | source = "registry+https://github.com/rust-lang/crates.io-index" 1588 | checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" 1589 | dependencies = [ 1590 | "fastrand", 1591 | "getrandom 0.3.3", 1592 | "once_cell", 1593 | "rustix", 1594 | "windows-sys 0.61.1", 1595 | ] 1596 | 1597 | [[package]] 1598 | name = "thiserror" 1599 | version = "2.0.12" 1600 | source = "registry+https://github.com/rust-lang/crates.io-index" 1601 | checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 1602 | dependencies = [ 1603 | "thiserror-impl", 1604 | ] 1605 | 1606 | [[package]] 1607 | name = "thiserror-impl" 1608 | version = "2.0.12" 1609 | source = "registry+https://github.com/rust-lang/crates.io-index" 1610 | checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 1611 | dependencies = [ 1612 | "proc-macro2", 1613 | "quote", 1614 | "syn", 1615 | ] 1616 | 1617 | [[package]] 1618 | name = "tiff" 1619 | version = "0.10.3" 1620 | source = "registry+https://github.com/rust-lang/crates.io-index" 1621 | checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" 1622 | dependencies = [ 1623 | "fax", 1624 | "flate2", 1625 | "half", 1626 | "quick-error", 1627 | "weezl", 1628 | "zune-jpeg", 1629 | ] 1630 | 1631 | [[package]] 1632 | name = "tinystr" 1633 | version = "0.8.1" 1634 | source = "registry+https://github.com/rust-lang/crates.io-index" 1635 | checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 1636 | dependencies = [ 1637 | "displaydoc", 1638 | "zerovec", 1639 | ] 1640 | 1641 | [[package]] 1642 | name = "tinyvec" 1643 | version = "1.10.0" 1644 | source = "registry+https://github.com/rust-lang/crates.io-index" 1645 | checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 1646 | dependencies = [ 1647 | "tinyvec_macros", 1648 | ] 1649 | 1650 | [[package]] 1651 | name = "tinyvec_macros" 1652 | version = "0.1.1" 1653 | source = "registry+https://github.com/rust-lang/crates.io-index" 1654 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1655 | 1656 | [[package]] 1657 | name = "tokio" 1658 | version = "1.47.1" 1659 | source = "registry+https://github.com/rust-lang/crates.io-index" 1660 | checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 1661 | dependencies = [ 1662 | "backtrace", 1663 | "bytes", 1664 | "io-uring", 1665 | "libc", 1666 | "mio", 1667 | "parking_lot", 1668 | "pin-project-lite", 1669 | "signal-hook-registry", 1670 | "slab", 1671 | "socket2", 1672 | "tokio-macros", 1673 | "windows-sys 0.59.0", 1674 | ] 1675 | 1676 | [[package]] 1677 | name = "tokio-macros" 1678 | version = "2.5.0" 1679 | source = "registry+https://github.com/rust-lang/crates.io-index" 1680 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1681 | dependencies = [ 1682 | "proc-macro2", 1683 | "quote", 1684 | "syn", 1685 | ] 1686 | 1687 | [[package]] 1688 | name = "tokio-rustls" 1689 | version = "0.26.4" 1690 | source = "registry+https://github.com/rust-lang/crates.io-index" 1691 | checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" 1692 | dependencies = [ 1693 | "rustls", 1694 | "tokio", 1695 | ] 1696 | 1697 | [[package]] 1698 | name = "tower" 1699 | version = "0.5.2" 1700 | source = "registry+https://github.com/rust-lang/crates.io-index" 1701 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 1702 | dependencies = [ 1703 | "futures-core", 1704 | "futures-util", 1705 | "pin-project-lite", 1706 | "sync_wrapper", 1707 | "tokio", 1708 | "tower-layer", 1709 | "tower-service", 1710 | ] 1711 | 1712 | [[package]] 1713 | name = "tower-http" 1714 | version = "0.6.6" 1715 | source = "registry+https://github.com/rust-lang/crates.io-index" 1716 | checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 1717 | dependencies = [ 1718 | "bitflags", 1719 | "bytes", 1720 | "futures-util", 1721 | "http", 1722 | "http-body", 1723 | "iri-string", 1724 | "pin-project-lite", 1725 | "tower", 1726 | "tower-layer", 1727 | "tower-service", 1728 | ] 1729 | 1730 | [[package]] 1731 | name = "tower-layer" 1732 | version = "0.3.3" 1733 | source = "registry+https://github.com/rust-lang/crates.io-index" 1734 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 1735 | 1736 | [[package]] 1737 | name = "tower-service" 1738 | version = "0.3.3" 1739 | source = "registry+https://github.com/rust-lang/crates.io-index" 1740 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1741 | 1742 | [[package]] 1743 | name = "tracing" 1744 | version = "0.1.41" 1745 | source = "registry+https://github.com/rust-lang/crates.io-index" 1746 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1747 | dependencies = [ 1748 | "pin-project-lite", 1749 | "tracing-core", 1750 | ] 1751 | 1752 | [[package]] 1753 | name = "tracing-core" 1754 | version = "0.1.34" 1755 | source = "registry+https://github.com/rust-lang/crates.io-index" 1756 | checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 1757 | dependencies = [ 1758 | "once_cell", 1759 | ] 1760 | 1761 | [[package]] 1762 | name = "try-lock" 1763 | version = "0.2.5" 1764 | source = "registry+https://github.com/rust-lang/crates.io-index" 1765 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1766 | 1767 | [[package]] 1768 | name = "unicode-ident" 1769 | version = "1.0.19" 1770 | source = "registry+https://github.com/rust-lang/crates.io-index" 1771 | checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" 1772 | 1773 | [[package]] 1774 | name = "unicode-segmentation" 1775 | version = "1.12.0" 1776 | source = "registry+https://github.com/rust-lang/crates.io-index" 1777 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 1778 | 1779 | [[package]] 1780 | name = "unicode-width" 1781 | version = "0.2.1" 1782 | source = "registry+https://github.com/rust-lang/crates.io-index" 1783 | checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" 1784 | 1785 | [[package]] 1786 | name = "untrusted" 1787 | version = "0.9.0" 1788 | source = "registry+https://github.com/rust-lang/crates.io-index" 1789 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1790 | 1791 | [[package]] 1792 | name = "url" 1793 | version = "2.5.7" 1794 | source = "registry+https://github.com/rust-lang/crates.io-index" 1795 | checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 1796 | dependencies = [ 1797 | "form_urlencoded", 1798 | "idna", 1799 | "percent-encoding", 1800 | "serde", 1801 | ] 1802 | 1803 | [[package]] 1804 | name = "utf8_iter" 1805 | version = "1.0.4" 1806 | source = "registry+https://github.com/rust-lang/crates.io-index" 1807 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1808 | 1809 | [[package]] 1810 | name = "utf8parse" 1811 | version = "0.2.2" 1812 | source = "registry+https://github.com/rust-lang/crates.io-index" 1813 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 1814 | 1815 | [[package]] 1816 | name = "want" 1817 | version = "0.3.1" 1818 | source = "registry+https://github.com/rust-lang/crates.io-index" 1819 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1820 | dependencies = [ 1821 | "try-lock", 1822 | ] 1823 | 1824 | [[package]] 1825 | name = "wasi" 1826 | version = "0.11.1+wasi-snapshot-preview1" 1827 | source = "registry+https://github.com/rust-lang/crates.io-index" 1828 | checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 1829 | 1830 | [[package]] 1831 | name = "wasi" 1832 | version = "0.14.7+wasi-0.2.4" 1833 | source = "registry+https://github.com/rust-lang/crates.io-index" 1834 | checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" 1835 | dependencies = [ 1836 | "wasip2", 1837 | ] 1838 | 1839 | [[package]] 1840 | name = "wasip2" 1841 | version = "1.0.1+wasi-0.2.4" 1842 | source = "registry+https://github.com/rust-lang/crates.io-index" 1843 | checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 1844 | dependencies = [ 1845 | "wit-bindgen", 1846 | ] 1847 | 1848 | [[package]] 1849 | name = "wasm-bindgen" 1850 | version = "0.2.104" 1851 | source = "registry+https://github.com/rust-lang/crates.io-index" 1852 | checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" 1853 | dependencies = [ 1854 | "cfg-if", 1855 | "once_cell", 1856 | "rustversion", 1857 | "wasm-bindgen-macro", 1858 | "wasm-bindgen-shared", 1859 | ] 1860 | 1861 | [[package]] 1862 | name = "wasm-bindgen-backend" 1863 | version = "0.2.104" 1864 | source = "registry+https://github.com/rust-lang/crates.io-index" 1865 | checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" 1866 | dependencies = [ 1867 | "bumpalo", 1868 | "log", 1869 | "proc-macro2", 1870 | "quote", 1871 | "syn", 1872 | "wasm-bindgen-shared", 1873 | ] 1874 | 1875 | [[package]] 1876 | name = "wasm-bindgen-futures" 1877 | version = "0.4.54" 1878 | source = "registry+https://github.com/rust-lang/crates.io-index" 1879 | checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" 1880 | dependencies = [ 1881 | "cfg-if", 1882 | "js-sys", 1883 | "once_cell", 1884 | "wasm-bindgen", 1885 | "web-sys", 1886 | ] 1887 | 1888 | [[package]] 1889 | name = "wasm-bindgen-macro" 1890 | version = "0.2.104" 1891 | source = "registry+https://github.com/rust-lang/crates.io-index" 1892 | checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" 1893 | dependencies = [ 1894 | "quote", 1895 | "wasm-bindgen-macro-support", 1896 | ] 1897 | 1898 | [[package]] 1899 | name = "wasm-bindgen-macro-support" 1900 | version = "0.2.104" 1901 | source = "registry+https://github.com/rust-lang/crates.io-index" 1902 | checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" 1903 | dependencies = [ 1904 | "proc-macro2", 1905 | "quote", 1906 | "syn", 1907 | "wasm-bindgen-backend", 1908 | "wasm-bindgen-shared", 1909 | ] 1910 | 1911 | [[package]] 1912 | name = "wasm-bindgen-shared" 1913 | version = "0.2.104" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" 1916 | dependencies = [ 1917 | "unicode-ident", 1918 | ] 1919 | 1920 | [[package]] 1921 | name = "web-sys" 1922 | version = "0.3.81" 1923 | source = "registry+https://github.com/rust-lang/crates.io-index" 1924 | checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" 1925 | dependencies = [ 1926 | "js-sys", 1927 | "wasm-bindgen", 1928 | ] 1929 | 1930 | [[package]] 1931 | name = "web-time" 1932 | version = "1.1.0" 1933 | source = "registry+https://github.com/rust-lang/crates.io-index" 1934 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 1935 | dependencies = [ 1936 | "js-sys", 1937 | "wasm-bindgen", 1938 | ] 1939 | 1940 | [[package]] 1941 | name = "webpki-roots" 1942 | version = "1.0.2" 1943 | source = "registry+https://github.com/rust-lang/crates.io-index" 1944 | checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" 1945 | dependencies = [ 1946 | "rustls-pki-types", 1947 | ] 1948 | 1949 | [[package]] 1950 | name = "weezl" 1951 | version = "0.1.10" 1952 | source = "registry+https://github.com/rust-lang/crates.io-index" 1953 | checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" 1954 | 1955 | [[package]] 1956 | name = "windows-link" 1957 | version = "0.2.0" 1958 | source = "registry+https://github.com/rust-lang/crates.io-index" 1959 | checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" 1960 | 1961 | [[package]] 1962 | name = "windows-sys" 1963 | version = "0.52.0" 1964 | source = "registry+https://github.com/rust-lang/crates.io-index" 1965 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1966 | dependencies = [ 1967 | "windows-targets 0.52.6", 1968 | ] 1969 | 1970 | [[package]] 1971 | name = "windows-sys" 1972 | version = "0.59.0" 1973 | source = "registry+https://github.com/rust-lang/crates.io-index" 1974 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1975 | dependencies = [ 1976 | "windows-targets 0.52.6", 1977 | ] 1978 | 1979 | [[package]] 1980 | name = "windows-sys" 1981 | version = "0.60.2" 1982 | source = "registry+https://github.com/rust-lang/crates.io-index" 1983 | checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 1984 | dependencies = [ 1985 | "windows-targets 0.53.4", 1986 | ] 1987 | 1988 | [[package]] 1989 | name = "windows-sys" 1990 | version = "0.61.1" 1991 | source = "registry+https://github.com/rust-lang/crates.io-index" 1992 | checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" 1993 | dependencies = [ 1994 | "windows-link", 1995 | ] 1996 | 1997 | [[package]] 1998 | name = "windows-targets" 1999 | version = "0.52.6" 2000 | source = "registry+https://github.com/rust-lang/crates.io-index" 2001 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2002 | dependencies = [ 2003 | "windows_aarch64_gnullvm 0.52.6", 2004 | "windows_aarch64_msvc 0.52.6", 2005 | "windows_i686_gnu 0.52.6", 2006 | "windows_i686_gnullvm 0.52.6", 2007 | "windows_i686_msvc 0.52.6", 2008 | "windows_x86_64_gnu 0.52.6", 2009 | "windows_x86_64_gnullvm 0.52.6", 2010 | "windows_x86_64_msvc 0.52.6", 2011 | ] 2012 | 2013 | [[package]] 2014 | name = "windows-targets" 2015 | version = "0.53.4" 2016 | source = "registry+https://github.com/rust-lang/crates.io-index" 2017 | checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" 2018 | dependencies = [ 2019 | "windows-link", 2020 | "windows_aarch64_gnullvm 0.53.0", 2021 | "windows_aarch64_msvc 0.53.0", 2022 | "windows_i686_gnu 0.53.0", 2023 | "windows_i686_gnullvm 0.53.0", 2024 | "windows_i686_msvc 0.53.0", 2025 | "windows_x86_64_gnu 0.53.0", 2026 | "windows_x86_64_gnullvm 0.53.0", 2027 | "windows_x86_64_msvc 0.53.0", 2028 | ] 2029 | 2030 | [[package]] 2031 | name = "windows_aarch64_gnullvm" 2032 | version = "0.52.6" 2033 | source = "registry+https://github.com/rust-lang/crates.io-index" 2034 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2035 | 2036 | [[package]] 2037 | name = "windows_aarch64_gnullvm" 2038 | version = "0.53.0" 2039 | source = "registry+https://github.com/rust-lang/crates.io-index" 2040 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 2041 | 2042 | [[package]] 2043 | name = "windows_aarch64_msvc" 2044 | version = "0.52.6" 2045 | source = "registry+https://github.com/rust-lang/crates.io-index" 2046 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2047 | 2048 | [[package]] 2049 | name = "windows_aarch64_msvc" 2050 | version = "0.53.0" 2051 | source = "registry+https://github.com/rust-lang/crates.io-index" 2052 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 2053 | 2054 | [[package]] 2055 | name = "windows_i686_gnu" 2056 | version = "0.52.6" 2057 | source = "registry+https://github.com/rust-lang/crates.io-index" 2058 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2059 | 2060 | [[package]] 2061 | name = "windows_i686_gnu" 2062 | version = "0.53.0" 2063 | source = "registry+https://github.com/rust-lang/crates.io-index" 2064 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 2065 | 2066 | [[package]] 2067 | name = "windows_i686_gnullvm" 2068 | version = "0.52.6" 2069 | source = "registry+https://github.com/rust-lang/crates.io-index" 2070 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2071 | 2072 | [[package]] 2073 | name = "windows_i686_gnullvm" 2074 | version = "0.53.0" 2075 | source = "registry+https://github.com/rust-lang/crates.io-index" 2076 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 2077 | 2078 | [[package]] 2079 | name = "windows_i686_msvc" 2080 | version = "0.52.6" 2081 | source = "registry+https://github.com/rust-lang/crates.io-index" 2082 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2083 | 2084 | [[package]] 2085 | name = "windows_i686_msvc" 2086 | version = "0.53.0" 2087 | source = "registry+https://github.com/rust-lang/crates.io-index" 2088 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 2089 | 2090 | [[package]] 2091 | name = "windows_x86_64_gnu" 2092 | version = "0.52.6" 2093 | source = "registry+https://github.com/rust-lang/crates.io-index" 2094 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2095 | 2096 | [[package]] 2097 | name = "windows_x86_64_gnu" 2098 | version = "0.53.0" 2099 | source = "registry+https://github.com/rust-lang/crates.io-index" 2100 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 2101 | 2102 | [[package]] 2103 | name = "windows_x86_64_gnullvm" 2104 | version = "0.52.6" 2105 | source = "registry+https://github.com/rust-lang/crates.io-index" 2106 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2107 | 2108 | [[package]] 2109 | name = "windows_x86_64_gnullvm" 2110 | version = "0.53.0" 2111 | source = "registry+https://github.com/rust-lang/crates.io-index" 2112 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 2113 | 2114 | [[package]] 2115 | name = "windows_x86_64_msvc" 2116 | version = "0.52.6" 2117 | source = "registry+https://github.com/rust-lang/crates.io-index" 2118 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2119 | 2120 | [[package]] 2121 | name = "windows_x86_64_msvc" 2122 | version = "0.53.0" 2123 | source = "registry+https://github.com/rust-lang/crates.io-index" 2124 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 2125 | 2126 | [[package]] 2127 | name = "wit-bindgen" 2128 | version = "0.46.0" 2129 | source = "registry+https://github.com/rust-lang/crates.io-index" 2130 | checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 2131 | 2132 | [[package]] 2133 | name = "writeable" 2134 | version = "0.6.1" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 2137 | 2138 | [[package]] 2139 | name = "x11rb" 2140 | version = "0.13.2" 2141 | source = "registry+https://github.com/rust-lang/crates.io-index" 2142 | checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" 2143 | dependencies = [ 2144 | "gethostname", 2145 | "rustix", 2146 | "x11rb-protocol", 2147 | ] 2148 | 2149 | [[package]] 2150 | name = "x11rb-protocol" 2151 | version = "0.13.2" 2152 | source = "registry+https://github.com/rust-lang/crates.io-index" 2153 | checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" 2154 | 2155 | [[package]] 2156 | name = "yoke" 2157 | version = "0.8.0" 2158 | source = "registry+https://github.com/rust-lang/crates.io-index" 2159 | checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 2160 | dependencies = [ 2161 | "serde", 2162 | "stable_deref_trait", 2163 | "yoke-derive", 2164 | "zerofrom", 2165 | ] 2166 | 2167 | [[package]] 2168 | name = "yoke-derive" 2169 | version = "0.8.0" 2170 | source = "registry+https://github.com/rust-lang/crates.io-index" 2171 | checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 2172 | dependencies = [ 2173 | "proc-macro2", 2174 | "quote", 2175 | "syn", 2176 | "synstructure", 2177 | ] 2178 | 2179 | [[package]] 2180 | name = "zerocopy" 2181 | version = "0.8.26" 2182 | source = "registry+https://github.com/rust-lang/crates.io-index" 2183 | checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 2184 | dependencies = [ 2185 | "zerocopy-derive", 2186 | ] 2187 | 2188 | [[package]] 2189 | name = "zerocopy-derive" 2190 | version = "0.8.26" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 2193 | dependencies = [ 2194 | "proc-macro2", 2195 | "quote", 2196 | "syn", 2197 | ] 2198 | 2199 | [[package]] 2200 | name = "zerofrom" 2201 | version = "0.1.6" 2202 | source = "registry+https://github.com/rust-lang/crates.io-index" 2203 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2204 | dependencies = [ 2205 | "zerofrom-derive", 2206 | ] 2207 | 2208 | [[package]] 2209 | name = "zerofrom-derive" 2210 | version = "0.1.6" 2211 | source = "registry+https://github.com/rust-lang/crates.io-index" 2212 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2213 | dependencies = [ 2214 | "proc-macro2", 2215 | "quote", 2216 | "syn", 2217 | "synstructure", 2218 | ] 2219 | 2220 | [[package]] 2221 | name = "zeroize" 2222 | version = "1.8.1" 2223 | source = "registry+https://github.com/rust-lang/crates.io-index" 2224 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2225 | 2226 | [[package]] 2227 | name = "zerotrie" 2228 | version = "0.2.2" 2229 | source = "registry+https://github.com/rust-lang/crates.io-index" 2230 | checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 2231 | dependencies = [ 2232 | "displaydoc", 2233 | "yoke", 2234 | "zerofrom", 2235 | ] 2236 | 2237 | [[package]] 2238 | name = "zerovec" 2239 | version = "0.11.4" 2240 | source = "registry+https://github.com/rust-lang/crates.io-index" 2241 | checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" 2242 | dependencies = [ 2243 | "yoke", 2244 | "zerofrom", 2245 | "zerovec-derive", 2246 | ] 2247 | 2248 | [[package]] 2249 | name = "zerovec-derive" 2250 | version = "0.11.1" 2251 | source = "registry+https://github.com/rust-lang/crates.io-index" 2252 | checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 2253 | dependencies = [ 2254 | "proc-macro2", 2255 | "quote", 2256 | "syn", 2257 | ] 2258 | 2259 | [[package]] 2260 | name = "zune-core" 2261 | version = "0.4.12" 2262 | source = "registry+https://github.com/rust-lang/crates.io-index" 2263 | checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" 2264 | 2265 | [[package]] 2266 | name = "zune-jpeg" 2267 | version = "0.4.21" 2268 | source = "registry+https://github.com/rust-lang/crates.io-index" 2269 | checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" 2270 | dependencies = [ 2271 | "zune-core", 2272 | ] 2273 | --------------------------------------------------------------------------------