From e4d3a9c280ad783ac1086f9b2b85090ca36b19d5 Mon Sep 17 00:00:00 2001 From: Farid Ismailov Date: Sun, 19 Apr 2026 21:48:24 +0300 Subject: [PATCH 1/5] feat(desktop): deeplink recording controls + Raycast extension (#1540) --- .../desktop/src-tauri/src/deeplink_actions.rs | 141 +- extensions/cap/.gitignore | 3 + extensions/cap/README.md | 35 + extensions/cap/extension-icon.png | Bin 0 -> 70 bytes extensions/cap/package-lock.json | 3467 +++++++++++++++++ extensions/cap/package.json | 143 + extensions/cap/raycast-env.d.ts | 1 + extensions/cap/src/deeplink.ts | 6 + extensions/cap/src/pause-recording.tsx | 8 + extensions/cap/src/refresh-device-cache.tsx | 8 + extensions/cap/src/resume-recording.tsx | 8 + extensions/cap/src/set-camera.tsx | 24 + extensions/cap/src/set-microphone.tsx | 13 + extensions/cap/src/start-recording.tsx | 77 + extensions/cap/src/stop-recording.tsx | 8 + extensions/cap/src/take-screenshot.tsx | 38 + extensions/cap/src/toggle-pause-recording.tsx | 8 + extensions/cap/tsconfig.json | 17 + 18 files changed, 3987 insertions(+), 18 deletions(-) create mode 100644 extensions/cap/.gitignore create mode 100644 extensions/cap/README.md create mode 100644 extensions/cap/extension-icon.png create mode 100644 extensions/cap/package-lock.json create mode 100644 extensions/cap/package.json create mode 100644 extensions/cap/raycast-env.d.ts create mode 100644 extensions/cap/src/deeplink.ts create mode 100644 extensions/cap/src/pause-recording.tsx create mode 100644 extensions/cap/src/refresh-device-cache.tsx create mode 100644 extensions/cap/src/resume-recording.tsx create mode 100644 extensions/cap/src/set-camera.tsx create mode 100644 extensions/cap/src/set-microphone.tsx create mode 100644 extensions/cap/src/start-recording.tsx create mode 100644 extensions/cap/src/stop-recording.tsx create mode 100644 extensions/cap/src/take-screenshot.tsx create mode 100644 extensions/cap/src/toggle-pause-recording.tsx create mode 100644 extensions/cap/tsconfig.json diff --git a/apps/desktop/src-tauri/src/deeplink_actions.rs b/apps/desktop/src-tauri/src/deeplink_actions.rs index a117028487..84167a74bf 100644 --- a/apps/desktop/src-tauri/src/deeplink_actions.rs +++ b/apps/desktop/src-tauri/src/deeplink_actions.rs @@ -1,12 +1,19 @@ use cap_recording::{ - RecordingMode, feeds::camera::DeviceOrModelID, sources::screen_capture::ScreenCaptureTarget, + RecordingMode, + feeds::{camera::DeviceOrModelID, microphone::MicrophoneFeed}, + sources::screen_capture::ScreenCaptureTarget, }; use serde::{Deserialize, Serialize}; +use serde_json::json; use std::path::{Path, PathBuf}; use tauri::{AppHandle, Manager, Url}; use tracing::trace; -use crate::{App, ArcLock, recording::StartRecordingInputs, windows::ShowCapWindow}; +use crate::{ + recording::StartRecordingInputs, + windows::ShowCapWindow, + App, ArcLock, +}; #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] @@ -26,6 +33,20 @@ pub enum DeepLinkAction { mode: RecordingMode, }, StopRecording, + PauseRecording, + ResumeRecording, + TogglePauseRecording, + TakeScreenshot { + capture_mode: CaptureMode, + }, + SetMicrophone { + mic_label: Option, + }, + SetCamera { + camera: Option, + }, + /// Writes `raycast-device-cache.json` under the app data dir (displays, windows, cameras, mics). + RefreshRaycastDeviceCache, OpenEditor { project_path: PathBuf, }, @@ -88,10 +109,14 @@ impl TryFrom<&Url> for DeepLinkAction { .map_err(|_| ActionParseFromUrlError::Invalid); } - match url.domain() { - Some(v) if v != "action" => Err(ActionParseFromUrlError::NotAction), - _ => Err(ActionParseFromUrlError::Invalid), - }?; + // `cap-desktop://action?value=...` — host must be exactly `action` (see tauri deep-link config). + if url.host_str() != Some("action") { + return Err(if url.host_str().is_some() { + ActionParseFromUrlError::NotAction + } else { + ActionParseFromUrlError::Invalid + }); + } let params = url .query_pairs() @@ -105,6 +130,30 @@ impl TryFrom<&Url> for DeepLinkAction { } } +fn capture_target_from_mode(capture_mode: &CaptureMode) -> Result { + Ok(match capture_mode { + CaptureMode::Screen(name) => cap_recording::screen_capture::list_displays() + .into_iter() + .find(|(s, _)| s.name == *name) + .map(|(s, _)| ScreenCaptureTarget::Display { id: s.id }) + .ok_or_else(|| format!("No screen with name \"{name}\""))?, + CaptureMode::Window(name) => cap_recording::screen_capture::list_windows() + .into_iter() + .find(|(w, _)| w.name == *name) + .map(|(w, _)| ScreenCaptureTarget::Window { id: w.id }) + .ok_or_else(|| format!("No window with name \"{name}\""))?, + }) +} + +fn raycast_device_cache_path(app: &AppHandle) -> Result { + let dir = app + .path() + .app_data_dir() + .map_err(|e| e.to_string())?; + std::fs::create_dir_all(&dir).map_err(|e| e.to_string())?; + Ok(dir.join("raycast-device-cache.json")) +} + impl DeepLinkAction { pub async fn execute(self, app: &AppHandle) -> Result<(), String> { match self { @@ -120,18 +169,7 @@ impl DeepLinkAction { crate::set_camera_input(app.clone(), state.clone(), camera, None).await?; crate::set_mic_input(state.clone(), mic_label).await?; - let capture_target: ScreenCaptureTarget = match capture_mode { - CaptureMode::Screen(name) => cap_recording::screen_capture::list_displays() - .into_iter() - .find(|(s, _)| s.name == name) - .map(|(s, _)| ScreenCaptureTarget::Display { id: s.id }) - .ok_or(format!("No screen with name \"{}\"", &name))?, - CaptureMode::Window(name) => cap_recording::screen_capture::list_windows() - .into_iter() - .find(|(w, _)| w.name == name) - .map(|(w, _)| ScreenCaptureTarget::Window { id: w.id }) - .ok_or(format!("No window with name \"{}\"", &name))?, - }; + let capture_target = capture_target_from_mode(&capture_mode)?; let inputs = StartRecordingInputs { mode, @@ -147,6 +185,73 @@ impl DeepLinkAction { DeepLinkAction::StopRecording => { crate::recording::stop_recording(app.clone(), app.state()).await } + DeepLinkAction::PauseRecording => { + crate::recording::pause_recording(app.clone(), app.state()).await + } + DeepLinkAction::ResumeRecording => { + crate::recording::resume_recording(app.clone(), app.state()).await + } + DeepLinkAction::TogglePauseRecording => { + crate::recording::toggle_pause_recording(app.clone(), app.state()) + .await + } + DeepLinkAction::TakeScreenshot { capture_mode } => { + let target = capture_target_from_mode(&capture_mode)?; + crate::recording::take_screenshot(app.clone(), target).await?; + Ok(()) + } + DeepLinkAction::SetMicrophone { mic_label } => { + let state = app.state::>(); + crate::set_mic_input(state, mic_label).await + } + DeepLinkAction::SetCamera { camera } => { + let state = app.state::>(); + crate::set_camera_input(app.clone(), state, camera, Some(true)).await + } + DeepLinkAction::RefreshRaycastDeviceCache => { + let displays = crate::recording::list_capture_displays().await; + let windows = crate::recording::list_capture_windows().await; + let cameras = crate::recording::list_cameras(); + let microphones = if crate::permissions::do_permissions_check(false) + .microphone + .permitted() + { + MicrophoneFeed::list() + .keys() + .cloned() + .collect::>() + } else { + vec![] + }; + + let cameras_json: Result, String> = cameras + .iter() + .map(|c| { + let id = DeviceOrModelID::from_info(c); + Ok(json!({ + "display_name": c.display_name(), + "device_or_model_id": serde_json::to_value(&id).map_err(|e| e.to_string())?, + })) + }) + .collect(); + let cameras_json = cameras_json?; + + let payload = json!({ + "generated_at": chrono::Utc::now().to_rfc3339(), + "displays": displays, + "windows": windows, + "cameras": cameras_json, + "microphones": microphones, + }); + + let path = raycast_device_cache_path(app)?; + std::fs::write( + &path, + serde_json::to_string_pretty(&payload).map_err(|e| e.to_string())?, + ) + .map_err(|e| e.to_string())?; + Ok(()) + } DeepLinkAction::OpenEditor { project_path } => { crate::open_project_from_path(Path::new(&project_path), app.clone()) } diff --git a/extensions/cap/.gitignore b/extensions/cap/.gitignore new file mode 100644 index 0000000000..3bdd52eb2e --- /dev/null +++ b/extensions/cap/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +dist/ +.DS_Store diff --git a/extensions/cap/README.md b/extensions/cap/README.md new file mode 100644 index 0000000000..fd138fa8ae --- /dev/null +++ b/extensions/cap/README.md @@ -0,0 +1,35 @@ +# Cap Raycast extension (local) + +Companion to desktop deeplinks (`cap-desktop://action?value=…`) implemented in `apps/desktop/src-tauri/src/deeplink_actions.rs`. + +## Prereqs + +- macOS with [Raycast](https://www.raycast.com/) (extensions target macOS). +- Cap desktop running (dev or prod) so `cap-desktop://` is registered. + +## Install (dev) + +```bash +cd extensions/cap +npm install +npm run dev +``` + +Pick the extension in Raycast, then run **Refresh Device Cache** once Cap is open so `raycast-device-cache.json` is written under Cap’s app data directory (`so.cap.desktop` or `so.cap.desktop.dev` on macOS). + +## Commands + +| Command | Deeplink payload | +|--------|-------------------| +| Start Recording | `start_recording` — `capture_mode` `{ "screen": "…" }` / `{ "window": "…" }`, `mode` `studio` \| `instant`, optional `mic_label`, `camera`, `capture_system_audio` | +| Stop / Pause / Resume / Toggle pause | `stop_recording`, `pause_recording`, `resume_recording`, `toggle_pause_recording` | +| Refresh Device Cache | `refresh_raycast_device_cache` | +| Take Screenshot | `take_screenshot` with `capture_mode` `screen` / `window` (CLI format `screen:Display Name`) | +| Set Microphone | `set_microphone.mic_label` (string or null) | +| Set Camera | `set_camera.camera` = JSON of `device_or_model_id` from cache | + +Desktop parsing for `cap-desktop://action?...` now checks `host_str() == "action"` so action URLs are not rejected as invalid. + +## Bounty PR + +Comment `/attempt #1540` on the issue, then open a PR against `CapSoftware/Cap` with `/claim #1540` in the body and a short demo video per Algora rules. diff --git a/extensions/cap/extension-icon.png b/extensions/cap/extension-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f37764b1f7606623616dcdc169cc858273ea2d94 GIT binary patch literal 70 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}1TpU9xZYBRYe;|OLfu)tPp=D){ QB2a?C)78&qol`;+0Lr!y6951J literal 0 HcmV?d00001 diff --git a/extensions/cap/package-lock.json b/extensions/cap/package-lock.json new file mode 100644 index 0000000000..9ce848282d --- /dev/null +++ b/extensions/cap/package-lock.json @@ -0,0 +1,3467 @@ +{ + "name": "cap", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cap", + "license": "MIT", + "dependencies": { + "@raycast/api": "^1.83.1" + }, + "devDependencies": { + "@raycast/eslint-config": "^1.0.11", + "typescript": "^5.4.5" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.21", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", + "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.10.1.tgz", + "integrity": "sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==", + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.3.2", + "@inquirer/confirm": "^5.1.21", + "@inquirer/editor": "^4.2.23", + "@inquirer/expand": "^4.0.23", + "@inquirer/input": "^4.3.1", + "@inquirer/number": "^3.0.23", + "@inquirer/password": "^4.0.23", + "@inquirer/rawlist": "^4.1.11", + "@inquirer/search": "^3.2.2", + "@inquirer/select": "^4.4.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oclif/core": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.10.5.tgz", + "integrity": "sha512-qcdCF7NrdWPfme6Kr34wwljRCXbCVpL1WVxiNy0Ep6vbWKjxAjFQwuhqkoyL0yjI+KdwtLcOCGn5z2yzdijc8w==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "ansis": "^3.17.0", + "clean-stack": "^3.0.1", + "cli-spinners": "^2.9.2", + "debug": "^4.4.3", + "ejs": "^3.1.10", + "get-package-type": "^0.1.0", + "indent-string": "^4.0.0", + "is-wsl": "^2.2.0", + "lilconfig": "^3.1.3", + "minimatch": "^10.2.5", + "semver": "^7.7.3", + "string-width": "^4.2.3", + "supports-color": "^8", + "tinyglobby": "^0.2.14", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-autocomplete": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.45.tgz", + "integrity": "sha512-ENrUg8rbVCjh40uvi3MC9kGbiUoEf11nyqE59RBzegeeLpRXNo/Zp27L9j1tUmPEqGgfS2/wvHPihNzkpK1FDw==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4", + "ansis": "^3.16.0", + "debug": "^4.4.1", + "ejs": "^3.1.10" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-help": { + "version": "6.2.44", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.44.tgz", + "integrity": "sha512-x03Se2LtlOOlGfTuuubt5C4Z8NHeR4zKXtVnfycuLU+2VOMu2WpsGy9nbs3nYuInuvsIY1BizjVaTjUz060Sig==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-not-found": { + "version": "3.2.80", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.80.tgz", + "integrity": "sha512-yTLjWvR1r/Rd/cO2LxHdMCDoL5sQhBYRUcOMCmxZtWVWhx4rAZ8KVUPDVsb+SvjJDV5ADTDBgt1H52fFx7YWqg==", + "license": "MIT", + "dependencies": { + "@inquirer/prompts": "^7.10.1", + "@oclif/core": "^4.10.5", + "ansis": "^3.17.0", + "fast-levenshtein": "^3.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@raycast/api": { + "version": "1.104.12", + "resolved": "https://registry.npmjs.org/@raycast/api/-/api-1.104.12.tgz", + "integrity": "sha512-DdrtoksnzLw4q60BgFr/H+PIvIObOfJrW15duTFH7QXVx/0Vxzw9fY7wo+H2gQ2JDDAh9sEMCpc5akP3UxKjTw==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4.8.4", + "@oclif/plugin-autocomplete": "^3.2.40", + "@oclif/plugin-help": "^6.2.37", + "@oclif/plugin-not-found": "^3.2.74", + "@types/node": "22.13.10", + "@types/react": "19.0.10", + "esbuild": "^0.27.3", + "react": "19.0.0" + }, + "bin": { + "ray": "bin/run.js" + }, + "engines": { + "node": ">=22.14.0" + }, + "peerDependencies": { + "@types/node": "22.13.10", + "@types/react": "19.0.10", + "react-devtools": "6.1.1" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "react-devtools": { + "optional": true + } + } + }, + "node_modules/@raycast/eslint-config": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@raycast/eslint-config/-/eslint-config-1.0.11.tgz", + "integrity": "sha512-I0Lt8bwahVGkANUBxripIxKptMBz1Ou+UXGwfqgFvKwo1gVLrnlEngxaspQJA8L5pvzQkQMwizVCSgNC3bddWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@raycast/eslint-plugin": "^1.0.11", + "@rushstack/eslint-patch": "^1.10.4", + "@typescript-eslint/eslint-plugin": "^6.8.0", + "@typescript-eslint/parser": "^6.8.0", + "eslint-config-prettier": "^9.1.0" + }, + "peerDependencies": { + "eslint": ">=7", + "prettier": ">=2", + "typescript": ">=4" + } + }, + "node_modules/@raycast/eslint-plugin": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@raycast/eslint-plugin/-/eslint-plugin-1.0.16.tgz", + "integrity": "sha512-OyFL/W75/4hlgdUUI80Eoes0HjpVrJ8I1kB/PBH2RLjbcK22TC6IwZPXvhBZ5jF962O1TqtOuHrTjySwDaa/cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.62.0" + }, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.16.1.tgz", + "integrity": "sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "license": "MIT", + "peer": true, + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/react": { + "version": "19.0.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", + "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chardet": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz", + "integrity": "sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", + "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "license": "MIT", + "dependencies": { + "fastest-levenshtein": "^1.0.7" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/optionator/node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/extensions/cap/package.json b/extensions/cap/package.json new file mode 100644 index 0000000000..bdc70e0b3b --- /dev/null +++ b/extensions/cap/package.json @@ -0,0 +1,143 @@ +{ + "$schema": "https://www.raycast.com/schemas/extension.json", + "name": "cap", + "title": "Cap", + "description": "Control Cap (cap.so) via cap-desktop:// deeplinks", + "icon": "extension-icon.png", + "author": "Leviann", + "categories": ["Productivity"], + "license": "MIT", + "commands": [ + { + "name": "stop-recording", + "title": "Stop Recording", + "subtitle": "Cap", + "description": "Stop the current Cap recording", + "mode": "no-view" + }, + { + "name": "pause-recording", + "title": "Pause Recording", + "subtitle": "Cap", + "description": "Pause the current Cap recording", + "mode": "no-view" + }, + { + "name": "resume-recording", + "title": "Resume Recording", + "subtitle": "Cap", + "description": "Resume a paused Cap recording", + "mode": "no-view" + }, + { + "name": "toggle-pause-recording", + "title": "Toggle Pause Recording", + "subtitle": "Cap", + "description": "Pause or resume the current Cap recording", + "mode": "no-view" + }, + { + "name": "refresh-device-cache", + "title": "Refresh Device Cache", + "subtitle": "Cap", + "description": "Writes raycast-device-cache.json (displays, windows, cameras, mics)", + "mode": "no-view" + }, + { + "name": "start-recording", + "title": "Start Recording", + "subtitle": "Cap", + "description": "Start Cap recording (screen:name or window:name; mode studio|instant)", + "mode": "no-view", + "arguments": [ + { + "name": "target", + "placeholder": "screen:Built-in Retina Display", + "type": "text", + "required": true + }, + { + "name": "mode", + "placeholder": "studio or instant", + "type": "text", + "required": true + }, + { + "name": "captureSystemAudio", + "placeholder": "true or false", + "type": "text", + "required": false + }, + { + "name": "micLabel", + "placeholder": "optional mic label", + "type": "text", + "required": false + }, + { + "name": "cameraJson", + "placeholder": "optional camera JSON (device_or_model_id)", + "type": "text", + "required": false + } + ] + }, + { + "name": "take-screenshot", + "title": "Take Screenshot", + "subtitle": "Cap", + "description": "Format: screen:Display Name or window:Window Name (see Refresh Device Cache)", + "mode": "no-view", + "arguments": [ + { + "name": "target", + "placeholder": "screen:Built-in Retina Display", + "type": "text", + "required": true + } + ] + }, + { + "name": "set-microphone", + "title": "Set Microphone", + "subtitle": "Cap", + "description": "Switch microphone by label (see device cache). Leave empty to clear.", + "mode": "no-view", + "arguments": [ + { + "name": "micLabel", + "placeholder": "Microphone label", + "type": "text", + "required": false + } + ] + }, + { + "name": "set-camera", + "title": "Set Camera", + "subtitle": "Cap", + "description": "Paste device_or_model_id JSON from cache, or leave empty to disable camera", + "mode": "no-view", + "arguments": [ + { + "name": "cameraJson", + "placeholder": "{\"device_id\":\"...\"}", + "type": "text", + "required": false + } + ] + } + ], + "dependencies": { + "@raycast/api": "^1.83.1" + }, + "devDependencies": { + "@raycast/eslint-config": "^1.0.11", + "typescript": "^5.4.5" + }, + "scripts": { + "build": "ray build -e dist", + "dev": "ray develop", + "lint": "ray lint" + } +} diff --git a/extensions/cap/raycast-env.d.ts b/extensions/cap/raycast-env.d.ts new file mode 100644 index 0000000000..6fef6a1d23 --- /dev/null +++ b/extensions/cap/raycast-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/extensions/cap/src/deeplink.ts b/extensions/cap/src/deeplink.ts new file mode 100644 index 0000000000..1ea4d0aa56 --- /dev/null +++ b/extensions/cap/src/deeplink.ts @@ -0,0 +1,6 @@ +import { open } from "@raycast/api"; + +export async function runCapDeeplink(body: Record): Promise { + const value = encodeURIComponent(JSON.stringify(body)); + await open(`cap-desktop://action?value=${value}`); +} diff --git a/extensions/cap/src/pause-recording.tsx b/extensions/cap/src/pause-recording.tsx new file mode 100644 index 0000000000..42952d8fa8 --- /dev/null +++ b/extensions/cap/src/pause-recording.tsx @@ -0,0 +1,8 @@ +import { closeMainWindow, showHUD } from "@raycast/api"; +import { runCapDeeplink } from "./deeplink"; + +export default async function main() { + await runCapDeeplink({ pause_recording: null }); + await showHUD("Cap: pause recording"); + await closeMainWindow(); +} diff --git a/extensions/cap/src/refresh-device-cache.tsx b/extensions/cap/src/refresh-device-cache.tsx new file mode 100644 index 0000000000..2408337bce --- /dev/null +++ b/extensions/cap/src/refresh-device-cache.tsx @@ -0,0 +1,8 @@ +import { closeMainWindow, showHUD } from "@raycast/api"; +import { runCapDeeplink } from "./deeplink"; + +export default async function main() { + await runCapDeeplink({ refresh_raycast_device_cache: null }); + await showHUD("Cap: device cache refresh sent"); + await closeMainWindow(); +} diff --git a/extensions/cap/src/resume-recording.tsx b/extensions/cap/src/resume-recording.tsx new file mode 100644 index 0000000000..17cb0c1668 --- /dev/null +++ b/extensions/cap/src/resume-recording.tsx @@ -0,0 +1,8 @@ +import { closeMainWindow, showHUD } from "@raycast/api"; +import { runCapDeeplink } from "./deeplink"; + +export default async function main() { + await runCapDeeplink({ resume_recording: null }); + await showHUD("Cap: resume recording"); + await closeMainWindow(); +} diff --git a/extensions/cap/src/set-camera.tsx b/extensions/cap/src/set-camera.tsx new file mode 100644 index 0000000000..b399bb123d --- /dev/null +++ b/extensions/cap/src/set-camera.tsx @@ -0,0 +1,24 @@ +import { LaunchProps, closeMainWindow, showHUD, showToast, Toast } from "@raycast/api"; +import { runCapDeeplink } from "./deeplink"; + +type Args = { arguments: { cameraJson: string } }; + +export default async function main(props: LaunchProps) { + const raw = props.arguments.cameraJson?.trim() ?? ""; + let camera: unknown = null; + if (raw.length > 0) { + try { + camera = JSON.parse(raw) as unknown; + } catch { + await showToast({ + style: Toast.Style.Failure, + title: "Invalid JSON", + message: "Paste device_or_model_id from raycast-device-cache.json", + }); + return; + } + } + await runCapDeeplink({ set_camera: { camera } }); + await showHUD("Cap: set camera"); + await closeMainWindow(); +} diff --git a/extensions/cap/src/set-microphone.tsx b/extensions/cap/src/set-microphone.tsx new file mode 100644 index 0000000000..9a9191e4d4 --- /dev/null +++ b/extensions/cap/src/set-microphone.tsx @@ -0,0 +1,13 @@ +import { LaunchProps, closeMainWindow, showHUD } from "@raycast/api"; +import { runCapDeeplink } from "./deeplink"; + +type Args = { arguments: { micLabel: string } }; + +export default async function main(props: LaunchProps) { + const label = props.arguments.micLabel?.trim(); + await runCapDeeplink({ + set_microphone: { mic_label: label ? label : null }, + }); + await showHUD("Cap: set microphone"); + await closeMainWindow(); +} diff --git a/extensions/cap/src/start-recording.tsx b/extensions/cap/src/start-recording.tsx new file mode 100644 index 0000000000..9a10182c76 --- /dev/null +++ b/extensions/cap/src/start-recording.tsx @@ -0,0 +1,77 @@ +import { LaunchProps, closeMainWindow, showHUD, showToast, Toast } from "@raycast/api"; +import { runCapDeeplink } from "./deeplink"; + +type Args = { + arguments: { + target: string; + mode: string; + captureSystemAudio: string; + micLabel: string; + cameraJson: string; + }; +}; + +function parseCaptureMode(raw: string): { screen?: string; window?: string } | null { + const t = raw.trim(); + const i = t.indexOf(":"); + if (i <= 0) return null; + const k = t.slice(0, i).toLowerCase(); + const name = t.slice(i + 1).trim(); + if (!name) return null; + if (k === "screen") return { screen: name }; + if (k === "window") return { window: name }; + return null; +} + +function parseMode(m: string): "studio" | "instant" | null { + const v = m.trim().toLowerCase(); + if (v === "studio" || v === "instant") return v; + return null; +} + +function parseBool(s: string): boolean { + const v = s.trim().toLowerCase(); + return v === "1" || v === "true" || v === "yes" || v === "on"; +} + +export default async function main(props: LaunchProps) { + const capture_mode = parseCaptureMode(props.arguments.target); + if (!capture_mode) { + await showToast({ + style: Toast.Style.Failure, + title: "target must be screen:Name or window:Name", + }); + return; + } + const mode = parseMode(props.arguments.mode); + if (!mode) { + await showToast({ + style: Toast.Style.Failure, + title: 'mode must be "studio" or "instant"', + }); + return; + } + const mic = props.arguments.micLabel?.trim(); + const camRaw = props.arguments.cameraJson?.trim(); + let camera: unknown = null; + if (camRaw) { + try { + camera = JSON.parse(camRaw) as unknown; + } catch { + await showToast({ style: Toast.Style.Failure, title: "cameraJson is not valid JSON" }); + return; + } + } + const capture_system_audio = parseBool(props.arguments.captureSystemAudio ?? "false"); + await runCapDeeplink({ + start_recording: { + capture_mode, + camera, + mic_label: mic ? mic : null, + capture_system_audio, + mode, + }, + }); + await showHUD("Cap: start recording"); + await closeMainWindow(); +} diff --git a/extensions/cap/src/stop-recording.tsx b/extensions/cap/src/stop-recording.tsx new file mode 100644 index 0000000000..8c13bf64a3 --- /dev/null +++ b/extensions/cap/src/stop-recording.tsx @@ -0,0 +1,8 @@ +import { closeMainWindow, showHUD } from "@raycast/api"; +import { runCapDeeplink } from "./deeplink"; + +export default async function main() { + await runCapDeeplink({ stop_recording: null }); + await showHUD("Cap: stop recording"); + await closeMainWindow(); +} diff --git a/extensions/cap/src/take-screenshot.tsx b/extensions/cap/src/take-screenshot.tsx new file mode 100644 index 0000000000..ebd2ac953d --- /dev/null +++ b/extensions/cap/src/take-screenshot.tsx @@ -0,0 +1,38 @@ +import { LaunchProps, closeMainWindow, showHUD, showToast, Toast } from "@raycast/api"; +import { runCapDeeplink } from "./deeplink"; + +type Args = { arguments: { target: string } }; + +export default async function main(props: LaunchProps) { + const raw = props.arguments.target.trim(); + const idx = raw.indexOf(":"); + if (idx <= 0) { + await showToast({ + style: Toast.Style.Failure, + title: "Use screen:Name or window:Name", + }); + return; + } + const kind = raw.slice(0, idx).toLowerCase(); + const name = raw.slice(idx + 1).trim(); + if (!name) { + await showToast({ style: Toast.Style.Failure, title: "Missing display/window name" }); + return; + } + const capture_mode = + kind === "window" + ? { window: name } + : kind === "screen" + ? { screen: name } + : null; + if (!capture_mode) { + await showToast({ + style: Toast.Style.Failure, + title: "Prefix must be screen: or window:", + }); + return; + } + await runCapDeeplink({ take_screenshot: { capture_mode } }); + await showHUD("Cap: screenshot"); + await closeMainWindow(); +} diff --git a/extensions/cap/src/toggle-pause-recording.tsx b/extensions/cap/src/toggle-pause-recording.tsx new file mode 100644 index 0000000000..72c70438c1 --- /dev/null +++ b/extensions/cap/src/toggle-pause-recording.tsx @@ -0,0 +1,8 @@ +import { closeMainWindow, showHUD } from "@raycast/api"; +import { runCapDeeplink } from "./deeplink"; + +export default async function main() { + await runCapDeeplink({ toggle_pause_recording: null }); + await showHUD("Cap: toggle pause"); + await closeMainWindow(); +} diff --git a/extensions/cap/tsconfig.json b/extensions/cap/tsconfig.json new file mode 100644 index 0000000000..96307822a3 --- /dev/null +++ b/extensions/cap/tsconfig.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "lib": ["ES2023"], + "module": "commonjs", + "target": "ES2023", + "strict": true, + "jsx": "react-jsx", + "isolatedModules": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "noEmit": true + }, + "include": ["src/**/*", "raycast-env.d.ts"] +} From 781f125d91d636a3467440dc8bf81203df6b450a Mon Sep 17 00:00:00 2001 From: Farid Ismailov Date: Sun, 19 Apr 2026 21:57:00 +0300 Subject: [PATCH 2/5] fix: async fs for raycast cache + handle deeplink open errors --- apps/desktop/src-tauri/src/deeplink_actions.rs | 15 +++++++++------ extensions/cap/src/deeplink.ts | 15 +++++++++++++-- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/apps/desktop/src-tauri/src/deeplink_actions.rs b/apps/desktop/src-tauri/src/deeplink_actions.rs index 84167a74bf..b0d48bf248 100644 --- a/apps/desktop/src-tauri/src/deeplink_actions.rs +++ b/apps/desktop/src-tauri/src/deeplink_actions.rs @@ -150,7 +150,6 @@ fn raycast_device_cache_path(app: &AppHandle) -> Result { .path() .app_data_dir() .map_err(|e| e.to_string())?; - std::fs::create_dir_all(&dir).map_err(|e| e.to_string())?; Ok(dir.join("raycast-device-cache.json")) } @@ -245,11 +244,15 @@ impl DeepLinkAction { }); let path = raycast_device_cache_path(app)?; - std::fs::write( - &path, - serde_json::to_string_pretty(&payload).map_err(|e| e.to_string())?, - ) - .map_err(|e| e.to_string())?; + if let Some(parent) = path.parent() { + tokio::fs::create_dir_all(parent) + .await + .map_err(|e| e.to_string())?; + } + let json = serde_json::to_string_pretty(&payload).map_err(|e| e.to_string())?; + tokio::fs::write(&path, json.as_bytes()) + .await + .map_err(|e| e.to_string())?; Ok(()) } DeepLinkAction::OpenEditor { project_path } => { diff --git a/extensions/cap/src/deeplink.ts b/extensions/cap/src/deeplink.ts index 1ea4d0aa56..1b1a99a74d 100644 --- a/extensions/cap/src/deeplink.ts +++ b/extensions/cap/src/deeplink.ts @@ -1,6 +1,17 @@ -import { open } from "@raycast/api"; +import { Toast, open, showToast } from "@raycast/api"; export async function runCapDeeplink(body: Record): Promise { const value = encodeURIComponent(JSON.stringify(body)); - await open(`cap-desktop://action?value=${value}`); + const url = `cap-desktop://action?value=${value}`; + try { + await open(url); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + await showToast({ + style: Toast.Style.Failure, + title: "Cap deeplink failed", + message: message.length > 0 ? message : "Could not open cap-desktop URL. Is Cap installed?", + }); + throw error; + } } From 0d85678caf28bb0970b63566985719d7b6922681 Mon Sep 17 00:00:00 2001 From: Farid Ismailov Date: Sun, 19 Apr 2026 22:04:27 +0300 Subject: [PATCH 3/5] fix(raycast): validate captureSystemAudio; doc async fs for device cache --- .../desktop/src-tauri/src/deeplink_actions.rs | 1 + extensions/cap/src/start-recording.tsx | 22 +++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/apps/desktop/src-tauri/src/deeplink_actions.rs b/apps/desktop/src-tauri/src/deeplink_actions.rs index b0d48bf248..68bb247ef7 100644 --- a/apps/desktop/src-tauri/src/deeplink_actions.rs +++ b/apps/desktop/src-tauri/src/deeplink_actions.rs @@ -244,6 +244,7 @@ impl DeepLinkAction { }); let path = raycast_device_cache_path(app)?; + // Async fs only: `execute` runs on Tokio; `std::fs` would block a worker thread. if let Some(parent) = path.parent() { tokio::fs::create_dir_all(parent) .await diff --git a/extensions/cap/src/start-recording.tsx b/extensions/cap/src/start-recording.tsx index 9a10182c76..5bc0dd5e79 100644 --- a/extensions/cap/src/start-recording.tsx +++ b/extensions/cap/src/start-recording.tsx @@ -29,9 +29,14 @@ function parseMode(m: string): "studio" | "instant" | null { return null; } -function parseBool(s: string): boolean { - const v = s.trim().toLowerCase(); - return v === "1" || v === "true" || v === "yes" || v === "on"; +/** Empty → false (default). Recognized truthy/falsy only; garbage → error. */ +function parseCaptureSystemAudio(raw: string | undefined): { ok: true; value: boolean } | { ok: false } { + const s = (raw ?? "").trim(); + if (s.length === 0) return { ok: true, value: false }; + const v = s.toLowerCase(); + if (v === "1" || v === "true" || v === "yes" || v === "on") return { ok: true, value: true }; + if (v === "0" || v === "false" || v === "no" || v === "off") return { ok: true, value: false }; + return { ok: false }; } export default async function main(props: LaunchProps) { @@ -62,7 +67,16 @@ export default async function main(props: LaunchProps) { return; } } - const capture_system_audio = parseBool(props.arguments.captureSystemAudio ?? "false"); + const sysAudio = parseCaptureSystemAudio(props.arguments.captureSystemAudio); + if (!sysAudio.ok) { + await showToast({ + style: Toast.Style.Failure, + title: "Invalid captureSystemAudio", + message: `Got "${props.arguments.captureSystemAudio ?? ""}". Use true/false, yes/no, on/off, or 1/0 (empty = false).`, + }); + return; + } + const capture_system_audio = sysAudio.value; await runCapDeeplink({ start_recording: { capture_mode, From 35ad9f5aa17ce0608fa2deab6d2e5c0787fb69ba Mon Sep 17 00:00:00 2001 From: Farid Ismailov Date: Sun, 19 Apr 2026 22:26:00 +0300 Subject: [PATCH 4/5] fix(windows): action deeplink path fallback + start protocol URL from Raycast --- apps/desktop/src-tauri/src/deeplink_actions.rs | 15 +++++++++++++-- extensions/cap/README.md | 6 +++++- extensions/cap/src/deeplink.ts | 15 ++++++++++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/apps/desktop/src-tauri/src/deeplink_actions.rs b/apps/desktop/src-tauri/src/deeplink_actions.rs index 68bb247ef7..3254a45c19 100644 --- a/apps/desktop/src-tauri/src/deeplink_actions.rs +++ b/apps/desktop/src-tauri/src/deeplink_actions.rs @@ -97,6 +97,18 @@ pub enum ActionParseFromUrlError { NotAction, } +fn is_action_deeplink_host(url: &Url) -> bool { + // Canonical (macOS / most): `cap-desktop://action?value=...` + if url.host_str() == Some("action") { + return true; + } + // Windows / some handlers: `cap-desktop:/action?value=...` — empty host, path `/action` + if url.host_str().is_none() && url.path() == "/action" { + return true; + } + false +} + impl TryFrom<&Url> for DeepLinkAction { type Error = ActionParseFromUrlError; @@ -109,8 +121,7 @@ impl TryFrom<&Url> for DeepLinkAction { .map_err(|_| ActionParseFromUrlError::Invalid); } - // `cap-desktop://action?value=...` — host must be exactly `action` (see tauri deep-link config). - if url.host_str() != Some("action") { + if !is_action_deeplink_host(url) { return Err(if url.host_str().is_some() { ActionParseFromUrlError::NotAction } else { diff --git a/extensions/cap/README.md b/extensions/cap/README.md index fd138fa8ae..14d7934659 100644 --- a/extensions/cap/README.md +++ b/extensions/cap/README.md @@ -28,7 +28,11 @@ Pick the extension in Raycast, then run **Refresh Device Cache** once Cap is ope | Set Microphone | `set_microphone.mic_label` (string or null) | | Set Camera | `set_camera.camera` = JSON of `device_or_model_id` from cache | -Desktop parsing for `cap-desktop://action?...` now checks `host_str() == "action"` so action URLs are not rejected as invalid. +Desktop parsing accepts both `cap-desktop://action?...` (host `action`) and **`cap-desktop:/action?...`** (empty host, path `/action`) — the second shape shows up from some Windows launchers. + +On **Windows**, Raycast uses `cmd /c start "" ` so the registered `cap-desktop` handler gets the same ShellExecute path as Explorer. + +**If the cache file stays empty:** Cap must be **installed** (URL scheme is registered by the installer), running, and check both `%AppData%\so.cap.desktop` and `%AppData%\so.cap.desktop.dev` if you mix prod vs dev builds. ## Bounty PR diff --git a/extensions/cap/src/deeplink.ts b/extensions/cap/src/deeplink.ts index 1b1a99a74d..5470c7ba14 100644 --- a/extensions/cap/src/deeplink.ts +++ b/extensions/cap/src/deeplink.ts @@ -1,10 +1,23 @@ import { Toast, open, showToast } from "@raycast/api"; +import { execFile } from "node:child_process"; +import { promisify } from "node:util"; + +const execFileAsync = promisify(execFile); + +/** Windows: `open()` can fail to hand off custom protocols; `start` uses ShellExecute like Explorer. */ +async function openCustomProtocolUrl(url: string): Promise { + if (process.platform === "win32") { + await execFileAsync("cmd.exe", ["/c", "start", "", url], { windowsHide: true }); + return; + } + await open(url); +} export async function runCapDeeplink(body: Record): Promise { const value = encodeURIComponent(JSON.stringify(body)); const url = `cap-desktop://action?value=${value}`; try { - await open(url); + await openCustomProtocolUrl(url); } catch (error) { const message = error instanceof Error ? error.message : String(error); await showToast({ From 0ac957c7b2a8c368c955afd225da96de8574b79c Mon Sep 17 00:00:00 2001 From: Farid Ismailov Date: Sun, 19 Apr 2026 22:56:18 +0300 Subject: [PATCH 5/5] fix(windows): rundll32 for cap-desktop URLs, Raycast assets+paths, deeplink parse logging - Use rundll32 url.dll,FileProtocolHandler on Windows (cmd start mangles % in query)\n- Move extension icon to assets/ (512px from app icon); README note\n- Refresh command toast with dev vs prod cache paths\n- Log parse/execute failures with tracing::warn for cap-desktop.log --- .../desktop/src-tauri/src/deeplink_actions.rs | 9 +++--- extensions/cap/README.md | 2 +- extensions/cap/assets/extension-icon.png | Bin 0 -> 60249 bytes extensions/cap/extension-icon.png | Bin 70 -> 0 bytes extensions/cap/src/deeplink.ts | 9 ++++-- extensions/cap/src/refresh-device-cache.tsx | 27 ++++++++++++++++-- 6 files changed, 38 insertions(+), 9 deletions(-) create mode 100644 extensions/cap/assets/extension-icon.png delete mode 100644 extensions/cap/extension-icon.png diff --git a/apps/desktop/src-tauri/src/deeplink_actions.rs b/apps/desktop/src-tauri/src/deeplink_actions.rs index 3254a45c19..dd44c86791 100644 --- a/apps/desktop/src-tauri/src/deeplink_actions.rs +++ b/apps/desktop/src-tauri/src/deeplink_actions.rs @@ -7,7 +7,7 @@ use serde::{Deserialize, Serialize}; use serde_json::json; use std::path::{Path, PathBuf}; use tauri::{AppHandle, Manager, Url}; -use tracing::trace; +use tracing::{info, trace, warn}; use crate::{ recording::StartRecordingInputs, @@ -65,10 +65,10 @@ pub fn handle(app_handle: &AppHandle, urls: Vec) { DeepLinkAction::try_from(&url) .map_err(|e| match e { ActionParseFromUrlError::ParseFailed(msg) => { - eprintln!("Failed to parse deep link \"{}\": {}", &url, msg) + warn!(%url, %msg, "failed to parse cap-desktop action deeplink (unknown fields / old app?)"); } ActionParseFromUrlError::Invalid => { - eprintln!("Invalid deep link format \"{}\"", &url) + warn!(%url, "invalid cap-desktop action deeplink (missing value= or bad host/path)"); } // Likely login action, not handled here. ActionParseFromUrlError::NotAction => {} @@ -85,7 +85,7 @@ pub fn handle(app_handle: &AppHandle, urls: Vec) { tauri::async_runtime::spawn(async move { for action in actions { if let Err(e) = action.execute(&app_handle).await { - eprintln!("Failed to handle deep link action: {e}"); + warn!(error = %e, "failed to execute cap-desktop deeplink action"); } } }); @@ -265,6 +265,7 @@ impl DeepLinkAction { tokio::fs::write(&path, json.as_bytes()) .await .map_err(|e| e.to_string())?; + info!(path = %path.display(), "wrote Raycast device cache"); Ok(()) } DeepLinkAction::OpenEditor { project_path } => { diff --git a/extensions/cap/README.md b/extensions/cap/README.md index 14d7934659..b2271fa177 100644 --- a/extensions/cap/README.md +++ b/extensions/cap/README.md @@ -30,7 +30,7 @@ Pick the extension in Raycast, then run **Refresh Device Cache** once Cap is ope Desktop parsing accepts both `cap-desktop://action?...` (host `action`) and **`cap-desktop:/action?...`** (empty host, path `/action`) — the second shape shows up from some Windows launchers. -On **Windows**, Raycast uses `cmd /c start "" ` so the registered `cap-desktop` handler gets the same ShellExecute path as Explorer. +On **Windows**, Raycast opens URLs via `rundll32 url.dll,FileProtocolHandler` (not `cmd /c start`, which corrupts `%`-encoded query strings). **If the cache file stays empty:** Cap must be **installed** (URL scheme is registered by the installer), running, and check both `%AppData%\so.cap.desktop` and `%AppData%\so.cap.desktop.dev` if you mix prod vs dev builds. diff --git a/extensions/cap/assets/extension-icon.png b/extensions/cap/assets/extension-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fbf9fc2f0a0773e3e24234e312d149d000899d45 GIT binary patch literal 60249 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

uKZ_Rj;^G0 zRMIcstPOOoL8!;Vc z8}~ap)@%JkHV5E|pf)!jHob#nhBLABIf?`_Pf&P(82b z_xDTFACr3p=l-%ULVVH1o`l7tLjt;A)Mk)p(uY|zyo^!4MpGl6*V zXUU}IXr6;Fwsfzk{4}2!p9^1e{6zhz;Df2`^6XeZL5=b$Mu{CbVZuR2D|Qg!hml(| zAJuO6bhj|_w=GQnimKWF`7yP`cE6n6GQ-V=s#L2n#{z$pLT-?bcWhsk3a7MMT(zx0 z;Elp}rKP0@NIW>|aEvnuIIG7FAtLaUJ#y(j37S9s{GBvDWR=*^pWN7MVT@hHTWe z>&Z`+#iGu?Cvqh2*V}u(KiM3y(0+)iP&v+Inu)gK`ygdi@G}TLUgu7TzD%tEFi|4ZNmVfV%e>IlG8^l>N=JS1G6yrznFwC#; zM(nRA10Ip6q?TBh=MGmSwgr?>mgo#9x_+C+t~JJY*tjPcR`A1~j$08wHOh#D z*X_EV1t_GG_Q`%j_`D{3=RkMi+G)Emp3bu1s7-4jAGd33(7Ko|T*GVm*feOT|8Lno zoPZDaWTCmULgx3nybx2?#N^f0RW||!mOr7h=WGZtgrKUltbxwXPE7>@m&B0@m{JL@ zsBSR=^^Scg%rP_?7dq5ono()hy!jf$$xa5;Jc!d6DA-yRBo12nq}O4}l8fi;FM_nI z$CMbi>KW3?;e?(JSj> zl-_0ft|NkYSaWMj6~E;*wV8vS{doKh$>ozjzcL6Hf5NRiYX}5f;D@9f?-dP_O>1@+ z8WC!|G{)@Gx|*VReZ_R)J>#;dP@lPKKVH2KDuhraay$jlV2SUD8&;jZcxlm3#Fd{X zjB}p-hMMJWPPrSj4yU(NxspFa$Jq{DeZ<=_n;BqXPqQ)KZtse!(UxlUSmUm)uQ8C7 zjN{^T;S8B?PX3UNz>k6$=;`GSs#2!*(K68G$5aiiaWZ}-VTVq%n3IC;>o`!22YsfKK&V3TE#(vX@e`IFj*uOOh zF^=^`Mn=x;?Cd~)|K`-vfCRY#e8-c0eqtj(hmyBdK$AWG_{ zh$rwU;U5|(khUxKy%H}J%*UZIy@|GTak;n}9v;@9PcA@)4dAJZBzoO#hHHBX%~*r7 zgUyEGCfqzcfS?=79v>eGTbc@RQxK+EA=0z5#&DUtynE4^z9dN>~#o=+LIM< zA;hA%_%l#f@HQQ24xU3q#P`ne z^~N#2{pI0E`+yBSq%R!n{Vy9E8D>)f{TrQ18McYnnX~`F;KJL$i`6944n@Ig#ir|Ab3pNk$Z6UK8 zG61_QJ=pF!4YK*(prR%xt6N2xYhmE(+{SXUu;f5-UoE;yP@s*}ClDs64fRawZqFksN34~oa zLIO&8$Eshy6T-P?*J@ZZgU(p~s*R98z>HYT&|x2uTEBo6*|wmbF(VqdQfJzp@aO{6}E43FTJPeAzss zh=9%baYm`xOxM5D*rluu<~pEt!xQ0k`>L+0j4T0U(LDntlo9|K@h0-~?<#|)zjwgN z*7LbZX!-Z=-)R$4_LBsvV1mU{jGyslXW2s_V0%ij);Bs0i| zhlgXm{n&P8&X#s`a&S;5xvf+pl`cyP-vlWXyG#=PisIF20NayTg`(i%NI&^ z0zleG47AkPDudBjgNX&gB=~xZ_kJ1E4DL_O?I~nklrZqw-J?*fe$!&QZQ9S9j*ur} zueWu{&%>8K>Rpz#Oa@3_l|nz1Xw;z$9ba9!-CrHfGN|VWA*#m`gZSQJAJoiIPcVU^ z7mR#VDRf^SYG1v#+Ky^`E(b{+ea%cvO!VdD%sdMg zc33&rjm9=U?EcUGt$Zu7;&iD$4;RLyG9ql0!%OS()1U_iO#kiHg|Cp!gnVr!!Be6+ zA~~8B!K6ko5ZXdN6^EuU18OCt8Hf6heg>tPBVKGAtY;$?fw%wJO0}Bqz9Q4?eejReL@G zD#R{PVR2~1c`4z7OR)adtM=8{Pr5}zPk;ZQM))VC#J&0bLSkub&rENtux4w}Q2VKY zB0B+ZUAqOdH1jf(?#tx5;XJ_#w}*DoC@&-k2wvKD&sx@8{r<1NFXS)YG9t>pZZlgBlVP0V)F zeQ2=CS*)uPQ)E|(baPwob*uc5S6Eo6iK%9MKvH&5`8Ybo0pV#T zhUR)D%8IUfsLsFB&EMfVAy`gKQz{X?GT(F&j3W2fip==_0L5XWGkStUcw8oB+khoX z(=a+#DkiJ(Q^2P~eLdn7Um_V)r; z=l{ITgsH8iGj-|JU!UUGh#q@h-s3%W{1;jF4GHg=D#l9|qwFU|@wX{v!CndHnq9l8 zxaLiU&Y54oC=Hjq_USnj#c_P5x?jSSRo*zQ`ysDJMkyVby}!%j$B&UlMjaP1wK2LBKa)T#$jH{ppevXA(Es@({et)qfyL2yC zagZ=pR+qhbDifT`qr=oT{2*sGN1=mp>e>z~WAa{uN<900DVFq+21(C|zcV&JA;bhn zjex_Qr3KnNk~W{$Ar|6c@{Ar|?8c%J54|IDC>27w3v zHYN2g+wpwl9`5xy)?C9WeyT}-ylT{+S6U{5$7>@^DGn##yHg>or=s!jW~b__=C{d< zko^H&vvZ>CPi*fk&TZdpe&sA~ZWYXOD-x~}HYq3C zuMfWFA2=@&W(m6x?nYV~;}U0T!@19t5*+2&`<4lD)6-4m`_Gu$QPLLdF)anJU%%!T z4_PhK_Di@nesH0p(%h8yl_ZD+I|@&CJovO3@BOJcHMd<8VZipB-EbVDlYa>nTV%9C%E%DBMi*OMThqRmkg@UO96@fC z?y3Sg!{B<=W4P)0S@L#c82L4Sd>cj{(HKhYN|#j)^z*AAyG1y|Fbm~ZP6+C!9G5gq zt~*!}&>vrsWxKUe!T)(|@@09u2+SRfk1u{T+4EN1n9nacHEZjWu!r9n0UMDMnJ=%1 zy_2={(!~k(WS1`IwSGk(x-9m0H&k?-sHgN@_)<`D<|iTmuf0FO{tkQbK;}f6b{0&I zc8XdouadOXZ4Sfc_U1u?)*NnzO~wE5V7xmra$Io8MWBs9Xx`@8RaI_@orzA*9Fuhhoaa>jI<|7mg?WE;OE<>le>4deLKb1JbwQGUM`#AD{_1n~ z9x8Usy@6H;TmGE+)b92LKK%8OYE*%kd)ve67pHuc5`I6L52Bu|?@<^!XZ<2FH`R>f-t1ewc>zm>dS6nUY4av|BqtBvv3W&VC* z8Q--%Efl}E=%t9CeOv9^>Y*XT46={>LC=K{lg%@mQ**bAniFHSZcx=0X;0B#r~KdG zl6VhWy7@MhTk_oeW2d*c*EaOBy_jUo_d2vcKsx-vUZ>Ja7p}!aO7kxX*B+t2CC5b;{Lm%trc_22=&delc1@OG_|D61073$}YAI?~dfIy?7*2E32gY(BGpws<1? zU2(K7o4v8SggsuS?oylAODE)s^Gen~E=U}j2vnilHMi8*%8ed|o*ZE_{%^ulA+P0% zbB-9hXc8Vz-hi<{W?@cAXu`Sl)BGvcJ}0KdZ=S+VnviR*+6#4iwY5ED zo~1>a${m&lhc#QuHy8Etz zPOZZ~-N;w6?GA|uy}g>_OzH0{4Onkkjca*+WD#JHx^1=@4{g%E2K~Tx{nS0CTd&v( zyhe@KFP&Sh86A+*hkc9YSJbkzxzz2nwVd-FcTqPXWpkA(VgL&+cD0Tw$titu98+D5 z0q;LF3I33FU{BMO)=mq13>n5WOk=ro8aW%Q88K2aqQ}XXz=7T`ff7kU8t37FQZWK( zVK)`+^lWJpgwG##ML7qu;)i{4?-ce4e^?^CpkLUBYkl+8L-tmGjg&va)Ni&6+khHJ zweSOv2WN;>)n~P@PDlMYcx0H}j_^wHwyMZE`^VI_PC$90Aqtb_y#&o+PCnK#Cl-Bg zbi!O$`M3}-k9_jGASG@OJ7{!Ms<2e_l$L&?wEr1)r+32Fhx9YvzVPXgio1^#Cu?b$ zh|M?r868^+_AJ-ltzGaJV6r?Vaq6T+`p>r4Uz5WBB&%J?FZuF-{S1FaIueP5I~7=o z!M!G%k`k1pU?)Eu8P?sWRpY4J!Vs}H$WGY7Wb`cJcO!KTiQ4SRxU3iu5K!!fL=t!P zqh2tjX@``T$y!%1&9mp<_@ZU`U01-dhA}%|Mq+b25?g74mkqI?7_c7P&0*ZzS82Pb zF{hZ$%2R!2lHVXDoA#F%%0B{$cya1-32ph!?#d8S zrG1BlKE^*O3AKxvUgnnh67(GM@x@wL=r=EcyKFL?IpbH$zMT{H5xlDQ>Q_veLflqH zn=N-0IG4soh3!t=*~?Wd9iuIPPT2wBTZ}x-k3Gl*{`A=n@Tv+PgvN#n&#|h{Qq;Eo zKdV9W@|UF|w0Zz}cNwr}?=%hTJ2{It96#_(k!_Znnf@+mK;}d12ReavhM`%lt}%ej=e5VO-=plQ`@sh z>HzM1$>vv2wtJuYVwS55t=fvI2?Yg!Z{My30g7Ywms@%p2i4!6vDXi?;r;CcJ+tK|4j*& z&+@&pl62DLE(wMcaGOif=-klDHXDt;je(*i@p?+QL0Z=$iyzYuh7aCbvz-f=ko8(D zwTN(7#NU50&$8fzXms(D^g@CROGJ;b66Wwv{_N#bh-XWA=q#`&$Ta|p)X%BSZ3lO0 z+6Q5a0Z6dvem2ej$wR@yzRFY#;qK$T4ORXe829msAho9N|*Aai|79REp_d%p31 z0~=!E*k6Y8a~2N}#YH2F)d1l^2&b+fP<*0M3cC3p?J1bb=Uc2r0(sp^7dHS<`zkv2 zIAQ78Y>H78a^(A*YDh>3VQg@4&^;kz-oLT;L38yps|(@j-THM14of{qbppmIAXB_(B^E!!u!$mwU? z=TV%OhAI?-xB}4im%a(7#ZkZiA}QKcEcSr-KqpL1O<{kzC?kz?Szn04c$>m<(M3nY zD_o3GP0J9%4(rolVSRmlIv3c^$aTo#Nk0?Wa3%RCkb5KAd&3XrSjB=OXb@3b@4yNF zp|acgX4JLC#YNTp&!0J+8E1WJ*KeLnjfT1fMhii~bCz+Zp)%gXH6V_cG&G)hg@#g) zoMKuBj(*G#1`YAAwx0IYPZRYhbQ*z9X51&B=r&bPC+vOzc9@>z zpis?(kLzK-=et-B0bl>I>A|vMS5tfr{mda?r`+lLS=u2qGJ^USA)1U12bxh7gu|X~ zK=m!ps=^TKM<{!Dy^i=4tT7>NPK%>&h~xKCl0s)yLCJ!+w7xDjt4h zwss`rx2%)n5`@CPGP|^YB-Qq}z$|!MTU(P*yWn;dkUk=n=g~v{>i`bUgT2%_mS#T! zc|6AkDUI%Dn+c`Nh$l7vj1vz(hyg-}hu}i+mwm=OtHaU?A{*fl>+G0o3?NeHTshMv zjuUSY$EBO(Z5~DX6#{iVkiLwiR@3*Q>i5tn61osU+d`Wb%A!hdjXTtEl0t|L)mw|X zNhjBg`U6qxzL*f4BBe!3e#OvB*!aR^x@&*0sxFK zlsN=#4n^sC1lx9uf~Jut0tsOo9m!-<_~L?P-!czK)LfRzI>fp|mv3X9l=JBXw_#9&T@M&#HmR){R`Zkbeo8{!1rwde);m{UCK5NwK7Ja z?G0rG&u56|aC{mhJV?^EcD&Gqk`RRS|7lVT-;8$!C3_NpX_gE=%PR=_VPIWd-Q}aI z%~jxlg;OH*vis&_8BOrcJqjNmztjVRWeh%GiJKVx&+!YW>7Oq#u+5*mC@LWPrb(D= zviMAxc<4s+BC&^|Sx*^~KzEL>3nc#5+Ue6Dpf2?UHg13Dc+0;-+sD$S#;TF@n7zFK zA?D75NjC*_w{QMWFbgl+ST*#DO&(~)@|tFkiAp>)GdDMnU!b>&(>AkY9UrU664QQ8ocHcS{$*)ZvO(!%MSEyN3+2##wEVkpWcF}-`P z07NFD6f(Hmp0;0HTxC0pbwF`{cX#6M z1wLzj_Ly%32g4~~%<3QBeg(cEk+paH)BPmTjo8%oKl_#iev7LkJlxwyOJw^n|U3%a3_j~o!;GKS>@^Gn}M-ZHVz=l(o0LGw?&-Z4c z3b0rdqcA&TwyoT#AY)p>CCwlG;z!zaTKU!vAj~fmUF7Sdn#tjMdPIi7PPUfRZ*>ul zZlowV7A$rbHQ$rbrT1kUD_|A**N5S27VkY_2I_Aj<@X-pAdzs87a1AJ%0Zr;n#+j4-glQUh&DCZPBm!6%Gkx|k>n$I*~!q>U|{mS(e zggu4MEB%Pkd}a?B33T`MYF%J6w|W@69%@#8z{{N?KE6vel-UDKe>ibi=s{+T-c-uo z-kx?2rCFa#+sfcG*|E&Fb{_K)bsGYvZRT_Bw9cGu&K&( z3XqsYS@J6#``^A5QJ+>+9=ob5=3v1AS88tZJZ_Z42>dz}oC>4LMoB=9^=}=SCi3s9ma!n~87@;1OEQwRivA*b0%UN}k{-D50n8NI}qEiR)N8ZMB5b zRWb|T$>zEPq72XHi#U2JYRmj7`DoRtbXl85`P5F2F4ywthK7a-Uqi;9uXay=a|#4< z{$hA%m@3gy@D0F%n`@dD3TT8Tcu@pr{J7%xoFW;Mi zYPEAqXh03IYC#*5cwS(*Fz^E}fNEo-V`Bt$HMN7^?j;QY@%8P2yq{1y8S8g)4#NIM zycPlTUOAw5h;vfxMG}xgLU*(A`Sk9GzN^D!LuT*QHlu+H7O$+XCc;2xLiYKrAm_M0 z1x-RQ5x7VsZeiQKYi>&iR4Z53*Vo_9(7(Hu5Eb_0rtZ!m|`4rU1SqhS9@$@T3JA3O6XWz>NVvW+VyRe41v)5_VP zd>A(o^7pT{JjB{1sFAmM#h7JlIGUw<+nUy+D%*WN^+Ae%5~g2=i3 zhl!9hEK<(Ji2KH|o;%;}0LT62xvBs3Qtta!9~d8Yf6sk(^3NZux#6-0C1QXqECAxk z|30#s1qd^J@;)*DGfMg!1~FFf=lvj+QuQec6FgY%EQm`$Y2ljBqsY zyiaV~goE}r-OkIFEBxVj=;QO&q7EK~%e-#yHD`%JR619L({@?&Q`XI^B@#x*$9 z=A6@^(t!v*!-;gvLoeZ3`E|v2FN*8lo{T(WYsaaqt?|K36{j}1CYcp*>>~};Y5RQO zKR$fxHjKCpF_x_9(hDDrkB{8BQHKau=;@exCW`KSgd zpQxi!Vw-d`DC$@|W=Q%(dWFRR8D%M0=~OZXE?IYX_mY6XK!i~2rjbm#UAbIgeN9cx z5PXI!OZ9_UHDEx}LDgr+iIpa<5uck68f=zRj14fEnYV$St%$0RBW@a7q(%B^XorDc z$d;Fv+nhUhPQfs@zrZX%)yq-!^U5=Wq1_s-cGcG{XHELxLi7dBu$QkO8;*%15+tKI z15xa7l1irO-KlT>8XrD?e&X*qv@e_(>qqMbtX{A`okm3iR>AzqdGe@y$+sWU_6ysj zVy$-2@)J&)2}u&-iO3z=MOjSTJhxp7m#njuqwOB*c-7`yiQVRMiho}wDZb#N zUNYkR54E$%_F732u$9vH`)<5C7Ne&uvyR2^)vKWvet+2M%~Vx%stfR39I6~-QWL>t?ktTsMQPd924aXxsfVISx{;BxGLLGI0P`m_E^hg z1uR{VzA3@rrM$DW^u#gXL{D$8Ka$WWA01_;Ch{MHZrlXwmPJ}Q2ooA1Gwq4xOMV*a zN=hk0pv_BANJvQOxK#GaGrb&!*E7Z+pbcYdvC_x#$JUmMSGwqP4-{opYj(vmrJ<8U zyCnfSZ%EPv+qqaM{`4IpN*l$OAULpm^wjSJ+=m}_Hl>3MgT zUXYf00|SrA4>QZ~Z4Tae-Fn=V=s?uRrvf-F+3 zXQ#TV>PNasn>-&o{>@?;?V}nWPsCuZ{RKV|`fRh4i%#Pi`}-mt>faihbWQ1_7t>9$ zEerUp#@N66|22@z=H%pjw#zsxEWPC=2N#XFosShQmAg?UC#$BXYMYAwZ8w^S9F029 z%lD*keqo``G8X~sxJloUWbir+{;@ajv?vF6B!&8Kw?UH1o?ONxtSd^|lojLA|l{ZUY+%hcPe@gZv7GC{ds z1uAd5=SDMbUi*5#GwZG<23H;3UyE(%6K=Rs` looks fine but **cmd expands + * `%…%` in the whole line**, so `encodeURIComponent` JSON (`%22`, `%7B`, …) gets mangled before `start` + * runs — Cap never sees a valid `value` query. `rundll32 url.dll,FileProtocolHandler` hands the URL + * to the shell without that corruption. + */ async function openCustomProtocolUrl(url: string): Promise { if (process.platform === "win32") { - await execFileAsync("cmd.exe", ["/c", "start", "", url], { windowsHide: true }); + await execFileAsync("rundll32.exe", ["url.dll,FileProtocolHandler", url], { windowsHide: true }); return; } await open(url); diff --git a/extensions/cap/src/refresh-device-cache.tsx b/extensions/cap/src/refresh-device-cache.tsx index 2408337bce..589c5ca79d 100644 --- a/extensions/cap/src/refresh-device-cache.tsx +++ b/extensions/cap/src/refresh-device-cache.tsx @@ -1,8 +1,31 @@ -import { closeMainWindow, showHUD } from "@raycast/api"; +import { Toast, closeMainWindow, showToast } from "@raycast/api"; +import { homedir } from "node:os"; +import { join } from "node:path"; import { runCapDeeplink } from "./deeplink"; +function cachePathHint(): string { + if (process.platform === "win32") { + const base = join(homedir(), "AppData", "Roaming"); + const devPath = join(base, "so.cap.desktop.dev", "raycast-device-cache.json"); + const prodPath = join(base, "so.cap.desktop", "raycast-device-cache.json"); + return ( + `tauri dev → ${devPath}\n` + + `installed Cap → ${prodPath}\n` + + `Whichever Cap.exe owns cap-desktop:// handles this (often the installer build, not dev).` + ); + } + const base = join(homedir(), "Library", "Application Support"); + const devPath = join(base, "so.cap.desktop.dev", "raycast-device-cache.json"); + const prodPath = join(base, "so.cap.desktop", "raycast-device-cache.json"); + return `dev → ${devPath}\nprod → ${prodPath}`; +} + export default async function main() { await runCapDeeplink({ refresh_raycast_device_cache: null }); - await showHUD("Cap: device cache refresh sent"); + await showToast({ + style: Toast.Style.Success, + title: "Cap: device cache refresh sent", + message: cachePathHint(), + }); await closeMainWindow(); }