├── rustfmt.toml ├── pnpm-workspace.yaml ├── .gitignore ├── .prettierrc ├── .editorconfig ├── .github └── workflows │ ├── release.yml │ └── test.yml ├── Cargo.toml ├── tests ├── integration_tests.rs └── git_tests.rs ├── README.md ├── src ├── main.rs ├── handlers.rs └── git.rs ├── CLAUDE.md ├── Cargo.lock └── pnpm-lock.yaml /rustfmt.toml: -------------------------------------------------------------------------------- 1 | tab_spaces = 2 2 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'packages/*' 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | target 4 | packages/*/bin/* 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5", 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | end_of_line = lf 6 | charset = utf-8 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | indent_size = 2 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - 'v*' 7 | 8 | jobs: 9 | publish: 10 | name: Publish to crates.io 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | 15 | - name: Install Rust 16 | uses: dtolnay/rust-toolchain@stable 17 | 18 | - uses: Swatinem/rust-cache@v2 19 | 20 | - name: Publish to crates.io 21 | run: cargo publish 22 | env: 23 | CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} 24 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "swagit" 3 | version = "1.1.0" 4 | edition = "2021" 5 | description = "A swag tool to use git with interactive cli" 6 | authors = ["Evan Ye "] 7 | license = "MIT" 8 | repository = "https://github.com/jigsawye/swagit" 9 | 10 | [[bin]] 11 | name = "swagit" 12 | path = "src/main.rs" 13 | 14 | [dependencies] 15 | clap = { version = "4.4", features = ["derive"] } 16 | dialoguer = { version = "0.11", features = ["fuzzy-select"] } 17 | colored = "2.0" 18 | atty = "0.2" 19 | ctrlc = "3.4" 20 | 21 | [dev-dependencies] 22 | tempfile = "3.8" 23 | assert_cmd = "2.0" 24 | predicates = "3.0" 25 | -------------------------------------------------------------------------------- /tests/integration_tests.rs: -------------------------------------------------------------------------------- 1 | use assert_cmd::Command; 2 | use predicates::prelude::*; 3 | 4 | #[test] 5 | fn test_help() { 6 | Command::cargo_bin("swagit") 7 | .unwrap() 8 | .arg("--help") 9 | .assert() 10 | .success() 11 | .stdout(predicate::str::contains( 12 | "A swag tool to use git with interactive cli", 13 | )); 14 | } 15 | 16 | #[test] 17 | fn test_version() { 18 | Command::cargo_bin("swagit") 19 | .unwrap() 20 | .arg("--version") 21 | .assert() 22 | .success() 23 | .stdout(predicate::str::contains(env!("CARGO_PKG_VERSION"))); 24 | } 25 | 26 | #[test] 27 | fn test_invalid_flag() { 28 | Command::cargo_bin("swagit") 29 | .unwrap() 30 | .arg("--invalid-flag") 31 | .assert() 32 | .failure(); 33 | } 34 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | 9 | jobs: 10 | test: 11 | name: Test 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | 16 | - name: Install Rust 17 | uses: actions-rs/toolchain@v1 18 | with: 19 | profile: minimal 20 | toolchain: stable 21 | override: true 22 | 23 | - name: Setup Git 24 | run: | 25 | git config --global user.name "Test User" 26 | git config --global user.email "test@example.com" 27 | 28 | - name: Run tests 29 | uses: actions-rs/cargo@v1 30 | with: 31 | command: test 32 | args: --verbose 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Swagit](https://i.imgur.com/kYSEMFD.png) 2 | 3 | ## Install 4 | 5 | Swagit is written in Rust and distributed via crates.io. 6 | 7 | ```bash 8 | cargo install swagit 9 | ``` 10 | 11 | ## Usage 12 | 13 | Once that's done, you can run this command inside your project's directory: 14 | 15 | ```bash 16 | swagit 17 | ``` 18 | 19 | You can set an alias to use a more convenient command: 20 | 21 | ```bash 22 | alias sg="swagit" 23 | ``` 24 | 25 | 26 | 27 | ### Options 28 | 29 | #### `--delete` or `-d` 30 | 31 | Enter an interactive mode to select branches to be deleted. 32 | 33 | 34 | 35 | #### `--sync` or `-s` 36 | 37 | Sync with remote and clean up merged branches. This command: 38 | - Syncs current branch with remote (fast-forward only) 39 | - Updates remote references 40 | - Deletes merged branches automatically 41 | 42 | ## License 43 | 44 | MIT © [Evan Ye](https://github.com/jigsawye) 45 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod git; 2 | mod handlers; 3 | 4 | use clap::{Arg, Command}; 5 | use colored::*; 6 | use dialoguer::console::Term; 7 | use git::GitManager; 8 | use handlers::{handle_checkout_command, handle_delete_command, handle_sync_command}; 9 | use std::process; 10 | 11 | fn main() { 12 | if let Err(err) = ctrlc::set_handler(move || { 13 | let _ = Term::stdout().show_cursor(); 14 | process::exit(0); 15 | }) { 16 | eprintln!("{}", format!("Error setting Ctrl-C handler: {}", err).red()); 17 | process::exit(1); 18 | } 19 | 20 | let matches = Command::new("swagit") 21 | .version(env!("CARGO_PKG_VERSION")) 22 | .author(env!("CARGO_PKG_AUTHORS")) 23 | .about(env!("CARGO_PKG_DESCRIPTION")) 24 | .arg( 25 | Arg::new("delete") 26 | .short('d') 27 | .long("delete") 28 | .help("Select branches which you want to delete") 29 | .action(clap::ArgAction::SetTrue), 30 | ) 31 | .arg( 32 | Arg::new("sync") 33 | .short('s') 34 | .long("sync") 35 | .help("Pull latest changes and cleanup merged branches") 36 | .action(clap::ArgAction::SetTrue), 37 | ) 38 | .get_matches(); 39 | 40 | let git = match GitManager::new() { 41 | Ok(git) => git, 42 | Err(_) => { 43 | eprintln!("{}", "Error: not a git repository".red()); 44 | process::exit(1); 45 | } 46 | }; 47 | 48 | match git.get_current_branch() { 49 | Ok(branch) => println!("{} Current branch is {}", "Info:".blue(), branch.magenta()), 50 | Err(_) => { 51 | eprintln!("{}", "Error: could not get current branch".red()); 52 | process::exit(1); 53 | } 54 | } 55 | 56 | let result = match (matches.get_flag("delete"), matches.get_flag("sync")) { 57 | (true, _) => handle_delete_command(&git), 58 | (_, true) => handle_sync_command(&git), 59 | _ => handle_checkout_command(&git), 60 | }; 61 | 62 | if let Err(err) = result { 63 | if !err.to_string().contains("read interrupted") { 64 | eprintln!("{}", format!("Error: {}", err).red()); 65 | process::exit(1); 66 | } 67 | process::exit(0); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /CLAUDE.md: -------------------------------------------------------------------------------- 1 | # CLAUDE.md 2 | 3 | This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. 4 | 5 | ## Project Overview 6 | 7 | Swagit is an interactive Git CLI tool written in Rust that provides a fuzzy-searchable interface for common Git operations. The tool was rewritten from Node.js/TypeScript to Rust starting from version 1.0.0 for better performance. 8 | 9 | ## Architecture 10 | 11 | ### Core Components 12 | 13 | - **GitManager** (`src/git.rs`): Core Git operations wrapper that handles all Git command execution and provides methods for branch management, status checking, and synchronization 14 | - **Handlers** (`src/handlers.rs`): Command-specific implementations for the three main operations: 15 | - `handle_checkout_command`: Interactive branch selection and switching 16 | - `handle_delete_command`: Multi-select branch deletion with confirmation 17 | - `handle_sync_command`: Remote sync with automatic cleanup of merged branches 18 | - **Main** (`src/main.rs`): CLI setup, argument parsing, and command routing 19 | 20 | ### Key Data Structures 21 | 22 | - `BranchInfo`: Contains branch name and commit ID 23 | - `BranchStatus` enum: Tracks various branch states (Updated, Merged, RemoteGone, Diverged, UpToDate, LocalOnly, Modified) 24 | 25 | ## Development Commands 26 | 27 | ### Building and Testing 28 | ```bash 29 | # Build the project 30 | cargo build 31 | 32 | # Run tests 33 | cargo test 34 | 35 | # Run specific test file 36 | cargo test --test git_tests 37 | cargo test --test integration_tests 38 | 39 | # Build release version 40 | cargo build --release 41 | 42 | # Format code 43 | cargo fmt 44 | 45 | # Run clippy linting 46 | cargo clippy 47 | ``` 48 | 49 | 50 | ## Key Implementation Details 51 | 52 | ### Branch Synchronization Logic 53 | The sync functionality (`sync_branches()` in GitManager) performs a complex workflow: 54 | 1. Checks for uncommitted changes 55 | 2. Updates remote references with `git remote update --prune` 56 | 3. Identifies merged branches using `git branch --merged` 57 | 4. Automatically deletes merged branches 58 | 5. Checks status of remaining branches using `git rev-list --left-right --count` 59 | 60 | ### Interactive CLI Features 61 | - Uses `dialoguer` crate for interactive prompts with fuzzy search 62 | - Handles both interactive (TTY) and non-interactive modes 63 | - Graceful Ctrl-C handling with proper cursor cleanup 64 | 65 | ### Distribution 66 | The project is distributed as a Rust binary via crates.io. 67 | 68 | ## Common Patterns 69 | 70 | - Error handling uses `Box` throughout 71 | - Git commands are executed via `std::process::Command` and wrapped in the `GitManager::command()` method 72 | - All user-facing output uses the `colored` crate for terminal colors 73 | - Interactive prompts check for TTY before presenting UI 74 | 75 | ## Testing Strategy 76 | 77 | Tests are located in `tests/` directory and use: 78 | - `assert_cmd` for CLI testing 79 | - `tempfile` for creating temporary Git repositories 80 | - `predicates` for output assertions 81 | - Test setup creates full Git repositories with proper configuration -------------------------------------------------------------------------------- /src/handlers.rs: -------------------------------------------------------------------------------- 1 | use crate::git::{BranchStatus, GitManager}; 2 | use colored::*; 3 | use dialoguer::{theme::ColorfulTheme, Confirm, FuzzySelect, MultiSelect}; 4 | use std::process; 5 | 6 | pub fn handle_checkout_command(git: &GitManager) -> Result<(), Box> { 7 | let branches = git.get_local_branches()?; 8 | 9 | if branches.is_empty() { 10 | eprintln!("{}", "Error: no other branches in the repository".red()); 11 | process::exit(1); 12 | } 13 | 14 | let branch_names: Vec = branches 15 | .iter() 16 | .map(|b| { 17 | let mut display = format!("{} [{}]", b.name, b.commit_id); 18 | if let Some(worktree_path) = &b.worktree_path { 19 | if let Some(worktree_name) = std::path::Path::new(worktree_path).file_name() { 20 | display.push_str(&format!(" ({})", worktree_name.to_string_lossy())); 21 | } 22 | } 23 | display 24 | }) 25 | .collect(); 26 | 27 | if atty::is(atty::Stream::Stdin) && atty::is(atty::Stream::Stdout) { 28 | let selection = match FuzzySelect::with_theme(&ColorfulTheme::default()) 29 | .with_prompt("Select the branch to switch to") 30 | .items(&branch_names) 31 | .default(0) 32 | .interact_opt()? 33 | { 34 | Some(selections) => selections, 35 | None => return Ok(()), 36 | }; 37 | 38 | let branch_name = &branches[selection].name; 39 | git.checkout_branch(branch_name)?; 40 | println!("{}", format!("Switched to branch {}", branch_name).green()); 41 | } else { 42 | let branch_name = &branches[0].name; 43 | git.checkout_branch(branch_name)?; 44 | println!("{}", format!("Switched to branch {}", branch_name).green()); 45 | } 46 | 47 | Ok(()) 48 | } 49 | 50 | pub fn handle_delete_command(git: &GitManager) -> Result<(), Box> { 51 | let branches = git.get_local_branches()?; 52 | 53 | if branches.is_empty() { 54 | eprintln!("{}", "Error: no other branches in the repository".red()); 55 | process::exit(1); 56 | } 57 | 58 | let branch_names: Vec = branches 59 | .iter() 60 | .map(|b| { 61 | let mut display = format!("{} [{}]", b.name, b.commit_id); 62 | if let Some(worktree_path) = &b.worktree_path { 63 | if let Some(worktree_name) = std::path::Path::new(worktree_path).file_name() { 64 | display.push_str(&format!(" ({})", worktree_name.to_string_lossy())); 65 | } 66 | } 67 | display 68 | }) 69 | .collect(); 70 | 71 | let selections = match MultiSelect::with_theme(&ColorfulTheme::default()) 72 | .with_prompt("Select the branches to delete") 73 | .items(&branch_names) 74 | .interact_opt()? 75 | { 76 | Some(selections) => selections, 77 | None => return Ok(()), 78 | }; 79 | 80 | if selections.is_empty() { 81 | println!("No branches selected, exiting."); 82 | return Ok(()); 83 | } 84 | 85 | let selected_branches: Vec = selections 86 | .iter() 87 | .map(|&i| branches[i].name.clone()) 88 | .collect(); 89 | 90 | let message = if selected_branches.len() == 1 { 91 | format!( 92 | "Are you sure you want to delete this branch?\n {}", 93 | selected_branches[0] 94 | ) 95 | } else { 96 | format!( 97 | "Are you sure you want to delete {} branches?\n {}", 98 | selected_branches.len().to_string().yellow().bold(), 99 | selected_branches.join(", ") 100 | ) 101 | }; 102 | 103 | if Confirm::with_theme(&ColorfulTheme::default()) 104 | .with_prompt(message) 105 | .interact()? 106 | { 107 | git.delete_branches(&selected_branches)?; 108 | println!( 109 | "{}", 110 | format!("Deleted {} branches", selected_branches.len()).green() 111 | ); 112 | } 113 | 114 | Ok(()) 115 | } 116 | 117 | pub fn handle_sync_command(git: &GitManager) -> Result<(), Box> { 118 | println!("{}", "Syncing with remote...".blue()); 119 | 120 | let branch_statuses = git.sync_branches()?; 121 | let mut has_updates = false; 122 | 123 | for status in branch_statuses { 124 | match status { 125 | BranchStatus::Updated(branch) => { 126 | has_updates = true; 127 | println!( 128 | "{} Updated branch {} (fast-forward)", 129 | "✓".green(), 130 | branch.green() 131 | ); 132 | } 133 | BranchStatus::Merged(branch) => { 134 | has_updates = true; 135 | println!("{} Deleted branch {} (was merged)", "✓".green(), branch); 136 | } 137 | BranchStatus::RemoteGone(branch) => { 138 | has_updates = true; 139 | println!( 140 | "{} Branch {} was deleted on remote but not merged", 141 | "!".red(), 142 | branch 143 | ); 144 | } 145 | BranchStatus::Diverged(branch) => { 146 | has_updates = true; 147 | println!("{} Branch {} has unpushed commits", "!".yellow(), branch); 148 | } 149 | BranchStatus::LocalOnly(branch) => { 150 | println!("{} Branch {} is local only", "i".blue(), branch); 151 | } 152 | BranchStatus::Modified(branch) => { 153 | has_updates = true; 154 | println!("{} Branch {} has uncommitted changes", "!".yellow(), branch); 155 | } 156 | BranchStatus::UpToDate => (), 157 | } 158 | } 159 | 160 | if !has_updates { 161 | println!("{}", "Everything is up to date".green()); 162 | } 163 | 164 | Ok(()) 165 | } 166 | -------------------------------------------------------------------------------- /tests/git_tests.rs: -------------------------------------------------------------------------------- 1 | use assert_cmd::Command; 2 | use predicates::prelude::*; 3 | use std::process::Command as StdCommand; 4 | use tempfile::TempDir; 5 | 6 | fn setup_git_repo() -> TempDir { 7 | let temp_dir = TempDir::new().unwrap(); 8 | 9 | StdCommand::new("git") 10 | .args(["config", "--global", "init.defaultBranch", "main"]) 11 | .current_dir(&temp_dir) 12 | .output() 13 | .unwrap(); 14 | 15 | // Initialize Git repository 16 | StdCommand::new("git") 17 | .args(["init"]) 18 | .current_dir(&temp_dir) 19 | .output() 20 | .unwrap(); 21 | 22 | // Set Git configuration 23 | StdCommand::new("git") 24 | .args(["config", "user.name", "Test User"]) 25 | .current_dir(&temp_dir) 26 | .output() 27 | .unwrap(); 28 | 29 | StdCommand::new("git") 30 | .args(["config", "user.email", "test@example.com"]) 31 | .current_dir(&temp_dir) 32 | .output() 33 | .unwrap(); 34 | 35 | // Create initial commit 36 | StdCommand::new("touch") 37 | .arg("README.md") 38 | .current_dir(&temp_dir) 39 | .output() 40 | .unwrap(); 41 | 42 | StdCommand::new("git") 43 | .args(["add", "README.md"]) 44 | .current_dir(&temp_dir) 45 | .output() 46 | .unwrap(); 47 | 48 | StdCommand::new("git") 49 | .args(["commit", "-m", "Initial commit"]) 50 | .current_dir(&temp_dir) 51 | .output() 52 | .unwrap(); 53 | 54 | temp_dir 55 | } 56 | 57 | #[test] 58 | fn test_not_git_repo() { 59 | let temp_dir = TempDir::new().unwrap(); 60 | 61 | Command::cargo_bin("swagit") 62 | .unwrap() 63 | .current_dir(&temp_dir) 64 | .assert() 65 | .failure() 66 | .stderr(predicate::str::contains("not a git repository")); 67 | } 68 | 69 | #[test] 70 | fn test_current_branch() { 71 | let temp_dir = setup_git_repo(); 72 | 73 | // Create a test branch so the repository has multiple branches 74 | StdCommand::new("git") 75 | .args(["checkout", "-b", "test-branch"]) 76 | .current_dir(&temp_dir) 77 | .output() 78 | .unwrap(); 79 | 80 | StdCommand::new("git") 81 | .args(["checkout", "main"]) 82 | .current_dir(&temp_dir) 83 | .output() 84 | .unwrap(); 85 | 86 | // Only check the output of the current branch, do not test interactive functionality 87 | Command::cargo_bin("swagit") 88 | .unwrap() 89 | .current_dir(&temp_dir) 90 | .env("RUST_BACKTRACE", "1") 91 | .assert() 92 | .success() 93 | .stdout(predicate::str::contains("Current branch is main")) 94 | .stdout(predicate::str::contains("Switched to branch test-branch")); // Automatically switched to the first branch in non-terminal environments 95 | } 96 | 97 | #[test] 98 | fn test_delete_branch() { 99 | let temp_dir = setup_git_repo(); 100 | 101 | // Create a new branch 102 | StdCommand::new("git") 103 | .args(["checkout", "-b", "test-branch"]) 104 | .current_dir(&temp_dir) 105 | .output() 106 | .unwrap(); 107 | 108 | // Switch back to main 109 | StdCommand::new("git") 110 | .args(["checkout", "main"]) 111 | .current_dir(&temp_dir) 112 | .output() 113 | .unwrap(); 114 | 115 | // Directly use the git command to delete the branch, instead of using the interactive interface 116 | StdCommand::new("git") 117 | .args(["branch", "-D", "test-branch"]) 118 | .current_dir(&temp_dir) 119 | .output() 120 | .unwrap(); 121 | 122 | // Verify that the branch has been deleted 123 | let output = StdCommand::new("git") 124 | .args(["branch"]) 125 | .current_dir(&temp_dir) 126 | .output() 127 | .unwrap(); 128 | 129 | assert!(!String::from_utf8_lossy(&output.stdout).contains("test-branch")); 130 | } 131 | 132 | #[test] 133 | fn test_sync_with_no_remote() { 134 | let temp_dir = setup_git_repo(); 135 | 136 | Command::cargo_bin("swagit") 137 | .unwrap() 138 | .current_dir(&temp_dir) 139 | .arg("-s") 140 | .assert() 141 | .failure() 142 | .stderr(predicate::str::contains("No remote repository configured")); 143 | } 144 | 145 | #[test] 146 | fn test_sync_does_not_delete_current_branch() { 147 | let temp_dir = setup_git_repo(); 148 | 149 | // Create a bare repository to act as remote 150 | let remote_dir = TempDir::new().unwrap(); 151 | StdCommand::new("git") 152 | .args(["init", "--bare"]) 153 | .current_dir(&remote_dir) 154 | .output() 155 | .expect("Failed to create bare repo"); 156 | 157 | // Add remote to our repo 158 | StdCommand::new("git") 159 | .args(["remote", "add", "origin", remote_dir.path().to_str().unwrap()]) 160 | .current_dir(&temp_dir) 161 | .output() 162 | .expect("Failed to add remote"); 163 | 164 | // Push main to remote 165 | StdCommand::new("git") 166 | .args(["push", "-u", "origin", "main"]) 167 | .current_dir(&temp_dir) 168 | .output() 169 | .expect("Failed to push main"); 170 | 171 | // Create and switch to a new branch 172 | StdCommand::new("git") 173 | .args(["checkout", "-b", "test-branch"]) 174 | .current_dir(&temp_dir) 175 | .output() 176 | .expect("Failed to create test branch"); 177 | 178 | // Create a commit 179 | std::fs::write(temp_dir.path().join("test.txt"), "test").unwrap(); 180 | StdCommand::new("git") 181 | .args(["add", "test.txt"]) 182 | .current_dir(&temp_dir) 183 | .output() 184 | .expect("Failed to add file"); 185 | StdCommand::new("git") 186 | .args(["commit", "-m", "test commit"]) 187 | .current_dir(&temp_dir) 188 | .output() 189 | .expect("Failed to commit"); 190 | 191 | // Switch to main and merge the test branch 192 | StdCommand::new("git") 193 | .args(["checkout", "main"]) 194 | .current_dir(&temp_dir) 195 | .output() 196 | .expect("Failed to switch to main"); 197 | StdCommand::new("git") 198 | .args(["merge", "test-branch"]) 199 | .current_dir(&temp_dir) 200 | .output() 201 | .expect("Failed to merge test branch"); 202 | 203 | // Push the merged main 204 | StdCommand::new("git") 205 | .args(["push", "origin", "main"]) 206 | .current_dir(&temp_dir) 207 | .output() 208 | .expect("Failed to push merged main"); 209 | 210 | // Switch back to test-branch 211 | StdCommand::new("git") 212 | .args(["checkout", "test-branch"]) 213 | .current_dir(&temp_dir) 214 | .output() 215 | .expect("Failed to switch back to test branch"); 216 | 217 | // Run sync - should not delete the current branch even though it's merged 218 | Command::cargo_bin("swagit") 219 | .unwrap() 220 | .current_dir(&temp_dir) 221 | .arg("-s") 222 | .assert() 223 | .success(); 224 | 225 | // Verify the current branch still exists 226 | let output = StdCommand::new("git") 227 | .args(["branch", "--show-current"]) 228 | .current_dir(&temp_dir) 229 | .output() 230 | .expect("Failed to get current branch"); 231 | 232 | assert_eq!(String::from_utf8_lossy(&output.stdout).trim(), "test-branch"); 233 | } 234 | -------------------------------------------------------------------------------- /src/git.rs: -------------------------------------------------------------------------------- 1 | use std::process::Command; 2 | 3 | #[derive(Debug)] 4 | pub struct BranchInfo { 5 | pub name: String, 6 | pub commit_id: String, 7 | pub worktree_path: Option, 8 | } 9 | 10 | #[derive(Debug)] 11 | pub enum BranchStatus { 12 | Updated(String), // branch updated 13 | Merged(String), // branch merged can be deleted 14 | RemoteGone(String), // remote branch deleted 15 | Diverged(String), // local has unpushed commits 16 | UpToDate, // branch is already up to date 17 | LocalOnly(String), // local branch never pushed 18 | Modified(String), // has uncommitted changes 19 | } 20 | 21 | pub struct GitManager; 22 | 23 | impl GitManager { 24 | pub fn new() -> Result> { 25 | // check if in git repository 26 | match Self.command("rev-parse", &["--git-dir"]) { 27 | Ok(_) => Ok(Self), 28 | Err(_) => Err("Not a git repository".into()), 29 | } 30 | } 31 | 32 | pub fn checkout_branch(&self, branch_name: &str) -> Result<(), Box> { 33 | self.command("checkout", &[branch_name])?; 34 | Ok(()) 35 | } 36 | 37 | pub fn delete_branches(&self, branch_names: &[String]) -> Result<(), Box> { 38 | let mut args = vec!["-D"]; 39 | args.extend(branch_names.iter().map(|s| s.as_str())); 40 | self.command("branch", &args)?; 41 | Ok(()) 42 | } 43 | 44 | pub fn get_current_branch(&self) -> Result> { 45 | Ok( 46 | self 47 | .command("branch", &["--show-current"])? 48 | .trim() 49 | .to_string(), 50 | ) 51 | } 52 | 53 | pub fn get_local_branches(&self) -> Result, Box> { 54 | let current = self.get_current_branch()?; 55 | let output = self.command( 56 | "for-each-ref", 57 | &[ 58 | "--format=%(refname:short) %(objectname:short)", 59 | "refs/heads/", 60 | ], 61 | )?; 62 | 63 | let worktrees = self.get_worktrees().unwrap_or_default(); 64 | 65 | let branches = output 66 | .lines() 67 | .filter_map(|line| { 68 | let parts: Vec<&str> = line.split_whitespace().collect(); 69 | if parts.len() == 2 && parts[0] != current { 70 | let worktree_path = worktrees.get(parts[0]).cloned(); 71 | Some(BranchInfo { 72 | name: parts[0].to_string(), 73 | commit_id: parts[1].to_string(), 74 | worktree_path, 75 | }) 76 | } else { 77 | None 78 | } 79 | }) 80 | .collect(); 81 | 82 | Ok(branches) 83 | } 84 | 85 | pub fn sync_branches(&self) -> Result, Box> { 86 | // Check working directory status 87 | let status = self.command("status", &["--porcelain"])?; 88 | if !status.is_empty() { 89 | return Ok(vec![BranchStatus::Modified(self.get_current_branch()?)]); 90 | } 91 | 92 | // Check remote 93 | let remote_exists = !self.command("remote", &[])?.trim().is_empty(); 94 | if !remote_exists { 95 | return Err("No remote repository configured".into()); 96 | } 97 | 98 | let mut statuses = Vec::new(); 99 | let current = self.get_current_branch()?; 100 | 101 | // Step 1: Sync current branch with remote (similar to hub sync) 102 | if let Ok(()) = self.sync_current_branch_with_remote() { 103 | statuses.push(BranchStatus::Updated(current.clone())); 104 | } 105 | 106 | // Step 2: Update remote info 107 | self.command("remote", &["update", "--prune"])?; 108 | 109 | // Step 3: Delete merged branches (similar to git branch --merged | grep -v master | xargs git branch -d) 110 | let deleted_branches = self.delete_merged_branches()?; 111 | for branch in deleted_branches { 112 | statuses.push(BranchStatus::Merged(branch)); 113 | } 114 | 115 | // Step 4: Check status of remaining branches 116 | let remaining_branches = self.get_local_branches()?; 117 | for branch in remaining_branches { 118 | if branch.name != current { 119 | statuses.push(self.check_branch_status(&branch.name)?); 120 | } 121 | } 122 | 123 | Ok(statuses) 124 | } 125 | 126 | fn sync_current_branch_with_remote(&self) -> Result<(), Box> { 127 | let current = self.get_current_branch()?; 128 | 129 | // Check if current branch has upstream 130 | let upstream_result = self.command("rev-parse", &["--abbrev-ref", &format!("{}@{{upstream}}", current)]); 131 | 132 | if upstream_result.is_ok() { 133 | // Pull changes if there's an upstream 134 | self.command("pull", &["--ff-only"])?; 135 | } 136 | 137 | Ok(()) 138 | } 139 | 140 | fn delete_merged_branches(&self) -> Result, Box> { 141 | let current = self.get_current_branch()?; 142 | 143 | // Get merged branches (excluding master/main and current branch) 144 | let merged_output = self.command("branch", &["--merged"])?; 145 | let branches_to_delete: Vec = merged_output 146 | .lines() 147 | .filter_map(|line| { 148 | let branch = line.trim().trim_start_matches('*').trim(); 149 | if !branch.is_empty() 150 | && branch != "master" 151 | && branch != "main" 152 | && branch != ¤t 153 | && !line.starts_with('*') // Extra safety: don't delete current branch 154 | { 155 | Some(branch.to_string()) 156 | } else { 157 | None 158 | } 159 | }) 160 | .collect(); 161 | 162 | // Delete branches 163 | let mut deleted = Vec::new(); 164 | for branch in branches_to_delete { 165 | if self.command("branch", &["-d", &branch]).is_ok() { 166 | deleted.push(branch); 167 | } 168 | } 169 | 170 | Ok(deleted) 171 | } 172 | 173 | fn command(&self, cmd: &str, args: &[&str]) -> Result> { 174 | let output = Command::new("git").arg(cmd).args(args).output()?; 175 | 176 | if output.status.success() { 177 | Ok(String::from_utf8(output.stdout)?) 178 | } else { 179 | let error = String::from_utf8_lossy(&output.stderr); 180 | Err(error.into()) 181 | } 182 | } 183 | 184 | fn check_branch_status(&self, branch: &str) -> Result> { 185 | // Check if there is an upstream branch 186 | let has_upstream = self 187 | .command("rev-parse", &["--verify", &format!("refs/remotes/origin/{}", branch)]) 188 | .is_ok(); 189 | 190 | if !has_upstream { 191 | return Ok(BranchStatus::LocalOnly(branch.to_string())); 192 | } 193 | 194 | // Use git rev-list to compare local and remote 195 | let output = self.command( 196 | "rev-list", 197 | &["--left-right", "--count", &format!("{}...origin/{}", branch, branch)] 198 | )?; 199 | 200 | let counts: Vec<&str> = output.trim().split_whitespace().collect(); 201 | match counts.as_slice() { 202 | [left, right] => { 203 | let local_ahead: usize = left.parse().unwrap_or(0); 204 | let local_behind: usize = right.parse().unwrap_or(0); 205 | 206 | match (local_ahead, local_behind) { 207 | (0, 0) => Ok(BranchStatus::UpToDate), 208 | (_, 0) => Ok(BranchStatus::Diverged(branch.to_string())), // Local has unpushed commits 209 | (0, _) => Ok(BranchStatus::Updated(branch.to_string())), // Could be updated (behind remote) 210 | (_, _) => Ok(BranchStatus::Diverged(branch.to_string())), // Both ahead and behind 211 | } 212 | } 213 | _ => Ok(BranchStatus::RemoteGone(branch.to_string())), 214 | } 215 | } 216 | 217 | 218 | pub fn get_worktrees(&self) -> Result, Box> { 219 | let output = match self.command("worktree", &["list", "--porcelain"]) { 220 | Ok(output) => output, 221 | Err(_) => return Ok(std::collections::HashMap::new()), // No worktrees or git version doesn't support it 222 | }; 223 | 224 | let mut worktrees = std::collections::HashMap::new(); 225 | let mut current_worktree = String::new(); 226 | let mut current_branch = String::new(); 227 | 228 | for line in output.lines() { 229 | if line.starts_with("worktree ") { 230 | current_worktree = line.strip_prefix("worktree ").unwrap_or("").to_string(); 231 | } else if line.starts_with("branch ") { 232 | let branch_ref = line.strip_prefix("branch ").unwrap_or(""); 233 | if let Some(branch_name) = branch_ref.strip_prefix("refs/heads/") { 234 | current_branch = branch_name.to_string(); 235 | } 236 | } 237 | 238 | if !current_worktree.is_empty() && !current_branch.is_empty() { 239 | worktrees.insert(current_branch.clone(), current_worktree.clone()); 240 | current_branch.clear(); 241 | } 242 | } 243 | 244 | Ok(worktrees) 245 | } 246 | } 247 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "1.1.3" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "anstream" 16 | version = "0.6.18" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 19 | dependencies = [ 20 | "anstyle", 21 | "anstyle-parse", 22 | "anstyle-query", 23 | "anstyle-wincon", 24 | "colorchoice", 25 | "is_terminal_polyfill", 26 | "utf8parse", 27 | ] 28 | 29 | [[package]] 30 | name = "anstyle" 31 | version = "1.0.10" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 34 | 35 | [[package]] 36 | name = "anstyle-parse" 37 | version = "0.2.6" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 40 | dependencies = [ 41 | "utf8parse", 42 | ] 43 | 44 | [[package]] 45 | name = "anstyle-query" 46 | version = "1.1.2" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 49 | dependencies = [ 50 | "windows-sys 0.59.0", 51 | ] 52 | 53 | [[package]] 54 | name = "anstyle-wincon" 55 | version = "3.0.6" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" 58 | dependencies = [ 59 | "anstyle", 60 | "windows-sys 0.59.0", 61 | ] 62 | 63 | [[package]] 64 | name = "assert_cmd" 65 | version = "2.0.16" 66 | source = "registry+https://github.com/rust-lang/crates.io-index" 67 | checksum = "dc1835b7f27878de8525dc71410b5a31cdcc5f230aed5ba5df968e09c201b23d" 68 | dependencies = [ 69 | "anstyle", 70 | "bstr", 71 | "doc-comment", 72 | "libc", 73 | "predicates", 74 | "predicates-core", 75 | "predicates-tree", 76 | "wait-timeout", 77 | ] 78 | 79 | [[package]] 80 | name = "atty" 81 | version = "0.2.14" 82 | source = "registry+https://github.com/rust-lang/crates.io-index" 83 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 84 | dependencies = [ 85 | "hermit-abi", 86 | "libc", 87 | "winapi", 88 | ] 89 | 90 | [[package]] 91 | name = "autocfg" 92 | version = "1.4.0" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 95 | 96 | [[package]] 97 | name = "bitflags" 98 | version = "2.6.0" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 101 | 102 | [[package]] 103 | name = "bstr" 104 | version = "1.10.0" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" 107 | dependencies = [ 108 | "memchr", 109 | "regex-automata", 110 | "serde", 111 | ] 112 | 113 | [[package]] 114 | name = "cfg-if" 115 | version = "1.0.0" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 118 | 119 | [[package]] 120 | name = "cfg_aliases" 121 | version = "0.2.1" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 124 | 125 | [[package]] 126 | name = "clap" 127 | version = "4.5.20" 128 | source = "registry+https://github.com/rust-lang/crates.io-index" 129 | checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" 130 | dependencies = [ 131 | "clap_builder", 132 | "clap_derive", 133 | ] 134 | 135 | [[package]] 136 | name = "clap_builder" 137 | version = "4.5.20" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" 140 | dependencies = [ 141 | "anstream", 142 | "anstyle", 143 | "clap_lex", 144 | "strsim", 145 | ] 146 | 147 | [[package]] 148 | name = "clap_derive" 149 | version = "4.5.18" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" 152 | dependencies = [ 153 | "heck", 154 | "proc-macro2", 155 | "quote", 156 | "syn", 157 | ] 158 | 159 | [[package]] 160 | name = "clap_lex" 161 | version = "0.7.2" 162 | source = "registry+https://github.com/rust-lang/crates.io-index" 163 | checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" 164 | 165 | [[package]] 166 | name = "colorchoice" 167 | version = "1.0.3" 168 | source = "registry+https://github.com/rust-lang/crates.io-index" 169 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 170 | 171 | [[package]] 172 | name = "colored" 173 | version = "2.1.0" 174 | source = "registry+https://github.com/rust-lang/crates.io-index" 175 | checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" 176 | dependencies = [ 177 | "lazy_static", 178 | "windows-sys 0.48.0", 179 | ] 180 | 181 | [[package]] 182 | name = "console" 183 | version = "0.15.8" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" 186 | dependencies = [ 187 | "encode_unicode", 188 | "lazy_static", 189 | "libc", 190 | "unicode-width", 191 | "windows-sys 0.52.0", 192 | ] 193 | 194 | [[package]] 195 | name = "ctrlc" 196 | version = "3.4.5" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "90eeab0aa92f3f9b4e87f258c72b139c207d251f9cbc1080a0086b86a8870dd3" 199 | dependencies = [ 200 | "nix", 201 | "windows-sys 0.59.0", 202 | ] 203 | 204 | [[package]] 205 | name = "dialoguer" 206 | version = "0.11.0" 207 | source = "registry+https://github.com/rust-lang/crates.io-index" 208 | checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" 209 | dependencies = [ 210 | "console", 211 | "fuzzy-matcher", 212 | "shell-words", 213 | "tempfile", 214 | "thiserror", 215 | "zeroize", 216 | ] 217 | 218 | [[package]] 219 | name = "difflib" 220 | version = "0.4.0" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" 223 | 224 | [[package]] 225 | name = "doc-comment" 226 | version = "0.3.3" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" 229 | 230 | [[package]] 231 | name = "encode_unicode" 232 | version = "0.3.6" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 235 | 236 | [[package]] 237 | name = "errno" 238 | version = "0.3.9" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" 241 | dependencies = [ 242 | "libc", 243 | "windows-sys 0.52.0", 244 | ] 245 | 246 | [[package]] 247 | name = "fastrand" 248 | version = "2.2.0" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" 251 | 252 | [[package]] 253 | name = "float-cmp" 254 | version = "0.9.0" 255 | source = "registry+https://github.com/rust-lang/crates.io-index" 256 | checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" 257 | dependencies = [ 258 | "num-traits", 259 | ] 260 | 261 | [[package]] 262 | name = "fuzzy-matcher" 263 | version = "0.3.7" 264 | source = "registry+https://github.com/rust-lang/crates.io-index" 265 | checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" 266 | dependencies = [ 267 | "thread_local", 268 | ] 269 | 270 | [[package]] 271 | name = "heck" 272 | version = "0.5.0" 273 | source = "registry+https://github.com/rust-lang/crates.io-index" 274 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 275 | 276 | [[package]] 277 | name = "hermit-abi" 278 | version = "0.1.19" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 281 | dependencies = [ 282 | "libc", 283 | ] 284 | 285 | [[package]] 286 | name = "is_terminal_polyfill" 287 | version = "1.70.1" 288 | source = "registry+https://github.com/rust-lang/crates.io-index" 289 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 290 | 291 | [[package]] 292 | name = "lazy_static" 293 | version = "1.5.0" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 296 | 297 | [[package]] 298 | name = "libc" 299 | version = "0.2.162" 300 | source = "registry+https://github.com/rust-lang/crates.io-index" 301 | checksum = "18d287de67fe55fd7e1581fe933d965a5a9477b38e949cfa9f8574ef01506398" 302 | 303 | [[package]] 304 | name = "linux-raw-sys" 305 | version = "0.4.14" 306 | source = "registry+https://github.com/rust-lang/crates.io-index" 307 | checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" 308 | 309 | [[package]] 310 | name = "memchr" 311 | version = "2.7.4" 312 | source = "registry+https://github.com/rust-lang/crates.io-index" 313 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 314 | 315 | [[package]] 316 | name = "nix" 317 | version = "0.29.0" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 320 | dependencies = [ 321 | "bitflags", 322 | "cfg-if", 323 | "cfg_aliases", 324 | "libc", 325 | ] 326 | 327 | [[package]] 328 | name = "normalize-line-endings" 329 | version = "0.3.0" 330 | source = "registry+https://github.com/rust-lang/crates.io-index" 331 | checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" 332 | 333 | [[package]] 334 | name = "num-traits" 335 | version = "0.2.19" 336 | source = "registry+https://github.com/rust-lang/crates.io-index" 337 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 338 | dependencies = [ 339 | "autocfg", 340 | ] 341 | 342 | [[package]] 343 | name = "once_cell" 344 | version = "1.20.2" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 347 | 348 | [[package]] 349 | name = "predicates" 350 | version = "3.1.2" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97" 353 | dependencies = [ 354 | "anstyle", 355 | "difflib", 356 | "float-cmp", 357 | "normalize-line-endings", 358 | "predicates-core", 359 | "regex", 360 | ] 361 | 362 | [[package]] 363 | name = "predicates-core" 364 | version = "1.0.8" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" 367 | 368 | [[package]] 369 | name = "predicates-tree" 370 | version = "1.0.11" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" 373 | dependencies = [ 374 | "predicates-core", 375 | "termtree", 376 | ] 377 | 378 | [[package]] 379 | name = "proc-macro2" 380 | version = "1.0.89" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" 383 | dependencies = [ 384 | "unicode-ident", 385 | ] 386 | 387 | [[package]] 388 | name = "quote" 389 | version = "1.0.37" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" 392 | dependencies = [ 393 | "proc-macro2", 394 | ] 395 | 396 | [[package]] 397 | name = "regex" 398 | version = "1.11.1" 399 | source = "registry+https://github.com/rust-lang/crates.io-index" 400 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 401 | dependencies = [ 402 | "aho-corasick", 403 | "memchr", 404 | "regex-automata", 405 | "regex-syntax", 406 | ] 407 | 408 | [[package]] 409 | name = "regex-automata" 410 | version = "0.4.8" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" 413 | dependencies = [ 414 | "aho-corasick", 415 | "memchr", 416 | "regex-syntax", 417 | ] 418 | 419 | [[package]] 420 | name = "regex-syntax" 421 | version = "0.8.5" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 424 | 425 | [[package]] 426 | name = "rustix" 427 | version = "0.38.39" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "375116bee2be9ed569afe2154ea6a99dfdffd257f533f187498c2a8f5feaf4ee" 430 | dependencies = [ 431 | "bitflags", 432 | "errno", 433 | "libc", 434 | "linux-raw-sys", 435 | "windows-sys 0.52.0", 436 | ] 437 | 438 | [[package]] 439 | name = "serde" 440 | version = "1.0.214" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" 443 | dependencies = [ 444 | "serde_derive", 445 | ] 446 | 447 | [[package]] 448 | name = "serde_derive" 449 | version = "1.0.214" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" 452 | dependencies = [ 453 | "proc-macro2", 454 | "quote", 455 | "syn", 456 | ] 457 | 458 | [[package]] 459 | name = "shell-words" 460 | version = "1.1.0" 461 | source = "registry+https://github.com/rust-lang/crates.io-index" 462 | checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" 463 | 464 | [[package]] 465 | name = "strsim" 466 | version = "0.11.1" 467 | source = "registry+https://github.com/rust-lang/crates.io-index" 468 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 469 | 470 | [[package]] 471 | name = "swagit" 472 | version = "1.1.0" 473 | dependencies = [ 474 | "assert_cmd", 475 | "atty", 476 | "clap", 477 | "colored", 478 | "ctrlc", 479 | "dialoguer", 480 | "predicates", 481 | "tempfile", 482 | ] 483 | 484 | [[package]] 485 | name = "syn" 486 | version = "2.0.87" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" 489 | dependencies = [ 490 | "proc-macro2", 491 | "quote", 492 | "unicode-ident", 493 | ] 494 | 495 | [[package]] 496 | name = "tempfile" 497 | version = "3.14.0" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" 500 | dependencies = [ 501 | "cfg-if", 502 | "fastrand", 503 | "once_cell", 504 | "rustix", 505 | "windows-sys 0.59.0", 506 | ] 507 | 508 | [[package]] 509 | name = "termtree" 510 | version = "0.4.1" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" 513 | 514 | [[package]] 515 | name = "thiserror" 516 | version = "1.0.68" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "02dd99dc800bbb97186339685293e1cc5d9df1f8fae2d0aecd9ff1c77efea892" 519 | dependencies = [ 520 | "thiserror-impl", 521 | ] 522 | 523 | [[package]] 524 | name = "thiserror-impl" 525 | version = "1.0.68" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "a7c61ec9a6f64d2793d8a45faba21efbe3ced62a886d44c36a009b2b519b4c7e" 528 | dependencies = [ 529 | "proc-macro2", 530 | "quote", 531 | "syn", 532 | ] 533 | 534 | [[package]] 535 | name = "thread_local" 536 | version = "1.1.8" 537 | source = "registry+https://github.com/rust-lang/crates.io-index" 538 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 539 | dependencies = [ 540 | "cfg-if", 541 | "once_cell", 542 | ] 543 | 544 | [[package]] 545 | name = "unicode-ident" 546 | version = "1.0.13" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" 549 | 550 | [[package]] 551 | name = "unicode-width" 552 | version = "0.1.14" 553 | source = "registry+https://github.com/rust-lang/crates.io-index" 554 | checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 555 | 556 | [[package]] 557 | name = "utf8parse" 558 | version = "0.2.2" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 561 | 562 | [[package]] 563 | name = "wait-timeout" 564 | version = "0.2.0" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" 567 | dependencies = [ 568 | "libc", 569 | ] 570 | 571 | [[package]] 572 | name = "winapi" 573 | version = "0.3.9" 574 | source = "registry+https://github.com/rust-lang/crates.io-index" 575 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 576 | dependencies = [ 577 | "winapi-i686-pc-windows-gnu", 578 | "winapi-x86_64-pc-windows-gnu", 579 | ] 580 | 581 | [[package]] 582 | name = "winapi-i686-pc-windows-gnu" 583 | version = "0.4.0" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 586 | 587 | [[package]] 588 | name = "winapi-x86_64-pc-windows-gnu" 589 | version = "0.4.0" 590 | source = "registry+https://github.com/rust-lang/crates.io-index" 591 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 592 | 593 | [[package]] 594 | name = "windows-sys" 595 | version = "0.48.0" 596 | source = "registry+https://github.com/rust-lang/crates.io-index" 597 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 598 | dependencies = [ 599 | "windows-targets 0.48.5", 600 | ] 601 | 602 | [[package]] 603 | name = "windows-sys" 604 | version = "0.52.0" 605 | source = "registry+https://github.com/rust-lang/crates.io-index" 606 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 607 | dependencies = [ 608 | "windows-targets 0.52.6", 609 | ] 610 | 611 | [[package]] 612 | name = "windows-sys" 613 | version = "0.59.0" 614 | source = "registry+https://github.com/rust-lang/crates.io-index" 615 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 616 | dependencies = [ 617 | "windows-targets 0.52.6", 618 | ] 619 | 620 | [[package]] 621 | name = "windows-targets" 622 | version = "0.48.5" 623 | source = "registry+https://github.com/rust-lang/crates.io-index" 624 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 625 | dependencies = [ 626 | "windows_aarch64_gnullvm 0.48.5", 627 | "windows_aarch64_msvc 0.48.5", 628 | "windows_i686_gnu 0.48.5", 629 | "windows_i686_msvc 0.48.5", 630 | "windows_x86_64_gnu 0.48.5", 631 | "windows_x86_64_gnullvm 0.48.5", 632 | "windows_x86_64_msvc 0.48.5", 633 | ] 634 | 635 | [[package]] 636 | name = "windows-targets" 637 | version = "0.52.6" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 640 | dependencies = [ 641 | "windows_aarch64_gnullvm 0.52.6", 642 | "windows_aarch64_msvc 0.52.6", 643 | "windows_i686_gnu 0.52.6", 644 | "windows_i686_gnullvm", 645 | "windows_i686_msvc 0.52.6", 646 | "windows_x86_64_gnu 0.52.6", 647 | "windows_x86_64_gnullvm 0.52.6", 648 | "windows_x86_64_msvc 0.52.6", 649 | ] 650 | 651 | [[package]] 652 | name = "windows_aarch64_gnullvm" 653 | version = "0.48.5" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 656 | 657 | [[package]] 658 | name = "windows_aarch64_gnullvm" 659 | version = "0.52.6" 660 | source = "registry+https://github.com/rust-lang/crates.io-index" 661 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 662 | 663 | [[package]] 664 | name = "windows_aarch64_msvc" 665 | version = "0.48.5" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 668 | 669 | [[package]] 670 | name = "windows_aarch64_msvc" 671 | version = "0.52.6" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 674 | 675 | [[package]] 676 | name = "windows_i686_gnu" 677 | version = "0.48.5" 678 | source = "registry+https://github.com/rust-lang/crates.io-index" 679 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 680 | 681 | [[package]] 682 | name = "windows_i686_gnu" 683 | version = "0.52.6" 684 | source = "registry+https://github.com/rust-lang/crates.io-index" 685 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 686 | 687 | [[package]] 688 | name = "windows_i686_gnullvm" 689 | version = "0.52.6" 690 | source = "registry+https://github.com/rust-lang/crates.io-index" 691 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 692 | 693 | [[package]] 694 | name = "windows_i686_msvc" 695 | version = "0.48.5" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 698 | 699 | [[package]] 700 | name = "windows_i686_msvc" 701 | version = "0.52.6" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 704 | 705 | [[package]] 706 | name = "windows_x86_64_gnu" 707 | version = "0.48.5" 708 | source = "registry+https://github.com/rust-lang/crates.io-index" 709 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 710 | 711 | [[package]] 712 | name = "windows_x86_64_gnu" 713 | version = "0.52.6" 714 | source = "registry+https://github.com/rust-lang/crates.io-index" 715 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 716 | 717 | [[package]] 718 | name = "windows_x86_64_gnullvm" 719 | version = "0.48.5" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 722 | 723 | [[package]] 724 | name = "windows_x86_64_gnullvm" 725 | version = "0.52.6" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 728 | 729 | [[package]] 730 | name = "windows_x86_64_msvc" 731 | version = "0.48.5" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 734 | 735 | [[package]] 736 | name = "windows_x86_64_msvc" 737 | version = "0.52.6" 738 | source = "registry+https://github.com/rust-lang/crates.io-index" 739 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 740 | 741 | [[package]] 742 | name = "zeroize" 743 | version = "1.8.1" 744 | source = "registry+https://github.com/rust-lang/crates.io-index" 745 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 746 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@changesets/changelog-github': 12 | specifier: ^0.5.0 13 | version: 0.5.0 14 | '@changesets/cli': 15 | specifier: ^2.27.9 16 | version: 2.27.9 17 | 18 | packages/darwin-arm64: {} 19 | 20 | packages/darwin-x64: {} 21 | 22 | packages/linux-arm64: {} 23 | 24 | packages/linux-x64: {} 25 | 26 | packages/swagit: 27 | optionalDependencies: 28 | '@swagit/darwin-arm64': 29 | specifier: ^1.0.1 30 | version: 1.0.1 31 | '@swagit/darwin-x64': 32 | specifier: ^1.0.1 33 | version: 1.0.1 34 | '@swagit/linux-arm64': 35 | specifier: ^1.0.1 36 | version: 1.0.1 37 | '@swagit/linux-x64': 38 | specifier: ^1.0.1 39 | version: 1.0.1 40 | '@swagit/win32-x64': 41 | specifier: ^1.0.1 42 | version: 1.0.1 43 | 44 | packages/win32-x64: {} 45 | 46 | packages: 47 | 48 | '@babel/runtime@7.26.0': 49 | resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} 50 | engines: {node: '>=6.9.0'} 51 | 52 | '@changesets/apply-release-plan@7.0.5': 53 | resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} 54 | 55 | '@changesets/assemble-release-plan@6.0.4': 56 | resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} 57 | 58 | '@changesets/changelog-git@0.2.0': 59 | resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} 60 | 61 | '@changesets/changelog-github@0.5.0': 62 | resolution: {integrity: sha512-zoeq2LJJVcPJcIotHRJEEA2qCqX0AQIeFE+L21L8sRLPVqDhSXY8ZWAt2sohtBpFZkBwu+LUwMSKRr2lMy3LJA==} 63 | 64 | '@changesets/cli@2.27.9': 65 | resolution: {integrity: sha512-q42a/ZbDnxPpCb5Wkm6tMVIxgeI9C/bexntzTeCFBrQEdpisQqk8kCHllYZMDjYtEc1ZzumbMJAG8H0Z4rdvjg==} 66 | hasBin: true 67 | 68 | '@changesets/config@3.0.3': 69 | resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} 70 | 71 | '@changesets/errors@0.2.0': 72 | resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} 73 | 74 | '@changesets/get-dependents-graph@2.1.2': 75 | resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} 76 | 77 | '@changesets/get-github-info@0.6.0': 78 | resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} 79 | 80 | '@changesets/get-release-plan@4.0.4': 81 | resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} 82 | 83 | '@changesets/get-version-range-type@0.4.0': 84 | resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} 85 | 86 | '@changesets/git@3.0.1': 87 | resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} 88 | 89 | '@changesets/logger@0.1.1': 90 | resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} 91 | 92 | '@changesets/parse@0.4.0': 93 | resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} 94 | 95 | '@changesets/pre@2.0.1': 96 | resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} 97 | 98 | '@changesets/read@0.6.1': 99 | resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} 100 | 101 | '@changesets/should-skip-package@0.1.1': 102 | resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} 103 | 104 | '@changesets/types@4.1.0': 105 | resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} 106 | 107 | '@changesets/types@6.0.0': 108 | resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} 109 | 110 | '@changesets/write@0.3.2': 111 | resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} 112 | 113 | '@manypkg/find-root@1.1.0': 114 | resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} 115 | 116 | '@manypkg/get-packages@1.1.3': 117 | resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} 118 | 119 | '@nodelib/fs.scandir@2.1.5': 120 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 121 | engines: {node: '>= 8'} 122 | 123 | '@nodelib/fs.stat@2.0.5': 124 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 125 | engines: {node: '>= 8'} 126 | 127 | '@nodelib/fs.walk@1.2.8': 128 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 129 | engines: {node: '>= 8'} 130 | 131 | '@swagit/darwin-arm64@1.0.1': 132 | resolution: {integrity: sha512-0c4J43NDvx9WzGRuS3ilKJMf13xmVtKniEqk6dmGPwaXF+6HBN2oo35VNT56CSUEH5tRD6IxWsH0cl7H5lZqBw==} 133 | cpu: [arm64] 134 | os: [darwin] 135 | 136 | '@swagit/darwin-x64@1.0.1': 137 | resolution: {integrity: sha512-XYbawD+4Z6lx9R2SbVP1mwvSIQFP52gLazFIzDz/u172Lp1giBXUy8Aq+lEg+Wuaf53eJckHne/dUQhBOQgkrA==} 138 | cpu: [x64] 139 | os: [darwin] 140 | 141 | '@swagit/linux-arm64@1.0.1': 142 | resolution: {integrity: sha512-gKCKtM+4WcSYShTdvedVTEF4Qdr4caaxXQSaTjG9SlV/+hXu4EtcxN8DWYMKbAfKGGa3D54qspWzRwDuzC1PDw==} 143 | cpu: [arm64] 144 | os: [linux] 145 | 146 | '@swagit/linux-x64@1.0.1': 147 | resolution: {integrity: sha512-gEKm4oYwkHH//ByzH2cy8hZsGwZ002D/hOU8a6H0Qi9wdUjPjGbnfh/0k1CBDvawyFdV+1NfPWi3uaKNLgx/6w==} 148 | cpu: [x64] 149 | os: [linux] 150 | 151 | '@swagit/win32-x64@1.0.1': 152 | resolution: {integrity: sha512-zOEHKlXi2kt7tQpU2haoemgy3VecizJ28hP1YCV6aToEgveIY78ZtYRZ+3QemsBxyQCJLOooaMCFRBbGK+0maQ==} 153 | cpu: [x64] 154 | os: [win32] 155 | 156 | '@types/node@12.20.55': 157 | resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} 158 | 159 | ansi-colors@4.1.3: 160 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 161 | engines: {node: '>=6'} 162 | 163 | ansi-regex@5.0.1: 164 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 165 | engines: {node: '>=8'} 166 | 167 | argparse@1.0.10: 168 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 169 | 170 | array-union@2.1.0: 171 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 172 | engines: {node: '>=8'} 173 | 174 | better-path-resolve@1.0.0: 175 | resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} 176 | engines: {node: '>=4'} 177 | 178 | braces@3.0.3: 179 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 180 | engines: {node: '>=8'} 181 | 182 | chardet@0.7.0: 183 | resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} 184 | 185 | ci-info@3.9.0: 186 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 187 | engines: {node: '>=8'} 188 | 189 | cross-spawn@5.1.0: 190 | resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} 191 | 192 | dataloader@1.4.0: 193 | resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} 194 | 195 | detect-indent@6.1.0: 196 | resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} 197 | engines: {node: '>=8'} 198 | 199 | dir-glob@3.0.1: 200 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 201 | engines: {node: '>=8'} 202 | 203 | dotenv@8.6.0: 204 | resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} 205 | engines: {node: '>=10'} 206 | 207 | enquirer@2.4.1: 208 | resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} 209 | engines: {node: '>=8.6'} 210 | 211 | esprima@4.0.1: 212 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 213 | engines: {node: '>=4'} 214 | hasBin: true 215 | 216 | extendable-error@0.1.7: 217 | resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} 218 | 219 | external-editor@3.1.0: 220 | resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} 221 | engines: {node: '>=4'} 222 | 223 | fast-glob@3.3.2: 224 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 225 | engines: {node: '>=8.6.0'} 226 | 227 | fastq@1.17.1: 228 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 229 | 230 | fill-range@7.1.1: 231 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 232 | engines: {node: '>=8'} 233 | 234 | find-up@4.1.0: 235 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 236 | engines: {node: '>=8'} 237 | 238 | fs-extra@7.0.1: 239 | resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} 240 | engines: {node: '>=6 <7 || >=8'} 241 | 242 | fs-extra@8.1.0: 243 | resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 244 | engines: {node: '>=6 <7 || >=8'} 245 | 246 | glob-parent@5.1.2: 247 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 248 | engines: {node: '>= 6'} 249 | 250 | globby@11.1.0: 251 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 252 | engines: {node: '>=10'} 253 | 254 | graceful-fs@4.2.11: 255 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 256 | 257 | human-id@1.0.2: 258 | resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} 259 | 260 | iconv-lite@0.4.24: 261 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 262 | engines: {node: '>=0.10.0'} 263 | 264 | ignore@5.3.2: 265 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 266 | engines: {node: '>= 4'} 267 | 268 | is-extglob@2.1.1: 269 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 270 | engines: {node: '>=0.10.0'} 271 | 272 | is-glob@4.0.3: 273 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 274 | engines: {node: '>=0.10.0'} 275 | 276 | is-number@7.0.0: 277 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 278 | engines: {node: '>=0.12.0'} 279 | 280 | is-subdir@1.2.0: 281 | resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} 282 | engines: {node: '>=4'} 283 | 284 | is-windows@1.0.2: 285 | resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} 286 | engines: {node: '>=0.10.0'} 287 | 288 | isexe@2.0.0: 289 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 290 | 291 | js-yaml@3.14.1: 292 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 293 | hasBin: true 294 | 295 | jsonfile@4.0.0: 296 | resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} 297 | 298 | locate-path@5.0.0: 299 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 300 | engines: {node: '>=8'} 301 | 302 | lodash.startcase@4.4.0: 303 | resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} 304 | 305 | lru-cache@4.1.5: 306 | resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} 307 | 308 | merge2@1.4.1: 309 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 310 | engines: {node: '>= 8'} 311 | 312 | micromatch@4.0.8: 313 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 314 | engines: {node: '>=8.6'} 315 | 316 | mri@1.2.0: 317 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 318 | engines: {node: '>=4'} 319 | 320 | node-fetch@2.7.0: 321 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 322 | engines: {node: 4.x || >=6.0.0} 323 | peerDependencies: 324 | encoding: ^0.1.0 325 | peerDependenciesMeta: 326 | encoding: 327 | optional: true 328 | 329 | os-tmpdir@1.0.2: 330 | resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} 331 | engines: {node: '>=0.10.0'} 332 | 333 | outdent@0.5.0: 334 | resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} 335 | 336 | p-filter@2.1.0: 337 | resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} 338 | engines: {node: '>=8'} 339 | 340 | p-limit@2.3.0: 341 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 342 | engines: {node: '>=6'} 343 | 344 | p-locate@4.1.0: 345 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 346 | engines: {node: '>=8'} 347 | 348 | p-map@2.1.0: 349 | resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} 350 | engines: {node: '>=6'} 351 | 352 | p-try@2.2.0: 353 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 354 | engines: {node: '>=6'} 355 | 356 | package-manager-detector@0.2.2: 357 | resolution: {integrity: sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==} 358 | 359 | path-exists@4.0.0: 360 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 361 | engines: {node: '>=8'} 362 | 363 | path-type@4.0.0: 364 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 365 | engines: {node: '>=8'} 366 | 367 | picocolors@1.1.1: 368 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 369 | 370 | picomatch@2.3.1: 371 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 372 | engines: {node: '>=8.6'} 373 | 374 | pify@4.0.1: 375 | resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} 376 | engines: {node: '>=6'} 377 | 378 | prettier@2.8.8: 379 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} 380 | engines: {node: '>=10.13.0'} 381 | hasBin: true 382 | 383 | pseudomap@1.0.2: 384 | resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} 385 | 386 | queue-microtask@1.2.3: 387 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 388 | 389 | read-yaml-file@1.1.0: 390 | resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} 391 | engines: {node: '>=6'} 392 | 393 | regenerator-runtime@0.14.1: 394 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 395 | 396 | resolve-from@5.0.0: 397 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 398 | engines: {node: '>=8'} 399 | 400 | reusify@1.0.4: 401 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 402 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 403 | 404 | run-parallel@1.2.0: 405 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 406 | 407 | safer-buffer@2.1.2: 408 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 409 | 410 | semver@7.6.3: 411 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 412 | engines: {node: '>=10'} 413 | hasBin: true 414 | 415 | shebang-command@1.2.0: 416 | resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} 417 | engines: {node: '>=0.10.0'} 418 | 419 | shebang-regex@1.0.0: 420 | resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} 421 | engines: {node: '>=0.10.0'} 422 | 423 | signal-exit@3.0.7: 424 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 425 | 426 | slash@3.0.0: 427 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 428 | engines: {node: '>=8'} 429 | 430 | spawndamnit@2.0.0: 431 | resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} 432 | 433 | sprintf-js@1.0.3: 434 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 435 | 436 | strip-ansi@6.0.1: 437 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 438 | engines: {node: '>=8'} 439 | 440 | strip-bom@3.0.0: 441 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 442 | engines: {node: '>=4'} 443 | 444 | term-size@2.2.1: 445 | resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} 446 | engines: {node: '>=8'} 447 | 448 | tmp@0.0.33: 449 | resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} 450 | engines: {node: '>=0.6.0'} 451 | 452 | to-regex-range@5.0.1: 453 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 454 | engines: {node: '>=8.0'} 455 | 456 | tr46@0.0.3: 457 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 458 | 459 | universalify@0.1.2: 460 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 461 | engines: {node: '>= 4.0.0'} 462 | 463 | webidl-conversions@3.0.1: 464 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 465 | 466 | whatwg-url@5.0.0: 467 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 468 | 469 | which@1.3.1: 470 | resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} 471 | hasBin: true 472 | 473 | yallist@2.1.2: 474 | resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} 475 | 476 | snapshots: 477 | 478 | '@babel/runtime@7.26.0': 479 | dependencies: 480 | regenerator-runtime: 0.14.1 481 | 482 | '@changesets/apply-release-plan@7.0.5': 483 | dependencies: 484 | '@changesets/config': 3.0.3 485 | '@changesets/get-version-range-type': 0.4.0 486 | '@changesets/git': 3.0.1 487 | '@changesets/should-skip-package': 0.1.1 488 | '@changesets/types': 6.0.0 489 | '@manypkg/get-packages': 1.1.3 490 | detect-indent: 6.1.0 491 | fs-extra: 7.0.1 492 | lodash.startcase: 4.4.0 493 | outdent: 0.5.0 494 | prettier: 2.8.8 495 | resolve-from: 5.0.0 496 | semver: 7.6.3 497 | 498 | '@changesets/assemble-release-plan@6.0.4': 499 | dependencies: 500 | '@changesets/errors': 0.2.0 501 | '@changesets/get-dependents-graph': 2.1.2 502 | '@changesets/should-skip-package': 0.1.1 503 | '@changesets/types': 6.0.0 504 | '@manypkg/get-packages': 1.1.3 505 | semver: 7.6.3 506 | 507 | '@changesets/changelog-git@0.2.0': 508 | dependencies: 509 | '@changesets/types': 6.0.0 510 | 511 | '@changesets/changelog-github@0.5.0': 512 | dependencies: 513 | '@changesets/get-github-info': 0.6.0 514 | '@changesets/types': 6.0.0 515 | dotenv: 8.6.0 516 | transitivePeerDependencies: 517 | - encoding 518 | 519 | '@changesets/cli@2.27.9': 520 | dependencies: 521 | '@changesets/apply-release-plan': 7.0.5 522 | '@changesets/assemble-release-plan': 6.0.4 523 | '@changesets/changelog-git': 0.2.0 524 | '@changesets/config': 3.0.3 525 | '@changesets/errors': 0.2.0 526 | '@changesets/get-dependents-graph': 2.1.2 527 | '@changesets/get-release-plan': 4.0.4 528 | '@changesets/git': 3.0.1 529 | '@changesets/logger': 0.1.1 530 | '@changesets/pre': 2.0.1 531 | '@changesets/read': 0.6.1 532 | '@changesets/should-skip-package': 0.1.1 533 | '@changesets/types': 6.0.0 534 | '@changesets/write': 0.3.2 535 | '@manypkg/get-packages': 1.1.3 536 | ansi-colors: 4.1.3 537 | ci-info: 3.9.0 538 | enquirer: 2.4.1 539 | external-editor: 3.1.0 540 | fs-extra: 7.0.1 541 | mri: 1.2.0 542 | p-limit: 2.3.0 543 | package-manager-detector: 0.2.2 544 | picocolors: 1.1.1 545 | resolve-from: 5.0.0 546 | semver: 7.6.3 547 | spawndamnit: 2.0.0 548 | term-size: 2.2.1 549 | 550 | '@changesets/config@3.0.3': 551 | dependencies: 552 | '@changesets/errors': 0.2.0 553 | '@changesets/get-dependents-graph': 2.1.2 554 | '@changesets/logger': 0.1.1 555 | '@changesets/types': 6.0.0 556 | '@manypkg/get-packages': 1.1.3 557 | fs-extra: 7.0.1 558 | micromatch: 4.0.8 559 | 560 | '@changesets/errors@0.2.0': 561 | dependencies: 562 | extendable-error: 0.1.7 563 | 564 | '@changesets/get-dependents-graph@2.1.2': 565 | dependencies: 566 | '@changesets/types': 6.0.0 567 | '@manypkg/get-packages': 1.1.3 568 | picocolors: 1.1.1 569 | semver: 7.6.3 570 | 571 | '@changesets/get-github-info@0.6.0': 572 | dependencies: 573 | dataloader: 1.4.0 574 | node-fetch: 2.7.0 575 | transitivePeerDependencies: 576 | - encoding 577 | 578 | '@changesets/get-release-plan@4.0.4': 579 | dependencies: 580 | '@changesets/assemble-release-plan': 6.0.4 581 | '@changesets/config': 3.0.3 582 | '@changesets/pre': 2.0.1 583 | '@changesets/read': 0.6.1 584 | '@changesets/types': 6.0.0 585 | '@manypkg/get-packages': 1.1.3 586 | 587 | '@changesets/get-version-range-type@0.4.0': {} 588 | 589 | '@changesets/git@3.0.1': 590 | dependencies: 591 | '@changesets/errors': 0.2.0 592 | '@manypkg/get-packages': 1.1.3 593 | is-subdir: 1.2.0 594 | micromatch: 4.0.8 595 | spawndamnit: 2.0.0 596 | 597 | '@changesets/logger@0.1.1': 598 | dependencies: 599 | picocolors: 1.1.1 600 | 601 | '@changesets/parse@0.4.0': 602 | dependencies: 603 | '@changesets/types': 6.0.0 604 | js-yaml: 3.14.1 605 | 606 | '@changesets/pre@2.0.1': 607 | dependencies: 608 | '@changesets/errors': 0.2.0 609 | '@changesets/types': 6.0.0 610 | '@manypkg/get-packages': 1.1.3 611 | fs-extra: 7.0.1 612 | 613 | '@changesets/read@0.6.1': 614 | dependencies: 615 | '@changesets/git': 3.0.1 616 | '@changesets/logger': 0.1.1 617 | '@changesets/parse': 0.4.0 618 | '@changesets/types': 6.0.0 619 | fs-extra: 7.0.1 620 | p-filter: 2.1.0 621 | picocolors: 1.1.1 622 | 623 | '@changesets/should-skip-package@0.1.1': 624 | dependencies: 625 | '@changesets/types': 6.0.0 626 | '@manypkg/get-packages': 1.1.3 627 | 628 | '@changesets/types@4.1.0': {} 629 | 630 | '@changesets/types@6.0.0': {} 631 | 632 | '@changesets/write@0.3.2': 633 | dependencies: 634 | '@changesets/types': 6.0.0 635 | fs-extra: 7.0.1 636 | human-id: 1.0.2 637 | prettier: 2.8.8 638 | 639 | '@manypkg/find-root@1.1.0': 640 | dependencies: 641 | '@babel/runtime': 7.26.0 642 | '@types/node': 12.20.55 643 | find-up: 4.1.0 644 | fs-extra: 8.1.0 645 | 646 | '@manypkg/get-packages@1.1.3': 647 | dependencies: 648 | '@babel/runtime': 7.26.0 649 | '@changesets/types': 4.1.0 650 | '@manypkg/find-root': 1.1.0 651 | fs-extra: 8.1.0 652 | globby: 11.1.0 653 | read-yaml-file: 1.1.0 654 | 655 | '@nodelib/fs.scandir@2.1.5': 656 | dependencies: 657 | '@nodelib/fs.stat': 2.0.5 658 | run-parallel: 1.2.0 659 | 660 | '@nodelib/fs.stat@2.0.5': {} 661 | 662 | '@nodelib/fs.walk@1.2.8': 663 | dependencies: 664 | '@nodelib/fs.scandir': 2.1.5 665 | fastq: 1.17.1 666 | 667 | '@swagit/darwin-arm64@1.0.1': 668 | optional: true 669 | 670 | '@swagit/darwin-x64@1.0.1': 671 | optional: true 672 | 673 | '@swagit/linux-arm64@1.0.1': 674 | optional: true 675 | 676 | '@swagit/linux-x64@1.0.1': 677 | optional: true 678 | 679 | '@swagit/win32-x64@1.0.1': 680 | optional: true 681 | 682 | '@types/node@12.20.55': {} 683 | 684 | ansi-colors@4.1.3: {} 685 | 686 | ansi-regex@5.0.1: {} 687 | 688 | argparse@1.0.10: 689 | dependencies: 690 | sprintf-js: 1.0.3 691 | 692 | array-union@2.1.0: {} 693 | 694 | better-path-resolve@1.0.0: 695 | dependencies: 696 | is-windows: 1.0.2 697 | 698 | braces@3.0.3: 699 | dependencies: 700 | fill-range: 7.1.1 701 | 702 | chardet@0.7.0: {} 703 | 704 | ci-info@3.9.0: {} 705 | 706 | cross-spawn@5.1.0: 707 | dependencies: 708 | lru-cache: 4.1.5 709 | shebang-command: 1.2.0 710 | which: 1.3.1 711 | 712 | dataloader@1.4.0: {} 713 | 714 | detect-indent@6.1.0: {} 715 | 716 | dir-glob@3.0.1: 717 | dependencies: 718 | path-type: 4.0.0 719 | 720 | dotenv@8.6.0: {} 721 | 722 | enquirer@2.4.1: 723 | dependencies: 724 | ansi-colors: 4.1.3 725 | strip-ansi: 6.0.1 726 | 727 | esprima@4.0.1: {} 728 | 729 | extendable-error@0.1.7: {} 730 | 731 | external-editor@3.1.0: 732 | dependencies: 733 | chardet: 0.7.0 734 | iconv-lite: 0.4.24 735 | tmp: 0.0.33 736 | 737 | fast-glob@3.3.2: 738 | dependencies: 739 | '@nodelib/fs.stat': 2.0.5 740 | '@nodelib/fs.walk': 1.2.8 741 | glob-parent: 5.1.2 742 | merge2: 1.4.1 743 | micromatch: 4.0.8 744 | 745 | fastq@1.17.1: 746 | dependencies: 747 | reusify: 1.0.4 748 | 749 | fill-range@7.1.1: 750 | dependencies: 751 | to-regex-range: 5.0.1 752 | 753 | find-up@4.1.0: 754 | dependencies: 755 | locate-path: 5.0.0 756 | path-exists: 4.0.0 757 | 758 | fs-extra@7.0.1: 759 | dependencies: 760 | graceful-fs: 4.2.11 761 | jsonfile: 4.0.0 762 | universalify: 0.1.2 763 | 764 | fs-extra@8.1.0: 765 | dependencies: 766 | graceful-fs: 4.2.11 767 | jsonfile: 4.0.0 768 | universalify: 0.1.2 769 | 770 | glob-parent@5.1.2: 771 | dependencies: 772 | is-glob: 4.0.3 773 | 774 | globby@11.1.0: 775 | dependencies: 776 | array-union: 2.1.0 777 | dir-glob: 3.0.1 778 | fast-glob: 3.3.2 779 | ignore: 5.3.2 780 | merge2: 1.4.1 781 | slash: 3.0.0 782 | 783 | graceful-fs@4.2.11: {} 784 | 785 | human-id@1.0.2: {} 786 | 787 | iconv-lite@0.4.24: 788 | dependencies: 789 | safer-buffer: 2.1.2 790 | 791 | ignore@5.3.2: {} 792 | 793 | is-extglob@2.1.1: {} 794 | 795 | is-glob@4.0.3: 796 | dependencies: 797 | is-extglob: 2.1.1 798 | 799 | is-number@7.0.0: {} 800 | 801 | is-subdir@1.2.0: 802 | dependencies: 803 | better-path-resolve: 1.0.0 804 | 805 | is-windows@1.0.2: {} 806 | 807 | isexe@2.0.0: {} 808 | 809 | js-yaml@3.14.1: 810 | dependencies: 811 | argparse: 1.0.10 812 | esprima: 4.0.1 813 | 814 | jsonfile@4.0.0: 815 | optionalDependencies: 816 | graceful-fs: 4.2.11 817 | 818 | locate-path@5.0.0: 819 | dependencies: 820 | p-locate: 4.1.0 821 | 822 | lodash.startcase@4.4.0: {} 823 | 824 | lru-cache@4.1.5: 825 | dependencies: 826 | pseudomap: 1.0.2 827 | yallist: 2.1.2 828 | 829 | merge2@1.4.1: {} 830 | 831 | micromatch@4.0.8: 832 | dependencies: 833 | braces: 3.0.3 834 | picomatch: 2.3.1 835 | 836 | mri@1.2.0: {} 837 | 838 | node-fetch@2.7.0: 839 | dependencies: 840 | whatwg-url: 5.0.0 841 | 842 | os-tmpdir@1.0.2: {} 843 | 844 | outdent@0.5.0: {} 845 | 846 | p-filter@2.1.0: 847 | dependencies: 848 | p-map: 2.1.0 849 | 850 | p-limit@2.3.0: 851 | dependencies: 852 | p-try: 2.2.0 853 | 854 | p-locate@4.1.0: 855 | dependencies: 856 | p-limit: 2.3.0 857 | 858 | p-map@2.1.0: {} 859 | 860 | p-try@2.2.0: {} 861 | 862 | package-manager-detector@0.2.2: {} 863 | 864 | path-exists@4.0.0: {} 865 | 866 | path-type@4.0.0: {} 867 | 868 | picocolors@1.1.1: {} 869 | 870 | picomatch@2.3.1: {} 871 | 872 | pify@4.0.1: {} 873 | 874 | prettier@2.8.8: {} 875 | 876 | pseudomap@1.0.2: {} 877 | 878 | queue-microtask@1.2.3: {} 879 | 880 | read-yaml-file@1.1.0: 881 | dependencies: 882 | graceful-fs: 4.2.11 883 | js-yaml: 3.14.1 884 | pify: 4.0.1 885 | strip-bom: 3.0.0 886 | 887 | regenerator-runtime@0.14.1: {} 888 | 889 | resolve-from@5.0.0: {} 890 | 891 | reusify@1.0.4: {} 892 | 893 | run-parallel@1.2.0: 894 | dependencies: 895 | queue-microtask: 1.2.3 896 | 897 | safer-buffer@2.1.2: {} 898 | 899 | semver@7.6.3: {} 900 | 901 | shebang-command@1.2.0: 902 | dependencies: 903 | shebang-regex: 1.0.0 904 | 905 | shebang-regex@1.0.0: {} 906 | 907 | signal-exit@3.0.7: {} 908 | 909 | slash@3.0.0: {} 910 | 911 | spawndamnit@2.0.0: 912 | dependencies: 913 | cross-spawn: 5.1.0 914 | signal-exit: 3.0.7 915 | 916 | sprintf-js@1.0.3: {} 917 | 918 | strip-ansi@6.0.1: 919 | dependencies: 920 | ansi-regex: 5.0.1 921 | 922 | strip-bom@3.0.0: {} 923 | 924 | term-size@2.2.1: {} 925 | 926 | tmp@0.0.33: 927 | dependencies: 928 | os-tmpdir: 1.0.2 929 | 930 | to-regex-range@5.0.1: 931 | dependencies: 932 | is-number: 7.0.0 933 | 934 | tr46@0.0.3: {} 935 | 936 | universalify@0.1.2: {} 937 | 938 | webidl-conversions@3.0.1: {} 939 | 940 | whatwg-url@5.0.0: 941 | dependencies: 942 | tr46: 0.0.3 943 | webidl-conversions: 3.0.1 944 | 945 | which@1.3.1: 946 | dependencies: 947 | isexe: 2.0.0 948 | 949 | yallist@2.1.2: {} 950 | --------------------------------------------------------------------------------