From 4980ef15a5bf50beba7d52466898c2c16514aa94 Mon Sep 17 00:00:00 2001 From: Joshua Higgins Date: Fri, 6 Feb 2026 15:02:13 -0500 Subject: [PATCH] Initial commit --- .eslintrc.json | 4 + .gitignore | 10 + .prettierrc | 4 + CHANGELOG.md | 41 + README.md | 30 + assets/yabai-icon-512px.png | Bin 0 -> 33961 bytes package-lock.json | 3687 ++++++++++++++++++++++++++++ package.json | 276 +++ src/balance.ts | 23 + src/create-space-and-focus.tsx | 35 + src/custom-yabai-command.tsx | 35 + src/destroy-space.tsx | 40 + src/focus-next-same-app.tsx | 44 + src/focus-space.tsx | 39 + src/focus-window-east.ts | 16 + src/focus-window-north.ts | 16 + src/focus-window-south.ts | 16 + src/focus-window-west.ts | 16 + src/helpers/mirror.ts | 29 + src/helpers/scripts.ts | 24 + src/helpers/window-utils.ts | 42 + src/layout-bsp.ts | 23 + src/layout-float.ts | 23 + src/layout-stack.ts | 23 + src/mirror-x.ts | 5 + src/mirror-y.ts | 5 + src/restart.ts | 33 + src/rotate.ts | 27 + src/screens-menu-bar.tsx | 54 + src/search-windows.tsx | 157 ++ src/start.ts | 23 + src/stop.ts | 23 + src/swap-window-east.ts | 16 + src/swap-window-north.ts | 16 + src/swap-window-south.ts | 16 + src/swap-window-west.ts | 16 + src/toggle.ts | 51 + src/warp-window-east.ts | 16 + src/warp-window-north.ts | 16 + src/warp-window-south.ts | 16 + src/warp-window-west.ts | 16 + src/windows-list-current-space.tsx | 104 + tsconfig.json | 17 + 43 files changed, 5123 insertions(+) create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 CHANGELOG.md create mode 100644 README.md create mode 100644 assets/yabai-icon-512px.png create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/balance.ts create mode 100644 src/create-space-and-focus.tsx create mode 100644 src/custom-yabai-command.tsx create mode 100644 src/destroy-space.tsx create mode 100644 src/focus-next-same-app.tsx create mode 100644 src/focus-space.tsx create mode 100644 src/focus-window-east.ts create mode 100644 src/focus-window-north.ts create mode 100644 src/focus-window-south.ts create mode 100644 src/focus-window-west.ts create mode 100644 src/helpers/mirror.ts create mode 100644 src/helpers/scripts.ts create mode 100644 src/helpers/window-utils.ts create mode 100644 src/layout-bsp.ts create mode 100644 src/layout-float.ts create mode 100644 src/layout-stack.ts create mode 100644 src/mirror-x.ts create mode 100644 src/mirror-y.ts create mode 100644 src/restart.ts create mode 100644 src/rotate.ts create mode 100644 src/screens-menu-bar.tsx create mode 100644 src/search-windows.tsx create mode 100644 src/start.ts create mode 100644 src/stop.ts create mode 100644 src/swap-window-east.ts create mode 100644 src/swap-window-north.ts create mode 100644 src/swap-window-south.ts create mode 100644 src/swap-window-west.ts create mode 100644 src/toggle.ts create mode 100644 src/warp-window-east.ts create mode 100644 src/warp-window-north.ts create mode 100644 src/warp-window-south.ts create mode 100644 src/warp-window-west.ts create mode 100644 src/windows-list-current-space.tsx create mode 100644 tsconfig.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..e6258e1 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "root": true, + "extends": ["@raycast"] +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ad70d66 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules + +# Raycast specific files +raycast-env.d.ts + +# misc +.DS_Store diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..fc0f503 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "printWidth": 120, + "singleQuote": false +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..31f18ea --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,41 @@ +# Yabai Changelog + +## [Added search windows command] - 2025-02-25 + +- Adds "Focus Next Same App" command + - Focuses on the next window with the same application name + - MacOS has same feature, but it is only available in the current space +- Adds "Search Windows" command + - Searches for windows managed by Yabai + - Allows to search by window title or application name, it is really useful when windows have the same app name + +## [Added window movement commands] - 2024-11-25 + +- Adds "Focus Active Window" commands + - "Focus Active Window North" moves window focus to the north. + - "Focus Active Window South" moves window focus to the south. + - "Focus Active Window East" moves window focus to the east. + - "Focus Active Window West" moves window focus to the west. +- Adds "Swap Active Window" commands + - "Swap Active Window North" swaps the active window with the window to the north. + - "Swap Active Window South" swaps the active window with the window to the south. + - "Swap Active Window East" swaps the active window with the window to the east. + - "Swap Active Window West" swaps the active window with the window to the west. +- Adds "Warp Active Window" commands + - "Warps Active Window North" warps the active window with the window to the north. + - "Warps Active Window South" warps the active window with the window to the south. + - "Warps Active Window East" warps the active window with the window to the east. + - "Warps Active Window West" warps the active window with the window to the west. + +## [Added MenuBar to indicate the current screen and listed windows of the current screen] - 2024-07-05 + +## [Enhancements] - 2024-06-28 + +-- Adds "Restart" command. +-- Adds "Start" command. +-- Adds "Stop" command. +-- Adds "Layout BSP" command. +-- Adds "Layout Stack" command. +-- Adds "Layout Float" command. + +## [Initial Version] - 2023-12-23 diff --git a/README.md b/README.md new file mode 100644 index 0000000..095ca50 --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +# Yabai + +> Run Yabai window management commands directly from Raycast. + +## Installation + +To use this extension, you must have `yabai` installed on your machine. + +The easiest way to install this is using [Homebrew](https://brew.sh/). After you have Homebrew installed, run the +following command in your terminal: + +```bash +brew install koekeishiya/formulae/yabai +``` + +[Official installation instructions]() + +## Additional Setup for MenuBar Desktop Indicator + +To enable the desktop indicator in the MenuBar, you need to add a specific command to your yabairc configuration file. + +Please add the following line to your yabairc file: + +```bash +yabai -m signal --add event=space_changed action="nohup open -g raycast://extensions/krzysztoff1/yabai/screens-menu-bar?launchType=background > /dev/null 2>&1 &" +``` + +This command will allow the Raycast extension to run in the background and update the menubar indicator whenever you switch desktop spaces. + +After adding this line, make sure to reload your yabairc configuration or restart yabai for the changes to take effect. diff --git a/assets/yabai-icon-512px.png b/assets/yabai-icon-512px.png new file mode 100644 index 0000000000000000000000000000000000000000..cd1f40a27d23f3c2bd54ae0ba4748f0d268bdfbd GIT binary patch literal 33961 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 DbeFry literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..61bd3d4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3687 @@ +{ + "name": "yabai", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "yabai", + "license": "MIT", + "dependencies": { + "@raycast/api": "^1.64.4", + "@raycast/utils": "^1.10.1", + "execa": "^8.0.1", + "ray": "^0.0.1", + "tiny-pinyin": "^1.3.2" + }, + "devDependencies": { + "@raycast/eslint-config": "1.0.8", + "@types/node": "20.10.5", + "@types/react": "18.2.45", + "eslint": "^8.56.0", + "prettier": "^3.1.1", + "typescript": "^5.3.3" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "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.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "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/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "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.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "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.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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.1", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", + "integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.8.tgz", + "integrity": "sha512-d/QAsnwuHX2OPolxvYcgSj7A9DO9H6gVOy2DvBTx+P2LH2iRTo/RSGV3iwCzW024nP9hw98KIuDmdyhZQj1UQg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.12", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.12.tgz", + "integrity": "sha512-dpq+ielV9/bqgXRUbNH//KsY6WEw9DrGPmipkpmgC1Y46cwuBTNx7PXFWTjc3MQ+urcc0QxoVHcMI0FW4Ok0hg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", + "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "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.21", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.21.tgz", + "integrity": "sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/external-editor": "^1.0.2", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.15.tgz", + "integrity": "sha512-4Y+pbr/U9Qcvf+N/goHzPEXiHH8680lM3Dr3Y9h9FFw4gHS+zVpbj8LfbKWIb/jayIB4aSO4pWiBTrBYWkvi5A==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "license": "MIT", + "dependencies": { + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", + "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.12.tgz", + "integrity": "sha512-xJ6PFZpDjC+tC1P8ImGprgcsrzQRsUh9aH3IZixm1lAZFK49UGHxM3ltFfuInN2kPYNfyoPRh+tU4ftsjPLKqQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.15.tgz", + "integrity": "sha512-xWg+iYfqdhRiM55MvqiTCleHzszpoigUpN5+t1OMcRkJrUrw7va3AzXaxvS+Ak7Gny0j2mFSTv2JJj8sMtbV2g==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.15.tgz", + "integrity": "sha512-75CT2p43DGEnfGTaqFpbDC2p2EEMrq0S+IRrf9iJvYreMy5mAWj087+mdKyLHapUEPLjN10mNvABpGbk8Wdraw==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.5.3.tgz", + "integrity": "sha512-8YL0WiV7J86hVAxrh3fE5mDCzcTDe1670unmJRz6ArDgN+DBK1a0+rbnNWp4DUB5rPMwqD5ZP6YHl9KK1mbZRg==", + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.1.8", + "@inquirer/confirm": "^5.1.12", + "@inquirer/editor": "^4.2.13", + "@inquirer/expand": "^4.0.15", + "@inquirer/input": "^4.1.12", + "@inquirer/number": "^3.0.15", + "@inquirer/password": "^4.0.15", + "@inquirer/rawlist": "^4.1.3", + "@inquirer/search": "^3.0.15", + "@inquirer/select": "^4.2.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.3.tgz", + "integrity": "sha512-7XrV//6kwYumNDSsvJIPeAqa8+p7GJh7H5kRuxirct2cgOcSWwwNGoXDRgpNFbY/MG2vQ4ccIWCi8+IXXyFMZA==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/type": "^3.0.7", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.15.tgz", + "integrity": "sha512-YBMwPxYBrADqyvP4nNItpwkBnGGglAvCLVW8u4pRmmvOsHUtCAUIMbUrLX5B3tFL1/WsLGdQ2HNzkqswMs5Uaw==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.3.tgz", + "integrity": "sha512-OAGhXU0Cvh0PhLz9xTF/kx6g6x+sP+PcyTiLvCrewI99P3BBeexD+VbuwkNDvqGkk3y2h5ZiWLeRP7BFlhkUDg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.13", + "@inquirer/figures": "^1.0.12", + "@inquirer/type": "^3.0.7", + "ansi-escapes": "^4.3.2", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", + "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", + "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.4.0", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.4.0.tgz", + "integrity": "sha512-wH5g3SLmbRutnr7UzQBSozRFEAZ7U9YGB/wFuBRr0ZghTgv5DE+KQaf6ZtU7iFb9pvkvoVRnT5XheNAtbjRDaQ==", + "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.0", + "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": "^9.0.5", + "semver": "^7.6.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.30", + "resolved": "https://registry.npmjs.org/@oclif/plugin-autocomplete/-/plugin-autocomplete-3.2.30.tgz", + "integrity": "sha512-kbfVGBwnG7D64VBNXMBzkMWqlIIkgxfybazJJR5NS3wQkpV2TyqCG213WMtYSmgOShxc0bCxa3hvJXyGjUTd2Q==", + "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.29", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.29.tgz", + "integrity": "sha512-90DMOngEHiQw1I7oylVE1Hco991OkeDFJMx3CNJ2M3g5F1dhXgscjbaIlYHdiuNyVs0mTkKevdiMs911suD4yA==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-not-found": { + "version": "3.2.57", + "resolved": "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.57.tgz", + "integrity": "sha512-HtDnLIcR7ojRgdeH4G6MMUIu1Dgub/iiFEA4srZcQVKUIPA/6nF117W7rBXZMlHcbch90OCoGkSP3ty55nGKDw==", + "license": "MIT", + "dependencies": { + "@inquirer/prompts": "^7.5.3", + "@oclif/core": "^4", + "ansis": "^3.17.0", + "fast-levenshtein": "^3.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@raycast/api": { + "version": "1.93.2", + "resolved": "https://registry.npmjs.org/@raycast/api/-/api-1.93.2.tgz", + "integrity": "sha512-7f8aPqD83Tqu2cZ5fgUYaB4cita/lNQYrmueheBswPbv6ZQ/FBwhzxQJN/2j6dS7lglo8IxCjnm8Cxxl8qWruA==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4.0.33", + "@oclif/plugin-autocomplete": "^3.2.10", + "@oclif/plugin-help": "^6.2.18", + "@oclif/plugin-not-found": "^3.2.28", + "@types/node": "20.8.10", + "@types/react": "18.3.3", + "esbuild": "^0.25.0", + "react": "18.3.1" + }, + "bin": { + "ray": "bin/run.js" + }, + "engines": { + "node": ">=20.5.0" + }, + "peerDependencies": { + "@types/node": "20.8.10", + "@types/react": "18.3.3", + "react-devtools": "5.2.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@types/react": { + "optional": true + }, + "react-devtools": { + "optional": true + } + } + }, + "node_modules/@raycast/api/node_modules/@types/node": { + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@raycast/api/node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@raycast/eslint-config": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@raycast/eslint-config/-/eslint-config-1.0.8.tgz", + "integrity": "sha512-xYopHeM7CJ1hhBOC6GPCbhBcVDQlkWxGh3Uft3zKf+dsOzSO16B6oAFArXYpjaoEGA2Rc2HPEBD5X1DOjLdF6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@raycast/eslint-plugin": "^1.0.7", + "@rushstack/eslint-patch": "^1.5.1", + "@typescript-eslint/eslint-plugin": "^6.8.0", + "@typescript-eslint/parser": "^6.8.0", + "eslint-config-prettier": "^9.0.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/@raycast/utils": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@raycast/utils/-/utils-1.19.1.tgz", + "integrity": "sha512-/udUGcTZCgZZwzesmjBkqG5naQZTD/ZLHbqRwkWcF+W97vf9tr9raxKyQjKsdZ17OVllw2T3sHBQsVUdEmCm2g==", + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.1.6", + "dequal": "^2.0.3", + "object-hash": "^3.0.0", + "signal-exit": "^4.0.2", + "stream-chain": "^2.2.5", + "stream-json": "^1.8.0" + }, + "peerDependencies": { + "@raycast/api": ">=1.69.0" + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.11.0.tgz", + "integrity": "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==", + "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": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.45", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", + "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", + "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + "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", + "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/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.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "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.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "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==", + "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==", + "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==", + "license": "MIT" + }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "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.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "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/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" + } + }, + "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", + "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.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "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/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "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.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "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/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "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.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "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.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "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.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "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/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "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-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "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/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "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/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "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/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "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/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "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.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "license": "MIT", + "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/ray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/ray/-/ray-0.0.1.tgz", + "integrity": "sha512-yyKtRfrxOL39pjJArN6cw7ZnMnPsFeZsDKWO3aoJ8uK1wulWzbVJ5PbUC62pRPKjdSym0f+HwiWyellASrcXxQ==" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "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.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "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==", + "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==", + "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/stream-chain": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", + "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", + "license": "BSD-3-Clause" + }, + "node_modules/stream-json": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", + "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", + "license": "BSD-3-Clause", + "dependencies": { + "stream-chain": "^2.2.5" + } + }, + "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-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/tiny-pinyin": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/tiny-pinyin/-/tiny-pinyin-1.3.2.tgz", + "integrity": "sha512-uHNGu4evFt/8eNLldazeAM1M8JrMc1jshhJJfVRARTN3yT8HEEibofeQ7QETWQ5ISBjd6fKtTVBCC/+mGS6FpA==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "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/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "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.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "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/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "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.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e4c190d --- /dev/null +++ b/package.json @@ -0,0 +1,276 @@ +{ + "$schema": "https://www.raycast.com/schemas/extension.json", + "name": "yabai", + "title": "Yabai", + "description": "Control Yabai using Raycast. Requires yabai to be installed.", + "icon": "yabai-icon-512px.png", + "author": "krzysztoff1", + "contributors": [ + "rubentsirunyan", + "webdesus", + "d34dh0r53", + "lhy-a" + ], + "categories": [ + "Developer Tools", + "Productivity" + ], + "license": "MIT", + "commands": [ + { + "name": "custom-yabai-command", + "title": "Run Custom Yabai Command", + "description": "Run custom Yabai command", + "mode": "no-view", + "arguments": [ + { + "name": "command", + "placeholder": "Command", + "type": "text", + "required": false + } + ] + }, + { + "name": "screens-menu-bar", + "title": "Show Current Screen", + "description": "Update the status information about the currently selected screen.", + "mode": "menu-bar" + }, + { + "name": "windows-list-current-space", + "title": "Windows List by Current Space", + "description": "Show the application of the current space.", + "mode": "view" + }, + { + "name": "toggle", + "title": "Toggle Yabai", + "description": "This command will start Yabai using `yabai --start-service` or stop it using `yabai --stop-service`.", + "mode": "no-view" + }, + { + "name": "rotate", + "title": "Rotate", + "description": "Rotate the tree 90 degrees clockwise.", + "mode": "no-view" + }, + { + "name": "mirror-x", + "title": "Mirror X", + "description": "Mirror the tree on the X axis.", + "mode": "no-view" + }, + { + "name": "mirror-y", + "title": "Mirror Y", + "description": "Mirror the tree on the Y axis.", + "mode": "no-view" + }, + { + "name": "balance", + "title": "Balance", + "description": "Balance the windows.", + "mode": "no-view" + }, + { + "name": "restart", + "title": "Restart", + "description": "Restart yabai service.", + "mode": "no-view" + }, + { + "name": "start", + "title": "Start", + "description": "Start yabai service.", + "mode": "no-view" + }, + { + "name": "stop", + "title": "Stop", + "description": "Stop yabai service.", + "mode": "no-view" + }, + { + "name": "layout-bsp", + "title": "Layout BSP", + "description": "Switch to BSP layout for the current space.", + "mode": "no-view" + }, + { + "name": "layout-stack", + "title": "Layout Stack", + "description": "Switch to stack layout for the current space.", + "mode": "no-view" + }, + { + "name": "layout-float", + "title": "Layout Float", + "description": "Switch to float layout for the current space.", + "mode": "no-view" + }, + { + "name": "create-space-and-focus", + "title": "Create & Focus New Space", + "subtitle": "Yabai", + "description": "Creates a new workspace and focuses it.", + "mode": "no-view" + }, + { + "name": "focus-space", + "title": "Focus Space", + "subtitle": "Yabai", + "description": "Focuses the specified space.", + "mode": "no-view", + "arguments": [ + { + "type": "text", + "placeholder": "Space Number", + "required": true, + "name": "spaceIndex" + } + ] + }, + { + "name": "destroy-space", + "title": "Destroy Current Space", + "subtitle": "Yabai", + "description": "Destroys the currently focused space.", + "mode": "no-view" + }, + { + "name": "focus-window-north", + "title": "Focus Active Window North", + "subtitle": "Yabai", + "description": "Focus the window to the north of the currently focused window.", + "mode": "no-view" + }, + { + "name": "focus-window-south", + "title": "Focus Active Window South", + "subtitle": "Yabai", + "description": "Focus the window to the south of the currently focused window.", + "mode": "no-view" + }, + { + "name": "focus-window-east", + "title": "Focus Active Window East", + "subtitle": "Yabai", + "description": "Focus the window to the east of the currently focused window.", + "mode": "no-view" + }, + { + "name": "focus-window-west", + "title": "Focus Active Window West", + "subtitle": "Yabai", + "description": "Focus the window to the west of the currently focused window.", + "mode": "no-view" + }, + { + "name": "swap-window-north", + "title": "Swap Active Window North", + "subtitle": "Yabai", + "description": "Swap window position and size with window to the north of the active window.", + "mode": "no-view" + }, + { + "name": "swap-window-south", + "title": "Swap Active Window South", + "subtitle": "Yabai", + "description": "Swap window position and size with window to the south of the active window.", + "mode": "no-view" + }, + { + "name": "swap-window-east", + "title": "Swap Active Window East", + "subtitle": "Yabai", + "description": "Swap window position and size with window to the east of the active window.", + "mode": "no-view" + }, + { + "name": "swap-window-west", + "title": "Swap Active Window West", + "subtitle": "Yabai", + "description": "Swap window position and size with window to the west of the active window.", + "mode": "no-view" + }, + { + "name": "warp-window-north", + "title": "Warp Active Window North", + "subtitle": "Yabai", + "description": "Warp at window to the north of the focused window.", + "mode": "no-view" + }, + { + "name": "warp-window-south", + "title": "Warp Active Window South", + "subtitle": "Yabai", + "description": "Warp at window to the south of the focused window.", + "mode": "no-view" + }, + { + "name": "warp-window-east", + "title": "Warp Active Window East", + "subtitle": "Yabai", + "description": "Warp at window to the east of the focused window.", + "mode": "no-view" + }, + { + "name": "warp-window-west", + "title": "Warp Active Window West", + "subtitle": "Yabai", + "description": "Warp at window to the west of the focused window.", + "mode": "no-view" + }, + { + "name": "search-windows", + "title": "Search Windows", + "subtitle": "Yabai", + "description": "Search and focus Yabai managed windows", + "mode": "view", + "keywords": [ + "s", + "window", + "search" + ] + }, + { + "name": "focus-next-same-app", + "title": "Focus Next Window of Same App", + "subtitle": "Yabai", + "description": "Focus the next window of the current application", + "mode": "no-view" + } + ], + "preferences": [ + { + "name": "yabaiPath", + "title": "Yabai installation path", + "required": false, + "type": "textfield", + "description": "Location to the Yabai installation (Defaults to `/opt/homebrew/bin/yabai` on M1 Macs, and `/usr/local/bin/yabai` otherwise)" + } + ], + "dependencies": { + "@raycast/api": "^1.64.4", + "@raycast/utils": "^1.10.1", + "execa": "^8.0.1", + "ray": "^0.0.1", + "tiny-pinyin": "^1.3.2" + }, + "devDependencies": { + "@raycast/eslint-config": "1.0.8", + "@types/node": "20.10.5", + "@types/react": "18.2.45", + "eslint": "^8.56.0", + "prettier": "^3.1.1", + "typescript": "^5.3.3" + }, + "scripts": { + "build": "ray build -e dist", + "dev": "ray develop", + "fix-lint": "ray lint --fix", + "lint": "ray lint", + "publish": "npx @raycast/api@latest publish" + } +} diff --git a/src/balance.ts b/src/balance.ts new file mode 100644 index 0000000..a02cc0f --- /dev/null +++ b/src/balance.ts @@ -0,0 +1,23 @@ +import { showHUD } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m space --balance"); + + if (stderr) { + throw new Error(); + } + + showHUD("Balanced space"); + } catch (error) { + if (error instanceof Error && error.message.includes("Yabai executable not found")) { + return; + } + + showFailureToast(error, { + title: "Failed to balance space, make sure you have Yabai installed and running.", + }); + } +} diff --git a/src/create-space-and-focus.tsx b/src/create-space-and-focus.tsx new file mode 100644 index 0000000..d739fdb --- /dev/null +++ b/src/create-space-and-focus.tsx @@ -0,0 +1,35 @@ +import { showHUD } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand(`-m space --create`); + + if (stderr) { + throw new Error(stderr); + } + + const { stdout: spacesOutput } = await runYabaiCommand(`-m query --spaces`); + const spaces = JSON.parse(spacesOutput); + const lastSpaceIndex = spaces.filter((space: { [x: string]: never }) => !space["is-native-fullscreen"]).pop().index; + + await runYabaiCommand(`-m space --focus ${lastSpaceIndex}`); + + showHUD(`Created space: ${lastSpaceIndex}`); + } catch (error) { + if (error instanceof Error) { + if (error.message.includes("Yabai executable not found")) { + return; + } + + showFailureToast(error, { + title: "Failed to create space", + }); + } else { + showFailureToast(error, { + title: "Failed to create space", + }); + } + } +} diff --git a/src/custom-yabai-command.tsx b/src/custom-yabai-command.tsx new file mode 100644 index 0000000..3e77974 --- /dev/null +++ b/src/custom-yabai-command.tsx @@ -0,0 +1,35 @@ +import { LaunchProps } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +const prefixesToRemove = ["yabai -m", "yabai --message", "-m", "--message"]; + +export default async function Command(launchProps: LaunchProps) { + try { + let command = launchProps.arguments.command.trim().replace(/\s\s+/g, " "); + + for (const prefix of prefixesToRemove) { + if (command.startsWith(prefix)) { + command = command.replace(prefix, "").trim(); + } + } + + if (!command) { + showFailureToast("No command provided."); + return; + } + + command = `-m ${command}`; + + const { stderr } = await runYabaiCommand(command); + if (stderr) { + throw new Error(stderr); + } + } catch (error) { + if (error instanceof Error && error.message.includes("Yabai executable not found")) { + return; + } + + showFailureToast(error); + } +} diff --git a/src/destroy-space.tsx b/src/destroy-space.tsx new file mode 100644 index 0000000..53fab08 --- /dev/null +++ b/src/destroy-space.tsx @@ -0,0 +1,40 @@ +import { showHUD } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stdout: rawRecentSpace, stderr } = await runYabaiCommand(`-m query --spaces --space recent`); + + if (stderr) { + throw new Error(stderr); + } + + const recentSpace = JSON.parse(rawRecentSpace); + const lastSpaceIndex = recentSpace.index; + + await runYabaiCommand(`-m space --destroy`); + + try { + await runYabaiCommand(`-m space --focus ${lastSpaceIndex}`); + } catch (error) { + throw new Error(`Failed to focus space: ${error}`); + } + + await showHUD(`Destroyed Space`); + } catch (error) { + if (error instanceof Error) { + if (error.message.includes("Yabai executable not found")) { + return; + } + + showFailureToast(error, { + title: "Failed to destroy space", + }); + } else { + showFailureToast(error, { + title: "Failed to destroy space", + }); + } + } +} diff --git a/src/focus-next-same-app.tsx b/src/focus-next-same-app.tsx new file mode 100644 index 0000000..f3816df --- /dev/null +++ b/src/focus-next-same-app.tsx @@ -0,0 +1,44 @@ +import { closeMainWindow, showHUD } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { sortWindows, BaseWindow } from "./helpers/window-utils"; + +interface Window extends BaseWindow { + "has-focus": boolean; + "is-minimized": boolean; +} + +export default async function Command() { + try { + const { stdout: windowsJson } = await runYabaiCommand("-m query --windows"); + const allWindows: Window[] = JSON.parse(windowsJson); + + const sortedWindows = sortWindows(allWindows); + + const currentWindow = sortedWindows.find((w) => w["has-focus"]); + if (!currentWindow) { + await showHUD("No focused window found"); + return; + } + + const sameAppWindows = sortedWindows.filter((w) => w.app === currentWindow.app); + if (sameAppWindows.length <= 1) { + await showHUD("No other windows of the same app"); + return; + } + + const currentIndex = sameAppWindows.findIndex((w) => w.id === currentWindow.id); + const nextIndex = (currentIndex + 1) % sameAppWindows.length; + const nextWindow = sameAppWindows[nextIndex]; + + await runYabaiCommand(`-m window --focus ${nextWindow.id}`); + if (nextWindow["is-minimized"]) { + await runYabaiCommand(`-m window ${nextWindow.id} --deminimize`); + } + + await showHUD(`Focused ${nextWindow.app}`); + await closeMainWindow(); + } catch (error) { + console.error("Error:", error); + await showHUD("Failed to focus next window"); + } +} diff --git a/src/focus-space.tsx b/src/focus-space.tsx new file mode 100644 index 0000000..3502f11 --- /dev/null +++ b/src/focus-space.tsx @@ -0,0 +1,39 @@ +import { LaunchProps, showHUD } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command(args: LaunchProps) { + if (isNaN(args.arguments.spaceIndex)) { + showHUD(`Invalid space index: ${args.arguments.spaceIndex}`); + return; + } + + const spaceIndex = parseInt(args.arguments.spaceIndex, 10); + + await focusSpace(spaceIndex); +} +export async function focusSpace(spaceIndex: number) { + try { + const { stderr } = await runYabaiCommand(`-m space --focus ${spaceIndex}`); + + if (stderr) { + throw new Error(stderr); + } + + showHUD(`Focused space ${spaceIndex}`); + } catch (error) { + if (error instanceof Error) { + if (error.message.includes("already focused space")) { + return; + } + + showFailureToast(error, { + title: "Failed to focus space", + }); + + return; + } + + showFailureToast("Failed to focus space"); + } +} diff --git a/src/focus-window-east.ts b/src/focus-window-east.ts new file mode 100644 index 0000000..1d35a4d --- /dev/null +++ b/src/focus-window-east.ts @@ -0,0 +1,16 @@ +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m window --focus east"); + + if (stderr) { + throw new Error(stderr); + } + } catch (error) { + showFailureToast(error, { + title: "Failed to warp window.", + }); + } +} diff --git a/src/focus-window-north.ts b/src/focus-window-north.ts new file mode 100644 index 0000000..d261948 --- /dev/null +++ b/src/focus-window-north.ts @@ -0,0 +1,16 @@ +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m window --focus north"); + + if (stderr) { + throw new Error(stderr); + } + } catch (error) { + showFailureToast(error, { + title: "Failed to warp window.", + }); + } +} diff --git a/src/focus-window-south.ts b/src/focus-window-south.ts new file mode 100644 index 0000000..5e41bd2 --- /dev/null +++ b/src/focus-window-south.ts @@ -0,0 +1,16 @@ +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m window --focus south"); + + if (stderr) { + throw new Error(stderr); + } + } catch (error) { + showFailureToast(error, { + title: "Failed to warp window.", + }); + } +} diff --git a/src/focus-window-west.ts b/src/focus-window-west.ts new file mode 100644 index 0000000..c5f7d68 --- /dev/null +++ b/src/focus-window-west.ts @@ -0,0 +1,16 @@ +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m window --focus west"); + + if (stderr) { + throw new Error(stderr); + } + } catch (error) { + showFailureToast(error, { + title: "Failed to warp window.", + }); + } +} diff --git a/src/helpers/mirror.ts b/src/helpers/mirror.ts new file mode 100644 index 0000000..3b9e775 --- /dev/null +++ b/src/helpers/mirror.ts @@ -0,0 +1,29 @@ +import { showHUD } from "@raycast/api"; +import { showFailureToast } from "@raycast/utils"; +import { runYabaiCommand } from "./scripts"; + +export async function mirror(axis: "x" | "y") { + const cmd = `-m space --mirror ${axis}-axis`; + + try { + const { stderr } = await runYabaiCommand(cmd); + + if (stderr) { + throw new Error(stderr); + } + + showHUD(`Mirrored space in the ${axis} axis`); + } catch (error) { + if ( + error instanceof Error && + typeof error?.message === "string" && + error.message.includes("Yabai executable not found") + ) { + return; + } + + showFailureToast(error, { + title: `Failed to mirror space in the ${axis} axis. Make sure Yabai is installed and running.`, + }); + } +} diff --git a/src/helpers/scripts.ts b/src/helpers/scripts.ts new file mode 100644 index 0000000..ea7044e --- /dev/null +++ b/src/helpers/scripts.ts @@ -0,0 +1,24 @@ +import { getPreferenceValues, showToast, Toast } from "@raycast/api"; +import { execaCommand } from "execa"; +import { userInfo } from "os"; +import { cpus } from "os"; +import fs from "fs"; + +const userEnv = `env USER=${userInfo().username}`; + +export const runYabaiCommand = async (command: string, opt?: { shell?: boolean }) => { + const preferences = getPreferenceValues(); + const yabaiPath: string = + preferences.yabaiPath && preferences.yabaiPath.length > 0 + ? preferences.yabaiPath + : cpus()[0].model.includes("Apple") + ? "/opt/homebrew/bin/yabai" + : "/usr/local/bin/yabai"; + + if (!fs.existsSync(yabaiPath)) { + await showToast(Toast.Style.Failure, "Yabai executable not found", `Is yabai installed at ${yabaiPath}?`); + return { stdout: "", stderr: "Yabai executable not found" }; + } + + return await execaCommand([userEnv, yabaiPath, command].join(" "), opt); +}; diff --git a/src/helpers/window-utils.ts b/src/helpers/window-utils.ts new file mode 100644 index 0000000..d69f867 --- /dev/null +++ b/src/helpers/window-utils.ts @@ -0,0 +1,42 @@ +export interface BaseWindow { + id: number; + pid: number; + app: string; + title: string; + space: number; + frame: { + x: number; + y: number; + w: number; + h: number; + }; +} + +export function sortWindows(windows: T[]): T[] { + return [...windows].sort((a, b) => { + if (a.space !== b.space) { + return a.space - b.space; + } + + const aArea = { + min: { x: a.frame.x, y: a.frame.y }, + max: { x: a.frame.x + a.frame.w, y: a.frame.y + a.frame.h }, + }; + const bArea = { + min: { x: b.frame.x, y: b.frame.y }, + max: { x: b.frame.x + b.frame.w, y: b.frame.y + b.frame.h }, + }; + + // calculate the overlap of the two windows + const overlapY = Math.max(0, Math.min(aArea.max.y, bArea.max.y) - Math.max(aArea.min.y, bArea.min.y)); + const minHeight = Math.min(a.frame.h, b.frame.h); + + // if the overlap of the two windows is greater than 50% of the window height, consider them in the same row + if (overlapY > minHeight * 0.5) { + return aArea.min.x - bArea.min.x; + } + + // otherwise, sort by the top edge + return aArea.min.y - bArea.min.y; + }); +} diff --git a/src/layout-bsp.ts b/src/layout-bsp.ts new file mode 100644 index 0000000..92e0e52 --- /dev/null +++ b/src/layout-bsp.ts @@ -0,0 +1,23 @@ +import { showHUD } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m space --layout bsp"); + + if (stderr) { + throw new Error(); + } + + showHUD("Switched to BSP layout"); + } catch (error) { + if (error instanceof Error && error.message.includes("Yabai executable not found")) { + return; + } + + showFailureToast(error, { + title: "Failed to switch to BSP layout, make sure you have Yabai installed and running.", + }); + } +} diff --git a/src/layout-float.ts b/src/layout-float.ts new file mode 100644 index 0000000..092a27c --- /dev/null +++ b/src/layout-float.ts @@ -0,0 +1,23 @@ +import { showHUD } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m space --layout float"); + + if (stderr) { + throw new Error(); + } + + showHUD("Switched to float layout"); + } catch (error) { + if (error instanceof Error && error.message.includes("Yabai executable not found")) { + return; + } + + showFailureToast(error, { + title: "Failed to switch to float layout, make sure you have Yabai installed and running.", + }); + } +} diff --git a/src/layout-stack.ts b/src/layout-stack.ts new file mode 100644 index 0000000..8d6995e --- /dev/null +++ b/src/layout-stack.ts @@ -0,0 +1,23 @@ +import { showHUD } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m space --layout stack"); + + if (stderr) { + throw new Error(); + } + + showHUD("Switched to stack layout"); + } catch (error) { + if (error instanceof Error && error.message.includes("Yabai executable not found")) { + return; + } + + showFailureToast(error, { + title: "Failed to switch to stack layout, make sure you have Yabai installed and running.", + }); + } +} diff --git a/src/mirror-x.ts b/src/mirror-x.ts new file mode 100644 index 0000000..c84c090 --- /dev/null +++ b/src/mirror-x.ts @@ -0,0 +1,5 @@ +import { mirror } from "./helpers/mirror"; + +export default async function Command() { + await mirror("x"); +} diff --git a/src/mirror-y.ts b/src/mirror-y.ts new file mode 100644 index 0000000..94adb72 --- /dev/null +++ b/src/mirror-y.ts @@ -0,0 +1,5 @@ +import { mirror } from "./helpers/mirror"; + +export default async function Command() { + await mirror("y"); +} diff --git a/src/restart.ts b/src/restart.ts new file mode 100644 index 0000000..b5e0dbd --- /dev/null +++ b/src/restart.ts @@ -0,0 +1,33 @@ +import { showHUD } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("--restart-service"); + + if (stderr) { + throw new Error(stderr); + } + + showHUD("Restarted yabai service"); + } catch (error) { + try { + const { stderr: startStderr } = await runYabaiCommand("--start-service"); + + if (startStderr) { + throw new Error(startStderr); + } + + showHUD("Yabai was not running. Started yabai service"); + } catch (startError) { + if (startError instanceof Error && startError.message.includes("Yabai executable not found")) { + return; + } + + showFailureToast(startError, { + title: "Failed to start yabai service, make sure you have Yabai installed.", + }); + } + } +} diff --git a/src/rotate.ts b/src/rotate.ts new file mode 100644 index 0000000..1cd8dee --- /dev/null +++ b/src/rotate.ts @@ -0,0 +1,27 @@ +import { showHUD } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async () => { + try { + const { stderr } = await runYabaiCommand("-m space --rotate 90"); + + if (stderr) { + throw new Error(stderr); + } + + showHUD("Rotated window tree"); + } catch (error) { + if ( + error instanceof Error && + typeof error?.message === "string" && + error.message.includes("Yabai executable not found") + ) { + return; + } + + showFailureToast(error, { + title: "Failed to rotate window tree, make sure you have Yabai installed and running.", + }); + } +}; diff --git a/src/screens-menu-bar.tsx b/src/screens-menu-bar.tsx new file mode 100644 index 0000000..95e97c5 --- /dev/null +++ b/src/screens-menu-bar.tsx @@ -0,0 +1,54 @@ +import { useEffect, useState } from "react"; +import { Icon, MenuBarExtra } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { focusSpace } from "./focus-space"; + +interface IDesktop { + index: number; + label: string; + "is-visible": boolean; +} + +async function getDesktopList(): Promise { + const desktopList = await runYabaiCommand("-m query --spaces --display"); + if (desktopList.stdout) { + return JSON.parse(desktopList.stdout); + } + throw new Error(desktopList.stderr); +} + +const useDesktop = () => { + const [state, setState] = useState<{ desktop: string; desktopList: IDesktop[]; isLoading: boolean }>({ + desktop: "0", + desktopList: [], + isLoading: true, + }); + useEffect(() => { + (async () => { + const desktopList = await getDesktopList(); + const desktop = desktopList.filter((f) => f["is-visible"])[0]; + setState({ + desktop: desktop.label || desktop.index.toString(), + desktopList, + isLoading: false, + }); + })(); + }, []); + return state; +}; +export default function Command() { + const { desktop, desktopList, isLoading } = useDesktop(); + const icon = Icon.Desktop; + + return ( + + {desktopList?.map((item) => ( + focusSpace(item.index)} + /> + ))} + + ); +} diff --git a/src/search-windows.tsx b/src/search-windows.tsx new file mode 100644 index 0000000..0e52fe2 --- /dev/null +++ b/src/search-windows.tsx @@ -0,0 +1,157 @@ +import { ActionPanel, Action, List, showToast, Toast } from "@raycast/api"; +import { useState, useEffect, useMemo } from "react"; +import { runYabaiCommand } from "./helpers/scripts"; +import { execaCommand } from "execa"; +import { sortWindows, BaseWindow } from "./helpers/window-utils"; +import * as pinyin from "tiny-pinyin"; + +interface Window extends BaseWindow { + icon?: string; +} + +async function findAppPath(pid: number): Promise { + if (!Number.isInteger(pid) || pid <= 0) { + throw new Error("Invalid process ID"); + } + const { stdout, stderr } = await execaCommand(`/usr/sbin/lsof -p ${pid} | grep txt | grep -v DEL | head -n 1 `, { + shell: true, + }); + if (stderr) { + console.error(stderr); + return ""; + } + const beginIndex = stdout.indexOf("/"); + const appIndex = stdout.indexOf(".app"); + if (appIndex === -1) { + return stdout; + } + return stdout.substring(beginIndex, appIndex + 4); +} + +function getPinyin(text: string): string { + if (!/[\u4e00-\u9fa5]/.test(text)) { + return text.toLowerCase(); + } + return pinyin.convertToPinyin(text, "", true).toLowerCase(); +} + +function timeLog(label: string, startTime: number) { + const endTime = performance.now(); + console.debug(`${label}: ${endTime - startTime}ms`); +} + +export default function Command() { + const [windows, setWindows] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [filteredWindows, setFilteredWindows] = useState([]); + const [searchText, setSearchText] = useState(""); + + const filteredWindowsMemo = useMemo(() => { + const startTime = performance.now(); + + if (!searchText) { + timeLog("Filter (no search)", startTime); + return windows; + } + + const lowerSearchText = searchText.toLowerCase(); + + const results = windows.filter((window) => { + const filterStartTime = performance.now(); + + if (window.title.toLowerCase().includes(lowerSearchText) || window.app.toLowerCase().includes(lowerSearchText)) { + timeLog("Filter (text match)", filterStartTime); + return true; + } + + if (/^[a-z]+$/.test(lowerSearchText)) { + const pinyinStartTime = performance.now(); + const titlePinyin = getPinyin(window.title); + const appPinyin = getPinyin(window.app); + const matched = titlePinyin.includes(lowerSearchText) || appPinyin.includes(lowerSearchText); + timeLog("Filter (pinyin match)", pinyinStartTime); + return matched; + } + + timeLog("Filter (no match)", filterStartTime); + return false; + }); + + timeLog("Total filter time", startTime); + return results; + }, [windows, searchText]); + + useEffect(() => { + async function fetchWindows() { + const startTime = performance.now(); + try { + const { stdout, stderr } = await runYabaiCommand("-m query --windows"); + if (stderr) { + throw new Error(stderr); + } + const windowsData: Window[] = JSON.parse(stdout); + + const sortedWindows = sortWindows(windowsData); + + timeLog("Fetch windows data", startTime); + + const iconStartTime = performance.now(); + const windowsWithIcons = await Promise.all( + sortedWindows.map(async (window) => ({ + ...window, + icon: await findAppPath(window.pid), + })), + ); + timeLog("Add icons", iconStartTime); + + setWindows(windowsWithIcons); + } catch (error) { + showToast(Toast.Style.Failure, "Failed to fetch windows"); + } finally { + setIsLoading(false); + timeLog("Total fetch time", startTime); + } + } + + fetchWindows(); + }, []); + + useEffect(() => { + setFilteredWindows(filteredWindowsMemo); + }, [filteredWindowsMemo]); + + async function focusWindow(windowId: number) { + try { + const { stderr } = await runYabaiCommand(`-m window --focus ${windowId}`); + if (stderr) { + throw new Error(stderr); + } + showToast(Toast.Style.Success, "Window focused"); + } catch (error) { + showToast(Toast.Style.Failure, "Failed to focus window"); + } + } + + return ( + + {filteredWindows.map((window) => ( + + focusWindow(window.id)} /> + + } + /> + ))} + + ); +} diff --git a/src/start.ts b/src/start.ts new file mode 100644 index 0000000..5b3076f --- /dev/null +++ b/src/start.ts @@ -0,0 +1,23 @@ +import { showHUD } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("--start-service"); + + if (stderr) { + throw new Error(); + } + + showHUD("Started yabai service"); + } catch (error) { + if (error instanceof Error && error.message.includes("Yabai executable not found")) { + return; + } + + showFailureToast(error, { + title: "Failed to start yabai service, make sure you have Yabai installed.", + }); + } +} diff --git a/src/stop.ts b/src/stop.ts new file mode 100644 index 0000000..951a481 --- /dev/null +++ b/src/stop.ts @@ -0,0 +1,23 @@ +import { showHUD } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("--stop-service"); + + if (stderr) { + throw new Error(); + } + + showHUD("Stopped yabai service"); + } catch (error) { + if (error instanceof Error && error.message.includes("Yabai executable not found")) { + return; + } + + showFailureToast(error, { + title: "Failed to stop yabai service, make sure you have Yabai installed and running.", + }); + } +} diff --git a/src/swap-window-east.ts b/src/swap-window-east.ts new file mode 100644 index 0000000..2010ee4 --- /dev/null +++ b/src/swap-window-east.ts @@ -0,0 +1,16 @@ +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m window --swap east"); + + if (stderr) { + throw new Error(stderr); + } + } catch (error) { + showFailureToast(error, { + title: "Failed to swap window.", + }); + } +} diff --git a/src/swap-window-north.ts b/src/swap-window-north.ts new file mode 100644 index 0000000..ddd4525 --- /dev/null +++ b/src/swap-window-north.ts @@ -0,0 +1,16 @@ +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m window --swap north"); + + if (stderr) { + throw new Error(stderr); + } + } catch (error) { + showFailureToast(error, { + title: "Failed to swap window.", + }); + } +} diff --git a/src/swap-window-south.ts b/src/swap-window-south.ts new file mode 100644 index 0000000..37014a0 --- /dev/null +++ b/src/swap-window-south.ts @@ -0,0 +1,16 @@ +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m window --swap south"); + + if (stderr) { + throw new Error(stderr); + } + } catch (error) { + showFailureToast(error, { + title: "Failed to swap window.", + }); + } +} diff --git a/src/swap-window-west.ts b/src/swap-window-west.ts new file mode 100644 index 0000000..215def3 --- /dev/null +++ b/src/swap-window-west.ts @@ -0,0 +1,16 @@ +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m window --swap west"); + + if (stderr) { + throw new Error(stderr); + } + } catch (error) { + showFailureToast(error, { + title: "Failed to swap window.", + }); + } +} diff --git a/src/toggle.ts b/src/toggle.ts new file mode 100644 index 0000000..242087f --- /dev/null +++ b/src/toggle.ts @@ -0,0 +1,51 @@ +import { showHUD } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async () => { + let serviceRunning = false; + + try { + const { stderr } = await runYabaiCommand("--stop-service"); + + if (stderr) { + throw new Error(stderr); + } + + showHUD("Yabai has been stopped."); + + serviceRunning = false; + } catch (error) { + if (error instanceof Error && error.message.includes("Yabai executable not found")) { + return; + } + + if (String(error).includes("Could not find service")) { + serviceRunning = true; + } else { + showFailureToast(error, { + title: "Error stopping Yabai", + }); + } + } + + if (serviceRunning) { + try { + const { stderr } = await runYabaiCommand("--start-service"); + + if (stderr) { + throw new Error(stderr); + } + + showHUD("Yabai has been started."); + } catch (error) { + if (error instanceof Error && error.message.includes("Yabai executable not found")) { + return; + } + + showFailureToast(error, { + title: "Error starting Yabai", + }); + } + } +}; diff --git a/src/warp-window-east.ts b/src/warp-window-east.ts new file mode 100644 index 0000000..9321d17 --- /dev/null +++ b/src/warp-window-east.ts @@ -0,0 +1,16 @@ +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m window --warp east"); + + if (stderr) { + throw new Error(stderr); + } + } catch (error) { + showFailureToast(error, { + title: "Failed to warp window.", + }); + } +} diff --git a/src/warp-window-north.ts b/src/warp-window-north.ts new file mode 100644 index 0000000..54e76ae --- /dev/null +++ b/src/warp-window-north.ts @@ -0,0 +1,16 @@ +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m window --warp north"); + + if (stderr) { + throw new Error(stderr); + } + } catch (error) { + showFailureToast(error, { + title: "Failed to warp window.", + }); + } +} diff --git a/src/warp-window-south.ts b/src/warp-window-south.ts new file mode 100644 index 0000000..4d8518e --- /dev/null +++ b/src/warp-window-south.ts @@ -0,0 +1,16 @@ +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m window --warp south"); + + if (stderr) { + throw new Error(stderr); + } + } catch (error) { + showFailureToast(error, { + title: "Failed to warp window.", + }); + } +} diff --git a/src/warp-window-west.ts b/src/warp-window-west.ts new file mode 100644 index 0000000..091c96b --- /dev/null +++ b/src/warp-window-west.ts @@ -0,0 +1,16 @@ +import { runYabaiCommand } from "./helpers/scripts"; +import { showFailureToast } from "@raycast/utils"; + +export default async function Command() { + try { + const { stderr } = await runYabaiCommand("-m window --warp west"); + + if (stderr) { + throw new Error(stderr); + } + } catch (error) { + showFailureToast(error, { + title: "Failed to warp window.", + }); + } +} diff --git a/src/windows-list-current-space.tsx b/src/windows-list-current-space.tsx new file mode 100644 index 0000000..a73d1ca --- /dev/null +++ b/src/windows-list-current-space.tsx @@ -0,0 +1,104 @@ +import { useEffect, useState } from "react"; +import { Action, ActionPanel, List, PopToRootType, closeMainWindow } from "@raycast/api"; +import { runYabaiCommand } from "./helpers/scripts"; +import { execaCommand } from "execa"; + +interface IWindow { + id: number; + pid: number; + title: string; + icon: string; + app: string; + "has-focus": boolean; + "stack-index": number; +} +async function getWindowsList(): Promise { + const windowsList = await runYabaiCommand(`-m query --windows --space`); + if (windowsList.stdout) { + return JSON.parse(windowsList.stdout); + } + throw new Error(windowsList.stderr); +} +const useWindowsList = () => { + const [state, setState] = useState<{ list: IWindow[]; isLoading: boolean }>({ + list: [], + isLoading: true, + }); + + useEffect(() => { + (async () => { + try { + const list = await getWindowsList(); + list.sort((a, b) => a["stack-index"] - b["stack-index"]); + setState({ + list: await Promise.all( + list.map(async (el) => { + el.icon = (await findAppPath(el.pid)) || ""; + el.title = el.title || el.app; + return el; + }), + ), + isLoading: false, + }); + } catch (error) { + console.error(error); + setState({ + list: [], + isLoading: false, + }); + } + })(); + }, []); + + return state; +}; +async function findAppPath(pid: number): Promise { + const { stdout, stderr } = await execaCommand(`/usr/sbin/lsof -p ${pid} | grep txt | grep -v DEL | head -n 1 `, { + shell: true, + }); + if (stderr) { + console.error(stderr); + return ""; + } + const beginIndex = stdout.indexOf("/"); + const appIndex = stdout.indexOf(".app"); + if (appIndex === -1) { + return stdout; + } + return stdout.substring(beginIndex, appIndex + 4); +} + +export function selectWindow(id: number) { + runYabaiCommand(`-m window --focus ${id}`); + closeMainWindow({ clearRootSearch: true, popToRootType: PopToRootType.Immediate }); +} + +export default function Command() { + const { list, isLoading } = useWindowsList(); + + let selectedItemId = 0; + if (list) { + selectedItemId = list.find((f) => f["has-focus"])?.id || 0; + } + + return ( + + {list?.map((item) => ( + + + selectWindow(item.id)} /> + + + } + /> + ))} + + ); +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c993d8a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Node 16", + "include": ["src/**/*", "raycast-env.d.ts"], + "compilerOptions": { + "lib": ["es2021"], + "module": "commonjs", + "target": "es2021", + "strict": true, + "isolatedModules": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "jsx": "react-jsx", + "resolveJsonModule": true + } +}