From fcdd932f5d25b3ac70702d72cf96129e08d463a2 Mon Sep 17 00:00:00 2001 From: manuelcontrera Date: Tue, 22 Sep 2026 09:04:18 -0500 Subject: [PATCH 1/3] feat(color-picker): add color-picker extension --- extensions/color-picker/.gitignore | 2 + extensions/color-picker/README.md | 59 + .../color-picker/assets/bin/picker-linux.py | 119 + extensions/color-picker/assets/icon.png | Bin 0 -> 120059 bytes .../color-picker/assets/rgb-color-wheel.png | Bin 0 -> 24996 bytes extensions/color-picker/package-lock.json | 3176 +++++++++++++++++ extensions/color-picker/package.json | 205 ++ extensions/color-picker/src/color-names.tsx | 76 + extensions/color-picker/src/color-wheel.tsx | 59 + .../src/components/ColorConvert.tsx | 49 + .../src/components/ColorNames.tsx | 35 + .../src/components/CopyAsSubmenu.tsx | 43 + .../color-picker/src/components/EditTitle.tsx | 24 + extensions/color-picker/src/convert-color.tsx | 83 + .../color-picker/src/favorite-colors.tsx | 65 + .../src/hooks/useColorsSelection.ts | 54 + .../color-picker/src/lib/color-format.ts | 55 + extensions/color-picker/src/lib/history.ts | 115 + extensions/color-picker/src/lib/types.ts | 76 + extensions/color-picker/src/lib/utils.ts | 150 + extensions/color-picker/src/native/picker.ts | 76 + .../color-picker/src/organize-colors.tsx | 360 ++ extensions/color-picker/src/pick-color.ts | 50 + extensions/color-picker/tsconfig.json | 18 + 24 files changed, 4949 insertions(+) create mode 100644 extensions/color-picker/.gitignore create mode 100644 extensions/color-picker/README.md create mode 100755 extensions/color-picker/assets/bin/picker-linux.py create mode 100644 extensions/color-picker/assets/icon.png create mode 100644 extensions/color-picker/assets/rgb-color-wheel.png create mode 100644 extensions/color-picker/package-lock.json create mode 100644 extensions/color-picker/package.json create mode 100644 extensions/color-picker/src/color-names.tsx create mode 100644 extensions/color-picker/src/color-wheel.tsx create mode 100644 extensions/color-picker/src/components/ColorConvert.tsx create mode 100644 extensions/color-picker/src/components/ColorNames.tsx create mode 100644 extensions/color-picker/src/components/CopyAsSubmenu.tsx create mode 100644 extensions/color-picker/src/components/EditTitle.tsx create mode 100644 extensions/color-picker/src/convert-color.tsx create mode 100644 extensions/color-picker/src/favorite-colors.tsx create mode 100644 extensions/color-picker/src/hooks/useColorsSelection.ts create mode 100644 extensions/color-picker/src/lib/color-format.ts create mode 100644 extensions/color-picker/src/lib/history.ts create mode 100644 extensions/color-picker/src/lib/types.ts create mode 100644 extensions/color-picker/src/lib/utils.ts create mode 100644 extensions/color-picker/src/native/picker.ts create mode 100644 extensions/color-picker/src/organize-colors.tsx create mode 100644 extensions/color-picker/src/pick-color.ts create mode 100644 extensions/color-picker/tsconfig.json diff --git a/extensions/color-picker/.gitignore b/extensions/color-picker/.gitignore new file mode 100644 index 000000000..eb3ae2051 --- /dev/null +++ b/extensions/color-picker/.gitignore @@ -0,0 +1,2 @@ +node_modules +vicinae-env.d.ts diff --git a/extensions/color-picker/README.md b/extensions/color-picker/README.md new file mode 100644 index 000000000..8faef80ae --- /dev/null +++ b/extensions/color-picker/README.md @@ -0,0 +1,59 @@ +# Color Picker for Vicinae + +A powerful cross-platform color picker, manager, and converter extension for **Vicinae**, ported and adapted from Raycast's popular Color Picker. + +Supported on **Linux** (GNOME, KDE, Wayland, X11), **macOS**, and **Windows**. + +--- + +## Commands + +### `pick-color` - Pick Color +Activates a screen loupe/eyedropper across your monitors, allowing you to sample any pixel. +- Copies the sampled color directly to the clipboard in your preferred format. +- Adds the color to your color history. +- Shows a HUD confirmation with the copied color. + +### `organize-colors` - Organize Colors +Manage, search, and export your picked color history. +- View in grid mode (with live color swatches) or list mode. +- Pin your favorite colors to the top. +- Rename colors with custom titles. +- Copy colors in 12 different formats (HEX, RGB, RGBA, HSL, HSV, OKLCH, LCH, Display P3, etc.). +- Export colors as CSS variables, CSS classes, or JSON. +- Trigger color sampling directly with a single click. + +### `favorite-colors` - Favorite Colors +Quick access to all colors pinned as favorites in Organize Colors. + +### `convert-color` - Convert Color +Universal color conversion tool. Pass any color format (or enter one in the search bar) to immediately get conversions in all major formats with one-click copy. + +### `color-names` - Color Names +Search and identify colors by their descriptive names using the `color-namer` palette. + +### `color-wheel` - Color Wheel +Interactive visual spectrum wheel to pick colors directly from a color disc. + +--- + +## Screen Picker Architecture + +- **Linux**: Uses D-Bus portal (`org.gnome.Shell.Screenshot.PickColor` and `org.freedesktop.portal.Screenshot.PickColor`) for seamless desktop integration under Wayland and X11. +- **macOS**: Native `NSColorSampler` API providing pixel-accurate magnification and system integration without requiring special accessibility permissions. +- **Windows**: Lightweight standalone Win32 magnifier with anti-aliasing and scroll-wheel zoom support. + +--- + +## Preferences + +- **Color Format**: Default format when copying picked colors (`HEX`, `HEX Lower Case`, `HEX No Prefix`, `RGB`, `RGB %`, `RGBA`, `RGBA %`, `HSLA`, `HSVA`, `OKLCH`, `LCH`, `P3`). +- **Show color name after picking**: Optionally show the matched color name in the notification after sampling. +- **Primary Action**: Configure whether selecting a color copies it to the clipboard or pastes it directly to the frontmost application. + +--- + +## Credits + +- Ported and maintained for Vicinae by [manuelcontrera](https://github.com/manuelcontrera). +- Original Raycast extension created by [thomas](https://github.com/thomas). diff --git a/extensions/color-picker/assets/bin/picker-linux.py b/extensions/color-picker/assets/bin/picker-linux.py new file mode 100755 index 000000000..2308f3d88 --- /dev/null +++ b/extensions/color-picker/assets/bin/picker-linux.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 +import sys +import json +import uuid + +def try_gnome(bus): + try: + from gi.repository import Gio + proxy = Gio.DBusProxy.new_sync( + bus, + Gio.DBusProxyFlags.NONE, + None, + 'org.gnome.Shell.Screenshot', + '/org/gnome/Shell/Screenshot', + 'org.gnome.Shell.Screenshot', + None + ) + res = proxy.call_sync('PickColor', None, Gio.DBusCallFlags.NONE, 60000, None) + val = res.unpack()[0] + if 'color' in val: + r, g, b = val['color'] + return { + "red": float(r), + "green": float(g), + "blue": float(b), + "alpha": 1.0, + "colorSpace": "sRGB" + } + return None + except Exception as e: + err_msg = str(e).lower() + if "cancel" in err_msg or "abort" in err_msg or "dismiss" in err_msg: + return "CANCELLED" + return None + +def try_portal(bus): + try: + from gi.repository import Gio, GLib + loop = GLib.MainLoop() + token = "picker_" + uuid.uuid4().hex[:8] + sender = bus.get_unique_name()[1:].replace('.', '_') + handle_path = f"/org/freedesktop/portal/desktop/request/{sender}/{token}" + + result_color = None + + def on_signal(connection, sender_name, object_path, interface_name, signal_name, parameters, user_data): + nonlocal result_color + try: + response_code, results = parameters.unpack() + if response_code == 0 and 'color' in results: + r, g, b = results['color'] + result_color = { + "red": float(r), + "green": float(g), + "blue": float(b), + "alpha": 1.0, + "colorSpace": "sRGB" + } + finally: + loop.quit() + + bus.signal_subscribe( + None, + "org.freedesktop.portal.Request", + "Response", + handle_path, + None, + Gio.DBusSignalFlags.NONE, + on_signal, + None + ) + + params = GLib.Variant.new_tuple( + GLib.Variant.new_string(""), + GLib.Variant('a{sv}', {'handle_token': GLib.Variant('s', token)}) + ) + + bus.call_sync( + "org.freedesktop.portal.Desktop", + "/org/freedesktop/portal/desktop", + "org.freedesktop.portal.Screenshot", + "PickColor", + params, + None, + Gio.DBusCallFlags.NONE, + -1, + None + ) + loop.run() + return result_color + except Exception: + return None + +def main(): + try: + from gi.repository import Gio + bus = Gio.bus_get_sync(Gio.BusType.SESSION, None) + except Exception as e: + sys.stderr.write(f"Failed to connect to D-Bus: {e}\n") + sys.exit(2) + + # 1. First try GNOME Shell native loupe (direct, no portal prompt) + color = try_gnome(bus) + if color == "CANCELLED": + sys.exit(1) + if color: + print(json.dumps(color)) + sys.exit(0) + + # 2. Fallback to XDG Desktop Portal (KDE, Wayland compositors) + color = try_portal(bus) + if color: + print(json.dumps(color)) + sys.exit(0) + + sys.exit(1) + +if __name__ == "__main__": + main() diff --git a/extensions/color-picker/assets/icon.png b/extensions/color-picker/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..76fad0915486485fd2564cafa8fcfde6a93dd8ff GIT binary patch literal 120059 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%0Ag7jXN|L|z#{?U$9_TNBYVe&?kU#ip;M}QY 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 z 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 HZ212G(CWy- literal 0 HcmV?d00001 diff --git a/extensions/color-picker/package-lock.json b/extensions/color-picker/package-lock.json new file mode 100644 index 000000000..a26b20219 --- /dev/null +++ b/extensions/color-picker/package-lock.json @@ -0,0 +1,3176 @@ +{ + "name": "color-picker", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "color-picker", + "license": "MIT", + "dependencies": { + "@vicinae/api": "^0.20.15", + "color-namer": "^1.4.0", + "colorjs.io": "^0.5.1", + "lodash": "^4.17.23" + }, + "devDependencies": { + "@types/color-namer": "^1.3.3", + "@types/lodash": "^4.17.23", + "@types/node": "^22.0.0", + "@types/react": "^19.0.0", + "typescript": "^5.8.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jgoz/esbuild-plugin-typecheck": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@jgoz/esbuild-plugin-typecheck/-/esbuild-plugin-typecheck-4.0.5.tgz", + "integrity": "sha512-yXC/6Kzcq/PAPdHFPFkqkfzw+qz/ZCyxntTGMk7CnAz1tFjv2vQuavVYIxsql5+eZetlJFM2ssPRYFtbKZGQ8w==", + "license": "MIT", + "peerDependencies": { + "@jgoz/esbuild-plugin-livereload": ">=2.1.4", + "esbuild": ">=0.25.0", + "typescript": ">= 3.5" + }, + "peerDependenciesMeta": { + "@jgoz/esbuild-plugin-livereload": { + "optional": true + } + } + }, + "node_modules/@oclif/core": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.14.0.tgz", + "integrity": "sha512-QCJIZoVJxV7jywgVAUlsQwl3dr3Sa21kfi5z9KrYolbexWJUtFSEtMoNiBWojD05mYycLnB50gp/VxlGdaOCRA==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.2", + "ansis": "^3.17.0", + "clean-stack": "^3.0.1", + "cli-spinners": "^2.9.2", + "debug": "^4.4.3", + "ejs": "^6", + "get-package-type": "^0.1.0", + "indent-string": "^4.0.0", + "lilconfig": "^3.1.3", + "minimatch": "^10.2.5", + "semver": "^7.8.1", + "string-width": "^4.2.3", + "supports-color": "^8", + "tinyglobby": "^0.2.17", + "widest-line": "^3.1.0", + "wordwrap": "^1.0.0", + "wrap-ansi": "^7.0.0", + "wsl-utils": "^0.4.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-help": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.3.0.tgz", + "integrity": "sha512-cpSRv7tyHHFPv39HrV22eNmu8ylrwjmPvqdlNo3URp79+p5319p+a8PI/3ez6A6GZmjwBj1EWUdVz1aPUAsSmw==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@oclif/plugin-plugins": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/@oclif/plugin-plugins/-/plugin-plugins-5.5.2.tgz", + "integrity": "sha512-Nyz6XBKcWRvjHCihPUCP0ubOj/k9pWwldzW39yK36t17RVYf+nVcYMLV+Kd1otB4qHKrsmt8pZI/nry6Fg5+Tg==", + "license": "MIT", + "dependencies": { + "@oclif/core": "^4.13.0", + "ansis": "^3.17.0", + "debug": "^4.4.0", + "npm": "^11.18.0", + "npm-package-arg": "^11.0.3", + "npm-run-path": "^5.3.0", + "object-treeify": "^4.0.1", + "semver": "^7.8.5", + "validate-npm-package-name": "^5.0.1", + "which": "^4.0.0", + "yarn": "^1.22.22" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@types/color-namer": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/color-namer/-/color-namer-1.3.3.tgz", + "integrity": "sha512-DJ0MHHqazwb94dUBRhahK49nXhRGk2DIRNrVNVR3U3uQjYWY4uNhEjHXO+TbFQGpZcwli1pCj6xm3S3KsB/+3A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.25.tgz", + "integrity": "sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.20.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.4.tgz", + "integrity": "sha512-zJRE40jpHtKqE/C4fgHrAKQLJuSpzEnP9ff9Y7YtoR3Wd2pwqzlekDeEuUQXjRd+QCYnVnNwuJYmhdk9XV8gvA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@vicinae/api": { + "version": "0.20.15", + "resolved": "https://registry.npmjs.org/@vicinae/api/-/api-0.20.15.tgz", + "integrity": "sha512-7FAUgdQJ+D8krDfiAfXmxKMtqo3a/oLxC4F6IA14WSCc6Wh1NWqwNyBvmPJxxrpuNg1/eQcPfHaWqm1rZCzCMA==", + "license": "ISC", + "dependencies": { + "@jgoz/esbuild-plugin-typecheck": "^4.0.3", + "@oclif/core": "^4", + "@oclif/plugin-help": "^6", + "@oclif/plugin-plugins": "^5", + "@types/node": ">=18", + "@types/react": "19.0.10", + "chokidar": "^4.0.3", + "esbuild": "^0.25.2", + "react": "19.0.0", + "zod": "^4.0.17" + }, + "bin": { + "vici": "bin/run.js" + }, + "peerDependencies": { + "@types/node": ">=18", + "@types/react": "19.0.10" + } + }, + "node_modules/@vicinae/api/node_modules/@types/react": { + "version": "19.0.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", + "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/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/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chroma-js": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-1.4.1.tgz", + "integrity": "sha512-jTwQiT859RTFN/vIf7s+Vl/Z2LcMrvMv3WUFmd/4u76AdlFC0NTNgqEEFPcRiHmAswPsMiQEDZLM8vX8qXpZNQ==" + }, + "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/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/color-namer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/color-namer/-/color-namer-1.4.0.tgz", + "integrity": "sha512-3mQMY9MJyfdV2uhe+xjQWcKHtYnPtl5svGjt89V2WWT2MlaLAd7C02886Wq7H1MTjjIIEa/NJLYPNF/Lhxhq2A==", + "license": "MIT", + "dependencies": { + "chroma-js": "^1.3.4", + "es6-weak-map": "^2.0.3" + } + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/ejs": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-6.0.1.tgz", + "integrity": "sha512-UaaM14yby8U3k02ihS1Bmj5Kz2d7CCQM1scxpgs4Mhkq8F1wR2gl3+Ts4h5Ne4Mnt7M9m4Dw7jsuMr3+xO4vZA==", + "license": "Apache-2.0", + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.12.18" + } + }, + "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/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "license": "ISC", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "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/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/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/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/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "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/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "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/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "license": "ISC" + }, + "node_modules/npm": { + "version": "11.19.1", + "resolved": "https://registry.npmjs.org/npm/-/npm-11.19.1.tgz", + "integrity": "sha512-ztsxKxt/kkIaAs+2i0GU6I+DRmUdrNasxTZKJe9TCdSjKxlhah/4r/hl5ygMD6XAg1qZ9c2TNomR4qgOydp10g==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/metavuln-calculator", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/redact", + "@npmcli/run-script", + "@sigstore/tuf", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "spdx-expression-parse", + "ssri", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which" + ], + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "mock-globals", + "mock-registry", + "workspaces/*" + ], + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^9.9.1", + "@npmcli/config": "^10.12.0", + "@npmcli/fs": "^5.0.0", + "@npmcli/map-workspaces": "^5.0.3", + "@npmcli/metavuln-calculator": "^9.0.3", + "@npmcli/package-json": "^7.0.5", + "@npmcli/promise-spawn": "^9.0.1", + "@npmcli/redact": "^4.0.0", + "@npmcli/run-script": "^10.0.4", + "@sigstore/tuf": "^4.0.2", + "abbrev": "^4.0.0", + "archy": "~1.0.0", + "cacache": "^20.0.4", + "chalk": "^5.6.2", + "ci-info": "^4.4.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^13.0.6", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^9.0.3", + "ini": "^6.0.0", + "init-package-json": "^8.2.5", + "is-cidr": "^6.0.4", + "json-parse-even-better-errors": "^5.0.0", + "libnpmaccess": "^10.0.3", + "libnpmdiff": "^8.1.12", + "libnpmexec": "^10.3.2", + "libnpmfund": "^7.0.26", + "libnpmorg": "^8.0.1", + "libnpmpack": "^9.1.13", + "libnpmpublish": "^11.2.0", + "libnpmsearch": "^9.0.1", + "libnpmteam": "^8.0.2", + "libnpmversion": "^8.0.4", + "make-fetch-happen": "^15.0.6", + "minimatch": "^10.2.5", + "minipass": "^7.1.3", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^12.4.0", + "nopt": "^9.0.0", + "npm-audit-report": "^7.0.0", + "npm-install-checks": "^8.0.0", + "npm-package-arg": "^13.0.2", + "npm-pick-manifest": "^11.0.3", + "npm-profile": "^12.0.2", + "npm-registry-fetch": "^19.1.1", + "npm-user-validate": "^4.0.0", + "p-map": "^7.0.4", + "pacote": "^21.5.1", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.1.0", + "qrcode-terminal": "^0.12.0", + "read": "^5.0.1", + "semver": "^7.8.5", + "spdx-expression-parse": "^4.0.0", + "ssri": "^13.0.1", + "supports-color": "^10.2.2", + "tar": "^7.5.22", + "text-table": "~0.2.0", + "tiny-relative-date": "^2.0.2", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^7.0.2", + "which": "^6.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "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/node_modules/@gar/promise-retry": { + "version": "1.0.3", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "4.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^11.2.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "9.9.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^5.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/metavuln-calculator": "^9.0.2", + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/query": "^5.0.0", + "@npmcli/redact": "^4.0.0", + "@npmcli/run-script": "^10.0.0", + "bin-links": "^6.0.0", + "cacache": "^20.0.1", + "common-ancestor-path": "^2.0.0", + "hosted-git-info": "^9.0.0", + "json-stringify-nice": "^1.1.4", + "lru-cache": "^11.2.1", + "minimatch": "^10.0.3", + "nopt": "^9.0.0", + "npm-install-checks": "^8.0.0", + "npm-package-arg": "^13.0.0", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "pacote": "^21.0.2", + "parse-conflict-json": "^5.0.1", + "proc-log": "^6.0.0", + "proggy": "^4.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "semver": "^7.3.7", + "ssri": "^13.0.0", + "treeverse": "^3.0.0", + "walk-up-path": "^4.0.0" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "10.12.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "ci-info": "^4.0.0", + "ini": "^6.0.0", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "walk-up-path": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "7.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", + "lru-cache": "^11.2.1", + "npm-pick-manifest": "^11.0.1", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "5.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "glob": "^13.0.0", + "minimatch": "^10.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "9.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^20.0.0", + "json-parse-even-better-errors": "^5.0.0", + "pacote": "^21.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "7.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", + "semver": "^7.5.3", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "9.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/redact": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "10.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "4.0.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "3.2.1", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.5.1", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "4.1.1", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@gar/promise-retry": "^1.0.2", + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.4", + "proc-log": "^6.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "4.0.2", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "3.1.1", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.1", + "@sigstore/protobuf-specs": "^0.5.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "4.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^10.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "7.1.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "4.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/npm/node_modules/bin-links": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "proc-log": "^6.0.0", + "read-cmd-shim": "^6.0.0", + "write-file-atomic": "^7.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "5.0.9", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "20.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^5.0.0", + "fs-minipass": "^3.0.0", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^13.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "5.6.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "3.0.0", + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/npm/node_modules/ci-info": { + "version": "4.4.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "5.0.5", + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "8.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "2.0.0", + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/debug": { + "version": "4.4.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/diff": { + "version": "8.0.4", + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.3", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "13.0.6", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "9.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.2.0", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "7.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "7.0.6", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.7.2", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "8.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^10.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/ini": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "8.2.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/package-json": "^7.0.0", + "npm-package-arg": "^13.0.0", + "promzard": "^3.0.1", + "read": "^5.0.1", + "semver": "^7.7.2", + "validate-npm-package-name": "^7.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/ip-address": { + "version": "10.5.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "6.0.4", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "^5.0.4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/npm/node_modules/isexe": { + "version": "4.0.0", + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "5.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "10.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^13.0.0", + "npm-registry-fetch": "^19.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "8.1.12", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^9.9.1", + "@npmcli/installed-package-contents": "^4.0.0", + "binary-extensions": "^3.0.0", + "diff": "^8.0.2", + "minimatch": "^10.0.3", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2", + "tar": "^7.5.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "10.3.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/arborist": "^9.9.1", + "@npmcli/package-json": "^7.0.0", + "@npmcli/run-script": "^10.0.0", + "ci-info": "^4.0.0", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2", + "proc-log": "^6.0.0", + "read": "^5.0.1", + "semver": "^7.3.7", + "signal-exit": "^4.1.0", + "walk-up-path": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "7.0.26", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^9.9.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "8.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^19.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "9.1.13", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^9.9.1", + "@npmcli/run-script": "^10.0.0", + "npm-package-arg": "^13.0.0", + "pacote": "^21.0.2" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "11.2.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/package-json": "^7.0.0", + "ci-info": "^4.0.0", + "npm-package-arg": "^13.0.0", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.7", + "sigstore": "^4.0.0", + "ssri": "^13.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "9.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^19.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^19.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "8.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^7.0.0", + "@npmcli/run-script": "^10.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "11.5.1", + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "15.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/agent": "^4.0.0", + "@npmcli/redact": "^4.0.0", + "cacache": "^20.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^6.0.0", + "ssri": "^13.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "10.2.5", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "7.1.3", + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "5.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^2.0.0", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + }, + "optionalDependencies": { + "iconv-lite": "^0.7.2" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.6", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minipass": "^7.1.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "12.4.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^5.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "8.0.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "13.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^7.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "10.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "11.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "npm-package-arg": "^13.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "12.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "19.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^4.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^15.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "4.0.0", + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "7.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/pacote": { + "version": "21.5.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/git": "^7.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "@npmcli/run-script": "^10.0.0", + "cacache": "^20.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^13.0.0", + "npm-packlist": "^10.0.1", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", + "sigstore": "^4.0.0", + "ssri": "^13.0.0", + "tar": "^7.4.3" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^5.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/path-scurry": { + "version": "2.0.2", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "7.1.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "6.1.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/proggy": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "^5.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "^3.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "optional": true + }, + "node_modules/npm/node_modules/semver": { + "version": "7.8.5", + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/sigstore": { + "version": "4.1.1", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.1", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.1.1", + "@sigstore/tuf": "^4.0.2", + "@sigstore/verify": "^3.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.8.9", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.5", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.5.0", + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.23", + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/ssri": { + "version": "13.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "10.2.2", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "7.5.22", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "2.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tinyglobby": { + "version": "0.2.17", + "inBundle": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js": { + "version": "4.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/undici": { + "version": "6.28.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "7.0.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/walk-up-path": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/npm/node_modules/which": { + "version": "6.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm/node_modules/yallist": { + "version": "5.0.0", + "inBundle": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/object-treeify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-4.0.1.tgz", + "integrity": "sha512-Y6tg5rHfsefSkfKujv2SwHulInROy/rCL5F4w0QOWxut8AnxYxf0YmNhTh95Zfyxpsudo66uqkux0ACFnyMSgQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "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/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/powershell-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", + "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/react": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", + "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/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/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "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/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/wsl-utils": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.4.0.tgz", + "integrity": "sha512-9YmF+2sFEd+T7TkwlmE337F0IVzfDvDknhtpBQxxXzEOfgPphGlFYpyx0cTuCIFj8/p+sqwBYAeGxOMNSzPPDA==", + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yarn": { + "version": "1.22.22", + "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.22.tgz", + "integrity": "sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==", + "hasInstallScript": true, + "license": "BSD-2-Clause", + "bin": { + "yarn": "bin/yarn.js", + "yarnpkg": "bin/yarn.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/zod": { + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", + "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/extensions/color-picker/package.json b/extensions/color-picker/package.json new file mode 100644 index 000000000..4f9b6719f --- /dev/null +++ b/extensions/color-picker/package.json @@ -0,0 +1,205 @@ +{ + "$schema": "https://raw.githubusercontent.com/vicinaehq/vicinae/refs/heads/main/extra/schemas/extension.json", + "name": "color-picker", + "title": "Color Picker", + "description": "Pick, organize, and convert colors on Mac, Windows, and Linux", + "icon": "icon.png", + "author": "manuelcontrera", + "pastContributors": [ + "thomas" + ], + "categories": [ + "Design Tools", + "Developer Tools" + ], + "license": "MIT", + "commands": [ + { + "name": "pick-color", + "title": "Pick Color", + "description": "Pick a color on your desktop", + "mode": "no-view", + "icon": "icon.png", + "preferences": [ + { + "name": "showColorName", + "title": "Show color name after picking", + "description": "Show the name of the picked color after picking", + "type": "checkbox", + "label": "Show", + "default": false, + "required": false + } + ] + }, + { + "name": "organize-colors", + "title": "Organize Colors", + "description": "Organize and manage your picked colors", + "mode": "view", + "icon": "icon.png", + "preferences": [ + { + "name": "primaryAction", + "title": "Primary Action", + "description": "The primary action to perform on a selected color", + "type": "dropdown", + "default": "copy", + "required": false, + "data": [ + { + "title": "Copy to Clipboard", + "value": "copy" + }, + { + "title": "Paste to Active App", + "value": "paste" + } + ] + } + ] + }, + { + "name": "favorite-colors", + "title": "Favorite Colors", + "description": "View and use your favorite colors", + "mode": "view", + "icon": "icon.png" + }, + { + "name": "convert-color", + "title": "Convert Color", + "description": "Convert any color to a different format", + "mode": "view", + "icon": "icon.png", + "arguments": [ + { + "name": "text", + "type": "text", + "required": false, + "placeholder": "#FF6363" + } + ] + }, + { + "name": "color-names", + "title": "Color Names", + "description": "Search and identify colors by name", + "mode": "view", + "icon": "icon.png", + "preferences": [ + { + "type": "dropdown", + "name": "colorNamesPerGroup", + "required": false, + "title": "Color Names Per Group", + "description": "The number of color names to display per group", + "default": "5", + "data": [ + { + "title": "5", + "value": "5" + }, + { + "title": "10", + "value": "10" + }, + { + "title": "25", + "value": "25" + }, + { + "title": "All", + "value": "Infinity" + } + ] + } + ] + }, + { + "name": "color-wheel", + "title": "Color Wheel", + "description": "Pick a color with interactive color wheel", + "mode": "view", + "icon": "icon.png" + } + ], + "preferences": [ + { + "name": "colorFormat", + "title": "Color Format", + "description": "The color format to use when copying/pasting colors", + "type": "dropdown", + "default": "hex", + "required": false, + "data": [ + { + "title": "HEX - #FF6363", + "value": "hex" + }, + { + "title": "HEX Lower Case - #ff6363", + "value": "hex-lower-case" + }, + { + "title": "HEX No Prefix - FF6363", + "value": "hex-no-prefix" + }, + { + "title": "RGB - rgb(255 99 99 / 100%)", + "value": "rgb" + }, + { + "title": "RGB % - rgb(100% 38% 38% / 100%)", + "value": "rgb-percentage" + }, + { + "title": "RGBA - rgba(255, 99, 99, 1)", + "value": "rgba" + }, + { + "title": "RGBA % - rgba(100%, 39%, 39%, 1)", + "value": "rgba-percentage" + }, + { + "title": "HSLA - hsla(0, 100%, 69%, 1)", + "value": "hsla" + }, + { + "title": "HSVA - color(hsv 43.082 81.145 100)", + "value": "hsva" + }, + { + "title": "OKLCH - oklch(0.6987 0.1902 23.468)", + "value": "oklch" + }, + { + "title": "LCH - lch(63.127 68.676 28.723)", + "value": "lch" + }, + { + "title": "P3 - color(display-p3 0.9248 0.428 0.4078)", + "value": "p3" + } + ] + } + ], + "scripts": { + "build": "vici build", + "dev": "vici develop", + "lint": "vici lint" + }, + "dependencies": { + "@vicinae/api": "^0.20.15", + "color-namer": "^1.4.0", + "colorjs.io": "^0.5.1", + "lodash": "^4.17.23" + }, + "devDependencies": { + "@types/color-namer": "^1.3.3", + "@types/lodash": "^4.17.23", + "@types/node": "^22.0.0", + "@types/react": "^19.0.0", + "typescript": "^5.8.0" + } +} diff --git a/extensions/color-picker/src/color-names.tsx b/extensions/color-picker/src/color-names.tsx new file mode 100644 index 000000000..f7fe483b2 --- /dev/null +++ b/extensions/color-picker/src/color-names.tsx @@ -0,0 +1,76 @@ +import { getPreferenceValues, List } from "@vicinae/api"; +import colorNamer from "color-namer"; +import { useEffect, useState } from "react"; +import { ColorNameListItem } from "./components/ColorNames"; +import type { ColorNamesPreferences, SortType } from "./lib/types"; +import { getColorByPlatform, getColorByProximity, normalizeColorHex } from "./lib/utils"; + +export default function ColorNames() { + const [isSearching, setIsSearching] = useState(false); + const [searchString, setSearchString] = useState("#FF6363"); + const [colors, setColors] = useState>(); + const [sortBy, setSortBy] = useState("platform"); + const normalizedSearchString = normalizeColorHex(searchString); + + let colorNamesPerGroup = "5"; + try { + const prefs = getPreferenceValues(); + if (prefs?.colorNamesPerGroup) { + colorNamesPerGroup = prefs.colorNamesPerGroup; + } + } catch { + // default + } + + const loadColors = (hexStr: string) => { + setIsSearching(true); + try { + const result = colorNamer(hexStr); + setColors(result); + } catch { + setColors(undefined); + } + setIsSearching(false); + }; + + useEffect(() => { + loadColors(normalizedSearchString); + }, [normalizedSearchString]); + + return ( + { + setSortBy(v as SortType); + }} + > + + + + } + > + {colors ? ( + sortBy === "platform" ? ( + getColorByPlatform(normalizedSearchString, colors).map(([palette, colorList]) => ( + + {colorList.slice(0, Number(colorNamesPerGroup)).map((color, index) => ( + + ))} + + )) + ) : ( + getColorByProximity(colors).map((color, index) => ( + + )) + ) + ) : ( + + )} + + ); +} diff --git a/extensions/color-picker/src/color-wheel.tsx b/extensions/color-picker/src/color-wheel.tsx new file mode 100644 index 000000000..718f1653b --- /dev/null +++ b/extensions/color-picker/src/color-wheel.tsx @@ -0,0 +1,59 @@ +import { Action, ActionPanel, Clipboard, closeMainWindow, Detail, popToRoot, showHUD } from "@vicinae/api"; +import { useEffect, useRef } from "react"; +import { addToHistory } from "./lib/history"; +import type { Color } from "./lib/types"; +import { getFormattedColor } from "./lib/utils"; +import { pickScreenColor } from "./native/picker"; + +const COLOR_WHEEL_MARKDOWN = ` +# Color Wheel + +Click the **Pick from Wheel** button below or use the screen picker to select any color from the spectrum. + +![RGB Color Wheel](rgb-color-wheel.png) +`; + +export default function Command() { + const hasInitialized = useRef(false); + + async function pickAndHandleColor() { + try { + const pickedColor: Color | null = await pickScreenColor(); + if (!pickedColor) { + return; + } + + addToHistory(pickedColor); + + const formattedColor = getFormattedColor(pickedColor); + if (!formattedColor) { + throw new Error("Failed to format color"); + } + + await Clipboard.copy(formattedColor); + await showHUD(`Copied color ${formattedColor} to clipboard`); + await closeMainWindow(); + await popToRoot(); + } catch (e) { + console.error(e); + await showHUD("❌ Failed picking color"); + } + } + + useEffect(() => { + if (hasInitialized.current) return; + hasInitialized.current = true; + pickAndHandleColor(); + }, []); + + return ( + + + + } + /> + ); +} diff --git a/extensions/color-picker/src/components/ColorConvert.tsx b/extensions/color-picker/src/components/ColorConvert.tsx new file mode 100644 index 000000000..ef9b7b927 --- /dev/null +++ b/extensions/color-picker/src/components/ColorConvert.tsx @@ -0,0 +1,49 @@ +import { Action, ActionPanel, Clipboard, List, LocalStorage, popToRoot, showHUD, showToast, Toast } from "@vicinae/api"; +import type { ColorFormatType } from "../lib/types"; +import { getFormattedColor } from "../lib/utils"; + +type ColorFormatProps = { + text: string; + title: string; + value: string; +}; + +function getConvertedColor(text: string, format: ColorFormatType) { + try { + const convertedColor = getFormattedColor(text, format); + return convertedColor; + } catch { + showToast({ + style: Toast.Style.Failure, + title: "Conversion failed", + message: `"${text}" is not a valid color.`, + }); + } +} + +export const ColorConvertListItem = ({ text, title, value }: ColorFormatProps) => { + const convertedColor = getConvertedColor(text, value as ColorFormatType); + if (!convertedColor) return null; + + return ( + + { + if (convertedColor) { + await Clipboard.copy(convertedColor); + await showHUD("Copied color to clipboard"); + } + await LocalStorage.setItem("lastConvertedColorFormat", value); + popToRoot({ clearSearchBar: true }); + }} + /> + + } + /> + ); +}; diff --git a/extensions/color-picker/src/components/ColorNames.tsx b/extensions/color-picker/src/components/ColorNames.tsx new file mode 100644 index 000000000..635c0b51f --- /dev/null +++ b/extensions/color-picker/src/components/ColorNames.tsx @@ -0,0 +1,35 @@ +import { Action, ActionPanel, Icon, List } from "@vicinae/api"; +import type { Color } from "color-namer"; +import { normalizeColorHex } from "../lib/utils"; + +export const ColorNameListItem = ({ color }: { color: Color }) => { + const hexCode = `#${color.hex.replace(/^#/, "")}`; + + return ( + + + + + } + /> + ); +}; diff --git a/extensions/color-picker/src/components/CopyAsSubmenu.tsx b/extensions/color-picker/src/components/CopyAsSubmenu.tsx new file mode 100644 index 000000000..774c2e249 --- /dev/null +++ b/extensions/color-picker/src/components/CopyAsSubmenu.tsx @@ -0,0 +1,43 @@ +import { Action, ActionPanel, Icon, Keyboard } from "@vicinae/api"; +import type { HistoryColor } from "../lib/types"; +import { getFormattedColor } from "../lib/utils"; + +type CopyAsSubmenuProps = { + color: HistoryColor; + onCopy?: () => void; +}; + +export default function CopyAsSubmenu({ color, onCopy }: CopyAsSubmenuProps) { + return ( + + + + + + + + + + + + + + + ); +} diff --git a/extensions/color-picker/src/components/EditTitle.tsx b/extensions/color-picker/src/components/EditTitle.tsx new file mode 100644 index 000000000..29716add2 --- /dev/null +++ b/extensions/color-picker/src/components/EditTitle.tsx @@ -0,0 +1,24 @@ +import { Action, ActionPanel, Form, useNavigation } from "@vicinae/api"; +import type { HistoryItem } from "../lib/types"; + +export function EditTitle(props: { item: HistoryItem; onEdit: (item: HistoryItem) => void }) { + const { item } = props; + const { pop } = useNavigation(); + + return ( +
+ { + props.onEdit({ ...item, title: values.title }); + pop(); + }} + /> + + } + > + + + ); +} diff --git a/extensions/color-picker/src/convert-color.tsx b/extensions/color-picker/src/convert-color.tsx new file mode 100644 index 000000000..4a19c89d8 --- /dev/null +++ b/extensions/color-picker/src/convert-color.tsx @@ -0,0 +1,83 @@ +import { List, LocalStorage, showToast, Toast } from "@vicinae/api"; +import { useEffect, useRef, useState } from "react"; +import { ColorConvertListItem } from "./components/ColorConvert"; + +interface ConvertColorProps { + arguments?: { + text?: string; + }; +} + +export default function ConvertColor(props: ConvertColorProps) { + const [colorText, setColorText] = useState(props.arguments?.text || null); + const [lastConvertedColorFormat, setLastConvertedColorFormat] = useState(undefined); + const [isLoading, setIsLoading] = useState(true); + const hasInitialized = useRef(false); + + useEffect(() => { + if (hasInitialized.current) return; + hasInitialized.current = true; + + async function getLastFormatAndText() { + setIsLoading(true); + try { + const lastFormat = await LocalStorage.getItem("lastConvertedColorFormat"); + setLastConvertedColorFormat(lastFormat); + } catch { + // ignore + } + + if (!colorText) { + // Default example color if no text provided + setColorText("#FF6363"); + } + setIsLoading(false); + } + + getLastFormatAndText(); + }, [colorText]); + + const format = [ + { title: "HEX", subtitle: "#FF6363", value: "hex" }, + { title: "HEX Lower Case", subtitle: "#ff6363", value: "hex-lower-case" }, + { title: "HEX No Prefix", subtitle: "FF6363", value: "hex-no-prefix" }, + { title: "RGB", subtitle: "rgb(255 99 99 / 100%)", value: "rgb" }, + { title: "RGB %", subtitle: "rgb(100% 38% 38% / 100%)", value: "rgb-percentage" }, + { title: "RGBA", subtitle: "rgba(255, 99, 99, 1)", value: "rgba" }, + { title: "RGBA %", subtitle: "rgba(100%, 39%, 39%, 1)", value: "rgba-percentage" }, + { title: "HSLA", subtitle: "hsla(0, 100%, 69%, 1)", value: "hsla" }, + { title: "HSVA", subtitle: "color(hsv 43.082 81.145 100)", value: "hsva" }, + { title: "OKLCH", subtitle: "oklch(0.6987 0.1902 23.468)", value: "oklch" }, + { title: "LCH", subtitle: "lch(63.127 68.676 28.723)", value: "lch" }, + { title: "P3", subtitle: "color(display-p3 0.9248 0.428 0.4078)", value: "p3" }, + ]; + + if (lastConvertedColorFormat) { + const index = format.findIndex((item) => item.value === lastConvertedColorFormat); + if (index !== -1) { + const [lastFormat] = format.splice(index, 1); + format.unshift(lastFormat); + } + } + + return ( + { + if (text && text.trim().length > 0) { + setColorText(text.trim()); + } + }} + > + {colorText && + format.map((item) => ( + + ))} + + + ); +} diff --git a/extensions/color-picker/src/favorite-colors.tsx b/extensions/color-picker/src/favorite-colors.tsx new file mode 100644 index 000000000..43402d80a --- /dev/null +++ b/extensions/color-picker/src/favorite-colors.tsx @@ -0,0 +1,65 @@ +import { Action, ActionPanel, Icon, List, showToast } from "@vicinae/api"; +import { useHistory } from "./lib/history"; +import { getAccessories, getFormattedColor, getIcon, getPreviewColor } from "./lib/utils"; +import OrganizeColors from "./organize-colors"; + +function OpenOrganizeColorsAction() { + return ( + } + /> + ); +} + +export default function Command() { + const { history, removeFromFavorites } = useHistory(); + const favorites = history?.filter((item) => item.isFavorite) ?? []; + + return ( + + {history !== undefined && favorites.length === 0 ? ( + + + + } + /> + ) : ( + favorites.map((item) => { + const formattedColor = getFormattedColor(item.color); + const previewColor = getPreviewColor(item.color); + + return ( + + + { + removeFromFavorites(item.color); + await showToast({ title: "Removed from favorites" }); + }} + /> + + + } + /> + ); + }) + )} + + ); +} diff --git a/extensions/color-picker/src/hooks/useColorsSelection.ts b/extensions/color-picker/src/hooks/useColorsSelection.ts new file mode 100644 index 000000000..80a9ca8d7 --- /dev/null +++ b/extensions/color-picker/src/hooks/useColorsSelection.ts @@ -0,0 +1,54 @@ +import { useEffect, useState } from "react"; +import type { HistoryItem, UseColorsSelectionObject } from "../lib/types"; + +type UseSelectionReturn = { + selection: UseColorsSelectionObject; +}; + +export function useColorsSelection( + items: T[], + getKey?: (item: T) => string, +): UseSelectionReturn { + const [selectedKeys, setSelectedKeys] = useState>(new Set()); + + const computeKey = (i: T): string => (getKey ? getKey(i) : (i as unknown as string)); + + useEffect(() => { + setSelectedKeys((prev) => { + if (prev.size === 0) return prev; + const valid = new Set(items.map((i) => (getKey ? getKey(i) : (i as unknown as string)))); + const next = new Set(); + for (const k of prev) if (valid.has(k)) next.add(k); + return next.size === prev.size ? prev : next; + }); + }, [items, getKey]); + + const toggleSelection = (item: T) => { + setSelectedKeys((prev) => { + const next = new Set(prev); + const k = computeKey(item); + if (next.has(k)) next.delete(k); + else next.add(k); + return next; + }); + }; + + const selectAll = () => setSelectedKeys(new Set(items.map(computeKey))); + const clearSelection = () => setSelectedKeys(new Set()); + const getIsItemSelected = (item: T) => selectedKeys.has(computeKey(item)); + + const selectedItems = items.filter((i) => selectedKeys.has(computeKey(i))); + + return { + selection: { + actions: { toggleSelection, selectAll, clearSelection }, + selected: { + selectedItems, + anySelected: selectedItems.length > 0, + allSelected: items.length > 0 && selectedItems.length === items.length, + countSelected: selectedItems.length, + }, + helpers: { getIsItemSelected }, + }, + }; +} diff --git a/extensions/color-picker/src/lib/color-format.ts b/extensions/color-picker/src/lib/color-format.ts new file mode 100644 index 000000000..64d07dce8 --- /dev/null +++ b/extensions/color-picker/src/lib/color-format.ts @@ -0,0 +1,55 @@ +import ColorJS from "colorjs.io"; +import type { ColorFormatType, HistoryColor } from "./types"; + +export function formatColor(_color: HistoryColor, format?: ColorFormatType) { + let color: any; + if (typeof _color === "string") { + color = new ColorJS(_color); + } else if ("colorSpace" in _color) { + color = new ColorJS(_color.colorSpace, [_color.red, _color.green, _color.blue], _color.alpha); + } else { + color = new ColorJS("srgb", [_color.red / 255, _color.green / 255, _color.blue / 255], _color.alpha); + } + + switch (format) { + default: + case "hex": { + return color.to("srgb").toString({ format: "hex" }).toUpperCase(); + } + case "hex-lower-case": { + return color.to("srgb").toString({ format: "hex" }).toLowerCase(); + } + case "hex-no-prefix": { + return color.to("srgb").toString({ format: "hex" }).replace("#", ""); + } + case "rgb": { + return color.to("srgb").toString({ format: "rgb_number" }); + } + case "rgb-percentage": { + return color.to("srgb").toString({ format: "rgb" }); + } + case "rgba": { + return color.to("srgb").toString({ format: "rgba_number" }); + } + case "rgba-percentage": { + return color.to("srgb").toString({ format: "rgba" }); + } + case "hsla": { + return color.to("hsl").toString({ format: "hsla" }); + } + case "hsva": { + return color.to("hsv").toString({ format: "color" }); + } + case "oklch": { + return color.to("oklch").toString(); + } + case "lch": { + const lchColor = color.to("lch"); + const [l, c, h] = lchColor.coords; + return `lch(${l.toFixed(2)}% ${c} ${h})`; + } + case "p3": { + return color.to("p3").toString({ format: "p3" }); + } + } +} diff --git a/extensions/color-picker/src/lib/history.ts b/extensions/color-picker/src/lib/history.ts new file mode 100644 index 000000000..e4205edbf --- /dev/null +++ b/extensions/color-picker/src/lib/history.ts @@ -0,0 +1,115 @@ +import { Cache } from "@vicinae/api"; +import { useEffect, useState } from "react"; +import type { HistoryColor, HistoryItem } from "./types"; +import { getFormattedColor } from "./utils"; + +const MAX_HISTORY_LENGTH = 200; +const cache = new Cache(); + +export function getHistory(): HistoryItem[] { + const data = cache.get("history"); + if (!data) return []; + try { + return JSON.parse(data) as HistoryItem[]; + } catch { + return []; + } +} + +export function saveHistory(items: HistoryItem[]) { + cache.set("history", JSON.stringify(items)); +} + +export function addToHistory(color: HistoryColor, options?: { isFavorite?: boolean }) { + const previousHistory = getHistory(); + const colorKey = getFormattedColor(color); + const previousHistoryItem = previousHistory.find((item) => getFormattedColor(item.color) === colorKey); + + const historyItem: HistoryItem = { + date: new Date().toISOString(), + color, + title: previousHistoryItem?.title, + isFavorite: options?.isFavorite ?? previousHistoryItem?.isFavorite, + }; + + const history = previousHistoryItem?.isFavorite + ? previousHistory.map((item) => (getFormattedColor(item.color) === colorKey ? historyItem : item)) + : [historyItem, ...previousHistory.filter((item) => getFormattedColor(item.color) !== colorKey)]; + + const persistentItemsCount = history.filter((item) => item.isFavorite).length; + const maxRegularHistoryLength = Math.max(MAX_HISTORY_LENGTH - persistentItemsCount, 0); + let regularHistoryCount = 0; + const newHistory = history.filter((item) => { + if (item.isFavorite) return true; + regularHistoryCount += 1; + return regularHistoryCount <= maxRegularHistoryLength; + }); + + saveHistory(newHistory); +} + +export function useHistory() { + const [history, setHistory] = useState(() => getHistory()); + + useEffect(() => { + setHistory(getHistory()); + const unsubscribe = cache.subscribe((key, data) => { + if (key === "history") { + try { + setHistory(data ? JSON.parse(data) : []); + } catch { + setHistory([]); + } + } + }); + return () => { + if (typeof unsubscribe === "function") { + unsubscribe(); + } + }; + }, []); + + const update = (color: HistoryColor, updateItem: (item: HistoryItem) => HistoryItem) => { + const next = history.map((item) => + getFormattedColor(item.color) === getFormattedColor(color) ? updateItem(item) : item, + ); + saveHistory(next); + }; + + return { + history, + remove: (color: HistoryColor) => { + const next = history.filter((item) => getFormattedColor(item.color) !== getFormattedColor(color)); + saveHistory(next); + }, + edit: (historyItem: HistoryItem) => { + const next = history.map((item) => + getFormattedColor(item.color) === getFormattedColor(historyItem.color) ? historyItem : item, + ); + saveHistory(next); + }, + addToFavorites: (color: HistoryColor) => update(color, (item) => ({ ...item, isFavorite: true })), + removeFromFavorites: (color: HistoryColor) => update(color, (item) => ({ ...item, isFavorite: false })), + moveFavorite: (color: HistoryColor, direction: "up" | "down") => { + const colorKey = getFormattedColor(color); + const currentIndex = history.findIndex( + (item) => item.isFavorite && getFormattedColor(item.color) === colorKey, + ); + if (currentIndex === -1) return; + + const favoriteIndexes = history.reduce((indexes, item, index) => { + if (item.isFavorite) indexes.push(index); + return indexes; + }, []); + const favoriteIndex = favoriteIndexes.indexOf(currentIndex); + const targetFavoriteIndex = favoriteIndex + (direction === "up" ? -1 : 1); + const targetIndex = favoriteIndexes[targetFavoriteIndex]; + if (targetIndex === undefined) return; + + const nextHistory = [...history]; + [nextHistory[currentIndex], nextHistory[targetIndex]] = [nextHistory[targetIndex], nextHistory[currentIndex]]; + saveHistory(nextHistory); + }, + clear: () => saveHistory([]), + }; +} diff --git a/extensions/color-picker/src/lib/types.ts b/extensions/color-picker/src/lib/types.ts new file mode 100644 index 000000000..248dda0bb --- /dev/null +++ b/extensions/color-picker/src/lib/types.ts @@ -0,0 +1,76 @@ +export type Color = { + alpha: number; + red: number; // between 0 and 1 + green: number; // between 0 and 1 + blue: number; // between 0 and 1 + colorSpace: string; +}; + +export type DeprecatedColor = { + alpha: number; + red: number; // between 0 and 255 + green: number; // between 0 and 255 + blue: number; // between 0 and 255 +}; + +export type HistoryColor = Color | DeprecatedColor | string; + +export type HistoryItem = { + date: string; + color: HistoryColor; + title?: string; + isFavorite?: boolean; +}; + +export type SortType = "platform" | "proximity"; + +export type ColorFormatType = + | "hex" + | "hex-lower-case" + | "hex-no-prefix" + | "rgb" + | "rgb-percentage" + | "rgba" + | "rgba-percentage" + | "hsla" + | "hsva" + | "oklch" + | "lch" + | "p3"; + +export type UseColorsSelectionObject = { + actions: { + toggleSelection: (item: T) => void; + selectAll: () => void; + clearSelection: () => void; + }; + selected: { + selectedItems: T[]; + anySelected: boolean; + allSelected: boolean; + countSelected: number; + }; + helpers: { + getIsItemSelected: (item: T) => boolean; + }; +}; + +export type CopyColorsFormat = "json" | "css-classes" | "css-variables"; + +export type SelectMode = "single" | "multi"; + +export interface ExtensionPreferences { + colorFormat?: ColorFormatType; +} + +export interface PickColorPreferences { + showColorName?: boolean; +} + +export interface OrganizeColorsPreferences { + primaryAction?: "copy" | "paste"; +} + +export interface ColorNamesPreferences { + colorNamesPerGroup?: string; +} diff --git a/extensions/color-picker/src/lib/utils.ts b/extensions/color-picker/src/lib/utils.ts new file mode 100644 index 000000000..b65acb281 --- /dev/null +++ b/extensions/color-picker/src/lib/utils.ts @@ -0,0 +1,150 @@ +import { getPreferenceValues, Icon, Image, Keyboard, List } from "@vicinae/api"; +import type { Colors, Palette } from "color-namer"; +import uniqBy from "lodash/uniqBy"; +import { formatColor } from "./color-format"; +import type { ColorFormatType, CopyColorsFormat, ExtensionPreferences, HistoryColor, HistoryItem } from "./types"; + +export const isMac = process.platform === "darwin"; +export const isWindows = process.platform === "win32"; + +export function getPreferences(): ExtensionPreferences { + try { + return getPreferenceValues(); + } catch { + return {}; + } +} + +export function getFormattedColor(_color: HistoryColor, format?: ColorFormatType) { + const prefs = getPreferences(); + return formatColor(_color, format || prefs.colorFormat || "hex"); +} + +export function getPreviewColor(color: HistoryColor) { + try { + return getFormattedColor(color, "hex"); + } catch { + return typeof color === "string" ? color : "#000000"; + } +} + +export function getShortcut(index: number) { + const key = index + 1; + let shortcut: Keyboard.Shortcut | undefined; + if (key >= 1 && key <= 9) { + shortcut = { modifiers: ["cmd"], key: String(key) as Keyboard.KeyEquivalent }; + } + return shortcut; +} + +export function getIcon(color: HistoryColor): Image.ImageLike | undefined { + let previewColor: string | undefined; + try { + previewColor = getFormattedColor(color, "hex"); + } catch { + previewColor = typeof color === "string" ? color : undefined; + } + if (!previewColor) { + return undefined; + } + + const icon: Image.ImageLike = { + source: Icon.CircleFilled, + tintColor: { light: previewColor, dark: previewColor, adjustContrast: false }, + }; + + return icon; +} + +export function getAccessories(historyItem: HistoryItem) { + const accessories = new Array(); + accessories.push({ date: new Date(historyItem.date), tooltip: new Date(historyItem.date).toLocaleString() }); + return accessories; +} + +export function normalizeColorHex(colorInput: string) { + let hex = colorInput.replace(/^#/, ""); + const validHexPattern = /^([a-f\d]{3,4}|[a-f\d]{6}|[a-f]\d{8})$/i; + if (validHexPattern.test(hex)) { + switch (hex.length) { + case 3: + case 4: + hex = hex + .slice(0, 3) + .split("") + .map((x) => x.repeat(2)) + .join(""); + break; + case 8: + hex = hex.slice(0, 6); + break; + } + } + return "#" + hex.toUpperCase(); +} + +export function getColorByPlatform(normalizedSearchString: string, colors?: Colors) { + return Object.entries(colors ?? {}).sort(([, a], [, b]) => { + if (normalizeColorHex(a[0].hex) === normalizeColorHex(b[0].hex)) return 0; + if (normalizedSearchString === normalizeColorHex(a[0].hex)) return -1; + return 1; + }); +} + +export function getColorByProximity(colors?: Colors) { + return uniqBy(Object.values(colors ?? {}).flat(), (x) => x.name.toLowerCase()).sort( + (a, b) => a.distance - b.distance, + ); +} + +export const COPY_FORMATS: Array<{ format: CopyColorsFormat; title: string; icon: Icon }> = [ + { format: "json", title: "Copy Colors as JSON", icon: Icon.CodeBlock }, + { format: "css-classes", title: "Copy Colors as CSS Classes", icon: Icon.Brush }, + { format: "css-variables", title: "Copy Colors as CSS Variables", icon: Icon.Gear }, +]; + +export function getColor(item: HistoryItem | string): HistoryColor { + return typeof item === "string" ? item : item.color; +} + +export function parseColorList(colors: string): string[] { + const parsed = colors + .split(";") + .map((color) => color.trim()) + .filter((color) => color.length > 0); + + if (parsed.length === 0) { + throw new Error("Provide at least one CSS color."); + } + + return parsed; +} + +export function copyAsJSON(items: (HistoryItem | string)[]): string { + return JSON.stringify({ colors: items.map((item) => getFormattedColor(getColor(item))) }, null, 2); +} + +export function copyAsCSSClasses(items: (HistoryItem | string)[]): string { + return items + .map((item, index) => { + const color = getFormattedColor(getColor(item)); + return `.color-${index + 1} {\n color: ${color};\n}`; + }) + .join("\n\n"); +} + +export function copyAsCSSVariables(items: (HistoryItem | string)[]): string { + const lines = items.map((item, index) => ` --color-${index + 1}: ${getFormattedColor(getColor(item))};`); + return [":root {", ...lines, "}"].join("\n"); +} + +export function copySelectedColors(items: (HistoryItem | string)[], format: CopyColorsFormat): string { + switch (format) { + case "json": + return copyAsJSON(items); + case "css-classes": + return copyAsCSSClasses(items); + case "css-variables": + return copyAsCSSVariables(items); + } +} diff --git a/extensions/color-picker/src/native/picker.ts b/extensions/color-picker/src/native/picker.ts new file mode 100644 index 000000000..83300eefd --- /dev/null +++ b/extensions/color-picker/src/native/picker.ts @@ -0,0 +1,76 @@ +import { execFile } from "node:child_process"; +import { existsSync } from "node:fs"; +import path from "node:path"; +import { promisify } from "node:util"; +import { environment } from "@vicinae/api"; +import type { Color } from "../lib/types"; + +const execFileAsync = promisify(execFile); + +export async function pickScreenColor(): Promise { + const platform = process.platform; + + let assetsPath = ""; + try { + assetsPath = environment.assetsPath || ""; + } catch { + // fallback + } + + const candidateDirs = [ + path.join(__dirname, "assets", "bin"), + assetsPath ? path.join(assetsPath, "bin") : "", + path.join(__dirname, "bin"), + ].filter(Boolean); + + let binaryPath = ""; + let args: string[] = []; + + if (platform === "darwin") { + const candidate = candidateDirs + .map((dir) => path.join(dir, "picker-mac")) + .find((p) => existsSync(p)); + + binaryPath = candidate || "picker-mac"; + } else if (platform === "win32") { + const candidate = candidateDirs + .map((dir) => path.join(dir, "picker-win.exe")) + .find((p) => existsSync(p)); + + binaryPath = candidate || "picker-win.exe"; + } else if (platform === "linux") { + const candidate = candidateDirs + .map((dir) => path.join(dir, "picker-linux.py")) + .find((p) => existsSync(p)); + + if (candidate) { + binaryPath = "python3"; + args = [candidate]; + } else { + throw new Error("Linux picker script picker-linux.py not found in candidate paths: " + candidateDirs.join(", ")); + } + } else { + throw new Error(`Unsupported operating system: ${platform}`); + } + + try { + const { stdout } = await execFileAsync(binaryPath, args, { + timeout: 120000, + }); + + const trimmed = stdout.trim(); + if (!trimmed) { + return null; + } + + const parsed = JSON.parse(trimmed) as Color; + return parsed; + } catch (err: any) { + if (err.code === 1 || err.exitCode === 1) { + // User cancelled + return null; + } + console.error("Error executing color picker:", err); + throw err; + } +} diff --git a/extensions/color-picker/src/organize-colors.tsx b/extensions/color-picker/src/organize-colors.tsx new file mode 100644 index 000000000..711c06f8c --- /dev/null +++ b/extensions/color-picker/src/organize-colors.tsx @@ -0,0 +1,360 @@ +import { + Action, + ActionPanel, + Alert, + Clipboard, + closeMainWindow, + confirmAlert, + getPreferenceValues, + Grid, + Icon, + Keyboard, + List, + showHUD, + showToast, + Toast, +} from "@vicinae/api"; +import { useCallback, useState } from "react"; +import CopyAsSubmenu from "./components/CopyAsSubmenu"; +import { EditTitle } from "./components/EditTitle"; +import { useColorsSelection } from "./hooks/useColorsSelection"; +import { addToHistory, useHistory } from "./lib/history"; +import type { HistoryItem, OrganizeColorsPreferences, SelectMode, UseColorsSelectionObject } from "./lib/types"; +import { COPY_FORMATS, copySelectedColors, getFormattedColor, getIcon, getPreviewColor } from "./lib/utils"; +import { pickScreenColor } from "./native/picker"; + +const EMPTY_VIEW_TITLE = "No colors picked yet ¯\\_(ツ)_/¯"; +const EMPTY_VIEW_DESCRIPTION = "Use the Pick Color command or button below to pick some"; + +function getPreferences(): OrganizeColorsPreferences { + try { + return getPreferenceValues(); + } catch { + return { primaryAction: "copy" }; + } +} + +const PickColorAction = ({ onPicked }: { onPicked?: () => void }) => ( + { + try { + await closeMainWindow(); + const color = await pickScreenColor(); + if (color) { + addToHistory(color); + const formatted = getFormattedColor(color); + await Clipboard.copy(formatted); + await showHUD(`Copied color ${formatted} to clipboard`); + onPicked?.(); + } + } catch (e: any) { + await showToast({ + style: Toast.Style.Failure, + title: "Failed picking color", + message: e?.message, + }); + } + }} + /> +); + +export default function Command() { + const { history } = useHistory(); + const [selectMode, setSelectMode] = useState("single"); + + const getItemKey = useCallback((item: HistoryItem) => `${item.date}-${getFormattedColor(item.color)}`, []); + const { selection } = useColorsSelection(history ?? [], getItemKey); + const favoriteHistory = history?.filter((item) => item.isFavorite) ?? []; + const regularHistory = history?.filter((item) => !item.isFavorite) ?? []; + + if (selectMode === "multi") { + return ( + setSelectMode(v as SelectMode)} + > + + + + } + > + + + + } + /> + + + + ); + } + + return ( + setSelectMode(v as SelectMode)}> + + + + } + > + + + + } + /> + + + + ); +} + +type HistorySectionProps = { + title: string; + history: HistoryItem[]; + selectMode: SelectMode; + selection: UseColorsSelectionObject; +}; + +function GridHistorySection({ title, history, selectMode, selection }: HistorySectionProps) { + if (history.length === 0) { + return null; + } + + return ( + + {history.map((historyItem) => { + const formattedColor = getFormattedColor(historyItem.color); + const previewColor = getPreviewColor(historyItem.color); + const color = { light: previewColor, dark: previewColor, adjustContrast: false }; + + return ( + } + /> + ); + })} + + ); +} + +function ListHistorySection({ title, history, selectMode, selection }: HistorySectionProps) { + if (history.length === 0) { + return null; + } + + return ( + + {history.map((historyItem) => { + const formattedColor = getFormattedColor(historyItem.color); + const previewColor = getPreviewColor(historyItem.color); + const isSelected = selection.helpers.getIsItemSelected(historyItem); + + return ( + } + /> + ); + })} + + ); +} + +type ActionsProps = { + historyItem: HistoryItem; + selectMode: SelectMode; + selection: UseColorsSelectionObject; +}; + +function Actions({ historyItem, selectMode, selection }: ActionsProps) { + const { history, remove, clear, edit, addToFavorites, removeFromFavorites, moveFavorite } = useHistory(); + const preferences = getPreferences(); + + const { toggleSelection, selectAll, clearSelection } = selection.actions; + const { anySelected, allSelected, selectedItems, countSelected } = selection.selected; + const isSelected = selection.helpers.getIsItemSelected(historyItem); + + const color = historyItem.color; + const formattedColor = getFormattedColor(color); + const favoriteHistory = history?.filter((item) => item.isFavorite) ?? []; + const favoriteIndex = favoriteHistory.findIndex((item) => getFormattedColor(item.color) === formattedColor); + const canMoveFavoriteUp = favoriteIndex > 0; + const canMoveFavoriteDown = favoriteIndex !== -1 && favoriteIndex < favoriteHistory.length - 1; + + return ( + + + {preferences.primaryAction === "copy" ? ( + <> + + + + ) : ( + <> + + + + )} + + + + + {selectMode === "multi" ? ( + <> + toggleSelection(historyItem)} + /> + {allSelected ? ( + + ) : ( + + )} + {anySelected && ( + + {COPY_FORMATS.map(({ format, title, icon }) => ( + + ))} + + )} + + ) : ( + + )} + } + /> + {historyItem.isFavorite ? ( + <> + removeFromFavorites(color)} + /> + {canMoveFavoriteUp && ( + moveFavorite(color, "up")} + /> + )} + {canMoveFavoriteDown && ( + moveFavorite(color, "down")} + /> + )} + + ) : ( + addToFavorites(color)} + /> + )} + + + + { + const confirmed = await confirmAlert({ + title: "Delete Color", + message: "Do you want to delete this color from history?", + primaryAction: { + title: "Delete", + style: Alert.ActionStyle.Destructive, + }, + }); + + if (confirmed) { + remove(historyItem.color); + await showToast({ title: "Deleted color" }); + } + }} + /> + { + const confirmed = await confirmAlert({ + title: "Delete All Colors", + message: "Do you want to delete all colors from your history?", + primaryAction: { + title: "Delete All", + style: Alert.ActionStyle.Destructive, + }, + }); + + if (confirmed) { + clear(); + await showToast({ title: "Deleted all colors" }); + } + }} + /> + + + ); +} diff --git a/extensions/color-picker/src/pick-color.ts b/extensions/color-picker/src/pick-color.ts new file mode 100644 index 000000000..3806fa7c2 --- /dev/null +++ b/extensions/color-picker/src/pick-color.ts @@ -0,0 +1,50 @@ +import { Clipboard, closeMainWindow, getPreferenceValues, showHUD } from "@vicinae/api"; +import colorNamer from "color-namer"; +import { addToHistory } from "./lib/history"; +import type { Color, PickColorPreferences } from "./lib/types"; +import { getColorByProximity, getFormattedColor } from "./lib/utils"; +import { pickScreenColor } from "./native/picker"; + +export default async function Command() { + let showColorName = false; + try { + const prefs = getPreferenceValues(); + showColorName = Boolean(prefs.showColorName); + } catch { + // default false + } + + await closeMainWindow(); + + try { + const pickedColor: Color | null = await pickScreenColor(); + if (!pickedColor) { + return; + } + + addToHistory(pickedColor); + + const formattedColor = getFormattedColor(pickedColor); + if (!formattedColor) { + throw new Error("Failed to format color"); + } + + await Clipboard.copy(formattedColor); + + if (showColorName) { + try { + const colors = colorNamer(formattedColor); + const colorsByDistance = getColorByProximity(colors); + const firstColorName = colorsByDistance[0]?.name; + await showHUD(`Copied color ${formattedColor} (${firstColorName}) to clipboard`); + } catch { + await showHUD(`Copied color ${formattedColor} to clipboard`); + } + } else { + await showHUD(`Copied color ${formattedColor} to clipboard`); + } + } catch (e: any) { + console.error("Pick color error:", e); + await showHUD("❌ Failed picking color"); + } +} diff --git a/extensions/color-picker/tsconfig.json b/extensions/color-picker/tsconfig.json new file mode 100644 index 000000000..8d9b6bbc1 --- /dev/null +++ b/extensions/color-picker/tsconfig.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Node 16", + "include": ["src/**/*"], + "compilerOptions": { + //"lib": ["es2020"], + "module": "commonjs", + "target": "es2020", + "strict": true, + "isolatedModules": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "jsx": "react-jsx", + "types": ["node"] + } +} From 3b30b5c9cfe5a801e59220bd4d4eac03973d456e Mon Sep 17 00:00:00 2001 From: manuelcontrera Date: Tue, 22 Sep 2026 19:22:48 -0500 Subject: [PATCH 2/3] fix(color-picker): address automated review feedback on platforms, color-wheel and storage --- extensions/color-picker/README.md | 16 +- extensions/color-picker/package-lock.json | 2506 +---------------- extensions/color-picker/package.json | 11 +- extensions/color-picker/src/color-wheel.tsx | 8 +- .../src/components/CopyAsSubmenu.tsx | 2 +- .../color-picker/src/components/EditTitle.tsx | 2 +- .../color-picker/src/favorite-colors.tsx | 6 +- extensions/color-picker/src/lib/history.ts | 83 +- extensions/color-picker/src/lib/utils.ts | 6 +- extensions/color-picker/src/native/picker.ts | 37 +- .../color-picker/src/organize-colors.tsx | 12 +- extensions/color-picker/src/pick-color.ts | 2 +- 12 files changed, 148 insertions(+), 2543 deletions(-) diff --git a/extensions/color-picker/README.md b/extensions/color-picker/README.md index 8faef80ae..dedfda25e 100644 --- a/extensions/color-picker/README.md +++ b/extensions/color-picker/README.md @@ -1,8 +1,8 @@ # Color Picker for Vicinae -A powerful cross-platform color picker, manager, and converter extension for **Vicinae**, ported and adapted from Raycast's popular Color Picker. +A powerful color picker, manager, and converter extension for **Vicinae** on **Linux**, ported and adapted from Raycast's Color Picker. -Supported on **Linux** (GNOME, KDE, Wayland, X11), **macOS**, and **Windows**. +Supported on **Linux** (GNOME, KDE, Hyprland, Sway, Wayland, and X11). --- @@ -11,12 +11,12 @@ Supported on **Linux** (GNOME, KDE, Wayland, X11), **macOS**, and **Windows**. ### `pick-color` - Pick Color Activates a screen loupe/eyedropper across your monitors, allowing you to sample any pixel. - Copies the sampled color directly to the clipboard in your preferred format. -- Adds the color to your color history. +- Adds the color to your persistent color history. - Shows a HUD confirmation with the copied color. ### `organize-colors` - Organize Colors Manage, search, and export your picked color history. -- View in grid mode (with live color swatches) or list mode. +- View in grid mode (with live SVG color swatches) or list mode. - Pin your favorite colors to the top. - Rename colors with custom titles. - Copy colors in 12 different formats (HEX, RGB, RGBA, HSL, HSV, OKLCH, LCH, Display P3, etc.). @@ -32,16 +32,14 @@ Universal color conversion tool. Pass any color format (or enter one in the sear ### `color-names` - Color Names Search and identify colors by their descriptive names using the `color-namer` palette. -### `color-wheel` - Color Wheel -Interactive visual spectrum wheel to pick colors directly from a color disc. +### `color-wheel` - Color Wheel Reference +Displays an RGB spectrum color wheel reference with quick access to the desktop screen picker. --- ## Screen Picker Architecture -- **Linux**: Uses D-Bus portal (`org.gnome.Shell.Screenshot.PickColor` and `org.freedesktop.portal.Screenshot.PickColor`) for seamless desktop integration under Wayland and X11. -- **macOS**: Native `NSColorSampler` API providing pixel-accurate magnification and system integration without requiring special accessibility permissions. -- **Windows**: Lightweight standalone Win32 magnifier with anti-aliasing and scroll-wheel zoom support. +- **Linux**: Uses D-Bus portal (`org.freedesktop.portal.Screenshot.PickColor` and `org.gnome.Shell.Screenshot.PickColor`) with native fallback tools (`hyprpicker`, `grim`+`slurp`, `xcolor`, `gpick`, `import`) for seamless desktop integration under Wayland and X11. --- diff --git a/extensions/color-picker/package-lock.json b/extensions/color-picker/package-lock.json index a26b20219..7c38e4b86 100644 --- a/extensions/color-picker/package-lock.json +++ b/extensions/color-picker/package-lock.json @@ -7,7 +7,7 @@ "name": "color-picker", "license": "MIT", "dependencies": { - "@vicinae/api": "^0.20.15", + "@vicinae/api": "^0.29.0", "color-namer": "^1.4.0", "colorjs.io": "^0.5.1", "lodash": "^4.17.23" @@ -436,85 +436,6 @@ "node": ">=18" } }, - "node_modules/@jgoz/esbuild-plugin-typecheck": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@jgoz/esbuild-plugin-typecheck/-/esbuild-plugin-typecheck-4.0.5.tgz", - "integrity": "sha512-yXC/6Kzcq/PAPdHFPFkqkfzw+qz/ZCyxntTGMk7CnAz1tFjv2vQuavVYIxsql5+eZetlJFM2ssPRYFtbKZGQ8w==", - "license": "MIT", - "peerDependencies": { - "@jgoz/esbuild-plugin-livereload": ">=2.1.4", - "esbuild": ">=0.25.0", - "typescript": ">= 3.5" - }, - "peerDependenciesMeta": { - "@jgoz/esbuild-plugin-livereload": { - "optional": true - } - } - }, - "node_modules/@oclif/core": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-4.14.0.tgz", - "integrity": "sha512-QCJIZoVJxV7jywgVAUlsQwl3dr3Sa21kfi5z9KrYolbexWJUtFSEtMoNiBWojD05mYycLnB50gp/VxlGdaOCRA==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.2", - "ansis": "^3.17.0", - "clean-stack": "^3.0.1", - "cli-spinners": "^2.9.2", - "debug": "^4.4.3", - "ejs": "^6", - "get-package-type": "^0.1.0", - "indent-string": "^4.0.0", - "lilconfig": "^3.1.3", - "minimatch": "^10.2.5", - "semver": "^7.8.1", - "string-width": "^4.2.3", - "supports-color": "^8", - "tinyglobby": "^0.2.17", - "widest-line": "^3.1.0", - "wordwrap": "^1.0.0", - "wrap-ansi": "^7.0.0", - "wsl-utils": "^0.4.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@oclif/plugin-help": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.3.0.tgz", - "integrity": "sha512-cpSRv7tyHHFPv39HrV22eNmu8ylrwjmPvqdlNo3URp79+p5319p+a8PI/3ez6A6GZmjwBj1EWUdVz1aPUAsSmw==", - "license": "MIT", - "dependencies": { - "@oclif/core": "^4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@oclif/plugin-plugins": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/@oclif/plugin-plugins/-/plugin-plugins-5.5.2.tgz", - "integrity": "sha512-Nyz6XBKcWRvjHCihPUCP0ubOj/k9pWwldzW39yK36t17RVYf+nVcYMLV+Kd1otB4qHKrsmt8pZI/nry6Fg5+Tg==", - "license": "MIT", - "dependencies": { - "@oclif/core": "^4.13.0", - "ansis": "^3.17.0", - "debug": "^4.4.0", - "npm": "^11.18.0", - "npm-package-arg": "^11.0.3", - "npm-run-path": "^5.3.0", - "object-treeify": "^4.0.1", - "semver": "^7.8.5", - "validate-npm-package-name": "^5.0.1", - "which": "^4.0.0", - "yarn": "^1.22.22" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@types/color-namer": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@types/color-namer/-/color-namer-1.3.3.tgz", @@ -533,6 +454,7 @@ "version": "22.20.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.4.tgz", "integrity": "sha512-zJRE40jpHtKqE/C4fgHrAKQLJuSpzEnP9ff9Y7YtoR3Wd2pwqzlekDeEuUQXjRd+QCYnVnNwuJYmhdk9XV8gvA==", + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -549,106 +471,45 @@ } }, "node_modules/@vicinae/api": { - "version": "0.20.15", - "resolved": "https://registry.npmjs.org/@vicinae/api/-/api-0.20.15.tgz", - "integrity": "sha512-7FAUgdQJ+D8krDfiAfXmxKMtqo3a/oLxC4F6IA14WSCc6Wh1NWqwNyBvmPJxxrpuNg1/eQcPfHaWqm1rZCzCMA==", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@vicinae/api/-/api-0.29.0.tgz", + "integrity": "sha512-NDXl/oUZkBcO9/YSdR4Q3P9iePmtJDecwYMBiQnL94VsHcOP2+5HayShEjVzcZ3va7+lB5G2bxLeDsMrbwdeiQ==", "license": "ISC", "dependencies": { - "@jgoz/esbuild-plugin-typecheck": "^4.0.3", - "@oclif/core": "^4", - "@oclif/plugin-help": "^6", - "@oclif/plugin-plugins": "^5", - "@types/node": ">=18", - "@types/react": "19.0.10", + "@types/react": "19.1.17", "chokidar": "^4.0.3", "esbuild": "^0.25.2", - "react": "19.0.0", + "react": "19.1.1", + "typescript": "5.9.2", "zod": "^4.0.17" }, "bin": { - "vici": "bin/run.js" + "vici": "dist/bin.js" }, "peerDependencies": { - "@types/node": ">=18", - "@types/react": "19.0.10" + "@types/node": ">=18" } }, "node_modules/@vicinae/api/node_modules/@types/react": { - "version": "19.0.10", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.10.tgz", - "integrity": "sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==", + "version": "19.1.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.17.tgz", + "integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==", "license": "MIT", "dependencies": { "csstype": "^3.0.2" } }, - "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/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/brace-expansion": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", - "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" + "node_modules/@vicinae/api/node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": "20 || >=22" + "node": ">=14.17" } }, "node_modules/chokidar": { @@ -671,51 +532,6 @@ "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-1.4.1.tgz", "integrity": "sha512-jTwQiT859RTFN/vIf7s+Vl/Z2LcMrvMv3WUFmd/4u76AdlFC0NTNgqEEFPcRiHmAswPsMiQEDZLM8vX8qXpZNQ==" }, - "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/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/color-namer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/color-namer/-/color-namer-1.4.0.tgz", @@ -751,41 +567,6 @@ "node": ">=0.12" } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/ejs": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-6.0.1.tgz", - "integrity": "sha512-UaaM14yby8U3k02ihS1Bmj5Kz2d7CCQM1scxpgs4Mhkq8F1wR2gl3+Ts4h5Ne4Mnt7M9m4Dw7jsuMr3+xO4vZA==", - "license": "Apache-2.0", - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.12.18" - } - }, - "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/es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", @@ -879,18 +660,6 @@ "@esbuild/win32-x64": "0.25.12" } }, - "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/esniff": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", @@ -925,2244 +694,67 @@ "type": "^2.7.2" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/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/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/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "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/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", - "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "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/lodash": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "license": "MIT" }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/minimatch": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", - "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.8" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", "license": "ISC" }, - "node_modules/npm": { - "version": "11.19.1", - "resolved": "https://registry.npmjs.org/npm/-/npm-11.19.1.tgz", - "integrity": "sha512-ztsxKxt/kkIaAs+2i0GU6I+DRmUdrNasxTZKJe9TCdSjKxlhah/4r/hl5ygMD6XAg1qZ9c2TNomR4qgOydp10g==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/metavuln-calculator", - "@npmcli/package-json", - "@npmcli/promise-spawn", - "@npmcli/redact", - "@npmcli/run-script", - "@sigstore/tuf", - "abbrev", - "archy", - "cacache", - "chalk", - "ci-info", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "semver", - "spdx-expression-parse", - "ssri", - "supports-color", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which" - ], - "license": "Artistic-2.0", - "workspaces": [ - "docs", - "smoke-tests", - "mock-globals", - "mock-registry", - "workspaces/*" - ], - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^9.9.1", - "@npmcli/config": "^10.12.0", - "@npmcli/fs": "^5.0.0", - "@npmcli/map-workspaces": "^5.0.3", - "@npmcli/metavuln-calculator": "^9.0.3", - "@npmcli/package-json": "^7.0.5", - "@npmcli/promise-spawn": "^9.0.1", - "@npmcli/redact": "^4.0.0", - "@npmcli/run-script": "^10.0.4", - "@sigstore/tuf": "^4.0.2", - "abbrev": "^4.0.0", - "archy": "~1.0.0", - "cacache": "^20.0.4", - "chalk": "^5.6.2", - "ci-info": "^4.4.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.3", - "glob": "^13.0.6", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^9.0.3", - "ini": "^6.0.0", - "init-package-json": "^8.2.5", - "is-cidr": "^6.0.4", - "json-parse-even-better-errors": "^5.0.0", - "libnpmaccess": "^10.0.3", - "libnpmdiff": "^8.1.12", - "libnpmexec": "^10.3.2", - "libnpmfund": "^7.0.26", - "libnpmorg": "^8.0.1", - "libnpmpack": "^9.1.13", - "libnpmpublish": "^11.2.0", - "libnpmsearch": "^9.0.1", - "libnpmteam": "^8.0.2", - "libnpmversion": "^8.0.4", - "make-fetch-happen": "^15.0.6", - "minimatch": "^10.2.5", - "minipass": "^7.1.3", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^12.4.0", - "nopt": "^9.0.0", - "npm-audit-report": "^7.0.0", - "npm-install-checks": "^8.0.0", - "npm-package-arg": "^13.0.2", - "npm-pick-manifest": "^11.0.3", - "npm-profile": "^12.0.2", - "npm-registry-fetch": "^19.1.1", - "npm-user-validate": "^4.0.0", - "p-map": "^7.0.4", - "pacote": "^21.5.1", - "parse-conflict-json": "^5.0.1", - "proc-log": "^6.1.0", - "qrcode-terminal": "^0.12.0", - "read": "^5.0.1", - "semver": "^7.8.5", - "spdx-expression-parse": "^4.0.0", - "ssri": "^13.0.1", - "supports-color": "^10.2.2", - "tar": "^7.5.22", - "text-table": "~0.2.0", - "tiny-relative-date": "^2.0.2", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^7.0.2", - "which": "^6.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm-package-arg": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", - "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "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==", + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", "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": ">=0.10.0" } }, - "node_modules/npm/node_modules/@gar/promise-retry": { - "version": "1.0.3", - "inBundle": true, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "license": "MIT", "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" + "node": ">= 14.18.0" }, - "engines": { - "node": ">=18.0.0" + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "inBundle": true, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", "license": "ISC" }, - "node_modules/npm/node_modules/@npmcli/agent": { - "version": "4.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^11.2.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "9.9.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^5.0.0", - "@npmcli/installed-package-contents": "^4.0.0", - "@npmcli/map-workspaces": "^5.0.0", - "@npmcli/metavuln-calculator": "^9.0.2", - "@npmcli/name-from-folder": "^4.0.0", - "@npmcli/node-gyp": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/query": "^5.0.0", - "@npmcli/redact": "^4.0.0", - "@npmcli/run-script": "^10.0.0", - "bin-links": "^6.0.0", - "cacache": "^20.0.1", - "common-ancestor-path": "^2.0.0", - "hosted-git-info": "^9.0.0", - "json-stringify-nice": "^1.1.4", - "lru-cache": "^11.2.1", - "minimatch": "^10.0.3", - "nopt": "^9.0.0", - "npm-install-checks": "^8.0.0", - "npm-package-arg": "^13.0.0", - "npm-pick-manifest": "^11.0.1", - "npm-registry-fetch": "^19.0.0", - "pacote": "^21.0.2", - "parse-conflict-json": "^5.0.1", - "proc-log": "^6.0.0", - "proggy": "^4.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^3.0.1", - "semver": "^7.3.7", - "ssri": "^13.0.0", - "treeverse": "^3.0.0", - "walk-up-path": "^4.0.0" - }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "10.12.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "ci-info": "^4.0.0", - "ini": "^6.0.0", - "nopt": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "walk-up-path": "^4.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "7.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "ini": "^6.0.0", - "lru-cache": "^11.2.1", - "npm-pick-manifest": "^11.0.1", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "which": "^6.0.0" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^5.0.0", - "npm-normalize-package-bin": "^5.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "5.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^4.0.0", - "@npmcli/package-json": "^7.0.0", - "glob": "^13.0.0", - "minimatch": "^10.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "9.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^20.0.0", - "json-parse-even-better-errors": "^5.0.0", - "pacote": "^21.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "7.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^7.0.0", - "glob": "^13.0.0", - "hosted-git-info": "^9.0.0", - "json-parse-even-better-errors": "^5.0.0", - "proc-log": "^6.0.0", - "semver": "^7.5.3", - "spdx-expression-parse": "^4.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "9.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "which": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/redact": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "10.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^5.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "node-gyp": "^12.1.0", - "proc-log": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "4.0.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.5.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@sigstore/core": { - "version": "3.2.1", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.5.1", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm/node_modules/@sigstore/sign": { - "version": "4.1.1", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@gar/promise-retry": "^1.0.2", - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.2.0", - "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.4", - "proc-log": "^6.1.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "4.0.2", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.5.0", - "tuf-js": "^4.1.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@sigstore/verify": { - "version": "3.1.1", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.2.1", - "@sigstore/protobuf-specs": "^0.5.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tufjs/models": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^10.1.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/agent-base": { - "version": "7.1.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "4.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/npm/node_modules/bin-links": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^8.0.0", - "npm-normalize-package-bin": "^5.0.0", - "proc-log": "^6.0.0", - "read-cmd-shim": "^6.0.0", - "write-file-atomic": "^7.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "5.0.9", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "20.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^5.0.0", - "fs-minipass": "^3.0.0", - "glob": "^13.0.0", - "lru-cache": "^11.1.0", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^13.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "5.6.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "3.0.0", - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/ci-info": { - "version": "4.4.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "5.0.5", - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "8.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "2.0.0", - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">= 18" - } - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.4.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/diff": { - "version": "8.0.4", - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.3", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "13.0.6", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minimatch": "^10.2.2", - "minipass": "^7.1.3", - "path-scurry": "^2.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.11", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "9.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^11.1.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.2.0", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "7.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.7.2", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "8.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^10.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/ini": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "8.2.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/package-json": "^7.0.0", - "npm-package-arg": "^13.0.0", - "promzard": "^3.0.1", - "read": "^5.0.1", - "semver": "^7.7.2", - "validate-npm-package-name": "^7.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/ip-address": { - "version": "10.5.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "6.0.4", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^5.0.4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/npm/node_modules/isexe": { - "version": "4.0.0", - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=20" - } - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "6.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.5.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "10.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^13.0.0", - "npm-registry-fetch": "^19.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "8.1.12", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^9.9.1", - "@npmcli/installed-package-contents": "^4.0.0", - "binary-extensions": "^3.0.0", - "diff": "^8.0.2", - "minimatch": "^10.0.3", - "npm-package-arg": "^13.0.0", - "pacote": "^21.0.2", - "tar": "^7.5.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "10.3.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/arborist": "^9.9.1", - "@npmcli/package-json": "^7.0.0", - "@npmcli/run-script": "^10.0.0", - "ci-info": "^4.0.0", - "npm-package-arg": "^13.0.0", - "pacote": "^21.0.2", - "proc-log": "^6.0.0", - "read": "^5.0.1", - "semver": "^7.3.7", - "signal-exit": "^4.1.0", - "walk-up-path": "^4.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "7.0.26", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^9.9.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "8.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^19.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "9.1.13", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^9.9.1", - "@npmcli/run-script": "^10.0.0", - "npm-package-arg": "^13.0.0", - "pacote": "^21.0.2" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "11.2.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/package-json": "^7.0.0", - "ci-info": "^4.0.0", - "npm-package-arg": "^13.0.0", - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.7", - "sigstore": "^4.0.0", - "ssri": "^13.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "9.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^19.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "8.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^19.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "8.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^7.0.0", - "@npmcli/run-script": "^10.0.0", - "json-parse-even-better-errors": "^5.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "11.5.1", - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "15.0.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/agent": "^4.0.0", - "@npmcli/redact": "^4.0.0", - "cacache": "^20.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^5.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^6.0.0", - "ssri": "^13.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "10.2.5", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "7.1.3", - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "5.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^2.0.0", - "minizlib": "^3.0.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - }, - "optionalDependencies": { - "iconv-lite": "^0.7.2" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.6", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "minipass": "^7.1.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/negotiator": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "12.4.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "graceful-fs": "^4.2.6", - "nopt": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "tar": "^7.5.4", - "tinyglobby": "^0.2.12", - "undici": "^6.25.0", - "which": "^6.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "9.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^4.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "7.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^5.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "8.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "13.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^9.0.0", - "proc-log": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^7.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "10.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^8.0.0", - "proc-log": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "11.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^8.0.0", - "npm-normalize-package-bin": "^5.0.0", - "npm-package-arg": "^13.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "12.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.1.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "19.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/redact": "^4.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^15.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^5.0.0", - "minizlib": "^3.0.1", - "npm-package-arg": "^13.0.0", - "proc-log": "^6.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "4.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "7.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "21.5.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promise-retry": "^1.0.0", - "@npmcli/git": "^7.0.0", - "@npmcli/installed-package-contents": "^4.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^9.0.0", - "@npmcli/run-script": "^10.0.0", - "cacache": "^20.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^13.0.0", - "npm-packlist": "^10.0.1", - "npm-pick-manifest": "^11.0.1", - "npm-registry-fetch": "^19.0.0", - "proc-log": "^6.0.0", - "sigstore": "^4.0.0", - "ssri": "^13.0.0", - "tar": "^7.4.3" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^5.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/path-scurry": { - "version": "2.0.2", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "7.1.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "6.1.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/proggy": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "^5.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "^3.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.8.5", - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "4.1.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/sigstore": { - "version": "4.1.1", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.2.1", - "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.1.1", - "@sigstore/tuf": "^4.0.2", - "@sigstore/verify": "^3.1.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.8.9", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip-address": "^10.1.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "8.0.5", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.5.0", - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.23", - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/ssri": { - "version": "13.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "10.2.2", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "7.5.22", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tinyglobby": { - "version": "0.2.17", - "inBundle": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/npm/node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/npm/node_modules/treeverse": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/tuf-js": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "4.1.0", - "debug": "^4.4.3", - "make-fetch-happen": "^15.0.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/undici": { - "version": "6.28.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "7.0.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/npm/node_modules/which": { - "version": "6.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^4.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "7.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "5.0.0", - "inBundle": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/object-treeify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/object-treeify/-/object-treeify-4.0.1.tgz", - "integrity": "sha512-Y6tg5rHfsefSkfKujv2SwHulInROy/rCL5F4w0QOWxut8AnxYxf0YmNhTh95Zfyxpsudo66uqkux0ACFnyMSgQ==", - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, - "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/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/powershell-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", - "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/react": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", - "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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/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/tinyglobby": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", - "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/type": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", - "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", - "license": "ISC" - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" + "node": ">=14.17" } }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, "license": "MIT" }, - "node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "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/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/wsl-utils": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.4.0.tgz", - "integrity": "sha512-9YmF+2sFEd+T7TkwlmE337F0IVzfDvDknhtpBQxxXzEOfgPphGlFYpyx0cTuCIFj8/p+sqwBYAeGxOMNSzPPDA==", - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0", - "powershell-utils": "^0.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yarn": { - "version": "1.22.22", - "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.22.tgz", - "integrity": "sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==", - "hasInstallScript": true, - "license": "BSD-2-Clause", - "bin": { - "yarn": "bin/yarn.js", - "yarnpkg": "bin/yarn.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/zod": { "version": "4.6.5", "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", diff --git a/extensions/color-picker/package.json b/extensions/color-picker/package.json index 4f9b6719f..74f644f6c 100644 --- a/extensions/color-picker/package.json +++ b/extensions/color-picker/package.json @@ -2,7 +2,7 @@ "$schema": "https://raw.githubusercontent.com/vicinaehq/vicinae/refs/heads/main/extra/schemas/extension.json", "name": "color-picker", "title": "Color Picker", - "description": "Pick, organize, and convert colors on Mac, Windows, and Linux", + "description": "Pick, organize, and convert colors on Linux", "icon": "icon.png", "author": "manuelcontrera", "pastContributors": [ @@ -13,6 +13,9 @@ "Developer Tools" ], "license": "MIT", + "platforms": [ + "Linux" + ], "commands": [ { "name": "pick-color", @@ -118,8 +121,8 @@ }, { "name": "color-wheel", - "title": "Color Wheel", - "description": "Pick a color with interactive color wheel", + "title": "Color Wheel Reference", + "description": "Display a color wheel reference and pick colors from screen", "mode": "view", "icon": "icon.png" } @@ -190,7 +193,7 @@ "lint": "vici lint" }, "dependencies": { - "@vicinae/api": "^0.20.15", + "@vicinae/api": "^0.29.0", "color-namer": "^1.4.0", "colorjs.io": "^0.5.1", "lodash": "^4.17.23" diff --git a/extensions/color-picker/src/color-wheel.tsx b/extensions/color-picker/src/color-wheel.tsx index 718f1653b..0ad206636 100644 --- a/extensions/color-picker/src/color-wheel.tsx +++ b/extensions/color-picker/src/color-wheel.tsx @@ -6,9 +6,9 @@ import { getFormattedColor } from "./lib/utils"; import { pickScreenColor } from "./native/picker"; const COLOR_WHEEL_MARKDOWN = ` -# Color Wheel +# Color Wheel Reference -Click the **Pick from Wheel** button below or use the screen picker to select any color from the spectrum. +A reference RGB color wheel spectrum. Use the desktop screen picker to sample colors directly from the wheel or anywhere on your screen. ![RGB Color Wheel](rgb-color-wheel.png) `; @@ -23,7 +23,7 @@ export default function Command() { return; } - addToHistory(pickedColor); + await addToHistory(pickedColor); const formattedColor = getFormattedColor(pickedColor); if (!formattedColor) { @@ -51,7 +51,7 @@ export default function Command() { markdown={COLOR_WHEEL_MARKDOWN} actions={ - + } /> diff --git a/extensions/color-picker/src/components/CopyAsSubmenu.tsx b/extensions/color-picker/src/components/CopyAsSubmenu.tsx index 774c2e249..4a8d22d45 100644 --- a/extensions/color-picker/src/components/CopyAsSubmenu.tsx +++ b/extensions/color-picker/src/components/CopyAsSubmenu.tsx @@ -9,7 +9,7 @@ type CopyAsSubmenuProps = { export default function CopyAsSubmenu({ color, onCopy }: CopyAsSubmenuProps) { return ( - + { - props.onEdit({ ...item, title: values.title }); + props.onEdit({ ...item, title: values.title ? String(values.title) : undefined }); pop(); }} /> diff --git a/extensions/color-picker/src/favorite-colors.tsx b/extensions/color-picker/src/favorite-colors.tsx index 43402d80a..4bd98fb8a 100644 --- a/extensions/color-picker/src/favorite-colors.tsx +++ b/extensions/color-picker/src/favorite-colors.tsx @@ -14,12 +14,12 @@ function OpenOrganizeColorsAction() { } export default function Command() { - const { history, removeFromFavorites } = useHistory(); + const { history, isLoading, removeFromFavorites } = useHistory(); const favorites = history?.filter((item) => item.isFavorite) ?? []; return ( - - {history !== undefined && favorites.length === 0 ? ( + + {!isLoading && favorites.length === 0 ? ( void>(); + +export async function getHistory(): Promise { + if (inMemoryHistory !== null) { + return inMemoryHistory; + } try { - return JSON.parse(data) as HistoryItem[]; - } catch { + const data = await LocalStorage.getItem(STORAGE_KEY); + if (!data) { + inMemoryHistory = []; + return []; + } + inMemoryHistory = JSON.parse(data) as HistoryItem[]; + return inMemoryHistory; + } catch (error) { + console.error("Failed to read history from LocalStorage:", error); + inMemoryHistory = []; return []; } } -export function saveHistory(items: HistoryItem[]) { - cache.set("history", JSON.stringify(items)); +export async function saveHistory(items: HistoryItem[]): Promise { + inMemoryHistory = items; + try { + await LocalStorage.setItem(STORAGE_KEY, JSON.stringify(items)); + } catch (error) { + console.error("Failed to persist history to LocalStorage:", error); + } + listeners.forEach((listener) => listener(items)); } -export function addToHistory(color: HistoryColor, options?: { isFavorite?: boolean }) { - const previousHistory = getHistory(); +export async function addToHistory(color: HistoryColor, options?: { isFavorite?: boolean }) { + const previousHistory = await getHistory(); const colorKey = getFormattedColor(color); const previousHistoryItem = previousHistory.find((item) => getFormattedColor(item.color) === colorKey); @@ -45,48 +63,55 @@ export function addToHistory(color: HistoryColor, options?: { isFavorite?: boole return regularHistoryCount <= maxRegularHistoryLength; }); - saveHistory(newHistory); + await saveHistory(newHistory); } export function useHistory() { - const [history, setHistory] = useState(() => getHistory()); + const [history, setHistory] = useState(() => inMemoryHistory ?? []); + const [isLoading, setIsLoading] = useState(inMemoryHistory === null); useEffect(() => { - setHistory(getHistory()); - const unsubscribe = cache.subscribe((key, data) => { - if (key === "history") { - try { - setHistory(data ? JSON.parse(data) : []); - } catch { - setHistory([]); - } + let isMounted = true; + + getHistory().then((items) => { + if (isMounted) { + setHistory(items); + setIsLoading(false); } }); - return () => { - if (typeof unsubscribe === "function") { - unsubscribe(); + + const listener = (newHistory: HistoryItem[]) => { + if (isMounted) { + setHistory(newHistory); } }; + listeners.add(listener); + + return () => { + isMounted = false; + listeners.delete(listener); + }; }, []); const update = (color: HistoryColor, updateItem: (item: HistoryItem) => HistoryItem) => { const next = history.map((item) => getFormattedColor(item.color) === getFormattedColor(color) ? updateItem(item) : item, ); - saveHistory(next); + void saveHistory(next); }; return { history, + isLoading, remove: (color: HistoryColor) => { const next = history.filter((item) => getFormattedColor(item.color) !== getFormattedColor(color)); - saveHistory(next); + void saveHistory(next); }, edit: (historyItem: HistoryItem) => { const next = history.map((item) => getFormattedColor(item.color) === getFormattedColor(historyItem.color) ? historyItem : item, ); - saveHistory(next); + void saveHistory(next); }, addToFavorites: (color: HistoryColor) => update(color, (item) => ({ ...item, isFavorite: true })), removeFromFavorites: (color: HistoryColor) => update(color, (item) => ({ ...item, isFavorite: false })), @@ -108,8 +133,8 @@ export function useHistory() { const nextHistory = [...history]; [nextHistory[currentIndex], nextHistory[targetIndex]] = [nextHistory[targetIndex], nextHistory[currentIndex]]; - saveHistory(nextHistory); + void saveHistory(nextHistory); }, - clear: () => saveHistory([]), + clear: () => void saveHistory([]), }; } diff --git a/extensions/color-picker/src/lib/utils.ts b/extensions/color-picker/src/lib/utils.ts index b65acb281..909b74897 100644 --- a/extensions/color-picker/src/lib/utils.ts +++ b/extensions/color-picker/src/lib/utils.ts @@ -32,7 +32,7 @@ export function getShortcut(index: number) { const key = index + 1; let shortcut: Keyboard.Shortcut | undefined; if (key >= 1 && key <= 9) { - shortcut = { modifiers: ["cmd"], key: String(key) as Keyboard.KeyEquivalent }; + shortcut = { modifiers: ["cmd"], key: String(key) as any }; } return shortcut; } @@ -58,7 +58,7 @@ export function getIcon(color: HistoryColor): Image.ImageLike | undefined { export function getAccessories(historyItem: HistoryItem) { const accessories = new Array(); - accessories.push({ date: new Date(historyItem.date), tooltip: new Date(historyItem.date).toLocaleString() }); + accessories.push({ text: new Date(historyItem.date).toLocaleDateString(), tooltip: new Date(historyItem.date).toLocaleString() }); return accessories; } @@ -100,7 +100,7 @@ export function getColorByProximity(colors?: Colors) { export const COPY_FORMATS: Array<{ format: CopyColorsFormat; title: string; icon: Icon }> = [ { format: "json", title: "Copy Colors as JSON", icon: Icon.CodeBlock }, { format: "css-classes", title: "Copy Colors as CSS Classes", icon: Icon.Brush }, - { format: "css-variables", title: "Copy Colors as CSS Variables", icon: Icon.Gear }, + { format: "css-variables", title: "Copy Colors as CSS Variables", icon: Icon.Cog }, ]; export function getColor(item: HistoryItem | string): HistoryColor { diff --git a/extensions/color-picker/src/native/picker.ts b/extensions/color-picker/src/native/picker.ts index 83300eefd..daee9b14a 100644 --- a/extensions/color-picker/src/native/picker.ts +++ b/extensions/color-picker/src/native/picker.ts @@ -23,36 +23,21 @@ export async function pickScreenColor(): Promise { path.join(__dirname, "bin"), ].filter(Boolean); - let binaryPath = ""; - let args: string[] = []; - - if (platform === "darwin") { - const candidate = candidateDirs - .map((dir) => path.join(dir, "picker-mac")) - .find((p) => existsSync(p)); - - binaryPath = candidate || "picker-mac"; - } else if (platform === "win32") { - const candidate = candidateDirs - .map((dir) => path.join(dir, "picker-win.exe")) - .find((p) => existsSync(p)); + if (platform !== "linux") { + throw new Error(`Color picking is currently only supported on Linux (current platform: ${platform})`); + } - binaryPath = candidate || "picker-win.exe"; - } else if (platform === "linux") { - const candidate = candidateDirs - .map((dir) => path.join(dir, "picker-linux.py")) - .find((p) => existsSync(p)); + const candidate = candidateDirs + .map((dir) => path.join(dir, "picker-linux.py")) + .find((p) => existsSync(p)); - if (candidate) { - binaryPath = "python3"; - args = [candidate]; - } else { - throw new Error("Linux picker script picker-linux.py not found in candidate paths: " + candidateDirs.join(", ")); - } - } else { - throw new Error(`Unsupported operating system: ${platform}`); + if (!candidate) { + throw new Error("Linux picker script picker-linux.py not found in candidate paths: " + candidateDirs.join(", ")); } + const binaryPath = "python3"; + const args = [candidate]; + try { const { stdout } = await execFileAsync(binaryPath, args, { timeout: 120000, diff --git a/extensions/color-picker/src/organize-colors.tsx b/extensions/color-picker/src/organize-colors.tsx index 711c06f8c..a07bea91e 100644 --- a/extensions/color-picker/src/organize-colors.tsx +++ b/extensions/color-picker/src/organize-colors.tsx @@ -43,7 +43,7 @@ const PickColorAction = ({ onPicked }: { onPicked?: () => void }) => ( await closeMainWindow(); const color = await pickScreenColor(); if (color) { - addToHistory(color); + await addToHistory(color); const formatted = getFormattedColor(color); await Clipboard.copy(formatted); await showHUD(`Copied color ${formatted} to clipboard`); @@ -61,7 +61,7 @@ const PickColorAction = ({ onPicked }: { onPicked?: () => void }) => ( ); export default function Command() { - const { history } = useHistory(); + const { history, isLoading } = useHistory(); const [selectMode, setSelectMode] = useState("single"); const getItemKey = useCallback((item: HistoryItem) => `${item.date}-${getFormattedColor(item.color)}`, []); @@ -72,6 +72,7 @@ export default function Command() { if (selectMode === "multi") { return ( setSelectMode(v as SelectMode)}> @@ -216,11 +218,11 @@ function Actions({ historyItem, selectMode, selection }: ActionsProps) { {preferences.primaryAction === "copy" ? ( <> - + ) : ( <> - + )} @@ -252,7 +254,7 @@ function Actions({ historyItem, selectMode, selection }: ActionsProps) { )} {anySelected && ( diff --git a/extensions/color-picker/src/pick-color.ts b/extensions/color-picker/src/pick-color.ts index 3806fa7c2..bfb81a5e3 100644 --- a/extensions/color-picker/src/pick-color.ts +++ b/extensions/color-picker/src/pick-color.ts @@ -22,7 +22,7 @@ export default async function Command() { return; } - addToHistory(pickedColor); + await addToHistory(pickedColor); const formattedColor = getFormattedColor(pickedColor); if (!formattedColor) { From ca96016db89979236b5121aa63666c94a3ad62a7 Mon Sep 17 00:00:00 2001 From: manuelcontrera Date: Wed, 23 Sep 2026 08:49:30 -0500 Subject: [PATCH 3/3] docs(color-picker): update Linux screen picker architecture in README --- extensions/color-picker/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/color-picker/README.md b/extensions/color-picker/README.md index dedfda25e..392b2b613 100644 --- a/extensions/color-picker/README.md +++ b/extensions/color-picker/README.md @@ -39,7 +39,7 @@ Displays an RGB spectrum color wheel reference with quick access to the desktop ## Screen Picker Architecture -- **Linux**: Uses D-Bus portal (`org.freedesktop.portal.Screenshot.PickColor` and `org.gnome.Shell.Screenshot.PickColor`) with native fallback tools (`hyprpicker`, `grim`+`slurp`, `xcolor`, `gpick`, `import`) for seamless desktop integration under Wayland and X11. +- **Linux**: Uses D-Bus color picking through `org.freedesktop.portal.Screenshot.PickColor` and `org.gnome.Shell.Screenshot.PickColor`. ---