From 047196c4d083fc812ead55887f1c327df4584b81 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Thu, 22 Oct 2026 06:53:45 +0000 Subject: [PATCH] Upload via GUI (7543 Dateien) --- .claude/settings.local.json | 15 + HANDBUCH.html | 2788 ++++----- __tests__/backup-progress.test.js | 116 + __tests__/delete.test.js | 60 + __tests__/features.test.js | 162 + __tests__/network.test.js | 41 + __tests__/prefs.test.js | 76 + __tests__/restore.test.js | 201 + assets/icon.ico | Bin 0 -> 55925 bytes dist/.icon-ico/icon.ico | Bin 0 -> 116672 bytes landing.html | 1330 ++--- main.js | 366 +- package-lock.json | 9160 ++++++++++++----------------- package.json | 147 +- preload.js | 30 + updater.js | 5 +- 16 files changed, 7030 insertions(+), 7467 deletions(-) create mode 100644 .claude/settings.local.json create mode 100644 __tests__/backup-progress.test.js create mode 100644 __tests__/delete.test.js create mode 100644 __tests__/features.test.js create mode 100644 __tests__/network.test.js create mode 100644 __tests__/prefs.test.js create mode 100644 __tests__/restore.test.js create mode 100644 assets/icon.ico create mode 100644 dist/.icon-ico/icon.ico diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..97642fc --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,15 @@ +{ + "permissions": { + "allow": [ + "Bash(node -e \"require\\('./src/git/apiHandler.js'\\); console.log\\('apiHandler OK'\\)\")", + "Bash(node --check main.js)", + "Bash(node --check renderer/renderer.js)", + "Bash(node -e \"require\\('./src/git/apiHandler.js'\\)\")", + "Bash(node --check preload.js)", + "Bash(node --test __tests__/*.test.js)", + "Bash(node --check updater.js)", + "Bash(node -e \"require\\('./src/git/apiHandler.js'\\); require\\('./src/git/gitHandler.js'\\)\")", + "Bash(node -e ' *)" + ] + } +} diff --git a/HANDBUCH.html b/HANDBUCH.html index c0fae68..9f93490 100644 --- a/HANDBUCH.html +++ b/HANDBUCH.html @@ -1,1394 +1,1394 @@ - - - - - -Git Manager Explorer Pro – Benutzerhandbuch - - - - - -
- -

Git Manager Explorer Pro

-

Vollständiges Benutzerhandbuch · Version 2.1.3

- -
-
Version2.1.3
-
PlattformWindows (Electron)
-
ErstellerM_Viper
-
StandMai 2026
-
- -
-
01
Erste Schritte & Einrichtung
-
02
Gitea-Verbindung konfigurieren
-
03
Repositories laden & filtern
-
04
Favoriten & Verlauf
-
05
Repository-Aktionen (Rechtsklick)
-
06
Datei-Explorer & Editor
-
07
Repository erstellen
-
08
Migration (GitHub → Gitea)
-
09
Batch-Aktionen
-
10
Commit-History & Diffs
-
11
Releases verwalten
-
12
Retry-Queue & Activity-Log
-
-
- - -
- - -
-
TEIL A
-
Einrichtung & erste Schritte
-
App starten, Gitea verbinden und mit der Übersicht vertraut machen.
-
- - -
-

01 Erste Schritte

- -

- Git Manager Explorer Pro ist eine Desktop-Anwendung auf Basis von Electron, - die dir eine grafische Oberfläche für deine Gitea- und GitHub-Repositories gibt. - Du kannst Dateien direkt im integrierten Editor bearbeiten, Commits einsehen, Releases anlegen, - Repositories migrieren und vieles mehr – alles ohne Kommandozeile. -

- -
-
-
-
-
- Git Manager Explorer Pro — Hauptfenster -
-
-
- 🛠 Git Manager Explorer Pro - -
🚀 New Repo
-
📥 Migrieren
-
⬆️ Push
-
⚙️ Settings
-
🧩 Batch
-
-
-
📂 Open Local
-
🌐 Load Gitea
-
Gitea ●
-
GitHub
-
-
-
Meine 8
-
Alle 24
-
W-Web 12
-
rusher2510 4
-
-
🔍 Fuzzy-Suche: Name, Owner, Sprache, Topics…
-
-
📦 git-manager-gui
JavaScript • 3,2 MB
-
📦 streamflixPrivat
Kotlin • 8,1 MB
-
📦 yt-coockie-adblock
JavaScript • 0,4 MB
-
-
-
- -
-
🖥 Systemvoraussetzungen
- - - - - - -
VoraussetzungMindestEmpfohlen
WindowsWindows 10 (64-bit)Windows 11
RAM4 GB8 GB
NetzwerkZugang zu Gitea/GitHub-URLStabile Verbindung
Gitea API≥ 1.171.21+
-
- -

Die App startet mit npm start im Projektordner oder über die bereitgestellte .exe-Datei. - Beim ersten Start sind noch keine Credentials gespeichert — öffne zuerst die Settings.

-
- - -
-

02 Gitea-Verbindung konfigurieren

- -

Alle Verbindungsdaten werden verschlüsselt (AES-256) lokal gespeichert. Öffne die Settings über - ⚙️ Settings in der Toolbar.

- -
-
-
-
-
- ⚙️ Einstellungen — Zugangsdaten -
-
-
-
-
- -
ghp_••••••••••••••••
-
-
- -
••••••••••••••••••
-
-
- -
https://git.example.com
-
-
-
🔌 Verbindung testen
-
-
-
-
-
Verbindungsstatus
-
-
URLGültig
-
APIErreichbar
-
AuthOK
-
Latenz32 ms
-
Server1.22.0
-
-
-
-
-
-
- -
    -
  1. GitHub Token – Optional. Nur benötigt wenn du auch GitHub-Repos laden willst. Erstelle ihn unter github.com → Settings → Developer settings → Personal access tokens.
  2. -
  3. Gitea Token – Pflichtfeld. Erstelle unter Gitea → Einstellungen → Anwendungen → Token generieren. Berechtigungen: repository, user, issue.
  4. -
  5. Gitea URL – Die Basis-URL deines Servers (z. B. https://git.example.com). IPv6 mit Klammern: http://[::1]:3000.
  6. -
  7. Verbindung testen drücken — der Verbindungsstatus zeigt grüne Haken wenn alles stimmt.
  8. -
  9. Speichern — beim nächsten App-Start werden die Repos automatisch geladen.
  10. -
- -
- Auto-Login: Sind Credentials gespeichert wird beim Start automatisch Load Gitea ausgeführt. Die letzten Projekte erscheinen sofort ohne manuellen Klick. -
- -
-
🎯 Projektname in der Übersicht
-

Wenn du ein Repository öffnest, wird der Projektname in der Gravy-Leiste (unter der Toolbar) angezeigt. - Beim Wechsel zurück zur Repository-Übersicht wird der Name automatisch ausgeblendet. - Das gilt für beide Navigationswege:

-
    -
  • ⬅️ Zurück-Button klicken
  • -
  • 🌐 Load Gitea / 📂 Open Local klicken
  • -
-
- ✓ Projektname wird immer korrekt synchronisiert und verschwindet in der Übersicht. -
-
-
- - -
-
TEIL B
-
Repository-Übersicht
-
Repositories laden, filtern, suchen und mit Tabs nach Besitzern sortieren.
-
- - -
-

03 Repositories laden & filtern

- -

Klicke auf 🌐 Load Gitea um alle Repositories deines Tokens zu laden — inklusive privater Repos.

- -
-
📂 Owner-Tabs
-

Die Tabs über dem Repository-Grid sortieren nach Besitzer. Der aktive Tab wird hervorgehoben. Beim App-Start ist immer Meine vorausgewählt.

-
-
-
-
Meine 8
-
Alle 24
-
W-Web 12
-
rusher2510 4
-
-
- → Klick auf "Alle" zeigt sämtliche geladenen Repositories unabhängig vom Besitzer. -
-
-
- - - - - -
TabBeschreibung
MeineNur Repositories deren Owner-Login mit deinem Gitea-Konto übereinstimmt
AlleAlle geladenen Repositories ohne Einschränkung
GruppennameNur Repositories dieser Organisation / dieses Nutzers
-
- -
-
🔍 Fuzzy-Suche TIPP
-

Das Suchfeld über dem Grid filtert in Echtzeit nach Name, Owner, Sprache und Topics. - Mehrere Wörter werden als AND-Verknüpfung behandelt.

-
- Shortcut: Ctrl + K fokussiert das Suchfeld von überall in der Repository-Ansicht. -
-

Beispiele:

-
    -
  • stream kotlin → zeigt alle Kotlin-Repos mit "stream" im Namen
  • -
  • telegram javascript → Telegram-Repos in JavaScript
  • -
  • privat → Repos mit "privat" in Beschreibung oder Name
  • -
-
- -
-
📋 Repository-Karte
-
-
-
-
-
- ⭐ -
📦 streamflixPrivat
-
Kotlin • 8,1 MB
-
- android · kotlin · leanback · streaming -
-
-
-
-
📦 git-manager-gui
-
JavaScript • 3,2 MB
-
-
-
📦 tg-group-moderation
-
kein Sprachmarker
-
-
-
-
-
    -
  • ⭐ Stern-Button (oben rechts auf Karte) — Favorit hinzufügen/entfernen
  • -
  • 🔒 Privat-Badge — Repo ist als private markiert
  • -
  • Projekt-Bild — wird angezeigt wenn ein Repo-Avatar hinterlegt ist
  • -
  • Drag & Drop — Karte rausziehen zum Herunterladen; Datei reinklicken zum Hochladen
  • -
-
-
- - -
-

04 Favoriten & Verlauf

- -

Die linke Seitenleiste zeigt deine Favoriten und deinen Verlauf als durchsuchbare Schnell-Navigation.

- -
-
-
-
-
- Favoriten & Verlauf — Sidebar -
-
- -
-
- -
-
-
⭐
-

Favoriten

-

Klicke den Stern auf einer Karte oder im Rechtsklick-Menü. Favoriten bleiben auch nach App-Neustart erhalten. Reihenfolge per Drag & Drop anpassbar.

-
-
-
🕐
-

Verlauf

-

Jedes geöffnete Repository wird automatisch im Verlauf gespeichert (max. 20). Zeit seit dem letzten Öffnen wird als "vor X Minuten/Stunden" angezeigt.

-
-
-
🖱️
-

Rechtsklick in Sidebar

-

Rechtsklick auf einen Sidebar-Eintrag öffnet ein Kontextmenü mit Öffnen, Favorit entfernen, Sichtbarkeit umschalten und Tags bearbeiten.

-
-
-
🔀
-

Drag & Drop Sortierung

-

Favoriten können per Drag & Drop innerhalb der Sidebar umsortiert werden. Die neue Reihenfolge wird automatisch gespeichert.

-
-
- -
- Sidebar ein-/ausblenden: Du kannst Favoriten und Verlauf einzeln in den Settings (Darstellung) deaktivieren. -
-
- - -
-
TEIL C
-
Repository-Aktionen
-
Kontextmenü, Datei-Explorer, Editor und alle Repo-Verwaltungsfunktionen.
-
- - -
-

05 Repository-Aktionen (Rechtsklick)

- -

Rechtsklick auf eine Repository-Karte öffnet ein vollständiges Kontextmenü mit allen Aktionen.

- -
-
-
-
Kontextmenü — Repository
-
-
📂 Öffnen
-
🌐 Im Browser öffnen
-
📋 Clone-URL kopieren
-
⭐ Zu Favoriten hinzufügen
-
🔒 Auf Privat schalten
-
🖼️ Projektbild hochladen
-
🏷️ Tags bearbeiten
-
🗑️ Löschen
-
-
-
-
Kontextmenü — Favorit/Verlauf
-
-
📂 Öffnen
-
⭐ Aus Favoriten entfernen
-
🔒 Auf Privat schalten
-
🏷️ Tags bearbeiten
-
🗑️ Aus Verlauf entfernen
-
-
-
-
- - - - - - - - - - - -
AktionBeschreibung
📂 ÖffnenWechselt in den Datei-Explorer des Repositories
🌐 Im Browser öffnenÖffnet das Repository auf der Gitea-Webseite
📋 Clone-URL kopierenKopiert die HTTPS-Clone-URL in die Zwischenablage
⭐ FavoritFügt zu Favoriten hinzu oder entfernt es
🔒 Privat/ÖffentlichSchaltet Sichtbarkeit des Repos auf Gitea um — benötigt Token mit Schreibrecht
🖼️ ProjektbildLädt ein eigenes Logo/Bild für das Repository hoch (max. empfohlen 512 × 512 px)
🏷️ Tags bearbeitenÖffnet den Tag-Editor (s. unten)
🗑️ LöschenLöscht das Repository permanent auf Gitea — es erscheint eine Bestätigungsabfrage
- -
-
🏷️ Tags (Topics) bearbeiten
-

- Tags helfen Repositories zu kategorisieren. Der Editor zeigt vorhandene Tags als Chips und - lädt automatisch alle bereits genutzten Topics von deiner Gitea-Instanz als Vorschläge. -

-
    -
  1. Rechtsklick auf Repo → 🏷️ Tags bearbeiten
  2. -
  3. Im Eingabefeld beginnen zu tippen — Vorschläge aus Gitea erscheinen automatisch
  4. -
  5. Vorschlag anklicken oder eigenen Tag mit Enter bestätigen
  6. -
  7. Bestehende Tags durch Klick auf ✕ entfernen
  8. -
  9. Speichern drücken
  10. -
-
- Tags müssen Gitea-kompatibel sein: nur Kleinbuchstaben, Zahlen und Bindestriche. Leerzeichen werden automatisch durch Bindestriche ersetzt. -
-
- -
-
🖼️ Projektbild (Repo-Avatar) hochladen
-
    -
  1. Rechtsklick auf Repo → 🖼️ Projektbild hochladen
  2. -
  3. Bilddatei auswählen (JPG, PNG, GIF — empfohlen quadratisch)
  4. -
  5. Das Bild wird sofort über die Gitea API hochgeladen
  6. -
  7. Nach Reload erscheint das Bild auf der Repository-Karte
  8. -
-
-
- - -
-

06 Datei-Explorer & Editor

- -

Klicke auf eine Repository-Karte um den Datei-Explorer zu öffnen. Hier navigierst du durch Ordner, - öffnest Dateien und bearbeitest Code direkt in der App.

- -
-
-
📁
-

Ordner-Navigation

-

Klick auf Ordner navigiert in die Tiefe. Der ⬅️ Zurück-Button erscheint automatisch in der Toolbar. Breadcrumb-Pfad oben sichtbar.

-
-
-
✏️
-

Datei-Editor

-

Klick auf eine Textdatei öffnet den integrierten Editor mit Syntax-Highlighting, Suchen & Ersetzen und Auto-Save-Funktion.

-
-
-
📤
-

Drag & Drop Upload

-

Dateien oder Ordner aus dem Windows Explorer direkt in das Grid ziehen um sie hochzuladen. Fortschritt wird als Progressbar angezeigt.

-
-
-
📥
-

Download per Drag

-

Eine Datei/Ordner-Karte aus dem Grid herausziehen lädt das Element auf den lokalen Rechner. Temporäre Dateien werden nach 20 s bereinigt.

-
-
-
🔤
-

Umbenennen & Verschieben

-

Rechtsklick auf eine Datei → Umbenennen. Ziel-Pfad eingeben um Dateien gleichzeitig zu verschieben.

-
-
-
🗑️
-

Löschen

-

Einzelne Dateien oder ganze Ordner löschen. Der Explorer zeigt eine Bestätigungsabfrage als Toast inklusive Zähler der betroffenen Dateien.

-
-
- -
-
✏️ Editor-Funktionen
-
-
-
-
-
- Editor — README.md -
-
-
-
🔍 Suchen (Ctrl+F)
-
💾 Speichern
-
✕ Schließen
- - README.md · Zeile 12 -
-
- 1  # Git Manager Explorer Pro
- 2 
- 3  A powerful Electron-based Git management GUI
- 4  supported by **Gitea** and **GitHub** APIs. -
-
-
- - - - - -
ShortcutAktion
Ctrl+SDatei speichern (pusht auf Gitea)
Ctrl+FSuchleiste öffnen
EscapeSuche schließen
-
- Mehrere Tabs: Der Editor unterstützt mehrere geöffnete Dateien gleichzeitig. Ungespeicherte Dateien werden mit einem Punkt im Tab-Namen markiert. -
-
-
- - -
-
TEIL D
-
Repository-Verwaltung
-
Erstellen, migrieren, pushen und Batch-Aktionen auf vielen Repos gleichzeitig.
-
- - -
-

07 Repository erstellen

- -

Klicke auf 🚀 New Repo in der Toolbar um ein neues Repository direkt auf Gitea anzulegen.

- -
-
-
-
-
- 🚀 Neues Repository erstellen -
-
-
-
-
- -
mein-neues-projekt
-
-
- -
main
-
-
- -
Optionale Beschreibung…
-
-
-
-
- -
-
Gitea ✓
-
GitHub
-
-
-
-
✓
- Auto-init mit README.md -
-
-
- Privates Repository -
-
-
-
-
Erstellen
-
Abbrechen
-
-
-
- -
    -
  1. Repository-Name wählen (nur Buchstaben, Zahlen, Bindestriche — der Name wird live on the fly validiert).
  2. -
  3. Optionale Beschreibung eintragen und Branch-Name bestätigen.
  4. -
  5. Plattform: Gitea oder GitHub auswählen (je nach Aktiv-Auswahl in der Toolbar).
  6. -
  7. "Auto-init mit README" ist standardmäßig aktiv — dadurch hat das Repo sofort einen initialen Commit.
  8. -
  9. Erstellen drücken – bei Erfolg erscheint eine Erfolgsmeldung und die Repo-Liste wird aktualisiert.
  10. -
- -
- Repository-Namen müssen eindeutig sein. Der Validator prüft direkt gegen Gitea und meldet Konflikte schon während der Eingabe. -
-
- - -
-

08 Migration (GitHub → Gitea)

- -

Klicke auf 📥 Migrieren um ein Repository vollständig von GitHub, GitLab oder einer - anderen Quelle auf deine Gitea-Instanz zu migrieren (inkl. Commit-History).

- -
-
-
-
-
- 📥 Repository migrieren -
-
-
- -
https://github.com/benutzer/mein-repo.git
-
-
-
- -
mein-repo
-
-
- -
Migriertes Repo von GitHub
-
-
- -
github-username
-
-
- -
ghp_••••••••
-
-
-
- ✅ "mein-repo" wurde erfolgreich migriert! -
-
-
- -
    -
  1. Quell-URL eingeben – unterstützt HTTPS und SSH-Clone-URLs von GitHub, GitLab, BitBucket und anderen Git-Diensten.
  2. -
  3. Repository-Name wird aus der URL automatisch vorausgefüllt (anpassbar).
  4. -
  5. Falls das Quell-Repo privat ist: Auth Username und Token des Quell-Dienstes eintragen.
  6. -
  7. "Privates Repository" anhaken wenn das migrierte Repo auf Gitea ebenfalls privat bleiben soll.
  8. -
  9. 📥 Migration starten drücken. Der Fortschritt wird als Status angezeigt.
  10. -
- -
- Gitea klont das Repo inklusive aller Branches, Tags und Commit-Historie direkt auf dem Server. - Die Migration kann je nach Repo-Größe einige Sekunden bis Minuten dauern. -
-
- - -
-

09 Batch-Aktionen

- -

Klicke auf 🧩 Batch um dieselbe Aktion gleichzeitig auf eine Liste von Repositories anzuwenden.

- -
-
-
-
-
- 🧩 Batch-Aktionen -
-
-
-
-
- -
🔄 Aktualisieren (refresh)
-
-
- -
- rusher2510/streamflix
- M_Viper/git-manager-gui
- W-Web/website -
-
-
-
-
-
Verfügbare Aktionen
-
- 🔄 Aktualisieren - 📥 Klonen (lokal) - 🏷️ Tag erstellen - 📦 Release erstellen -
-
-
-
-
-
- - - - - - - -
AktionWas passiert
🔄 AktualisierenLädt Metadaten aller eingetragenen Repos neu (kein Code-Push)
📥 KlonenKlont alle Repos in einen gewählten lokalen Zielordner
🏷️ Tag erstellenErstellt auf allen angegebenen Repos denselben Git-Tag
📦 Release erstellenLegt auf allen Repos ein Release mit Tag, Name und Beschreibung an
- -
- Repos werden im Format owner/repo eingetragen, eines pro Zeile. Beim Klonen wird auf doppelte Zielordner geprüft und gewarnt. -
-
- - -
-
TEIL E
-
Commits, Releases & Protokoll
-
Commit-History einsehen, Releases verwalten und die Activity-Log nutzen.
-
- - -
-

10 Commit-History & Diffs

- -

Wenn du ein Repository geöffnet hast, erscheint in der Toolbar der Button 📊 Commits. - Klicke ihn um die vollständige Commit-History zu laden.

- -
-
-
📊
-

Commit-Liste

-

Zeigt Commits mit Message, Autor, Datum und verkürztem SHA. Branch-Selector oben wechselt den Branch.

-
-
-
🔍
-

Commit-Suche

-

Filtert die Commit-Liste nach Message oder Autor in Echtzeit ohne neue API-Anfrage.

-
-
-
📄
-

Diff-Ansicht

-

Klick auf einen Commit zeigt das vollständige Diff (Added/Removed/Changed) aller betroffenen Dateien.

-
-
-
📈
-

Aktivitäts-Heatmap

-

Zeigt deine Gitea-Commit-Aktivität der letzten 20 Monate als farbige Kacheln — ähnlich GitHub.

-
-
- -
- Lokale Commits: Auch für lokal geöffnete Ordner (Open Local) kann die Commit-History des lokalen Git-Repos angezeigt werden. -
-
- - -
-

11 Releases verwalten

- -

In der Repo-Ansicht erscheint der Button 📦 Releases. Damit öffnest du die Release-Verwaltung.

- - - - - - - - - - -
FunktionBeschreibung
Release-ListeAlle vorhandenen Releases mit Datum, Tag und Beschreibung
Release erstellenTag, Name, Beschreibung und Pre-Release-Flag wählbar
Release bearbeitenName und Beschreibung nachträglich anpassen
Release löschenRelease permanent entfernen (mit Bestätigung)
Asset hochladenBinärdateien (z. B. .zip, .exe) an ein Release anhängen
Asset löschenEinzelne Anhänge aus einem Release entfernen
Release-Archiv herunterladenDen Quellcode-Snapshot als ZIP/TAR herunterladen
-
- - -
-

12 Retry-Queue & Activity-Log

- -
-
-
🔁
-

Retry-Queue

-

Fehlgeschlagene Schreiboperationen (z. B. Datei-Upload bei Netzwerkausfall) werden automatisch in die Queue eingereiht und alle 15 Sekunden erneut versucht. Die Queue-Größe steht im Toolbar-Button 🔁 Queue (0).

-
-
-
📝
-

Activity-Log

-

Öffne über 📝 Activity das vollständige Protokoll aller App-Aktionen gefiltert nach Info/Warn/Fehler. Der Log kann komplett geleert werden.

-
-
- -
- Retry-Limit: Nach 8 erfolglosen Versuchen wird ein Queue-Eintrag verworfen und als Fehler im Activity-Log eingetragen. Dann bitte Verbindung und Token prüfen. -
- -
-
🔁 Queue manuell verarbeiten
-
    -
  1. Klicke auf 🔁 Queue (N) in der Toolbar um alle ausstehenden Aufgaben sofort zu verarbeiten.
  2. -
  3. Im Activity-Log siehst du das Ergebnis: X erfolgreich, Y verworfen.
  4. -
-
-
- - -
-
TEIL F
-
Einstellungen & System
-
Alle Settings, Profilbild, Darstellung und Auto-Update.
-
- -
-

13 Einstellungen im Detail

- -
-
👤 Profilbild / Avatar
-

In den Settings kannst du ein Profilbild hinterlegen, das auf Gitea gesetzt wird.

-
    -
  1. In den Settings auf das Avatar-Kreisfeld klicken → Bild aus Datei wählen.
  2. -
  3. Das Bild wird lokal gespeichert und beim nächsten Speichern automatisch auf Gitea hochgeladen.
  4. -
  5. Alternativ: 📤 Auf Gitea aktualisieren sofort ohne Speichern auslösen.
  6. -
-
- - - - - - - - -
EinstellungStandardBeschreibung
⭐ Favoriten anzeigenAnZeigt/versteckt die Favoriten-Sidebar und Stern-Buttons
🕐 Zuletzt geöffnetAnVerlaufs-Sidebar ein-/ausblenden
⊞ Kompakt-ModusAusVerdichtete Darstellung für kleinere Bildschirme
🎨 Farbige Datei-IconsAnUnterschiedliche Farben je Dateityp im Explorer
🚀 Mit Windows startenAusApp miniert im System-Tray beim Windows-Login starten
- -
-
🔄 App-Update
-

Klicke auf 🔄 Nach Updates suchen in den Settings. Die App vergleicht die lokale Version - mit dem GitHub-Release-Server und lädt eine neue Version direkt herunter falls verfügbar.

-
- Die App prüft beim Start automatisch auf Updates im Hintergrund und meldet sich ohne Unterbrechung. -
-
-
- - -
-
ANHANG
-
Referenz & Problemlösung
-
Shortcuts, häufige Fehler und Token-Einrichtung auf einen Blick.
-
- -
-

Tastenkürzel-Übersicht

- - - - - - - - - -
ShortcutFunktion
Ctrl+KFuzzy-Suche im Repository-Grid fokussieren
Ctrl+SAktive Datei im Editor speichern
Ctrl+FSuchleiste im Editor öffnen
EscapeSuchleiste im Editor schließen
RechtsklickKontextmenü auf Repository-Karte oder Sidebar-Eintrag
Drag rausDatei/Ordner/Repo herunterladen
Drag reinDatei/Ordner in aktuelles Verzeichnis hochladen
-
- -
-

Häufige Fehler & Lösungen

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FehlermeldungUrsacheLösung
"missing-token-or-url"Kein Token oder keine URL eingetragenSettings öffnen und Gitea Token + URL eintragen
"401 Unauthorized"Token ungültig oder abgelaufenNeues Token auf Gitea generieren und in Settings eintragen
"403 Forbidden"Token hat nicht die benötigten RechteToken-Berechtigungen prüfen: repository, user sind Pflicht
"ECONNREFUSED"Gitea-Server nicht erreichbarURL prüfen; bei IPv6 eckige Klammern: http://[::1]:3000
"Timeout"Netzwerkproblem oder Server überlastetNetzwerkverbindung prüfen; ggf. VPN deaktivieren
Repo erscheint nichtOwner-Tab auf "Meine" filtert fremde Repos raus"Alle" Tab wählen oder nach Name suchen
Bilder werden nicht geladenGitea CORS-Policy oder ungültige Avatar-URLGitea-Server-Einstellungen prüfen; Repo-Avatar neu hochladen
-
- -
-

Gitea-Token einrichten (Schritt für Schritt)

-
    -
  1. Anmelden auf deiner Gitea-Instanz.
  2. -
  3. Rechts oben Avatar-Icon → Einstellungen.
  4. -
  5. Links in der Navigation: Anwendungen.
  6. -
  7. Unter "Token generieren" einen Namen eingeben (z. B. "Git Manager GUI").
  8. -
  9. Berechtigungen aktivieren: Repositories (Read & Write), User (Read), Issue (optional).
  10. -
  11. Token generieren und sofort kopieren — er wird nur einmal angezeigt!
  12. -
  13. Token in die Settings der App unter Gitea Token einfügen.
  14. -
-
- - - -
- - - - + + + + + +Git Manager Explorer Pro – Benutzerhandbuch + + + + + +
+ +

Git Manager Explorer Pro

+

Vollständiges Benutzerhandbuch · Version 2.1.3

+ +
+
Version2.1.3
+
PlattformWindows (Electron)
+
ErstellerM_Viper
+
StandMai 2026
+
+ +
+
01
Erste Schritte & Einrichtung
+
02
Gitea-Verbindung konfigurieren
+
03
Repositories laden & filtern
+
04
Favoriten & Verlauf
+
05
Repository-Aktionen (Rechtsklick)
+
06
Datei-Explorer & Editor
+
07
Repository erstellen
+
08
Migration (GitHub → Gitea)
+
09
Batch-Aktionen
+
10
Commit-History & Diffs
+
11
Releases verwalten
+
12
Retry-Queue & Activity-Log
+
+
+ + +
+ + +
+
TEIL A
+
Einrichtung & erste Schritte
+
App starten, Gitea verbinden und mit der Übersicht vertraut machen.
+
+ + +
+

01 Erste Schritte

+ +

+ Git Manager Explorer Pro ist eine Desktop-Anwendung auf Basis von Electron, + die dir eine grafische Oberfläche für deine Gitea- und GitHub-Repositories gibt. + Du kannst Dateien direkt im integrierten Editor bearbeiten, Commits einsehen, Releases anlegen, + Repositories migrieren und vieles mehr – alles ohne Kommandozeile. +

+ +
+
+
+
+
+ Git Manager Explorer Pro — Hauptfenster +
+
+
+ 🛠 Git Manager Explorer Pro + +
🚀 New Repo
+
📥 Migrieren
+
⬆️ Push
+
⚙️ Settings
+
🧩 Batch
+
+
+
📂 Open Local
+
🌐 Load Gitea
+
Gitea ●
+
GitHub
+
+
+
Meine 8
+
Alle 24
+
W-Web 12
+
rusher2510 4
+
+
🔍 Fuzzy-Suche: Name, Owner, Sprache, Topics…
+
+
📦 git-manager-gui
JavaScript • 3,2 MB
+
📦 streamflixPrivat
Kotlin • 8,1 MB
+
📦 yt-coockie-adblock
JavaScript • 0,4 MB
+
+
+
+ +
+
🖥 Systemvoraussetzungen
+ + + + + + +
VoraussetzungMindestEmpfohlen
WindowsWindows 10 (64-bit)Windows 11
RAM4 GB8 GB
NetzwerkZugang zu Gitea/GitHub-URLStabile Verbindung
Gitea API≥ 1.171.21+
+
+ +

Die App startet mit npm start im Projektordner oder über die bereitgestellte .exe-Datei. + Beim ersten Start sind noch keine Credentials gespeichert — öffne zuerst die Settings.

+
+ + +
+

02 Gitea-Verbindung konfigurieren

+ +

Alle Verbindungsdaten werden verschlüsselt (AES-256) lokal gespeichert. Öffne die Settings über + ⚙️ Settings in der Toolbar.

+ +
+
+
+
+
+ ⚙️ Einstellungen — Zugangsdaten +
+
+
+
+
+ +
ghp_••••••••••••••••
+
+
+ +
••••••••••••••••••
+
+
+ +
https://git.example.com
+
+
+
🔌 Verbindung testen
+
+
+
+
+
Verbindungsstatus
+
+
URLGültig
+
APIErreichbar
+
AuthOK
+
Latenz32 ms
+
Server1.22.0
+
+
+
+
+
+
+ +
    +
  1. GitHub Token – Optional. Nur benötigt wenn du auch GitHub-Repos laden willst. Erstelle ihn unter github.com → Settings → Developer settings → Personal access tokens.
  2. +
  3. Gitea Token – Pflichtfeld. Erstelle unter Gitea → Einstellungen → Anwendungen → Token generieren. Berechtigungen: repository, user, issue.
  4. +
  5. Gitea URL – Die Basis-URL deines Servers (z. B. https://git.example.com). IPv6 mit Klammern: http://[::1]:3000.
  6. +
  7. Verbindung testen drücken — der Verbindungsstatus zeigt grüne Haken wenn alles stimmt.
  8. +
  9. Speichern — beim nächsten App-Start werden die Repos automatisch geladen.
  10. +
+ +
+ Auto-Login: Sind Credentials gespeichert wird beim Start automatisch Load Gitea ausgeführt. Die letzten Projekte erscheinen sofort ohne manuellen Klick. +
+ +
+
🎯 Projektname in der Übersicht
+

Wenn du ein Repository öffnest, wird der Projektname in der Gravy-Leiste (unter der Toolbar) angezeigt. + Beim Wechsel zurück zur Repository-Übersicht wird der Name automatisch ausgeblendet. + Das gilt für beide Navigationswege:

+
    +
  • ⬅️ Zurück-Button klicken
  • +
  • 🌐 Load Gitea / 📂 Open Local klicken
  • +
+
+ ✓ Projektname wird immer korrekt synchronisiert und verschwindet in der Übersicht. +
+
+
+ + +
+
TEIL B
+
Repository-Übersicht
+
Repositories laden, filtern, suchen und mit Tabs nach Besitzern sortieren.
+
+ + +
+

03 Repositories laden & filtern

+ +

Klicke auf 🌐 Load Gitea um alle Repositories deines Tokens zu laden — inklusive privater Repos.

+ +
+
📂 Owner-Tabs
+

Die Tabs über dem Repository-Grid sortieren nach Besitzer. Der aktive Tab wird hervorgehoben. Beim App-Start ist immer Meine vorausgewählt.

+
+
+
+
Meine 8
+
Alle 24
+
W-Web 12
+
rusher2510 4
+
+
+ → Klick auf "Alle" zeigt sämtliche geladenen Repositories unabhängig vom Besitzer. +
+
+
+ + + + + +
TabBeschreibung
MeineNur Repositories deren Owner-Login mit deinem Gitea-Konto übereinstimmt
AlleAlle geladenen Repositories ohne Einschränkung
GruppennameNur Repositories dieser Organisation / dieses Nutzers
+
+ +
+
🔍 Fuzzy-Suche TIPP
+

Das Suchfeld über dem Grid filtert in Echtzeit nach Name, Owner, Sprache und Topics. + Mehrere Wörter werden als AND-Verknüpfung behandelt.

+
+ Shortcut: Ctrl + K fokussiert das Suchfeld von überall in der Repository-Ansicht. +
+

Beispiele:

+
    +
  • stream kotlin → zeigt alle Kotlin-Repos mit "stream" im Namen
  • +
  • telegram javascript → Telegram-Repos in JavaScript
  • +
  • privat → Repos mit "privat" in Beschreibung oder Name
  • +
+
+ +
+
📋 Repository-Karte
+
+
+
+
+
+ ⭐ +
📦 streamflixPrivat
+
Kotlin • 8,1 MB
+
+ android · kotlin · leanback · streaming +
+
+
+
+
📦 git-manager-gui
+
JavaScript • 3,2 MB
+
+
+
📦 tg-group-moderation
+
kein Sprachmarker
+
+
+
+
+
    +
  • ⭐ Stern-Button (oben rechts auf Karte) — Favorit hinzufügen/entfernen
  • +
  • 🔒 Privat-Badge — Repo ist als private markiert
  • +
  • Projekt-Bild — wird angezeigt wenn ein Repo-Avatar hinterlegt ist
  • +
  • Drag & Drop — Karte rausziehen zum Herunterladen; Datei reinklicken zum Hochladen
  • +
+
+
+ + +
+

04 Favoriten & Verlauf

+ +

Die linke Seitenleiste zeigt deine Favoriten und deinen Verlauf als durchsuchbare Schnell-Navigation.

+ +
+
+
+
+
+ Favoriten & Verlauf — Sidebar +
+
+ +
+
+ +
+
+
⭐
+

Favoriten

+

Klicke den Stern auf einer Karte oder im Rechtsklick-Menü. Favoriten bleiben auch nach App-Neustart erhalten. Reihenfolge per Drag & Drop anpassbar.

+
+
+
🕐
+

Verlauf

+

Jedes geöffnete Repository wird automatisch im Verlauf gespeichert (max. 20). Zeit seit dem letzten Öffnen wird als "vor X Minuten/Stunden" angezeigt.

+
+
+
🖱️
+

Rechtsklick in Sidebar

+

Rechtsklick auf einen Sidebar-Eintrag öffnet ein Kontextmenü mit Öffnen, Favorit entfernen, Sichtbarkeit umschalten und Tags bearbeiten.

+
+
+
🔀
+

Drag & Drop Sortierung

+

Favoriten können per Drag & Drop innerhalb der Sidebar umsortiert werden. Die neue Reihenfolge wird automatisch gespeichert.

+
+
+ +
+ Sidebar ein-/ausblenden: Du kannst Favoriten und Verlauf einzeln in den Settings (Darstellung) deaktivieren. +
+
+ + +
+
TEIL C
+
Repository-Aktionen
+
Kontextmenü, Datei-Explorer, Editor und alle Repo-Verwaltungsfunktionen.
+
+ + +
+

05 Repository-Aktionen (Rechtsklick)

+ +

Rechtsklick auf eine Repository-Karte öffnet ein vollständiges Kontextmenü mit allen Aktionen.

+ +
+
+
+
Kontextmenü — Repository
+
+
📂 Öffnen
+
🌐 Im Browser öffnen
+
📋 Clone-URL kopieren
+
⭐ Zu Favoriten hinzufügen
+
🔒 Auf Privat schalten
+
🖼️ Projektbild hochladen
+
🏷️ Tags bearbeiten
+
🗑️ Löschen
+
+
+
+
Kontextmenü — Favorit/Verlauf
+
+
📂 Öffnen
+
⭐ Aus Favoriten entfernen
+
🔒 Auf Privat schalten
+
🏷️ Tags bearbeiten
+
🗑️ Aus Verlauf entfernen
+
+
+
+
+ + + + + + + + + + + +
AktionBeschreibung
📂 ÖffnenWechselt in den Datei-Explorer des Repositories
🌐 Im Browser öffnenÖffnet das Repository auf der Gitea-Webseite
📋 Clone-URL kopierenKopiert die HTTPS-Clone-URL in die Zwischenablage
⭐ FavoritFügt zu Favoriten hinzu oder entfernt es
🔒 Privat/ÖffentlichSchaltet Sichtbarkeit des Repos auf Gitea um — benötigt Token mit Schreibrecht
🖼️ ProjektbildLädt ein eigenes Logo/Bild für das Repository hoch (max. empfohlen 512 × 512 px)
🏷️ Tags bearbeitenÖffnet den Tag-Editor (s. unten)
🗑️ LöschenLöscht das Repository permanent auf Gitea — es erscheint eine Bestätigungsabfrage
+ +
+
🏷️ Tags (Topics) bearbeiten
+

+ Tags helfen Repositories zu kategorisieren. Der Editor zeigt vorhandene Tags als Chips und + lädt automatisch alle bereits genutzten Topics von deiner Gitea-Instanz als Vorschläge. +

+
    +
  1. Rechtsklick auf Repo → 🏷️ Tags bearbeiten
  2. +
  3. Im Eingabefeld beginnen zu tippen — Vorschläge aus Gitea erscheinen automatisch
  4. +
  5. Vorschlag anklicken oder eigenen Tag mit Enter bestätigen
  6. +
  7. Bestehende Tags durch Klick auf ✕ entfernen
  8. +
  9. Speichern drücken
  10. +
+
+ Tags müssen Gitea-kompatibel sein: nur Kleinbuchstaben, Zahlen und Bindestriche. Leerzeichen werden automatisch durch Bindestriche ersetzt. +
+
+ +
+
🖼️ Projektbild (Repo-Avatar) hochladen
+
    +
  1. Rechtsklick auf Repo → 🖼️ Projektbild hochladen
  2. +
  3. Bilddatei auswählen (JPG, PNG, GIF — empfohlen quadratisch)
  4. +
  5. Das Bild wird sofort über die Gitea API hochgeladen
  6. +
  7. Nach Reload erscheint das Bild auf der Repository-Karte
  8. +
+
+
+ + +
+

06 Datei-Explorer & Editor

+ +

Klicke auf eine Repository-Karte um den Datei-Explorer zu öffnen. Hier navigierst du durch Ordner, + öffnest Dateien und bearbeitest Code direkt in der App.

+ +
+
+
📁
+

Ordner-Navigation

+

Klick auf Ordner navigiert in die Tiefe. Der ⬅️ Zurück-Button erscheint automatisch in der Toolbar. Breadcrumb-Pfad oben sichtbar.

+
+
+
✏️
+

Datei-Editor

+

Klick auf eine Textdatei öffnet den integrierten Editor mit Syntax-Highlighting, Suchen & Ersetzen und Auto-Save-Funktion.

+
+
+
📤
+

Drag & Drop Upload

+

Dateien oder Ordner aus dem Windows Explorer direkt in das Grid ziehen um sie hochzuladen. Fortschritt wird als Progressbar angezeigt.

+
+
+
📥
+

Download per Drag

+

Eine Datei/Ordner-Karte aus dem Grid herausziehen lädt das Element auf den lokalen Rechner. Temporäre Dateien werden nach 20 s bereinigt.

+
+
+
🔤
+

Umbenennen & Verschieben

+

Rechtsklick auf eine Datei → Umbenennen. Ziel-Pfad eingeben um Dateien gleichzeitig zu verschieben.

+
+
+
🗑️
+

Löschen

+

Einzelne Dateien oder ganze Ordner löschen. Der Explorer zeigt eine Bestätigungsabfrage als Toast inklusive Zähler der betroffenen Dateien.

+
+
+ +
+
✏️ Editor-Funktionen
+
+
+
+
+
+ Editor — README.md +
+
+
+
🔍 Suchen (Ctrl+F)
+
💾 Speichern
+
✕ Schließen
+ + README.md · Zeile 12 +
+
+ 1  # Git Manager Explorer Pro
+ 2 
+ 3  A powerful Electron-based Git management GUI
+ 4  supported by **Gitea** and **GitHub** APIs. +
+
+
+ + + + + +
ShortcutAktion
Ctrl+SDatei speichern (pusht auf Gitea)
Ctrl+FSuchleiste öffnen
EscapeSuche schließen
+
+ Mehrere Tabs: Der Editor unterstützt mehrere geöffnete Dateien gleichzeitig. Ungespeicherte Dateien werden mit einem Punkt im Tab-Namen markiert. +
+
+
+ + +
+
TEIL D
+
Repository-Verwaltung
+
Erstellen, migrieren, pushen und Batch-Aktionen auf vielen Repos gleichzeitig.
+
+ + +
+

07 Repository erstellen

+ +

Klicke auf 🚀 New Repo in der Toolbar um ein neues Repository direkt auf Gitea anzulegen.

+ +
+
+
+
+
+ 🚀 Neues Repository erstellen +
+
+
+
+
+ +
mein-neues-projekt
+
+
+ +
main
+
+
+ +
Optionale Beschreibung…
+
+
+
+
+ +
+
Gitea ✓
+
GitHub
+
+
+
+
✓
+ Auto-init mit README.md +
+
+
+ Privates Repository +
+
+
+
+
Erstellen
+
Abbrechen
+
+
+
+ +
    +
  1. Repository-Name wählen (nur Buchstaben, Zahlen, Bindestriche — der Name wird live on the fly validiert).
  2. +
  3. Optionale Beschreibung eintragen und Branch-Name bestätigen.
  4. +
  5. Plattform: Gitea oder GitHub auswählen (je nach Aktiv-Auswahl in der Toolbar).
  6. +
  7. "Auto-init mit README" ist standardmäßig aktiv — dadurch hat das Repo sofort einen initialen Commit.
  8. +
  9. Erstellen drücken – bei Erfolg erscheint eine Erfolgsmeldung und die Repo-Liste wird aktualisiert.
  10. +
+ +
+ Repository-Namen müssen eindeutig sein. Der Validator prüft direkt gegen Gitea und meldet Konflikte schon während der Eingabe. +
+
+ + +
+

08 Migration (GitHub → Gitea)

+ +

Klicke auf 📥 Migrieren um ein Repository vollständig von GitHub, GitLab oder einer + anderen Quelle auf deine Gitea-Instanz zu migrieren (inkl. Commit-History).

+ +
+
+
+
+
+ 📥 Repository migrieren +
+
+
+ +
https://github.com/benutzer/mein-repo.git
+
+
+
+ +
mein-repo
+
+
+ +
Migriertes Repo von GitHub
+
+
+ +
github-username
+
+
+ +
ghp_••••••••
+
+
+
+ ✅ "mein-repo" wurde erfolgreich migriert! +
+
+
+ +
    +
  1. Quell-URL eingeben – unterstützt HTTPS und SSH-Clone-URLs von GitHub, GitLab, BitBucket und anderen Git-Diensten.
  2. +
  3. Repository-Name wird aus der URL automatisch vorausgefüllt (anpassbar).
  4. +
  5. Falls das Quell-Repo privat ist: Auth Username und Token des Quell-Dienstes eintragen.
  6. +
  7. "Privates Repository" anhaken wenn das migrierte Repo auf Gitea ebenfalls privat bleiben soll.
  8. +
  9. 📥 Migration starten drücken. Der Fortschritt wird als Status angezeigt.
  10. +
+ +
+ Gitea klont das Repo inklusive aller Branches, Tags und Commit-Historie direkt auf dem Server. + Die Migration kann je nach Repo-Größe einige Sekunden bis Minuten dauern. +
+
+ + +
+

09 Batch-Aktionen

+ +

Klicke auf 🧩 Batch um dieselbe Aktion gleichzeitig auf eine Liste von Repositories anzuwenden.

+ +
+
+
+
+
+ 🧩 Batch-Aktionen +
+
+
+
+
+ +
🔄 Aktualisieren (refresh)
+
+
+ +
+ rusher2510/streamflix
+ M_Viper/git-manager-gui
+ W-Web/website +
+
+
+
+
+
Verfügbare Aktionen
+
+ 🔄 Aktualisieren + 📥 Klonen (lokal) + 🏷️ Tag erstellen + 📦 Release erstellen +
+
+
+
+
+
+ + + + + + + +
AktionWas passiert
🔄 AktualisierenLädt Metadaten aller eingetragenen Repos neu (kein Code-Push)
📥 KlonenKlont alle Repos in einen gewählten lokalen Zielordner
🏷️ Tag erstellenErstellt auf allen angegebenen Repos denselben Git-Tag
📦 Release erstellenLegt auf allen Repos ein Release mit Tag, Name und Beschreibung an
+ +
+ Repos werden im Format owner/repo eingetragen, eines pro Zeile. Beim Klonen wird auf doppelte Zielordner geprüft und gewarnt. +
+
+ + +
+
TEIL E
+
Commits, Releases & Protokoll
+
Commit-History einsehen, Releases verwalten und die Activity-Log nutzen.
+
+ + +
+

10 Commit-History & Diffs

+ +

Wenn du ein Repository geöffnet hast, erscheint in der Toolbar der Button 📊 Commits. + Klicke ihn um die vollständige Commit-History zu laden.

+ +
+
+
📊
+

Commit-Liste

+

Zeigt Commits mit Message, Autor, Datum und verkürztem SHA. Branch-Selector oben wechselt den Branch.

+
+
+
🔍
+

Commit-Suche

+

Filtert die Commit-Liste nach Message oder Autor in Echtzeit ohne neue API-Anfrage.

+
+
+
📄
+

Diff-Ansicht

+

Klick auf einen Commit zeigt das vollständige Diff (Added/Removed/Changed) aller betroffenen Dateien.

+
+
+
📈
+

Aktivitäts-Heatmap

+

Zeigt deine Gitea-Commit-Aktivität der letzten 20 Monate als farbige Kacheln — ähnlich GitHub.

+
+
+ +
+ Lokale Commits: Auch für lokal geöffnete Ordner (Open Local) kann die Commit-History des lokalen Git-Repos angezeigt werden. +
+
+ + +
+

11 Releases verwalten

+ +

In der Repo-Ansicht erscheint der Button 📦 Releases. Damit öffnest du die Release-Verwaltung.

+ + + + + + + + + + +
FunktionBeschreibung
Release-ListeAlle vorhandenen Releases mit Datum, Tag und Beschreibung
Release erstellenTag, Name, Beschreibung und Pre-Release-Flag wählbar
Release bearbeitenName und Beschreibung nachträglich anpassen
Release löschenRelease permanent entfernen (mit Bestätigung)
Asset hochladenBinärdateien (z. B. .zip, .exe) an ein Release anhängen
Asset löschenEinzelne Anhänge aus einem Release entfernen
Release-Archiv herunterladenDen Quellcode-Snapshot als ZIP/TAR herunterladen
+
+ + +
+

12 Retry-Queue & Activity-Log

+ +
+
+
🔁
+

Retry-Queue

+

Fehlgeschlagene Schreiboperationen (z. B. Datei-Upload bei Netzwerkausfall) werden automatisch in die Queue eingereiht und alle 15 Sekunden erneut versucht. Die Queue-Größe steht im Toolbar-Button 🔁 Queue (0).

+
+
+
📝
+

Activity-Log

+

Öffne über 📝 Activity das vollständige Protokoll aller App-Aktionen gefiltert nach Info/Warn/Fehler. Der Log kann komplett geleert werden.

+
+
+ +
+ Retry-Limit: Nach 8 erfolglosen Versuchen wird ein Queue-Eintrag verworfen und als Fehler im Activity-Log eingetragen. Dann bitte Verbindung und Token prüfen. +
+ +
+
🔁 Queue manuell verarbeiten
+
    +
  1. Klicke auf 🔁 Queue (N) in der Toolbar um alle ausstehenden Aufgaben sofort zu verarbeiten.
  2. +
  3. Im Activity-Log siehst du das Ergebnis: X erfolgreich, Y verworfen.
  4. +
+
+
+ + +
+
TEIL F
+
Einstellungen & System
+
Alle Settings, Profilbild, Darstellung und Auto-Update.
+
+ +
+

13 Einstellungen im Detail

+ +
+
👤 Profilbild / Avatar
+

In den Settings kannst du ein Profilbild hinterlegen, das auf Gitea gesetzt wird.

+
    +
  1. In den Settings auf das Avatar-Kreisfeld klicken → Bild aus Datei wählen.
  2. +
  3. Das Bild wird lokal gespeichert und beim nächsten Speichern automatisch auf Gitea hochgeladen.
  4. +
  5. Alternativ: 📤 Auf Gitea aktualisieren sofort ohne Speichern auslösen.
  6. +
+
+ + + + + + + + +
EinstellungStandardBeschreibung
⭐ Favoriten anzeigenAnZeigt/versteckt die Favoriten-Sidebar und Stern-Buttons
🕐 Zuletzt geöffnetAnVerlaufs-Sidebar ein-/ausblenden
⊞ Kompakt-ModusAusVerdichtete Darstellung für kleinere Bildschirme
🎨 Farbige Datei-IconsAnUnterschiedliche Farben je Dateityp im Explorer
🚀 Mit Windows startenAusApp miniert im System-Tray beim Windows-Login starten
+ +
+
🔄 App-Update
+

Klicke auf 🔄 Nach Updates suchen in den Settings. Die App vergleicht die lokale Version + mit dem GitHub-Release-Server und lädt eine neue Version direkt herunter falls verfügbar.

+
+ Die App prüft beim Start automatisch auf Updates im Hintergrund und meldet sich ohne Unterbrechung. +
+
+
+ + +
+
ANHANG
+
Referenz & Problemlösung
+
Shortcuts, häufige Fehler und Token-Einrichtung auf einen Blick.
+
+ +
+

Tastenkürzel-Übersicht

+ + + + + + + + + +
ShortcutFunktion
Ctrl+KFuzzy-Suche im Repository-Grid fokussieren
Ctrl+SAktive Datei im Editor speichern
Ctrl+FSuchleiste im Editor öffnen
EscapeSuchleiste im Editor schließen
RechtsklickKontextmenü auf Repository-Karte oder Sidebar-Eintrag
Drag rausDatei/Ordner/Repo herunterladen
Drag reinDatei/Ordner in aktuelles Verzeichnis hochladen
+
+ +
+

Häufige Fehler & Lösungen

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FehlermeldungUrsacheLösung
"missing-token-or-url"Kein Token oder keine URL eingetragenSettings öffnen und Gitea Token + URL eintragen
"401 Unauthorized"Token ungültig oder abgelaufenNeues Token auf Gitea generieren und in Settings eintragen
"403 Forbidden"Token hat nicht die benötigten RechteToken-Berechtigungen prüfen: repository, user sind Pflicht
"ECONNREFUSED"Gitea-Server nicht erreichbarURL prüfen; bei IPv6 eckige Klammern: http://[::1]:3000
"Timeout"Netzwerkproblem oder Server überlastetNetzwerkverbindung prüfen; ggf. VPN deaktivieren
Repo erscheint nichtOwner-Tab auf "Meine" filtert fremde Repos raus"Alle" Tab wählen oder nach Name suchen
Bilder werden nicht geladenGitea CORS-Policy oder ungültige Avatar-URLGitea-Server-Einstellungen prüfen; Repo-Avatar neu hochladen
+
+ +
+

Gitea-Token einrichten (Schritt für Schritt)

+
    +
  1. Anmelden auf deiner Gitea-Instanz.
  2. +
  3. Rechts oben Avatar-Icon → Einstellungen.
  4. +
  5. Links in der Navigation: Anwendungen.
  6. +
  7. Unter "Token generieren" einen Namen eingeben (z. B. "Git Manager GUI").
  8. +
  9. Berechtigungen aktivieren: Repositories (Read & Write), User (Read), Issue (optional).
  10. +
  11. Token generieren und sofort kopieren — er wird nur einmal angezeigt!
  12. +
  13. Token in die Settings der App unter Gitea Token einfügen.
  14. +
+
+ + + +
+ + + + diff --git a/__tests__/backup-progress.test.js b/__tests__/backup-progress.test.js new file mode 100644 index 0000000..cb7f2f0 --- /dev/null +++ b/__tests__/backup-progress.test.js @@ -0,0 +1,116 @@ +const test = require('node:test'); +const assert = require('node:assert'); +const http = require('node:http'); +const fs = require('node:fs'); +const os = require('node:os'); +const path = require('node:path'); + +require('../src/git/gitBinary.js').useBundledGit(); +const { registerFeatureIpc } = require('../src/features/featuresIpc.js'); + +// Drei Repos; das ZIP von "langsam" kommt in kleinen Stücken über ~3 s, damit ein Abbruch mitten hineinfällt +function fakeGitea() { + const server = http.createServer((req, res) => { + const u = new URL(req.url, 'http://x'); + const send = (code, obj) => { res.statusCode = code; res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify(obj)); }; + if (u.pathname === '/api/v1/user/repos') { + if (u.searchParams.get('page') !== '1') return send(200, []); + const port = server.address().port; + return send(200, ['eins', 'langsam', 'drei'].map(name => ({ + name, owner: { login: 'M_Viper' }, default_branch: 'main', empty: false, + clone_url: `http://127.0.0.1:${port}/M_Viper/${name}.git` + }))); + } + const m = u.pathname.match(/^\/api\/v1\/repos\/M_Viper\/(\w+)\/archive\/main\.zip$/); + if (m) { + const total = 64 * 1024; + res.writeHead(200, { 'Content-Type': 'application/zip', 'Content-Length': String(total) }); + if (m[1] !== 'langsam') return res.end(Buffer.alloc(total, 1)); + let sent = 0; + const t = setInterval(() => { + if (res.destroyed) return clearInterval(t); + res.write(Buffer.alloc(2048, 1)); + sent += 2048; + if (sent >= total) { clearInterval(t); res.end(); } + }, 100); + return; + } + send(404, { message: 'not found' }); + }); + return new Promise(r => server.listen(0, '127.0.0.1', () => r({ server, url: `http://127.0.0.1:${server.address().port}` }))); +} + +function setup(url) { + const handlers = {}; + const events = []; + registerFeatureIpc({ + ipcMain: { handle: (name, fn) => { handlers[name] = fn; } }, + app: { getPath: () => fs.mkdtempSync(path.join(os.tmpdir(), 'gm-ud-')) }, + readCredentials: () => ({ giteaURL: url, giteaToken: 't' }), + buildItemsFromPaths: async () => ({ items: [], skipped: [], ignored: [] }), + clearGitTransportBlock: () => false, + broadcast: (channel, p) => { if (channel === 'repo-backup-progress') events.push(p); } + }); + return { call: (name, data) => handlers[name]({ sender: { send() {} } }, data), events }; +} + +test('Backup meldet Fortschritt: Phasen, aktuelles Repo, Bytes und Ergebnis je Repo', async () => { + const g = await fakeGitea(); + try { + const { call, events } = setup(g.url); + const target = fs.mkdtempSync(path.join(os.tmpdir(), 'gm-bk-')); + await call('repo-backup-set-config', { targetDir: target }); + const r = await call('repo-backup-run-now', {}); + assert.strictEqual(r.summary.ok, 3, JSON.stringify(r)); + + const phases = [...new Set(events.map(e => e.phase))]; + assert.deepStrictEqual(phases, ['start', 'list', 'running', 'done']); + assert.deepStrictEqual(events.find(e => e.phase === 'running').repos, ['M_Viper/eins', 'M_Viper/langsam', 'M_Viper/drei']); + assert.ok(events.some(e => e.repo === 'M_Viper/langsam' && e.bytes > 0 && e.bytesTotal === 64 * 1024), 'Download-Fortschritt fehlt'); + const last = events[events.length - 1]; + assert.strictEqual(last.results.length, 3); + assert.ok(last.results.every(x => x.ok && x.method === 'ZIP')); + assert.ok(!events.some(e => 'abort' in e), 'interne Felder dürfen nicht nach außen gehen'); + + // Während kein Backup läuft, gibt es auch keinen Zwischenstand + const state = await call('repo-backup-get-config', {}); + assert.strictEqual(state.running, false); + assert.strictEqual(state.progress, null); + } finally { + g.server.close(); + } +}); + +test('Abbrechen beendet den laufenden ZIP-Download sofort und überspringt den Rest', async () => { + const g = await fakeGitea(); + try { + const { call, events } = setup(g.url); + const target = fs.mkdtempSync(path.join(os.tmpdir(), 'gm-bk-')); + await call('repo-backup-set-config', { targetDir: target }); + const started = Date.now(); + const running = call('repo-backup-run-now', {}); + + // warten, bis der langsame Download läuft + while (!events.some(e => e.repo === 'M_Viper/langsam' && e.bytes > 0)) { + if (Date.now() - started > 10000) throw new Error('Download startete nicht'); + await new Promise(r => setTimeout(r, 50)); + } + const state = await call('repo-backup-get-config', {}); + assert.strictEqual(state.running, true); + assert.strictEqual(state.progress.repo, 'M_Viper/langsam'); + + assert.strictEqual((await call('repo-backup-cancel', {})).ok, true); + const r = await running; + assert.ok(Date.now() - started < 2500, 'Abbruch muss den Download sofort beenden'); + assert.strictEqual(r.ok, false); + assert.strictEqual(r.summary.cancelled, true); + assert.strictEqual(r.summary.ok, 1); + assert.strictEqual(r.summary.skipped, 2); + // keine halbe Datei zurücklassen + const archiv = path.join(target, 'M_Viper', 'langsam-archiv'); + assert.deepStrictEqual(fs.existsSync(archiv) ? fs.readdirSync(archiv) : [], []); + assert.strictEqual((await call('repo-backup-cancel', {})).ok, false); + } finally { + g.server.close(); + } +}); diff --git a/__tests__/delete.test.js b/__tests__/delete.test.js new file mode 100644 index 0000000..198c42c --- /dev/null +++ b/__tests__/delete.test.js @@ -0,0 +1,60 @@ +const test = require('node:test'); +const assert = require('node:assert'); +const http = require('node:http'); +const { deleteGiteaPathsBatched } = require('../src/git/apiHandler.js'); + +// Minimaler Gitea-Nachbau: Repo-Info, Trees-API (seitenweise) und Mehrfach-Commit-Endpunkt. +function fakeGitea(paths, { perPage = 1000, failPath = null } = {}) { + const files = new Map(paths.map((p, i) => [p, `sha${i}`])); + const commits = []; + const server = http.createServer((req, res) => { + const u = new URL(req.url, 'http://x'); + const send = (code, obj) => { res.statusCode = code; res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify(obj)); }; + if (req.method === 'GET' && u.pathname === '/api/v1/repos/o/r') return send(200, { default_branch: 'main' }); + if (req.method === 'GET' && u.pathname === '/api/v1/repos/o/r/git/trees/main') { + const page = Number(u.searchParams.get('page') || 1); + const all = [...files.keys()].map(p => ({ path: p, type: 'blob', sha: files.get(p) })); + const slice = all.slice((page - 1) * perPage, page * perPage); + return send(200, { tree: slice, truncated: page * perPage < all.length, total_count: all.length, page }); + } + if (req.method === 'POST' && u.pathname === '/api/v1/repos/o/r/contents') { + let body = ''; + req.on('data', c => body += c); + req.on('end', () => { + const { files: ops } = JSON.parse(body); + if (failPath && ops.some(o => o.path === failPath)) return send(422, { message: 'kaputt' }); + for (const o of ops) { + assert.strictEqual(o.operation, 'delete'); + assert.strictEqual(o.sha, files.get(o.path)); + files.delete(o.path); + } + commits.push(ops.length); + send(201, {}); + }); + return; + } + send(404, { message: 'object does not exist' }); + }); + return new Promise(r => server.listen(0, '127.0.0.1', () => r({ server, files, commits, url: `http://127.0.0.1:${server.address().port}` }))); +} + +test('Ordner wird paketweise gelöscht, Nachbarn bleiben', async () => { + const paths = [...Array.from({ length: 2500 }, (_, i) => `mobile/build/f${i}.dex`), 'mobile/build.gradle.kts', 'mobile/src/A.kt']; + const g = await fakeGitea(paths, { perPage: 1000 }); + try { + const r = await deleteGiteaPathsBatched({ token: 't', url: g.url, owner: 'o', repo: 'r', prefix: 'mobile/build' }); + assert.strictEqual(r.deleted, 2500); + assert.deepStrictEqual(g.commits, Array(25).fill(100)); + assert.deepStrictEqual([...g.files.keys()].sort(), ['mobile/build.gradle.kts', 'mobile/src/A.kt']); + } finally { g.server.close(); } +}); + +test('eine fehlerhafte Datei blockiert nicht das ganze Paket', async () => { + const paths = Array.from({ length: 10 }, (_, i) => `x/f${i}`); + const g = await fakeGitea(paths, { failPath: 'x/f3' }); + try { + const r = await deleteGiteaPathsBatched({ token: 't', url: g.url, owner: 'o', repo: 'r', paths }); + assert.strictEqual(r.deleted, 9); + assert.deepStrictEqual(r.failed.map(f => f.path), ['x/f3']); + } finally { g.server.close(); } +}); diff --git a/__tests__/features.test.js b/__tests__/features.test.js new file mode 100644 index 0000000..3ad2c89 --- /dev/null +++ b/__tests__/features.test.js @@ -0,0 +1,162 @@ +const test = require('node:test'); +const assert = require('node:assert'); +const http = require('node:http'); +const fs = require('node:fs'); +const os = require('node:os'); +const path = require('node:path'); +const { spawnSync } = require('node:child_process'); + +require('../src/git/gitBinary.js').useBundledGit(); +const { registerFeatureIpc, parsePorcelainZ } = require('../src/features/featuresIpc.js'); +const { scanForSecrets, checkName } = require('../src/features/secretScan.js'); + +// Minimaler Gitea-Nachbau für Diagnose, PRs/Issues und Backup +function fakeGitea() { + const calls = []; + const comments = []; + const server = http.createServer((req, res) => { + const u = new URL(req.url, 'http://x'); + calls.push(`${req.method} ${u.pathname}`); + const send = (code, obj) => { res.statusCode = code; res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify(obj)); }; + let body = ''; + req.on('data', c => body += c); + req.on('end', () => { + const p = u.pathname; + if (p === '/api/v1/version') return send(200, { version: '1.24.0' }); + if (p === '/api/v1/user') return send(200, { login: 'M_Viper' }); + if (p === '/api/v1/user/repos') { + if (u.searchParams.get('page') && u.searchParams.get('page') !== '1') return send(200, []); + return send(200, [{ name: 'deskhub', owner: { login: 'M_Viper' }, default_branch: 'main', empty: false, + clone_url: `http://127.0.0.1:${server.address().port}/M_Viper/deskhub.git` }]); + } + if (p === '/api/v1/repos/M_Viper/deskhub/pulls') return send(200, [{ number: 3, title: 'Fix', state: 'open', user: { login: 'a' }, labels: [], head: { label: 'fix' }, base: { label: 'main' }, mergeable: true }]); + if (p === '/api/v1/repos/M_Viper/deskhub/issues' && req.method === 'GET') return send(200, [{ number: 5, title: 'Bug', state: 'open', labels: [{ name: 'bug', color: 'ff0000' }] }]); + if (p === '/api/v1/repos/M_Viper/deskhub/issues' && req.method === 'POST') return send(201, { number: 6, ...JSON.parse(body), state: 'open', labels: [] }); + if (p === '/api/v1/repos/M_Viper/deskhub/issues/5/comments' && req.method === 'POST') { comments.push(JSON.parse(body).body); return send(201, {}); } + if (p === '/api/v1/repos/M_Viper/deskhub/issues/5/comments') return send(200, comments.map((b, i) => ({ id: i, body: b, user: { login: 'M_Viper' } }))); + if (p === '/api/v1/repos/M_Viper/deskhub/issues/5') return send(200, { number: 5, title: 'Bug', state: 'open', labels: [] }); + if (p === '/api/v1/repos/M_Viper/deskhub/pulls/3/merge') return send(200, {}); + if (p === '/api/v1/repos/M_Viper/deskhub/archive/main.zip') { + res.statusCode = 200; res.setHeader('Content-Type', 'application/zip'); return res.end(Buffer.from('PK\u0003\u0004fake')); + } + send(404, { message: 'not found' }); + }); + }); + return new Promise(r => server.listen(0, '127.0.0.1', () => r({ server, calls, comments, url: `http://127.0.0.1:${server.address().port}` }))); +} + +function setup(url) { + const handlers = {}; + const userData = fs.mkdtempSync(path.join(os.tmpdir(), 'gm-ud-')); + registerFeatureIpc({ + ipcMain: { handle: (name, fn) => { handlers[name] = fn; } }, + app: { getPath: () => userData }, + readCredentials: () => ({ giteaURL: url, giteaToken: 'geheim123' }), + buildItemsFromPaths: async (paths) => ({ + items: paths.map(p => ({ localFile: p, targetPath: path.basename(p) })), skipped: [], ignored: [] + }), + clearGitTransportBlock: () => false + }); + const call = (name, data) => handlers[name]({ sender: { send() {} } }, data); + return { call, userData }; +} + +test('Geheimnisse werden an Name und Inhalt erkannt, Vorlagen nicht', async () => { + assert.ok(checkName('google-services.json')); + assert.ok(checkName('.env')); + assert.ok(checkName('release.keystore')); + assert.strictEqual(checkName('.env.example'), null); + assert.strictEqual(checkName('README.md'), null); + const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'gm-sec-')); + const bot = path.join(dir, 'bot.js'); + fs.writeFileSync(bot, 'const TOKEN = "123456789:AA' + 'b'.repeat(33) + '";'); + const clean = path.join(dir, 'app.js'); + fs.writeFileSync(clean, 'console.log("hallo")'); + const found = await scanForSecrets([{ localFile: bot, size: fs.statSync(bot).size }, { localFile: clean, size: fs.statSync(clean).size }]); + assert.match(found.get(bot), /Telegram/); + assert.strictEqual(found.has(clean), false); + fs.rmSync(dir, { recursive: true, force: true }); +}); + +test('git status -z wird korrekt gelesen (inkl. Umbenennung)', () => { + const files = parsePorcelainZ(' M src/a.js\0?? neu.txt\0R neu/name.js\0alt/name.js\0D weg.txt\0'); + assert.deepStrictEqual(files.map(f => [f.code, f.path, f.from]), [['M', 'src/a.js', null], ['?', 'neu.txt', null], ['R', 'neu/name.js', 'alt/name.js'], ['D', 'weg.txt', null]]); +}); + +test('Lokale Änderungen: Status, Diff und Commit nur der ausgewählten Dateien', async () => { + const { call } = setup('http://127.0.0.1:1'); + const repo = fs.mkdtempSync(path.join(os.tmpdir(), 'gm-local-')); + const git = (...a) => spawnSync('git', ['-C', repo, '-c', 'user.name=t', '-c', 'user.email=t@t', ...a], { encoding: 'utf8' }); + git('init', '-q'); + fs.writeFileSync(path.join(repo, 'a.txt'), 'eins\n'); + git('add', '.'); git('commit', '-qm', 'start'); + fs.writeFileSync(path.join(repo, 'a.txt'), 'zwei\n'); + fs.writeFileSync(path.join(repo, 'b.txt'), 'neu\n'); + + const st = await call('local-git', { action: 'status', folder: repo }); + assert.strictEqual(st.ok, true); + assert.deepStrictEqual(st.files.map(f => f.path).sort(), ['a.txt', 'b.txt']); + + const diff = await call('local-git', { action: 'diff', folder: repo, file: 'a.txt', code: 'M' }); + assert.match(diff.diff, /-eins/); + assert.match(diff.diff, /\+zwei/); + + const c = await call('local-git', { action: 'commit', folder: repo, files: ['a.txt'], message: 'nur a' }); + assert.strictEqual(c.ok, true, c.error); + const after = await call('local-git', { action: 'status', folder: repo }); + assert.deepStrictEqual(after.files.map(f => f.path), ['b.txt']); + + const notRepo = await call('local-git', { action: 'status', folder: os.tmpdir() + path.sep + 'gm-gibtsnicht-' + Date.now() }); + assert.strictEqual(notRepo.ok, false); + fs.rmSync(repo, { recursive: true, force: true }); +}); + +test('Upload-Vorschau markiert Geheimnisse', async () => { + const { call } = setup('http://127.0.0.1:1'); + const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'gm-prev-')); + const a = path.join(dir, 'main.kt'); fs.writeFileSync(a, 'fun main() {}'); + const g = path.join(dir, 'google-services.json'); fs.writeFileSync(g, '{}'); + const r = await call('preview-upload-paths', { paths: [a, g], destPath: '' }); + assert.strictEqual(r.ok, true); + assert.strictEqual(r.secretCount, 1); + assert.ok(r.files.find(f => f.localFile === g).secret); + fs.rmSync(dir, { recursive: true, force: true }); +}); + +test('Diagnose, PRs/Issues und Backup gegen einen nachgebauten Server', async () => { + const g = await fakeGitea(); + const { call } = setup(g.url); + try { + const d = await call('run-server-diagnosis', {}); + const byLabel = Object.fromEntries(d.checks.map(c => [c.label, c.status])); + assert.strictEqual(byLabel['Gitea-API'], 'ok'); + assert.strictEqual(byLabel['Token'], 'ok'); + assert.strictEqual(byLabel['Erreichbar über IPv4'], 'ok'); + assert.ok(!JSON.stringify(d).includes('geheim123'), 'Token darf nicht in der Diagnose stehen'); + + const pulls = await call('gitea-collab', { action: 'listPulls', owner: 'M_Viper', repo: 'deskhub' }); + assert.strictEqual(pulls.items[0].head, 'fix'); + const issues = await call('gitea-collab', { action: 'listIssues', owner: 'M_Viper', repo: 'deskhub' }); + assert.strictEqual(issues.items[0].labels[0].name, 'bug'); + assert.strictEqual((await call('gitea-collab', { action: 'comment', owner: 'M_Viper', repo: 'deskhub', index: 5, body: 'Danke' })).ok, true); + const detail = await call('gitea-collab', { action: 'get', owner: 'M_Viper', repo: 'deskhub', index: 5 }); + assert.strictEqual(detail.comments[0].body, 'Danke'); + assert.strictEqual((await call('gitea-collab', { action: 'merge', owner: 'M_Viper', repo: 'deskhub', index: 3, style: 'squash' })).ok, true); + assert.strictEqual((await call('gitea-collab', { action: 'createIssue', owner: 'M_Viper', repo: 'deskhub', title: 'Neu' })).item.number, 6); + + const target = fs.mkdtempSync(path.join(os.tmpdir(), 'gm-bk-')); + await call('repo-backup-set-config', { targetDir: target, interval: 'daily', keep: 2 }); + for (let i = 0; i < 3; i++) { + const r = await call('repo-backup-run-now', {}); + assert.strictEqual(r.summary.ok, 1, JSON.stringify(r)); + await new Promise(res => setTimeout(res, 61000 / 60)); // eindeutige Zeitstempel + } + const zips = fs.readdirSync(path.join(target, 'M_Viper', 'deskhub-archiv')); + assert.ok(zips.length <= 3 && zips.length >= 1); + const state = await call('repo-backup-get-config', {}); + assert.strictEqual(state.config.lastResult.total, 1); + fs.rmSync(target, { recursive: true, force: true }); + } finally { + g.server.close(); + } +}); diff --git a/__tests__/network.test.js b/__tests__/network.test.js new file mode 100644 index 0000000..8fe12cc --- /dev/null +++ b/__tests__/network.test.js @@ -0,0 +1,41 @@ +const test = require('node:test'); +const assert = require('node:assert'); +const http = require('node:http'); +const { bareHostname } = require('../src/utils/helpers.js'); +const { checkGiteaConnection } = require('../src/git/apiHandler.js'); + +function listen(host) { + return new Promise((resolve, reject) => { + const server = http.createServer((req, res) => { + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify({ version: '1.22.0' })); + }); + server.once('error', reject); + server.listen(0, host, () => resolve(server)); + }); +} + +test('bareHostname entfernt Klammern nur bei IPv6-Literalen', () => { + assert.strictEqual(bareHostname(new URL('http://[2001:db8::1]:3000').hostname), '2001:db8::1'); + assert.strictEqual(bareHostname('[::1]'), '::1'); + assert.strictEqual(bareHostname('127.0.0.1'), '127.0.0.1'); + assert.strictEqual(bareHostname('git.example.com'), 'git.example.com'); + assert.strictEqual(bareHostname(undefined), ''); +}); + +test('Gitea-Verbindung über IPv4', async () => { + const server = await listen('127.0.0.1'); + try { + const r = await checkGiteaConnection({ url: `http://127.0.0.1:${server.address().port}` }); + assert.strictEqual(r.ok, true); + } finally { server.close(); } +}); + +test('Gitea-Verbindung über IPv6', async (t) => { + let server; + try { server = await listen('::1'); } catch { return t.skip('IPv6-Loopback nicht verfügbar'); } + try { + const r = await checkGiteaConnection({ url: `http://[::1]:${server.address().port}` }); + assert.strictEqual(r.ok, true); + } finally { server.close(); } +}); diff --git a/__tests__/prefs.test.js b/__tests__/prefs.test.js new file mode 100644 index 0000000..37df337 --- /dev/null +++ b/__tests__/prefs.test.js @@ -0,0 +1,76 @@ +const test = require('node:test'); +const assert = require('node:assert'); +const fs = require('node:fs'); +const os = require('node:os'); +const path = require('node:path'); +const { spawnSync } = require('node:child_process'); + +const { createPrefs, DEFAULTS } = require('../src/features/appPrefs.js'); +const { useBundledGit, applyGitIdentity, commitIdentity } = require('../src/git/gitBinary.js'); +const { createRepoBackup, excludeMatcher } = require('../src/backup/GiteaRepoBackup.js'); + +const tmp = (p) => fs.mkdtempSync(path.join(os.tmpdir(), p)); + +test('Einstellungen: Standardwerte, Bereinigung und ungültige E-Mail', () => { + const file = path.join(tmp('gm-prefs-'), 'app-settings.json'); + const prefs = createPrefs(file); + assert.deepStrictEqual(prefs.get(), DEFAULTS); + + const r = prefs.set({ zoom: 400, theme: 'pink', closeAction: 'tray', gitName: 'Max \n', unbekannt: 1, uploadSecretScan: 0 }); + assert.strictEqual(r.prefs.zoom, 150); + assert.strictEqual(r.prefs.theme, 'dark'); + assert.strictEqual(r.prefs.closeAction, 'tray'); + assert.strictEqual(r.prefs.gitName, 'Max x'); + assert.strictEqual(r.prefs.uploadSecretScan, false); + assert.ok(!('unbekannt' in r.prefs)); + + const bad = prefs.set({ gitEmail: 'keine-mail' }); + assert.deepStrictEqual(bad.rejected, ['gitEmail']); + assert.strictEqual(bad.prefs.gitEmail, ''); + + // nach dem Neuladen noch da + assert.strictEqual(createPrefs(file).get().closeAction, 'tray'); +}); + +test('Git-Identität greift nur als Rückfallwert und verschwindet beim Leeren', () => { + useBundledGit(); + const userData = tmp('gm-ud-'); + const home = tmp('gm-home-'); + const env = { ...process.env, HOME: home, USERPROFILE: home }; + const ident = () => spawnSync('git', ['var', 'GIT_AUTHOR_IDENT'], { encoding: 'utf8', env: { ...env, GIT_CONFIG_SYSTEM: process.env.GIT_CONFIG_SYSTEM || '' } }).stdout; + + assert.strictEqual(applyGitIdentity({ name: 'Test Name', email: 'test@example.com' }, userData), true); + assert.match(ident(), /^Test Name /); + + // Eine globale Einstellung hat Vorrang + fs.writeFileSync(path.join(home, '.gitconfig'), '[user]\n\tname = Global\n\temail = global@example.com\n'); + assert.match(ident(), /^Global /); + + applyGitIdentity({ name: '', email: '' }, userData); + assert.strictEqual(process.env.GIT_CONFIG_SYSTEM, undefined); + assert.ok(!fs.existsSync(path.join(userData, 'git-system.gitconfig'))); + assert.deepStrictEqual(commitIdentity({ gitName: '', gitEmail: '' }), { name: 'Git Manager GUI', email: 'gui@gitmanager.local' }); +}); + +test('Backup: Ausschlussmuster und Zeitpunkt für automatische Backups', () => { + const m = excludeMatcher('test-*\nM_Viper/Alt?\n# Kommentar\nmy.repo'); + assert.strictEqual(m('M_Viper/test-1'), true); + assert.strictEqual(m('M_Viper/Alt1'), true); + assert.strictEqual(m('M_Viper/Alt12'), false); + assert.strictEqual(m('x/my.repo'), true); + assert.strictEqual(m('x/myXrepo'), false); + + const configPath = path.join(tmp('gm-bk-'), 'repo-backup.json'); + const backup = createRepoBackup({ configPath, getContext() {}, giteaCall() {}, runGit() {}, isPackFailure() {}, redact: (s) => s }); + backup.setConfig({ targetDir: 'X:/irgendwo', interval: 'daily', time: '03:00' }); + const at = (s) => new Date(s); + // noch nie gelaufen: vor 03:00 nicht, danach schon + assert.strictEqual(backup.isDue(at('2026-10-22T02:59:00')), true, 'Slot von gestern 03:00 ist offen'); + fs.writeFileSync(configPath, JSON.stringify({ ...JSON.parse(fs.readFileSync(configPath, 'utf8')), lastRun: '2026-10-22T03:05:00' })); + assert.strictEqual(backup.isDue(at('2026-10-22T20:00:00')), false, 'heute schon gelaufen'); + assert.strictEqual(backup.isDue(at('2026-10-23T02:59:00')), false, 'vor 03:00 noch nicht'); + assert.strictEqual(backup.isDue(at('2026-10-23T03:00:00')), true, 'ab 03:00 wieder fällig'); + + backup.setConfig({ time: '25:99' }); + assert.strictEqual(backup.getState().config.time, ''); +}); diff --git a/__tests__/restore.test.js b/__tests__/restore.test.js new file mode 100644 index 0000000..bd2cca7 --- /dev/null +++ b/__tests__/restore.test.js @@ -0,0 +1,201 @@ +const test = require('node:test'); +const assert = require('node:assert'); +const http = require('node:http'); +const fs = require('node:fs'); +const os = require('node:os'); +const path = require('node:path'); +const { spawnSync } = require('node:child_process'); +const archiver = require('archiver'); + +require('../src/git/gitBinary.js').useBundledGit(); +const { registerFeatureIpc } = require('../src/features/featuresIpc.js'); + +const git = (cwd, ...a) => spawnSync('git', ['-c', 'user.name=t', '-c', 'user.email=t@t', ...a], { cwd, encoding: 'utf8' }); +const tmp = (p) => fs.mkdtempSync(path.join(os.tmpdir(), p)); + +function makeZip(file, entries) { + return new Promise((resolve, reject) => { + const out = fs.createWriteStream(file); + const zip = archiver('zip'); + out.on('close', resolve); + zip.on('error', reject); + zip.pipe(out); + for (const [name, content] of entries) zip.append(content, { name }); + zip.finalize(); + }); +} + +// Backup-Ordner wie von GiteaRepoBackup angelegt: Spiegel + ZIP-Stände +async function makeBackupDir() { + const work = tmp('gm-src-'); + git(work, 'init', '-q', '-b', 'main'); + fs.writeFileSync(path.join(work, 'a.txt'), 'hallo'); + git(work, 'add', '.'); git(work, 'commit', '-qm', 'eins'); + git(work, 'branch', 'feature'); git(work, 'tag', 'v1.0'); + const dir = tmp('gm-bk-'); + fs.mkdirSync(path.join(dir, 'M_Viper')); + git(dir, 'clone', '-q', '--mirror', work, path.join(dir, 'M_Viper', 'deskhub.git')); + const zipDir = path.join(dir, 'M_Viper', 'deskhub-archiv'); + fs.mkdirSync(zipDir); + await makeZip(path.join(zipDir, 'deskhub-2026-10-01_10-00.zip'), [['deskhub/a.txt', 'alt'], ['deskhub/src/b.kt', 'fun b() {}']]); + await makeZip(path.join(zipDir, 'deskhub-2026-10-20_10-00.zip'), [['deskhub/a.txt', 'neu'], ['deskhub/src/b.kt', 'fun b() {}']]); + fs.utimesSync(path.join(zipDir, 'deskhub-2026-10-01_10-00.zip'), new Date('2026-10-01'), new Date('2026-10-01')); + fs.writeFileSync(path.join(dir, 'backup-protokoll.json'), '{}'); + return { dir, work }; +} + +// Gitea-Nachbau: neue Repos zeigen auf echte lokale Bare-Repos, damit der Push wirklich läuft +function fakeGitea() { + const created = []; + const patches = []; + const repoRoot = tmp('gm-remote-'); + const server = http.createServer((req, res) => { + const u = new URL(req.url, 'http://x'); + const send = (code, obj) => { res.statusCode = code; res.setHeader('Content-Type', 'application/json'); res.end(JSON.stringify(obj)); }; + let body = ''; + req.on('data', c => body += c); + req.on('end', () => { + if (u.pathname === '/api/v1/user') return send(200, { login: 'M_Viper' }); + if (u.pathname === '/api/v1/user/repos' && req.method === 'POST') { + const b = JSON.parse(body); + if (b.name === 'deskhub') return send(409, { message: 'repository already exists' }); + const bare = path.join(repoRoot, `${b.name}.git`); + spawnSync('git', ['init', '-q', '--bare', '-b', 'main', bare]); + created.push(b); + return send(201, { name: b.name, full_name: `M_Viper/${b.name}`, owner: { login: 'M_Viper' }, clone_url: bare, html_url: `http://gitea/M_Viper/${b.name}`, default_branch: 'main' }); + } + if (u.pathname.startsWith('/api/v1/repos/M_Viper/') && req.method === 'PATCH') { patches.push(JSON.parse(body)); return send(200, {}); } + send(404, { message: 'not found' }); + }); + }); + return new Promise(r => server.listen(0, '127.0.0.1', () => r({ server, created, patches, repoRoot, url: `http://127.0.0.1:${server.address().port}` }))); +} + +function setup(url) { + const handlers = {}; + const userData = tmp('gm-ud-'); + registerFeatureIpc({ + ipcMain: { handle: (name, fn) => { handlers[name] = fn; } }, + app: { getPath: () => userData }, + readCredentials: () => ({ giteaURL: url, giteaToken: 'geheim123' }), + buildItemsFromPaths: async () => ({ items: [], skipped: [], ignored: [] }), + clearGitTransportBlock: () => false + }); + return (name, data) => handlers[name]({ sender: { send() {} } }, data); +} + +test('Sicherungen werden gefunden: Spiegel und ZIP-Stände, neuester zuerst', async () => { + const { dir } = await makeBackupDir(); + const call = setup('http://127.0.0.1:1'); + const r = await call('repo-backup-list', { dir }); + assert.strictEqual(r.ok, true, r.error); + assert.strictEqual(r.backups.length, 1); + const b = r.backups[0]; + assert.deepStrictEqual([b.owner, b.repo], ['M_Viper', 'deskhub']); + assert.ok(b.mirror); + assert.deepStrictEqual(b.zips.map(z => z.file), ['deskhub-2026-10-20_10-00.zip', 'deskhub-2026-10-01_10-00.zip']); +}); + +test('Lokal: Spiegel wird zur Arbeitskopie mit allen Branches, ZIP ohne Oberordner entpackt', async () => { + const { dir } = await makeBackupDir(); + const call = setup('http://127.0.0.1:1'); + const { backups: [b] } = await call('repo-backup-list', { dir }); + + const dest1 = tmp('gm-dst-'); + const m = await call('repo-restore-local', { kind: 'mirror', source: b.mirror.path, destParent: dest1, repo: 'deskhub' }); + assert.strictEqual(m.ok, true, m.error); + assert.strictEqual(fs.readFileSync(path.join(dest1, 'deskhub', 'a.txt'), 'utf8'), 'hallo'); + assert.match(git(path.join(dest1, 'deskhub'), 'branch', '-r').stdout, /feature/); + + // Zweiter Versuch in denselben Ordner darf nichts überschreiben + const again = await call('repo-restore-local', { kind: 'mirror', source: b.mirror.path, destParent: dest1, repo: 'deskhub' }); + assert.strictEqual(again.ok, false); + assert.match(again.error, /existiert bereits/); + + const dest2 = tmp('gm-dst-'); + const z = await call('repo-restore-local', { kind: 'zip', source: b.zips[0].path, destParent: dest2, repo: 'deskhub' }); + assert.strictEqual(z.ok, true, z.error); + assert.strictEqual(z.files, 2); + assert.strictEqual(fs.readFileSync(path.join(dest2, 'deskhub', 'a.txt'), 'utf8'), 'neu'); + assert.ok(fs.existsSync(path.join(dest2, 'deskhub', 'src', 'b.kt'))); +}); + +// ZIP von Hand bauen: archiver entschärft "../" schon beim Erzeugen, ein echter Angreifer nicht. +function rawZip(file, entries) { + const zlib = require('node:zlib'); + const locals = []; + const centrals = []; + let offset = 0; + for (const [name, content] of entries) { + const n = Buffer.from(name); + const data = Buffer.from(content); + const crc = zlib.crc32(data); + const lh = Buffer.alloc(30); + lh.writeUInt32LE(0x04034b50, 0); lh.writeUInt16LE(20, 4); lh.writeUInt32LE(crc, 14); + lh.writeUInt32LE(data.length, 18); lh.writeUInt32LE(data.length, 22); lh.writeUInt16LE(n.length, 26); + const ch = Buffer.alloc(46); + ch.writeUInt32LE(0x02014b50, 0); ch.writeUInt16LE(20, 4); ch.writeUInt16LE(20, 6); ch.writeUInt32LE(crc, 16); + ch.writeUInt32LE(data.length, 20); ch.writeUInt32LE(data.length, 24); ch.writeUInt16LE(n.length, 28); ch.writeUInt32LE(offset, 42); + locals.push(lh, n, data); + centrals.push(ch, n); + offset += lh.length + n.length + data.length; + } + const cd = Buffer.concat(centrals); + const end = Buffer.alloc(22); + end.writeUInt32LE(0x06054b50, 0); end.writeUInt16LE(entries.length, 8); end.writeUInt16LE(entries.length, 10); + end.writeUInt32LE(cd.length, 12); end.writeUInt32LE(offset, 16); + fs.writeFileSync(file, Buffer.concat([...locals, cd, end])); +} + +test('Archive mit Pfaden außerhalb des Ziels werden abgewiesen', async () => { + const d = tmp('gm-evil-'); + const zip = path.join(d, 'evil.zip'); + rawZip(zip, [['deskhub/ok.txt', 'ok'], ['deskhub/../../boese.txt', 'x']]); + const unzipper = require('unzipper'); + const names = (await unzipper.Open.file(zip)).files.map(f => f.path); + assert.ok(names.includes('deskhub/../../boese.txt'), 'Testarchiv muss den gefährlichen Pfad wirklich enthalten'); + const call = setup('http://127.0.0.1:1'); + const destParent = tmp('gm-dst-'); + const r = await call('repo-restore-local', { kind: 'zip', source: zip, destParent, repo: 'x' }); + assert.strictEqual(r.ok, false); + assert.match(r.error, /Unsicherer Pfad/); + assert.ok(!fs.existsSync(path.join(destParent, 'x', 'ok.txt')), 'auch harmlose Dateien dürfen dann nicht entpackt werden'); + assert.ok(!fs.existsSync(path.join(destParent, 'boese.txt'))); +}); + +test('Gitea: Spiegel und ZIP als neues Repo, Namenskonflikt und ZIP-Überschreiben werden abgefangen', async () => { + const { dir } = await makeBackupDir(); + const g = await fakeGitea(); + try { + const call = setup(g.url); + const { backups: [b] } = await call('repo-backup-list', { dir }); + + const m = await call('repo-restore-gitea', { kind: 'mirror', source: b.mirror.path, owner: 'M_Viper', repo: 'deskhub', mode: 'new', newName: 'deskhub-wieder', isPrivate: true }); + assert.strictEqual(m.ok, true, m.error); + const bare = path.join(g.repoRoot, 'deskhub-wieder.git'); + const refs = git(bare, 'for-each-ref', '--format=%(refname)').stdout; + assert.match(refs, /refs\/heads\/main/); + assert.match(refs, /refs\/heads\/feature/); + assert.match(refs, /refs\/tags\/v1\.0/); + assert.strictEqual(g.created[0].private, true); + + const z = await call('repo-restore-gitea', { kind: 'zip', source: b.zips[0].path, owner: 'M_Viper', repo: 'deskhub', mode: 'new', newName: 'deskhub-zip' }); + assert.strictEqual(z.ok, true, z.error); + assert.strictEqual(z.method, 'Git'); + const files = git(path.join(g.repoRoot, 'deskhub-zip.git'), 'ls-tree', '-r', '--name-only', 'main').stdout.trim().split('\n'); + assert.deepStrictEqual(files.sort(), ['a.txt', 'src/b.kt']); + + const conflict = await call('repo-restore-gitea', { kind: 'mirror', source: b.mirror.path, owner: 'M_Viper', repo: 'deskhub', mode: 'new', newName: 'deskhub' }); + assert.strictEqual(conflict.ok, false); + assert.match(conflict.error, /existiert bereits/); + + const zipOverwrite = await call('repo-restore-gitea', { kind: 'zip', source: b.zips[0].path, owner: 'M_Viper', repo: 'deskhub', mode: 'overwrite' }); + assert.strictEqual(zipOverwrite.ok, false); + assert.match(zipOverwrite.error, /nur mit einem Git-Spiegel/); + + const badName = await call('repo-restore-gitea', { kind: 'zip', source: b.zips[0].path, owner: 'M_Viper', repo: 'deskhub', mode: 'new', newName: 'mit leerzeichen' }); + assert.strictEqual(badName.ok, false); + } finally { + g.server.close(); + } +}); diff --git a/assets/icon.ico b/assets/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..387e214c89661336cc99202598916d4d65f582c4 GIT binary patch literal 55925 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%0Ah!0HEo>bK5D7G= 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 literal 0 HcmV?d00001 diff --git a/dist/.icon-ico/icon.ico b/dist/.icon-ico/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a29048b41fb8060c6a3b30d49fef570b8af071a8 GIT binary patch literal 116672 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 P>l#Xak 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

Cs35oL0`0K>hBG)UKVn6D(vP9=1E9glSgl>j? z{tz=gq0MwfcaE!E0myIyvI6nja!(wMHA74AARJK*LX~1azpa?im94o`-99-9b$^MXogGVZZ33!luF%y2KWD303e_yVv25srJMvT@WjuH zEzuq;0|4a!_TC}@aAfOBR`A-RY|nK6p*b&(Daaq^bg@2kFpm10qS-~>AP2k|A7%f= zi}yiCx|XDDwZ{k8Mb8NU$O~}ijY8P%32b$R?rj@%E-^=EnmM{tEudRq$+ZM|&j7Dt zU6rs_?pNCUH0?@H8WtpAL#IEzKbcB=*+V3&`)xzZ`dc80WzasyOv_Xf7PLci7) z-ODY|xo8wRQ!V(0)h1d%8*dI>JUv=MMjJLav8LrRZQyzfJ1!&Agwn9Aa6jt8URQ+DT!`QbBMdF zfjoEoyvTxk00aQ(5$4z(X{k<+v|zWw!Y?1N+m+|}uTP858t?aYzK=2L{LN71V}vqq zhH^iKsvy}D`0}OupCVt+lI!orPX|Kl?_L^)h9Dyx3?GX9VS`ZhQe^YdxBoG*ZP9c_)}M zlP6V9)106rU`?ng4#hBBCgx)w58y@sz{x0F63iUpPHSHN{dpk)fDs3Pz2T#NYuVw=3)%6V%h<`Rb)&ML8og<6l!KJ-Yl;$YBUJhtaR4Z$a3GMOIhx_i zS8dR_iW+HxAnx#jwAUNrZV%{pxIiG*E9C|#9H31}!~_?B&~u$Vx)+;6pJK%`{&M#dDX$O!kVXJyNGVBZ1t{#iz8m;| z+59p9C?t*^&%>$5L?!dj>$*wwIt>xAL}!{6#8u96`EQRG@3`VIA)N{tZd^+a>C{LP zfU`?%@xf$ME(cZ9f#WG|75O!MeMDNcF%{c%ZPyk?O_^kr~v?^0(ax4DlG*Ip^GUHxZ#$@#l046_`q%*QVwLZ&S$#Ci*gYf0RJrB8;?+bqbm7#;tK+@N~44;o5 zihs`-j`Q^=Oya$e)S6_}y~$m1kb5PMl6zV@eQ_ zm*a(xUweRe0JcUjRE3zJWWxO@denSI@r1kB+M{*c`g48y)*NnMZ(1<1>amdH1^^(X z*p3?k07<^3+VlYcd)}Vf{pR%mU@+1n$OEuc?~O2Lw;BM{FN$aJjIrHMM~7{H#QXb9 z&An2gpD_*un4vWAHthE`L9rJ@3CU#zGkoymozSlE1h%Px-NC@FAYi*cA2KRza)n4q zIohlQ0$W|=jy(D^{d}XV3eg6QX!2xNEv27E*x24D0qAYk2S~X^<_hdM#F~Jv; z@4)Z>909B(03aD6A6`l!H(5$|0@BHCatA1GT51g)HCiN-ASZbNG62xj8M!QCpaI|9 zX@BzoKwbdVvh5&{ z_SMGZ36;}=j}@s+P#gB=0YJDB0BCMa05Gf_5sdAg=Ebtt#F_1RDk64Qq~)2cz#%B4 zDNccdQQ~Wca$i$a2AH5SfT1po;oZmY#_uW4(5?1?v{?mg4+gddLfS$nF?j)=ax6{& zu$?xqtNeU3HR+I7pm+v!57A%}vJGVJzy??4H9GmJ3`w3QCHDvj$ZMv9lxq9Fz!nv- zIRxS=HGYeC!^e-`hsFpKR8s!J-w3sVrl{~SLWQ3(O8rcc?>hiFL3bhjLFbOWlLKGa zo4M4qJn?z<`L0#m{?s~^yPB2Goyv-4O=8)vjCnriQJ)V>0*!Gbcp&P%j8N~zaB{R6 zeth9RXh}+%e&KXKNEsdwGiYW20f3WyYHo9b^tJ=UCHBxRutPT|0LdpZ-CTV0lLw$s zeE(ViP}(+0e}MN{6Rp)5LZS=A1m`ONfJ!r1>L8;x#beuDIp4Z_n*)Sx4!{m)o(!V0 z42hmdrBV2OR}kKxWzN}u2ct|;9K=vD)$7Ycag&$-khR*bEp--q@2v!OWKsWsz^8A? z0PywZ<_6u3V($Sc^EN}dk11+Y15p)d#!G}XYKC{F+>NhZF~>O)Oh@0IZZgqvY)fwV8Cy3h|A#Qbmv_-Mal*M-fHY=w*H#hF;OPib_ZKBuhA#I`N zBnMy{_4Ye*Fpy}k(CNR$AL1H6Tuk%8H#2Q;e8Qdl9;3egYCmJt1el;Yz>J472Pl`J zGRFSUJCPA#(Vg)~z~ap55%*_I4`=Dm#TxzB7q8{b7r33=o9IyTRLG8^KocAe8h}P$ zW7K*v911bQ=TmRTZ?o=)utw%1^OKP(0$Hw*_Ba5$D1ky=fE%#V3A!|UbP>~u0|2?* z@}NVm2K@g60C*li?l{zu+!AkXb>jMjqC)@WBqb_S(qx>KE&wI}wzxpp>ICgJ2WYq1 za{!RGDqqreH;B|x)-n-jnS}Fu!*G1Y1E>$9%F;bl%_32>kTz+1$R~x?pVOW5Mmk!Dbu)j*K?GVGcmf16;=g;5h(GAln5$rH;bk zXc+)9BF(Wo>ei_OT)pa6&1X2>%vOXu@;~Q4;=Ld@+~Q23_w6Y4G)0;3?WhPCj0)d@ zsG#v#D#j(n8p0SpntnHaiF3l`<-X9b@rAhF2hv7wh?_kjZgqpORlZO3TOA;7kxkm- zC>u%2Z>F-H{K%hgc7V9a4&r88NSkeeEq1^b2Y|oV1;Sb^|j_6Kygf@w05>PcjZn@;+ut^Gg zsUxu3jc0kKEiTY+afEiO1N40J%U`arfxbYhbOZng#{!2Z15H!Vl{FeirWx^!aznTo zN<;5N&KQqNhf-&)KDlbah?b<+*w3Y#8IEOh`@7c1tLAX~Vr$CSipMnVMZtr3FF<>& z2`&-%E$#&XSq@w_4g$mrNT%{F^#oW!yKDsXJIoaT7>PsF45Ypd8IdEgJIX?x9(n5| z0k2;FT04h*vwlANdi{L<=lqAfW@f2JT+H(sigNY+D4|DBGc@`Q;A}xE>sAFalu(?l zVmLOz2&eyPfzIXLz(zHs%|Tp|SK35i;00leJA|#SkhV}bpo9bl+v2Pk0f1w#hd^P# z23JVyT_LP-gZQ>PIu<$N%s=nPyHiY17s@~rxvTtTwdopCbMiAnr4OC_gHalI7m9-J zM1Jrc$PBwvyXQg6e4IWwfIi>9i`TG|I~M(K7wux(es22$87q7=V0!UGZk=_(_oCk4 z3@w31Ty&AT-;PEa;oBF6qieaFk_+$#_7Z`H;$=5EgT6=RSL@fhqidN1I*4dP6M<;N zF^M1&X@cB!<<#bFyM0F`^>kugJ2pvvof3K1n%wk5o81{gvKxeCcW9HH(M8(or1?j* z&NOpKZ`lFsC@bp(aTA#%^qU=_+w1`SW_t*mY$0y6g|N;J!a7HJEPUBYwt?fsz_YWMu@0Px=OdFU{4+v*!S`dK+<3m%2bourbt7XI%(GOSCDDP8^Dlo_+wQ|7nMdsa_D?Rs$Qu zfGwfDVZvr#fV%d!5Q~uV1)g%ezrjJt_|t1XzGX?Z;YdqImvfz+1zP&(`Q}nF4z43 zX8@o)09nn<#1@ zaw1VkO2SMaTIC+>#ZnbAYtb8J*-6lmr2dF+j^`pe6(e=*^v}D<zxH`AE$vvp znXf1B(3m&n-;Rv4J}-xL!R^?AcsR`j zpUg4G7mF?NRiY)HuCv0+O;%`0vVwAlHB>vvt)NaehiaP)O`DAIWR(&Auv8zvo1>3= zlLz5OOfS?0ci>~>B~;b7*WqlwQd;Njpv5J<>337bztD-H$fKQ@>(vdX-235ph~4vJ z5l$OVO%B$lGGAl)hy4Hd`N{wA@V{;sSHH_XIhxeHWLES$XZ-X~Xpl0bLr=3rXMSX zjBkCq$6F}%ZilO(x_Fsr4Q#Q4NB}^$KVOqAfdCDqDAt%lMO%Yb6K8!el$-lPeRLov z0{wZN9xeoFA;-HDQbPLUc<2DnlfQBRcx9yr7BJFiI^?LwC?QCR_FQl>+~HzcfUGg! zqc;j2I-=Bx)P!_U<)n>jCoMi;Q{}9MN@p$UW_FPBa%#sBkDxq&;nMJSs2|%M52p6R zC+`lz=X3S&#e98yId>5LFmEuvm^~05PktM>N4DeBm^3v?c|CCuI6KjfW)-wi>(UMt zwv2nVqYkQ_bW!G@gCeK)D0J3Ej(bO(^Bag0;r1V;#Q5zzJ849(lo)SD%h~DH|Br9} zpBnD|o~>kz9f=9GI^b{6lI=^9OPx^Stc@a9E#5w%KL{gvM%R0P(A-*GXZ}0b8hdSU|CXq>%Nb;fj^go9~q*H6NPbWFd(|jYJAnHATCX zulXv?b6*Kr@}DIDumlpVAg(ayTI-56hET3IfNGN=gd{r5#Ok7O%t4Y`+Gi;NzyTTG z8z=0OLEK{w?4o|IHSgz&J4~V8VZ;lCjeGUcMBIS#AfPrJszPs|dN`W1!*F*=e-uP& zBR8xAvLg(U6YEy-=d2^WA%3k@Fm(jOgF5zY_CFA2{15H3QybWq>D$@Oq?xQabpgA* zbI!!9ShqXp+;mXvsf9}+T6nR-65{s}0R3$>inGN2TSFje3i*07C`m4R^|y2xwuvscz4KVclu%Z^X0qR@asF8c z-1{rfxc34r8m)5eiW;X5`~X&Qp1lsLU3B==Cxzm94h;Fu4Ee4Mc`g#OFx!zK$3gmD z0o~XR3`O<~g%%7&GKNwsiK|Z+W|@l?O1V>UkD-*J4m$?g!%<_eg*rza)H=39l~X5_ zyLLmV*V`!Z?kApg>!msxVtJ=<@tAq^f616WjHN{T{QK4Ze`R!Aot)&!PR|kC`x6QPfMpJnDkuZfJ2L(yPUta?duhCSgO3hbUz1n6Y{hU~R40*a3TKVWhd{_9p-^m53WVsEa`WU?q_`C>q#n zhVQlw!n1uwP@Z!EN&3xU_FR zOPd(Pvftm!&L_?#4{#c)%Jjt>aMzf-QQ?=9P4mJBQK=vTjdmsut-r^BJA#ELfm7`D?fB|sW$1VFT9 zl|J8V4b@&tsP)P*xthWA9_P$Mxj%H{m+?FrI+c6B=YCi4*Y|HP^`Ok)?5 z=dy~mQ&>u*GdmmQ${)u^xjjEW7VmUnw*Se3p$6aNy3x=Q<9Yz!t+ar0t2GoGWf~1Y z&EJZ0ep-{YS_ZjBub$Gh)-3~p!v^ib39(!KlPoO35+xpYN=TNjkL6CGan`}cb(@5@tR zPU_JYYc9k>0tOeFInYLtqYg?O+o9aC1IirRqr|Blik)>(MBk^P9z_F=jJMXS?McT^ z2Nky3D7Np2Eax6LR#WoM=bv6L9!g(v-GpQpKWMTwg(FI>=o1^uUr9duA)qm5c;hTq5bMe}MaF0@Gb zzj($B@^dC=I%9<9leAn!29ZV_Y5M7)gA|JIw1t>t1@%UWGaz3}JZclD*U=4b!u!!g zN>Q&ddCfJORLIx-@O&b)i0cf14FjfE0jB-dk`v{Zh(DyWzQ-CO2LNj* z_S!(X*P6FyL<;?hAF!Pw0aJ)ONuo&xITa80*+ST7i>72#H0?J>%Q;u53OylKdI8nm zK$$O|e_)GyvwNZ{h(O?NWQFJ$o_&5Ok$sc0 znf>|bI#w{npPd`+!XK~NG1vC^NVl=?d+E(O9$^=sF*RUE(G34{`NNIA$nox^DsX40 z@@2RX$~fCizTFzln`lM05mc+G_-7<7qF5s>1{J6duv!BEn+E|O8Ukk=@zok5Tn^L% zwH1#9_rd!i{X7o`_hG+PtJyr8Jx?3LUgjO8LG^M`Sv7L5BBWWDc=;d?wN*_0TBK#kKDx z%GMLjd0sTb)2r;`gUh-9KeKOhKj2PwEZlitiu(W*Qs0!w2~PCKXpb_d4ybhOfMP4g zLEz)q9(YOXmJdm-K@wnWJtITQ2}3B37(paiG2%dzoI_QtpOB2aV5Qp*Be8KC4<9%c#_Y+7lh}rUwr=Xvy@mrUdwwEsgo` z>~Q-hDSiex=G_-ZeY@kde*9$k>>^%gRH zddV~V2R=C)sQ=07VOF)dGltE3d~|*P(-VSN(Yl$eZeIc`**NRX{BiE>UBx|b`UqCE zaGY0GlvhTUQx{Y@caicMTOE|z>7d+E7lqagdDaX?P7F7qy5K3X@Th>s^#g1q5s?%# zfb;`sxQ0Xz-Xs3Ki=^FtzyacJD?XJcCYwXpVFp!_36xt5xe$qBlm7Rv+-$&Iwb>ZL zRvE-3GtN3hvJBX11ne;aD4#!I0mT7p$Pd^+dB6@L5toRgO;G>=0NwVxZJ^pihu;A$ zd+pImfUw(=Q<*u4BpX9amOuleu&Yyh~sZ5~5Ij?P!dH~17x z@lQDsJory3zCF~1Lk5VYLH$tT_cro;x*)?>7nyzxg#ir3ehdY~D)VH>^<(&Qy$sKG zTi~1R#(1*D5YIO1qiMY%L_abLZ^p7!V? zrhD{2mU|auyS7KJYkL&BcR-P6dlY)KL!PTPvK$#QsZ-#ngK`(TAlsqTxjl+qIwRMm z3({S>;n_X7sL_#o2i(&-riE30X~YxoazHq6meyo;PAz~0Z=B} zOVZ0UZ++Aps-vb*AG3r=gdvIqXax5?k~^~bAxz&#p}Hm4XA}3DL)=69==9M{@?AeT z$aib<`@QtJF|gN|_xOePEcxMYJzxjr0ecAhDebWPp%6&E%O1jR2PpQ?;kQNWZY!SW zt9HpC(2B5RBZ$c+Q138`D`+7Sg218^$V>A~k`w}k-E{W^Uc`{claAN}2LZk*2U@0`zW zZJxo3-w9@4oZVtrvN$I3!=ORuvxb`eu5_s0i_(xDDE4oM5+7~pMxwvFJ43!N<2wuQ z&g_LhB%0ydE%tc6#}zM51VE7;26cWIRJp-WWduT<>JQ4%mNO@K3Q`0H9z+zg_D6dk^c@5;g`uVutM+%l70UKGv!w{EEuf>`F% zA?)n90QSL9JN8{|fll`9(Y;Pax|kdbFtSS>?&zC4)*~S&#_3#ogvI4kLHfTx;n(-Y zN#EYeQ$D@LQ$BAa#itie`}D>c@3(Qrvpddu_CTt4UwKBL;n!J1t?%Z>xToh&3|xFV z(#H2d@F2Sb(YB^17likw-+$bevAmhX*u@RASXIJA?!O8vm>I?LCJkXZu|8e0qrJvv zhTH${tZP5yICnvrYiE(#92J_jATg;ZJfdniXL`~A03ZNKL_t*Og(2rmTojB~{=-6?$6QK{M6+Xk&`zan9(Y zJl}$UO@JZnGlTj)D<}@ypmm=$l>4X+=?d&~2ev!m#R^k25|Jp`2}pK;dY3I!d#s_L zBHvCEsCJt`*l8j$2Du1?DU>@bp&$UD=kBtBBFPNmb`v1k5bERsQ0(gqkWgx&Jy7Zb zl=%RKf%wCAbKINR1($|1vBX~+xgl@i!tBtx$J=L)0G{ezULD8E<_%@nwy$8Hp8k+k zt(?i`5;5ygf<;D@)y%vY$1??^96rqscnkU73`L$&-dW_zP#3{)ccBqJ+3bYR4+Y?l zrz7x}%#nDJ8wq7WBv29wR7L@p#{k!2f$O7zYomcHqks$1KRE1$^ z$q7PJsuvnl?9oJ852^0>(`sW}^krNJp}<`ig+pa|H8VnIKHM@(b~e(E)vbzS^}A-X zOBA3d-2hKd? z*MIJZzWo;*_3O9jn1BDpCj$p8KJM3d@e%L07a#HIz3_zppgCuTm`%-yag8pTG1T)` z^1{Bfrt^K@!R*5*8+Lj|0IS_Qhds{S!fN)+X1_|y9_g-?KH8V9*t16aTwHMc@nGv) z=e!0g^W3|k)JYp<_7Z!E*i_UqALk?z-m`&7^VdYo*-vf?kq9|-==aMY5_6B1lh9)X2=q8T#+{yLt`Tam;;Dpsj}?T2 zHc-E32h~11sCL;wvE31k>z(jyi4`73b;n1sJ<&qsn9VkvA3&M_s@Ol*t4FR*>(qf^sKu1gO1e0_-q=kUR*&2QrAHl$_@TlzIVW{y>f= zzT0bxkLSIGE5jKs1Ts{Fbw>4cpYjW<;zpOoNB1s{kg<{pK@9Tex)mGZ2c=C43aOem zVsCbY?628$=&6|J!}x6YrKpa$I(Y!<7s~MIHha8C3x=vbl}cp zpkadKcgI7#I~KzIu@E1`Nq%Px#M@(l+v9*c6M?%EfqUbD`dHw~NT4B;^zF?~c=u!{ zynC@zz602~5EGU;(vcNR3}n?y#<0sW$kll-n}Y579-_G9!pI*Rb0L!Y*?twi`mZL(@Jar6B4EY_o*8 z-9jQV?J!5H#??DyntFi@;x+>)w(CJnYOb_RDBlezatF$NfE-sSKQO~r%iqS05!$E? zW;|CLS|V#?-F( zdaD&wDZW7QaNu$rP)`SV9B`Ko^;oDIVz>);Vu8D3fIG1e?#4iQcN7%&W1xIE8mfn} zP~MAy&=3PO!~*x?fJYO6k0$Wvqka@X-@7#uXcz}n#NfsIfp`>ejSCY8pdzw63WxMS zT5xZi2sLV{O&s(7<@J*+zsyNws+tt->zik>2m6<^3#)(o5kZ^11^`);!&rJ;AUhu) z*RE*gWW5ukJXRd`9)xt)9w>9~f?Buss3yuVO<2*cGA~_Jd+MNyZZJ|8^4G?dVV!Vu zbT>Sl@ity=GDPc611R?y1AL6q4B|l(i2Drz@`Faedvw4JfIWJ^UVVT*-)A5J!vPb? zIUtzxwj%bp1G_!YwAu`x&gg@NG2L)Eq7$n9sCywvDA&*`X(xtD?u?6`Jef5J!X{$> z+3|xe(#_8SfQpNjzz$0wiGaWY;x>u~Od;PUgOXT+y9fx(pr#$}yDcH#ZHnf7CXmx` z6afHr2#TG7d}jz5E@<3iiP~tXP*)JrUCap?^lfp3$*tTWhBwngj6OdXIJi08uRF?u zI-tOlp)`o$&YWI&_P!ew6(b>Bj0P@@04|S^4sSy=&=4j0ZOMf@(Gc&&0QW}&_hKO4 z8x7&!XsGXxhVuSs$nVE+Fc9cD_hKR5CqNhtWkWOs0*$+4fjgstM`NM76ARUi@eu0g zKz%nJ%DS0&u*nGp;S8A`45eXxP#kX3bS^;eFU7MW4~iGgT3*}yE_<*)p$!23+bn-( z1ox69V|ku>dhV#chx}yIPli}NPV?-Cd`BIWI%x5k0lu!;MGIvv+Nf~TLA6Iml#{Rl z^-_sh6~J(9Y*#eA(-ogC?tv$32B0;GHlt{`_ZsrU4#|>B)sKXqbbOmPk;MNK6h=&4LC%NLjVml;K7|J3N_f0IatLl5F{{ zPu&RhPIIV}EjTEE)-=<$)@_vgO9GL~WHTssnnRUr1#yQB)Y~l~r}^$=6SN*QgZ#7& zR5|t#sV-3F1eCb}*>3oHw-v5TdJDPE4B4(ayoz7u-xGzN+9;qQ5g)0TT0gZX{y?cq zdMJeRbjV{N-lf|;8n`cr?WO1Om|z??gjrh=%&kD5&m? z;*kIcfCn)UAH)I=#sCk;K=p7m|DJen4A3wd!mTI>kH$dpC=SYx-+}z2d1$^rA9yey zjTfim$?4(vG{FkBq>DfTvOxn;6lwn~drDaL^{umcRj_PH49lA4|I5)<+w9F)$%dKi z+w-T`2cz6r0!cBAbbt3)sAc6TpTUh8uH8`V+8$MI?f4K8)d)z^MUaXPf_(C1u1mUlE@tHy2x?VLLLoe zP`k!Piw|KG8#B}gcfpf)4T1Fp0QOK*(J$E?%AFMYn*-Etqd(F{wz!>rqGKksMK#4t2?gUi00|lP=%U&B?eWwp^)s@h{ zm6kkc#!_p;8R{4H$CD!t5Gz7~8&SZWQ4nvBgzDA^sQE!34WS_l;_XP__6VSU1aNyK zaECk!!ad2whG>Ws6>t!Uf%@KPC?3Q@@nAInT)0agW1)N)3)RChQk{U(h6YL(Vj=%% z9F+ev11*nd;=B4u5FgJ3KA8{HPlqZm5}ziy<7!MdRQtb$Jnzm(4>LgVyF=@8XAK#7 za$!WrtjXRiE6!OfE6({1y<6Mt7cp$uz><*bWhQjK-cL8&D}?f`}>0p0LokvW8|j!%cy)jVS zj)CH4G~~CUp&%f5G!DXRu6#Ha3i|kH3X~70L-AlL@X=J@!8nKyCjt+r0aqsD^X=}a zitUYppbjVw>w$CrJ&`%y{ZaNbzo@dLg)Dta085=7%2MA6`(@sYZT5x%Al92L9buw< z?eMye8IwbTPY!O2d z=MJdy?1fUFzR2|Kh2!pBal)r3PW$#ms&{u}xxa-%hfc^d(?Y%}Ly0xRrQnWuvXpXs z2dMXu+dv@tFdg_L4cjou5ZF$1V^dCAqOiY}(gW&pB-=tsKtNH$K1(R69&peQYT7SQ zXa}*<4$5+S2-W^T=@2x2=!3d2sdG}}&hRNMoy??Z!$9C(7*r2J(0nHVE%gBqZVm-* zj^N?Hcs~Z}TM^RDUmpqF90}Zr2I^y^LLMFb+oOS7V>CV%xDgB77!BNv1#VOQKvO`x zLplE#sPB%2`q6kO9>k&f&SPM4-&)z z{j3ft!|fb%#{0yc9cEQ=#(xmf-8-Yuqccj~+oRM)n{R9>b<{?ggD%P)+Hq!Kg?)Qe zI!L3KmE5&>u3k<#JD;%nvC~aY;t7?`I;eEfMYW4I>fE(B0MLfx8b>Wu6S#PEN2Y66 zob>30)RESY@+W!E%87M6d@9)B$uY-H$aLt6BFD}sw$(*}B}2YFLuFVO{3*c#iX=M- z+pQoboAIuIn&tv_kdm+guw4TJ+hx3HNF4%Y60sPqqzE9{3W}{JP;NKkyaZAkQk*o0 zSmX$?%pEB40}8@`v@kU8a>d;VI{3p@TPU+afXZRO)e*q0;ZWWTN6XDH$m_$Qx;+%C zhH$9whC#d=0#$tw&=3LKjs|XxmJT@e`maPmtQ!WgJParb0}6)#1w(+`5FjTQ$PWd| zh5~h?fGY$Halox{91zrZ$3gXQ0@RNuLVhO}EqBL2`Dh|kk0+t^K^)|dVxj(MH1IeY zcn}3p&EUo);Mxp)b8ZB#%xI5PH-?(94k#bm7uhim_s`9VTyXZCaCUCSPtI$+7MsXCkb(Wezbf&-U;CJj<;UvYi=n`2-aK0Rez?_$%z% zp~7AVl@8jda?s|ZlGPN-zwS;9H5%ul4ZNzajcNh_H(fqvDMbeDd1R6A+7X#v{g4`L z_WN^@PDgVmxJ|_QgPm*V53xQKX}9@spy|gaoVp>~xho1C+oQmiA=`%GtQEtBQN8h( zWu_3eSVP!Gn_*}cz!d7;#!x2{02lx?Ahb;eY&U~IBB)7J93)M6Ylx%}v(=pcER7Va zcA27izYMLkS}n^1LW(O|-g8FdK4-M-vB$SmRLt}P>V^Rqh5}bdLcB5ps;iMu-iU&# zekA0#!XdvE40VG)#5=waZU^%GU%VO#RrN5m7KWiII}lB2K6rWB4UI>gAV1^?u4Bk0=6&l8TWON!*_a<<-gf>)Bx3m^T0yX(G~>A!nE|QpR~bI6Z4b z44Xe)Cx2cft64a*4FvvMt!&LiR=srwyRds6%bw)VAFEvw<9T+d>CqEjeQ%uf9r(vH z{)3y+y?Y^_wwpM0La9T0lsU9RIgLizYoW?s3pMr(wbZV2WT2sCL)^*8%NN}$<|tZ@N}FLU?x%Ng&^Zf~5za;FBe zqP0`sK07gB>H9wVe>&;X16ht8P++fvJW_sf)xsHbhO49d;M?WqkZ+`=55yHPhq&7a z!cGH-I|u-XC}as?n+25HXpfu~gdI|=kn;zqElILz+btj@TR^_k5-)dHKy|>LYbAcO zq$j?d&+yfTUJ$d~f$BiuQZR5O6u3MT!sQ4E*P|ia8Vxn&>Q{$Cbv+E?%@E*55O6UN z>Z&j(as$wG+y&2eo8zxr4e|9B$-mubh!<-O(Y(q4&CB)BLR|lq26(yJ08dvA#y1K5 z@Ym&i@oa+u#&D`7Uzt}D; z8^i8wnZ+vO<5=2Ad-k;AQ2Uc}$HX3t4J_CnVEWBj?|$kmm$#7P*b(`T9r=V|Imt6Q zX!C_61OgYG7%n<6oF_nd1qv<{-jif9jU|&xkuHk8-x4!D`-rE!^^p={`(0*iXxaG{ z^T*uVy`{(b74x}T?)7yuxTj7DW~ozyS;p*$w^FBtEI8t4_~$c@-H>bBP7;A|)kco9 z7EJ5O&x@zRMP^yGRetR1zSe0i_*Q0Ij6v z5rHj)BnPNBI^x-4BRpTMk0*=!<1efGq9w%^Vy!=L*$?7XU*KjSgv)`z^>B#wkxLQZ>5cT4WfVw78adpg-nD{Lu?P|AM`x zw$vhIc9Xn2_VNc!i?QW-ULtERcl*~(-%pBN%b1mzww&L$oCB&rXPIUGEmNQuS29Xz z^ysH9ya*@Z!4wXR6n4#!g7_GkS@=kL;lm1RlkO?vSaSUov_6Izl7!l$Ru%KVU z3K&T8;PRYh-cZW^)!4sv_)SS)=Pd^G@qLv}_Q=14M7P5~xh7YN=D5HA_PtOmqwS8~|@#41X$*@hO+6-aPnSh4R@i-13247IOn(mX-f~^=H*P@-*oGp7ynC zEasI*o7BlO6t-U2K?(wPqiLRNC)E?z#WOla=L{VYgRFR6pHo%6l1~wPv)0RB$LzVs zNUI7s&nexGKdLX&u3`!7&;o;0%k~^x zI5QhM4bkzUtJh0K&OL-=ffZnlBPCm_1kg_xv^Oo$UsoyO$rqfmd6du5MPyAYVkkw8 zayJMJ4Sq6WZhRn))XE3f-9b9{iN&IBKJ|z3qy=%sNehsj*}nB}pF^Kspk0?*ljn&T zZRO88kE*EqrjgHidmTSkl8+qwG|t4@d0aB}2LFc_H4P~UVfVvIcEv5~qiAUCZd{Nk zp1+{#KHV}S&S{@N>gKF=5K*riBKu@4gD#Kd9dZxuYc2y_QnGslxBNy{Wb1IUiv5EOTuiRL6<|IR3ZEeo@ z>pvFu*YA%1JWTWY<|;6 zef0+4{)3uvDwOFL&A!D)r(cdqI~XPWc72x^v3#RXq1q1MMH8j=WfDHEiJ68`(2HGa z1g%lXGASn^h6{R_w8DBPvBwNf+aH3Ba7K@~euOocCt4}(IEM1x4RK`jRMw&{X4m!N z^aB8$&orK0U~B9l07BhE`*{E`F7VphHyqFKw5d}S+qzjQ+c?Jqe8c}8Gd?{ZvaPXx z=fBQQjz6LtB#Snt?&l?i;fU^$gPrJ5*lZ^%pDdyD7aTnc&$lsy zSeB?r%D1I9EuW+xHR%U4RK3VPf82Cibm)0^yK^=`VEPM(z;q@Wi&w;2TI-c;m_2{? zXv4?n4!^Y68OIxmYD(EV&K$!}YuZSa+ z0;XtR_+@RRRNZgYRbdwfrAd^w|h+rNI z5JQ8YK-(#agr<;wGpW4i|hp|P5sv;vAIsTzMCm%>%QO{M*v{}W)idS z&WdZ{X8WvE{}ZTWW1Z%A(>JPxe}e7?I~Mv#df4)+a3h0d@hVd|6mM2oor_XkfNOT3 zCkIa*X4X1a}Omcwpm4A*s~T z7X2P|()w*d1Zqrr}mn2UsoO_V+ zW~|NxLvIZ@-;EXSn4#~0C9;&8m#N}!%TlMCd&k>_gPQ%B$VNKZ!gaJIBRjx_{JL9x zvpdXYibi1EZ6OZPx9J<(G#E{_nTqvOWR+sV-5OZqgiON+=L5F}zzqX#$j-*@gNxX! zA}l}V*VvwMPrlAmnb=@@#>pFwU&4OAiQdIIWD=mqhVzAn(qVSohDu-+lC3{r;`&v* z5`400%T1vJ)D9}8Z6=L0;;geI*`*IF>MD@wT-@%T4gY#uBBgrNC+^xP;o?k+G+mhR z_$b5|`I2pt#^Y`7VzdFQp-$hTqo}`B#wD+#a3T#mo{B@%A^}DL<1+mH%n#MIz)MS& z{l!niAiT{zT%(l;mmUGtc=MflrE%q_+65>|>N4Q_sse`1Vc>wa7f%#%b;AWj$UWtfQEBrL4@0h@!@sgS;FBkIK;{?i)6&SlJGYJ{&eQ)p?UT*{*s${KL7=Whv zwV!w$Mmt90pilcCnL*1WQ=#*Xx8fJ#*8r>@wvRG-S`rLoQR@S&w6LBW0 zhW*aF;uu4X7)N+T;br)&J9`V)NWDmH;Uxv&){i-_{xRMhBpCH5+|U@0r2k+?uQ!_4O@~%M?%Ou@0HSuy* z{BSWtn?y4KxAROjj&l3jE6#kWiOr^DkywiS)`&{6B-|W*W%VPt z;>XB{T(-G7Xk&E)y4_SZa5#!k1>vE zD%AFsPn;`n#a#Kfzr@~lnH>J(-x199M&i@^J0GYNK&92KWL9=pmn&eV9n>85>(9tk zs|c+(upR_xVis}i7?+Le`3dQAA-Dz zjq(U2O95_5Hr!~$Cj_OU2n;oC>_&AGSZ7&AtU0 z*LDB>)HAu1SU>T1z~tdjF!gKerowz#$=~b*z{!S(P4Z8 zli+B_1U{zfmKf<(675FNsn1}n(Q(lJ$;8Il(A>0AT<{BE5oCbhbJC`F1a@SBKM?BAA&ofTR zRJ5Or;A?6pO5%2!6cgVDUV(X70vrKW(f0yG+_T(Hv1vZ|2Y*jJdy}Y|9Q-%NBVV^2 zawNGK-(ITdWe|9A5I+0Yn_S|$a_Mlj^x(O#H2>-DR;%uLm}_uzDZ0P=EowD(OU@ zl}gr>Azzi)(I70PY{Gb$B#BJC65(D+Liz53(9H}9U3C`~L$bt(vjq))oyraoiuk*F zRQ~{LUtQUP49f8vN8Qx$ZNiF~to1~oNtI+-c%0jv%Hj8NivUWl5uDO%Tm zO2jldj=k|WUfxN5o4`CV%-dZg&@v1HRK>ZM3FY3?5`{+l4h7v@BB z{cKBq>oo}<()hJY$IEsz*(Ua0ci3tEmg$@f3H~VZ^uzXayn_*IqO^O{&@Zai0j`jU z`~p-{q&6wp#HKF6<`uo6l=IeGU5+4;T4FQGzsjoj7_+!Q=k1apY@XakijN33aDriX zSLmF=mTmM`k=(r(=N&FkajA}DS^wd!C82@9>!L$$6ff1>@5f#A-ZeSo8V0oNv1d@_ ztdt$RW#7qHVWI=E>fgo21qMs8!JCALmCe^qMTF0ztijX7F>pbAzH7CO?Jg7175a#U zS2JLDRc|S8`;Uy>W@6w)mS&G%pI{5GXjPS;r%_PeY^MR|`2i;&$F{87GRtF>CVQGY z|30bqf6Y3cC!J_vCb9b9lQ=h%-i=XE_RCi#&XyxX2DKc5F_2f7>@WR=k%kfk_2?xT zeTOyncfl{lWFNbJf}jwgu!tkMo$TQ9g^zJ!z~#${&J*b1o zy8l&hdvLn=FAhKE!wzCm z7MtDDYMJv-y2k%l*GO0)Jd>ZHZ@=Y**f{NpC+Bz-qh{VWFN*;enP?Q$4qVh$kcRRq z=B@$*#p+(LtUQa!3UFRwHFSnu)6XKP^Oo=M4zxtTo@C`A{J)p9n|_0m+1<*ImX2Ux=x=Cv;1Bx{UG zfrrp+z1~YIlsT$w)oeIz7qJg8zvkH9)TkhcKm>i0m(QOmg< zVdntMDzzL}FUFT0+^(hpD=MB>vfw8IW{Yt2eJ#7WK$p6D)9;a{RCPwGHe{Av(R5M+)Y18J}4Hy`7=@!^xW3x+g{ z`)9rLPa})dgGm>ysL=Q0>I#+d)MfHAOvyPWqS%tQ!5K3B`{`cSt%ELseC92VH$MJ; zoRpsnr4)(xMHnDy5|K8JUjU6KkTjgsU5wLe%0D^U@DGBx`{ZgQdXB#i0EnBEEg|r^ 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 literal 0 HcmV?d00001 diff --git a/landing.html b/landing.html index 0aaed78..b9ae8b8 100644 --- a/landing.html +++ b/landing.html @@ -1,665 +1,665 @@ - - - - - - Git Manager Explorer Pro — Desktop Git Manager für Gitea & GitHub - - - - - - -

- - -
-

Git Manager Explorer Pro

-

- Verwalte deine Gitea & GitHub Repositories auf dem Desktop.
- Mit Editor, Favoriten, Batch-Aktionen und mehr — alles ohne Kommandozeile. -

- -
- - -
-
-
-

100+

-

Repos gleichzeitig verwalten

-
-
-

2.1.3

-

Aktuelle Version

-
-
-

⚡

-

Schnell & zuverlässig

-
-
-
- - -
-

Warum Git Manager Pro?

-

Alles, was du brauchst, um deine Repositories effizient zu verwalten.

- -
-
-
🌐
-

Gitea & GitHub

-

Unterstützt beide Plattformen nahtlos — alle Repositories an einem Ort.

-
-
-
📂
-

Datei-Explorer

-

Navigiere durch Ordnerstruktur wie im Windows Explorer. Mit integriertem Editor.

-
-
-
⭐
-

Favoriten & Verlauf

-

Schnelle Navigation zu Lieblingsprojekten. Automatisch gespeichert.

-
-
-
📤
-

Drag & Drop

-

Ziehe Dateien rein zum Upload, raus zum Download — direkt im App-Fenster.

-
-
-
🧩
-

Batch-Aktionen

-

Wende dieselbe Operation auf mehrere Repositories gleichzeitig an.

-
-
-
📊
-

Commit-History

-

Sieh alle Commits, Tags und Releases. Mit Aktivitäts-Heatmap wie auf GitHub.

-
-
-
✏️
-

Code-Editor

-

Bearbeite Dateien direkt in der App. Mit Syntax-Highlighting und Auto-Save.

-
-
-
🔒
-

Sichere Credentials

-

Alle Tokens verschlüsselt (AES-256) — deine Daten sind sicher.

-
-
-
📥
-

Ein-Klick-Migration

-

Migriere Repos zwischen Services — mit kompletter History.

-
-
- -
-

🎥 Demo (baldiges Update)

-
- Screenshot-Bereich — Demo und UI-Vorschau kommen bald!

- Starte die App mit npm start, um eine Live-Demo zu sehen -
-
-
- - -
-
-

💻 Systemvoraussetzungen

-
-
- Windows - 10 oder 11 (64-bit) -
-
- RAM - Mindestens 4 GB -
-
- Festplatte - 200 MB für App + Repos -
-
- Internet - Für Gitea/GitHub Zugriff -
-
-
-
- - -
-
-

⬇️ Git Manager Pro herunterladen

-

Wähle eine Option um zu starten:

- -

- ✨ Kostenlos, Open Source, MIT Lizenz -

-
-
- - -
-

Ressourcen & Support

- - -
- - -
-

❓ Häufige Fragen

- -
-
-

Kostet die App etwas?

-

Nein, Git Manager Pro ist kostenlos und Open Source unter der MIT-Lizenz.

-
-
-

Funktioniert es nur mit Gitea?

-

Nein, die App unterstützt sowohl Gitea als auch GitHub. Du kannst zwischen den Plattformen wechseln.

-
-
-

Sind meine Credentials sicher?

-

Ja, alle Tokens und Passwörter werden lokal mit AES-256 verschlüsselt. Nie auf Servern gespeichert.

-
-
-

Kann ich beitragen?

-

Gerne! Siehe den DEV_GUIDE.md für Setup-Anleitung und sieh dir unsere offenen Issues an.

-
-
-
- - - - - + + + + + + Git Manager Explorer Pro — Desktop Git Manager für Gitea & GitHub + + + + + + +
+ + +
+ + +
+

Git Manager Explorer Pro

+

+ Verwalte deine Gitea & GitHub Repositories auf dem Desktop.
+ Mit Editor, Favoriten, Batch-Aktionen und mehr — alles ohne Kommandozeile. +

+ +
+ + +
+
+
+

100+

+

Repos gleichzeitig verwalten

+
+
+

2.1.3

+

Aktuelle Version

+
+
+

⚡

+

Schnell & zuverlässig

+
+
+
+ + +
+

Warum Git Manager Pro?

+

Alles, was du brauchst, um deine Repositories effizient zu verwalten.

+ +
+
+
🌐
+

Gitea & GitHub

+

Unterstützt beide Plattformen nahtlos — alle Repositories an einem Ort.

+
+
+
📂
+

Datei-Explorer

+

Navigiere durch Ordnerstruktur wie im Windows Explorer. Mit integriertem Editor.

+
+
+
⭐
+

Favoriten & Verlauf

+

Schnelle Navigation zu Lieblingsprojekten. Automatisch gespeichert.

+
+
+
📤
+

Drag & Drop

+

Ziehe Dateien rein zum Upload, raus zum Download — direkt im App-Fenster.

+
+
+
🧩
+

Batch-Aktionen

+

Wende dieselbe Operation auf mehrere Repositories gleichzeitig an.

+
+
+
📊
+

Commit-History

+

Sieh alle Commits, Tags und Releases. Mit Aktivitäts-Heatmap wie auf GitHub.

+
+
+
✏️
+

Code-Editor

+

Bearbeite Dateien direkt in der App. Mit Syntax-Highlighting und Auto-Save.

+
+
+
🔒
+

Sichere Credentials

+

Alle Tokens verschlüsselt (AES-256) — deine Daten sind sicher.

+
+
+
📥
+

Ein-Klick-Migration

+

Migriere Repos zwischen Services — mit kompletter History.

+
+
+ +
+

🎥 Demo (baldiges Update)

+
+ Screenshot-Bereich — Demo und UI-Vorschau kommen bald!

+ Starte die App mit npm start, um eine Live-Demo zu sehen +
+
+
+ + +
+
+

💻 Systemvoraussetzungen

+
+
+ Windows + 10 oder 11 (64-bit) +
+
+ RAM + Mindestens 4 GB +
+
+ Festplatte + 200 MB für App + Repos +
+
+ Internet + Für Gitea/GitHub Zugriff +
+
+
+
+ + +
+
+

⬇️ Git Manager Pro herunterladen

+

Wähle eine Option um zu starten:

+ +

+ ✨ Kostenlos, Open Source, MIT Lizenz +

+
+
+ + +
+

Ressourcen & Support

+ + +
+ + +
+

❓ Häufige Fragen

+ +
+
+

Kostet die App etwas?

+

Nein, Git Manager Pro ist kostenlos und Open Source unter der MIT-Lizenz.

+
+
+

Funktioniert es nur mit Gitea?

+

Nein, die App unterstützt sowohl Gitea als auch GitHub. Du kannst zwischen den Plattformen wechseln.

+
+
+

Sind meine Credentials sicher?

+

Ja, alle Tokens und Passwörter werden lokal mit AES-256 verschlüsselt. Nie auf Servern gespeichert.

+
+
+

Kann ich beitragen?

+

Gerne! Siehe den DEV_GUIDE.md für Setup-Anleitung und sieh dir unsere offenen Issues an.

+
+
+
+ + + + + diff --git a/main.js b/main.js index 3c98e2e..bf999af 100644 --- a/main.js +++ b/main.js @@ -1,10 +1,42 @@ // main.js — Main-Process with concurrent folder upload/download, progress events, and temp-dir cleanup const { app, BrowserWindow, ipcMain, dialog, Menu, nativeImage, Tray, shell, clipboard, safeStorage } = require('electron'); +// Das Setup startet die frisch installierte EXE einmal mit diesem Schalter, damit Windows Defender +// sie schon während der Installation prüft (installer/Installer.cs → Vorwaermen). Sofort beenden. +if (process.argv.includes('--gm-vorwaermen')) process.exit(0); +// Eingebautes Git aktivieren, bevor irgendein Git-Prozess startet. +require('./src/git/gitBinary.js').useBundledGit(); const ppath = require('path'); const fs = require('fs'); + +// Allgemeine App-Einstellungen (ohne Geheimnisse) und was sofort davon abhängt +const { applyGitIdentity, commitIdentity } = require('./src/git/gitBinary.js'); +const appPrefs = require('./src/features/appPrefs.js').createPrefs(ppath.join(app.getPath('userData'), 'app-settings.json')); +const UPLOAD_EXCLUDES_FILE = ppath.join(app.getPath('userData'), 'upload-excludes.txt'); +function applyPrefsToProcess(p) { + try { applyGitIdentity({ name: p.gitName, email: p.gitEmail }, app.getPath('userData')); } catch (e) { console.warn('Git-Identität:', e.message); } + try { + if (p.uploadExtraExcludes.trim()) fs.writeFileSync(UPLOAD_EXCLUDES_FILE, p.uploadExtraExcludes + '\n', 'utf8'); + else if (fs.existsSync(UPLOAD_EXCLUDES_FILE)) fs.rmSync(UPLOAD_EXCLUDES_FILE, { force: true }); + } catch (e) { console.warn('Upload-Ausschlüsse:', e.message); } +} +applyPrefsToProcess(appPrefs.get()); +appPrefs.onChange((p) => { + applyPrefsToProcess(p); + for (const w of BrowserWindow.getAllWindows()) { + try { w.webContents.setZoomFactor(p.zoom / 100); } catch (_) {} + } +}); +// Name/E-Mail für Commits in den temporären Upload-Klonen +function gitIdentityConfig() { + const id = commitIdentity(appPrefs.get()); + return [`user.email=${id.email}`, `user.name=${id.name}`]; +} +// Wird beendet (Tray-Menü, Updater, Herunterfahren)? Dann das Fenster nicht in den Tray schicken. +let quittingForReal = false; +app.on('before-quit', () => { quittingForReal = true; }); const os = require('os'); const crypto = require('crypto'); -const { execSync, spawnSync } = require('child_process'); +const { execSync, spawnSync, spawn } = require('child_process'); const http = require('http'); const https = require('https'); @@ -16,7 +48,8 @@ const { formatErrorForUser, caches, runParallel, - retryWithBackoff + retryWithBackoff, + bareHostname } = require('./src/utils/helpers.js'); // OPTIMIERUNG: Updater wird nicht sofort geladen, sondern verzögert nach Startup @@ -44,6 +77,8 @@ const { getGiteaFileContent, uploadGiteaFile, uploadItemsViaGiteaApi, + listGiteaRepoFiles, + deleteGiteaPathsBatched, getGiteaCurrentUser, getGiteaCommits, getGiteaCommit, @@ -187,6 +222,14 @@ function markGitTransportWorking(authUrl) { if (brokenGitTransports.delete(gitTransportKey(authUrl))) saveBrokenGitTransports(); } +// Hebt die Sperre für einen Host auf, z. B. wenn die Diagnose den Git-Weg als funktionierend erkannt hat. +function clearGitTransportBlock(host) { + loadBrokenGitTransports(); + if (!brokenGitTransports.delete(host)) return false; + saveBrokenGitTransports(); + return true; +} + function isGitTransportKnownBroken(authUrl) { loadBrokenGitTransports(); const key = gitTransportKey(authUrl); @@ -975,6 +1018,9 @@ function createWindow() { }); win.loadFile(ppath.join(__dirname, 'renderer', 'index.html')); + win.webContents.on('did-finish-load', () => { + try { win.webContents.setZoomFactor(appPrefs.get().zoom / 100); } catch (_) {} + }); // win.webContents.openDevTools(); // OPTIMIERUNG: Tray wird verzögert hergestellt (nicht beim Fenster-Create) @@ -982,10 +1028,12 @@ function createWindow() { createTray(win); }); - // Schließen-Button -> Tray statt Beenden (nur wenn Autostart aktiv) + // Schließen-Button -> Tray statt Beenden. Einstellung "Beim Schließen": immer Tray, immer beenden + // oder automatisch (Tray nur, wenn die App mit Windows startet). win.on('close', (e) => { - const { enabled } = app.getLoginItemSettings(); - if (enabled) { + const action = appPrefs.get().closeAction; + const toTray = action === 'tray' || (action === 'auto' && app.getLoginItemSettings().enabled); + if (toTray && !quittingForReal) { e.preventDefault(); win.hide(); } @@ -1140,18 +1188,37 @@ function sanitizeGitRef(ref, fallback = 'main') { return normalizeBranch(ref, 'gitea'); } -function runGitSync(args, cwd, options = {}) { - const res = spawnSync('git', args, { - cwd, - encoding: 'utf8', - windowsHide: true, - ...options +// Startet Git ohne den Hauptprozess zu blockieren. Synchrone Aufrufe (spawnSync) froren +// die Oberfläche ein, bis Windows "Anwendung reagiert nicht" meldete. +function execGit(args, { cwd, input, env } = {}) { + return new Promise((resolve) => { + let child; + try { + child = spawn('git', args, { cwd, env: env || process.env, windowsHide: true }); + } catch (e) { + resolve({ status: -1, stdout: '', stderr: String(e && e.message || e) }); + return; + } + const out = []; + const err = []; + child.stdout.on('data', c => out.push(c)); + child.stderr.on('data', c => err.push(c)); + child.on('error', e => err.push(Buffer.from(String(e && e.message || e)))); + child.on('close', (code) => resolve({ + status: code, + stdout: Buffer.concat(out).toString('utf8'), + stderr: Buffer.concat(err).toString('utf8') + })); + if (input != null) child.stdin.end(input); + else child.stdin.end(); }); +} +async function runGitAsync(args, cwd, options = {}) { + const res = await execGit(args, { cwd, env: options.env }); if (res.status !== 0) { throw new Error(String(res.stderr || res.stdout || 'Git-Fehler').trim()); } - return String(res.stdout || '').trim(); } @@ -1489,7 +1556,7 @@ ipcMain.handle('push-project', async (event, data) => { // Aktuellen Branch ermitteln (NICHT umbenennen!) let currentBranch = data.branch || null; try { - const detected = runGitSync(['branch', '--show-current'], data.folder); + const detected = await runGitAsync(['branch', '--show-current'], data.folder); if (detected) { currentBranch = currentBranch || sanitizeGitRef(detected, 'main'); console.log('Current local branch:', detected); @@ -1504,7 +1571,7 @@ ipcMain.handle('push-project', async (event, data) => { // 2. Prüfen, ob ein 'origin' Remote existiert let remoteUrl = ''; try { - remoteUrl = runGitSync(['remote', 'get-url', 'origin'], data.folder); + remoteUrl = await runGitAsync(['remote', 'get-url', 'origin'], data.folder); // Bereits gespeicherte Credential-URLs in sichere Origin-URLs ohne Userinfo konvertieren. try { @@ -1513,7 +1580,7 @@ ipcMain.handle('push-project', async (event, data) => { remoteObj.username = ''; remoteObj.password = ''; const sanitizedRemoteUrl = remoteObj.toString(); - runGitSync(['remote', 'set-url', 'origin', sanitizedRemoteUrl], data.folder); + await runGitAsync(['remote', 'set-url', 'origin', sanitizedRemoteUrl], data.folder); remoteUrl = sanitizedRemoteUrl; } } catch (_) {} @@ -1544,11 +1611,11 @@ ipcMain.handle('push-project', async (event, data) => { } if (constructedUrl) { try { - runGitSync(['remote', 'add', 'origin', constructedUrl], data.folder, { stdio: 'inherit' }); + await runGitAsync(['remote', 'add', 'origin', constructedUrl], data.folder, { stdio: 'inherit' }); // Auth nie in der Remote-URL speichern; stattdessen Header scoped auf den Remote-Origin. if (remoteOrigin && authHeader) { - runGitSync(['config', `http.${remoteOrigin}.extraheader`, authHeader], data.folder); + await runGitAsync(['config', `http.${remoteOrigin}.extraheader`, authHeader], data.folder); } console.log(`Remote origin added: ${constructedUrl}`); @@ -1583,7 +1650,7 @@ ipcMain.handle('getBranches', async (event, data) => { // Aktuellen Branch ermitteln und nach oben sortieren let currentBranch = null; try { - currentBranch = runGitSync(['branch', '--show-current'], data.folder); + currentBranch = await runGitAsync(['branch', '--show-current'], data.folder); } catch (_) {} branches.sort((a, b) => { if (a === currentBranch) return -1; @@ -1908,7 +1975,7 @@ ipcMain.handle('deleteFile', async (event, data) => { return new Promise((resolve, reject) => { const refQuery = useBranch ? `?ref=${encodeURIComponent(useBranch)}` : ''; const req = protocol.request({ - hostname: urlObj.hostname, port, + hostname: bareHostname(urlObj.hostname), port, path: `/api/v1/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/contents/${path.split('/').map(encodeURIComponent).join('/')}${refQuery}`, method: 'GET', headers: { 'Authorization': `token ${token}`, 'Content-Type': 'application/json' } @@ -1934,7 +2001,7 @@ ipcMain.handle('deleteFile', async (event, data) => { if (useBranch) payload.branch = useBranch; const body = JSON.stringify(payload); const req = protocol.request({ - hostname: urlObj.hostname, port, + hostname: bareHostname(urlObj.hostname), port, path: `/api/v1/repos/${encodeURIComponent(owner)}/${encodeURIComponent(repo)}/contents/${filePath.split('/').map(encodeURIComponent).join('/')}`, method: 'DELETE', headers: { @@ -1972,6 +2039,11 @@ ipcMain.handle('deleteFile', async (event, data) => { const notFound = contents.errors.some(err => String(err).toLowerCase().includes('does not exist')); if (notFound) return files; } + // Gitea meldet einen nicht (mehr) vorhandenen Pfad als {"message":"object does not exist ..."}. + if (contents && !Array.isArray(contents) && !contents.sha && typeof contents.message === 'string' && + /does not exist|not found/i.test(contents.message)) { + return files; + } if (Array.isArray(contents)) { // It's a folder — recurse into it for (const item of contents) { @@ -2020,6 +2092,23 @@ ipcMain.handle('deleteFile', async (event, data) => { return remaining.length > 0; } + // Schnellweg: paketweise löschen (ein Commit pro bis zu 100 Dateien). + // Nur wenn die Trees-API nicht nutzbar ist, läuft der alte Einzelweg weiter unten. + try { + const r = await deleteGiteaPathsBatched({ + token, url: giteaUrl, owner, repo, branch: useBranch || 'HEAD', prefix: filePath + }); + invalidateRepoContentsCache(owner, repo); + if (r.failed.length === 0) { + logger.info('deleteFile', `Deleted ${r.deleted} files in ${r.commits} commits`); + return { ok: true, deleted: r.deleted }; + } + const preview = r.failed.slice(0, 5).map(f => `${f.path}: ${f.error}`).join('; '); + return { ok: false, error: `Löschen unvollständig: ${r.failed.length} von ${r.total} Dateien nicht gelöscht (${preview}${r.failed.length > 5 ? ', ...' : ''}).` }; + } catch (batchErr) { + logger.warn('deleteFile', 'Paket-Löschen nicht möglich, nutze Einzelweg', { error: String(batchErr && batchErr.message || batchErr) }); + } + // Collect all files to delete (handles both file and folder) const filesToDelete = await collectAllFiles(filePath); @@ -2072,6 +2161,70 @@ ipcMain.handle('deleteFile', async (event, data) => { } }); +/* ----------------------------- + Gitea: Dateien finden, die laut lokaler .gitignore nicht ins Repo gehören + ----------------------------- */ +ipcMain.handle('find-gitignored-in-repo', async (_event, data) => { + try { + const credentials = readCredentials(); + const token = credentials && credentials.giteaToken; + const url = credentials && credentials.giteaURL; + if (!token || !url) return { ok: false, error: 'missing-token-or-url' }; + const { owner, repo, localFolder } = data || {}; + const repoPath = String((data && data.repoPath) || '').replace(/^\/+|\/+$/g, ''); + if (!owner || !repo || !localFolder || !fs.existsSync(localFolder)) return { ok: false, error: 'Lokaler Ordner nicht gefunden' }; + + const { branch, files } = await listGiteaRepoFiles({ token, url, owner, repo, branch: data.branch || 'HEAD' }); + const prefix = repoPath ? `${repoPath}/` : ''; + const remote = [...files.keys()].filter(p => p.startsWith(prefix)); + if (remote.length === 0) return { ok: true, branch, files: [], scanned: 0 }; + + // Die Regeln des lokalen Ordners auf die Server-Pfade anwenden. check-ignore prüft rein + // nach Muster, die Dateien müssen lokal nicht existieren. + const tmp = fs.mkdtempSync(ppath.join(os.tmpdir(), 'gm-ignore-')); + let ignoredRel = []; + try { + await execGit(['init', '-q', '--bare', tmp]); + const r = await execGit([`--git-dir=${tmp}`, `--work-tree=${localFolder}`, 'check-ignore', '--no-index', '--stdin', '-z'], { + cwd: localFolder, + input: remote.map(p => p.slice(prefix.length)).join('\0') + '\0' + }); + // Exit-Code 1 heißt: nichts ignoriert. + if (r.status !== 0 && r.status !== 1) throw new Error((r.stderr || 'git check-ignore fehlgeschlagen').trim()); + ignoredRel = r.stdout.split('\0').filter(Boolean); + } finally { + try { fs.rmSync(tmp, { recursive: true, force: true }); } catch (_) {} + } + + return { ok: true, branch, files: ignoredRel.map(rel => prefix + rel), scanned: remote.length }; + } catch (e) { + console.error('find-gitignored-in-repo error', e); + return { ok: false, error: mapIpcError(e) }; + } +}); + +ipcMain.handle('delete-gitea-paths', async (event, data) => { + try { + const credentials = readCredentials(); + const token = credentials && credentials.giteaToken; + const url = credentials && credentials.giteaURL; + if (!token || !url) return { ok: false, error: 'missing-token-or-url' }; + const { owner, repo, paths } = data || {}; + if (!owner || !repo || !Array.isArray(paths) || paths.length === 0) return { ok: false, error: 'Keine Dateien angegeben' }; + + const r = await deleteGiteaPathsBatched({ + token, url, owner, repo, branch: data.branch || 'HEAD', paths, + message: data.message, + onProgress: (percent) => { try { event.sender.send('folder-upload-progress', { percent }); } catch (_) {} } + }); + invalidateRepoContentsCache(owner, repo); + return { ok: r.failed.length === 0, ...r }; + } catch (e) { + console.error('delete-gitea-paths error', e); + return { ok: false, error: mapIpcError(e) }; + } +}); + /* ----------------------------- Gitea: list repos, contents, file content ----------------------------- */ @@ -2405,7 +2558,7 @@ ipcMain.handle('upload-gitea-file', async (event, data) => { } const tmpDir = getSafeTmpDir(`git-file-${owner}-${repo}`); - const gitConfig = ['user.email=gui@gitmanager.local', 'user.name=Git Manager GUI']; + const gitConfig = gitIdentityConfig(); try { const { repoGit, isEmptyRepo } = await cloneForUpload({ @@ -2617,6 +2770,7 @@ ipcMain.handle('upload-local-folder-to-gitea', async (event, data) => { // Exclude-Liste: .git, node_modules etc. überspringen const excludeList = ['.git', 'node_modules', '.DS_Store', 'thumbs.db', '.vscode', '.idea']; + const isIgnored = await createUploadIgnore(localFolder); (function walk(dir) { const entries = fs.readdirSync(dir); for (const entry of entries) { @@ -2624,6 +2778,7 @@ ipcMain.handle('upload-local-folder-to-gitea', async (event, data) => { const full = ppath.join(dir, entry); let stat; try { stat = fs.statSync(full); } catch(e) { continue; } + if (isIgnored(full, stat.isDirectory())) continue; if (stat.isDirectory()) { walk(full); } else if (stat.isFile()) { @@ -2656,7 +2811,7 @@ ipcMain.handle('upload-local-folder-to-gitea', async (event, data) => { } const tmpDir = getSafeTmpDir(`git-folder-${owner}-${repo}`); - const gitConfig = ['user.email=gui@gitmanager.local', 'user.name=Git Manager GUI']; + const gitConfig = gitIdentityConfig(); // Fortschritt: Start try { event.sender.send('folder-upload-progress', { processed: 0, total, percent: 0 }); } catch (_) {} @@ -2761,18 +2916,78 @@ ipcMain.handle('upload-local-folder-to-gitea', async (event, data) => { Erzeugt EINEN Clone + EINEN Commit + EINEN Push für ALLE Pfade zusammen – egal wie viele Dateien/Ordner gedroppt wurden. ----------------------------------------------------------------- */ +// Liest die .gitignore-Regeln (auch verschachtelte und globale) für einen Upload-Pfad aus +// und liefert eine Prüffunktion. Build-Ausgaben wie build/ oder .gradle/ werden so nicht +// hochgeladen. Maßgeblich ist das Repo, in dem der Pfad liegt; ohne Repo der Elternordner. +// So greift die .gitignore auch, wenn nur einzelne Einträge eines Ordners gezogen werden. +// Git bekommt ein leeres Dummy-Repo und den Ordner nur als Arbeitsverzeichnis. +// +// Läuft asynchron; das Ergebnis pro Arbeitsordner wird im übergebenen Cache gehalten, +// damit 19 gezogene Einträge eines Ordners nur eine Git-Abfrage auslösen. +async function createUploadIgnore(target, cache = new Map()) { + const parent = ppath.dirname(target); + let workTree = parent; + if (cache.has(`top:${parent}`)) { + workTree = cache.get(`top:${parent}`); + } else { + const top = await execGit(['-C', parent, 'rev-parse', '--show-toplevel']); + if (top.status === 0 && top.stdout.trim()) workTree = ppath.resolve(top.stdout.trim()); + cache.set(`top:${parent}`, workTree); + } + + let ignored = cache.get(`ign:${workTree}`); + if (!ignored) { + ignored = new Set(); + let tmp = null; + try { + tmp = fs.mkdtempSync(ppath.join(os.tmpdir(), 'gm-ignore-')); + const init = await execGit(['init', '-q', '--bare', tmp]); + if (init.status === 0) { + const r = await execGit([`--git-dir=${tmp}`, `--work-tree=${workTree}`, 'ls-files', '-z', + '--others', '--ignored', '--exclude-standard', '--directory', + // zusätzliche Muster aus Einstellungen → Uploads + ...(fs.existsSync(UPLOAD_EXCLUDES_FILE) ? [`--exclude-from=${UPLOAD_EXCLUDES_FILE}`] : [])], { cwd: workTree }); + if (r.status === 0) { + for (const entry of r.stdout.split('\0')) if (entry) ignored.add(entry); + } + } + } catch (e) { + console.warn('createUploadIgnore:', e.message || e); + } finally { + if (tmp) { try { fs.rmSync(tmp, { recursive: true, force: true }); } catch (_) {} } + } + cache.set(`ign:${workTree}`, ignored); + if (ignored.size) console.log(`[Upload] .gitignore: ${ignored.size} Einträge unter ${workTree} ausgeschlossen`); + } + + return (fullPath, isDir) => { + if (!ignored.size) return false; + const rel = ppath.relative(workTree, fullPath).split(ppath.sep).join('/'); + if (ignored.has(isDir ? `${rel}/` : rel)) return true; + // Liegt der Pfad in einem ausgeschlossenen Ordner? + for (let i = rel.lastIndexOf('/'); i > 0; i = rel.lastIndexOf('/', i - 1)) { + if (ignored.has(rel.slice(0, i + 1))) return true; + } + return false; + }; +} + const GIT_UPLOAD_EXCLUDE = ['.git', 'node_modules', '.DS_Store', 'thumbs.db', '.vscode', '.idea']; // Wandelt gedroppte Pfade (Dateien und/oder Ordner) in eine flache Liste // { localFile, targetPath } um. Dateien -> destPath/, Ordner -> // destPath// (identisch zum bisherigen Verhalten). -function buildItemsFromPaths(paths, destPath) { +async function buildItemsFromPaths(paths, destPath) { const items = []; + const ignoreCache = new Map(); const skipped = []; + const ignored = []; for (const p of paths) { let stat; try { stat = fs.statSync(p); } catch (e) { skipped.push({ path: p, error: 'not-found' }); continue; } const baseName = ppath.basename(p); + const isIgnored = await createUploadIgnore(p, ignoreCache); + if (isIgnored(p, stat.isDirectory())) { skipped.push({ path: p, error: 'gitignore' }); continue; } if (stat.isFile()) { const targetPath = destPath ? `${destPath}/${baseName}` : baseName; items.push({ localFile: p, targetPath }); @@ -2786,6 +3001,7 @@ function buildItemsFromPaths(paths, destPath) { const full = ppath.join(dir, entry); let st; try { st = fs.statSync(full); } catch (e) { continue; } + if (isIgnored(full, st.isDirectory())) { ignored.push({ path: full, isDir: st.isDirectory() }); continue; } if (st.isDirectory()) { walk(full); } else if (st.isFile()) { @@ -2799,7 +3015,7 @@ function buildItemsFromPaths(paths, destPath) { skipped.push({ path: p, error: 'unsupported' }); } } - return { items, skipped }; + return { items, skipped, ignored }; } // Klont das Repo (shallow), kopiert alle items hinein, commit + push. @@ -2809,7 +3025,7 @@ async function gitPushItemsToGitea({ token, url, owner, repo, branch, items, mes const authUrl = `${urlObj.protocol}//${encodeURIComponent(token)}@${urlObj.host}/${owner}/${repo}.git`; const tmpDir = getSafeTmpDir(`git-paths-${owner}-${repo}`); - const gitConfig = ['user.email=gui@gitmanager.local', 'user.name=Git Manager GUI']; + const gitConfig = gitIdentityConfig(); const safeBranch = sanitizeGitRef(branch || 'HEAD', 'HEAD'); try { @@ -2891,7 +3107,10 @@ ipcMain.handle('upload-paths-to-gitea', async (event, data) => { try { invalidateRepoContentsCache(owner, repo); } catch (_) {} try { caches.repos.invalidate(`${owner}/${repo}`); } catch (_) {} - const { items, skipped } = buildItemsFromPaths(paths, destPath); + const built = await buildItemsFromPaths(paths, destPath); + const skipped = built.skipped; + const excluded = new Set(Array.isArray(data.excludeFiles) ? data.excludeFiles : []); + const items = excluded.size ? built.items.filter(it => !excluded.has(it.localFile)) : built.items; if (items.length === 0) { return { ok: false, error: 'Keine Dateien zum Hochladen gefunden', skipped, debugId: uploadDebugId }; } @@ -3143,7 +3362,7 @@ ipcMain.handle('delete-gitea-repo', async (event, data) => { return new Promise((resolve) => { const options = { - hostname: urlObj.hostname, + hostname: bareHostname(urlObj.hostname), port: urlObj.port || (urlObj.protocol === 'https:' ? 443 : 80), path: deletePath, method: 'DELETE', @@ -3278,7 +3497,7 @@ ipcMain.handle('upload-and-push', async (event, data) => { const cloneArgs = ['clone', '--depth', '1']; if (branch !== 'HEAD') cloneArgs.push('--branch', branch); cloneArgs.push(authClone, tmpDir); - runGitSync(cloneArgs, process.cwd(), gitExecOptions); + await runGitAsync(cloneArgs, process.cwd(), gitExecOptions); // Zielort im Repo bestimmen let destDirInRepo = tmpDir; @@ -3293,17 +3512,17 @@ ipcMain.handle('upload-and-push', async (event, data) => { fs.copyFileSync(data.localFolder, finalFileDest); // Git Befehle - runGitSync(['-C', tmpDir, 'add', '.'], process.cwd(), gitExecOptions); - try { runGitSync(['-C', tmpDir, 'commit', '-m', `Upload file ${fileName} via GUI`], process.cwd(), gitExecOptions); } catch (_) {} + await runGitAsync(['-C', tmpDir, 'add', '.'], process.cwd(), gitExecOptions); + try { await runGitAsync(['-C', tmpDir, 'commit', '-m', `Upload file ${fileName} via GUI`], process.cwd(), gitExecOptions); } catch (_) {} let pushBranch = branch; if (pushBranch === 'HEAD') { try { - pushBranch = runGitSync(['-C', tmpDir, 'rev-parse', '--abbrev-ref', 'HEAD'], process.cwd(), gitExecOptions).trim(); + pushBranch = await runGitAsync(['-C', tmpDir, 'rev-parse', '--abbrev-ref', 'HEAD'], process.cwd(), gitExecOptions); } catch (_) { pushBranch = 'main'; } } - runGitSync(['-C', tmpDir, 'push', 'origin', pushBranch], process.cwd(), gitExecOptions); + await runGitAsync(['-C', tmpDir, 'push', 'origin', pushBranch], process.cwd(), gitExecOptions); setTimeout(() => { try { if (fs.existsSync(tmpDir)) fs.rmSync(tmpDir, { recursive: true, force: true }); } catch (_) {} }, 5_000); return { ok: true, usedGit: true, singleFile: true, msg: 'Uploaded via Git (Fallback)', debugId: uploadDebugId }; @@ -3355,7 +3574,7 @@ ipcMain.handle('upload-and-push', async (event, data) => { const cloneArgs = ['clone', '--depth', '1']; if (branch !== 'HEAD') cloneArgs.push('--branch', branch); cloneArgs.push(authClone, tmpDir); - runGitSync(cloneArgs, process.cwd(), gitExecOptions); + await runGitAsync(cloneArgs, process.cwd(), gitExecOptions); // Zielverzeichnis im Repo: // (wie im API-Weg) let destDirInRepo = tmpDir; @@ -3364,14 +3583,20 @@ ipcMain.handle('upload-and-push', async (event, data) => { ensureDir(destDirInRepo); // Kompletten Ordner rekursiv kopieren, ausgeschlossene Einträge überspringen + const isIgnoredLocal = await createUploadIgnore(data.localFolder); fs.cpSync(data.localFolder, destDirInRepo, { recursive: true, - filter: (src) => !excludeList.includes(ppath.basename(src)) + filter: (src) => { + if (excludeList.includes(ppath.basename(src))) return false; + let isDir = false; + try { isDir = fs.statSync(src).isDirectory(); } catch (_) {} + return !isIgnoredLocal(src, isDir); + } }); - runGitSync(['-C', tmpDir, 'add', '.'], process.cwd(), gitExecOptions); + await runGitAsync(['-C', tmpDir, 'add', '.'], process.cwd(), gitExecOptions); try { - runGitSync(['-C', tmpDir, 'commit', '-m', `Upload ${folderName} via GUI`], process.cwd(), gitExecOptions); + await runGitAsync(['-C', tmpDir, 'commit', '-m', `Upload ${folderName} via GUI`], process.cwd(), gitExecOptions); } catch (commitErr) { // "nothing to commit" ist kein echter Fehler if (!/nothing to commit/i.test(String(commitErr))) throw commitErr; @@ -3383,11 +3608,11 @@ ipcMain.handle('upload-and-push', async (event, data) => { let pushBranch = branch; if (pushBranch === 'HEAD') { try { - pushBranch = runGitSync(['-C', tmpDir, 'rev-parse', '--abbrev-ref', 'HEAD'], process.cwd(), gitExecOptions).trim(); + pushBranch = await runGitAsync(['-C', tmpDir, 'rev-parse', '--abbrev-ref', 'HEAD'], process.cwd(), gitExecOptions); } catch (_) { pushBranch = 'main'; } if (!pushBranch || pushBranch === 'HEAD') pushBranch = 'main'; } - runGitSync(['-C', tmpDir, 'push', 'origin', pushBranch], process.cwd(), gitExecOptions); + await runGitAsync(['-C', tmpDir, 'push', 'origin', pushBranch], process.cwd(), gitExecOptions); console.log('[UPLOAD_DEBUG][main] directory-upload:git-push-done', { uploadDebugId, pushBranch }); setTimeout(() => { try { if (fs.existsSync(tmpDir)) fs.rmSync(tmpDir, { recursive: true, force: true }); } catch (_) {} }, 5_000); @@ -3407,6 +3632,7 @@ ipcMain.handle('upload-and-push', async (event, data) => { const items = []; // excludeList und folderName sind oben (FALL 2) bereits definiert + const isIgnoredApi = await createUploadIgnore(data.localFolder); (function walk(dir) { const entries = fs.readdirSync(dir); for (const entry of entries) { @@ -3417,6 +3643,7 @@ ipcMain.handle('upload-and-push', async (event, data) => { try { stat = fs.statSync(full); } catch(e) { continue; } + if (isIgnoredApi(full, stat.isDirectory())) continue; if (stat.isDirectory()) { walk(full); @@ -3550,7 +3777,7 @@ ipcMain.handle('run-batch-repo-action', async (event, data) => { } } catch (_) {} - runGitSync(['clone', '--depth', '1', authCloneUrl, repoDir], process.cwd(), { stdio: 'ignore' }); + await runGitAsync(['clone', '--depth', '1', authCloneUrl, repoDir], process.cwd(), { stdio: 'ignore' }); results.push({ repo: item.id, ok: true, message: `Geklont nach ${repoDir}` }); } else if (action === 'create-tag') { const tag = String(options.tag || '').trim(); @@ -3635,7 +3862,7 @@ ipcMain.handle('rename-gitea-item', async (event, data) => { return new Promise((resolve, reject) => { const bodyStr = body ? JSON.stringify(body) : null; const req = protocol.request({ - hostname: urlObj.hostname, port, + hostname: bareHostname(urlObj.hostname), port, path: apiPath, method, headers: { 'Authorization': `token ${token}`, @@ -3743,7 +3970,7 @@ ipcMain.handle('create-gitea-item', async (event, data) => { return new Promise((resolve) => { const bodyStr = body ? JSON.stringify(body) : null; const req = protocol.request({ - hostname: urlObj.hostname, + hostname: bareHostname(urlObj.hostname), port, path: apiPath, method, @@ -4646,7 +4873,7 @@ function isAllowedExternalUrl(rawUrl) { if (protocol === 'https:' || protocol === 'mailto:') return true; if (protocol === 'http:') { const host = String(parsed.hostname || '').toLowerCase(); - return host === 'localhost' || host === '127.0.0.1' || host === '::1'; + return host === 'localhost' || host === '127.0.0.1' || host === '[::1]' || host === '::1'; } return false; } catch (_) { @@ -4929,12 +5156,8 @@ ipcMain.handle('sync-repo-to-github', async (event, data) => { : ['clone', '--bare', sourceCloneUrl, mirrorDir]; // runGit: gibt stdout zurück, loggt stderr immer (git push schreibt Status auf stderr) - const runGit = (args, cwd) => { - const res = spawnSync('git', args, { - cwd, - encoding: 'utf8', - windowsHide: true - }); + const runGit = async (args, cwd) => { + const res = await execGit(args, { cwd }); const out = (res.stdout || '').trim(); const err = (res.stderr || '').trim(); if (err) console.log(`[sync-repo-to-github][git] ${err}`); @@ -4945,17 +5168,17 @@ ipcMain.handle('sync-repo-to-github', async (event, data) => { }; console.log(`[sync-repo-to-github] Klone Quell-Repo (bare): ${sourceCloneUrl}`); - runGit(cloneArgs, process.cwd()); + await runGit(cloneArgs, process.cwd()); console.log('[sync-repo-to-github] Bare-Clone abgeschlossen'); // Alle lokalen Branches auflisten - const allBranchesRaw = runGit(['for-each-ref', '--format=%(refname:short)', 'refs/heads/'], mirrorDir); + const allBranchesRaw = await runGit(['for-each-ref', '--format=%(refname:short)', 'refs/heads/'], mirrorDir); const allBranches = (allBranchesRaw || '').split('\n').map(s => s.trim()).filter(s => s && isSafeGitRef(s)); console.log(`[sync-repo-to-github] Lokale Branches: ${allBranches.join(', ') || '(keine)'}`); // Default-Branch ermitteln try { - const headRef = runGit(['symbolic-ref', '--short', 'HEAD'], mirrorDir); + const headRef = await runGit(['symbolic-ref', '--short', 'HEAD'], mirrorDir); sourceDefaultBranch = String(headRef || '').replace(/^refs\/heads\//, '').trim(); if (!isSafeGitRef(sourceDefaultBranch)) sourceDefaultBranch = ''; } catch (_) { @@ -4969,19 +5192,19 @@ ipcMain.handle('sync-repo-to-github', async (event, data) => { const ghAuthArgs = ['-c', 'credential.helper=', '-c', `http.https://github.com/.extraheader=${githubAuthHeader}`]; // GitHub als Push-Remote setzen - runGit(['remote', 'set-url', 'origin', githubRemoteUrl], mirrorDir); + await runGit(['remote', 'set-url', 'origin', githubRemoteUrl], mirrorDir); // Lokale Commit-SHAs loggen (= Gitea-Stand) for (const branch of allBranches) { try { - const localSha = runGit(['rev-parse', `refs/heads/${branch}`], mirrorDir); + const localSha = await runGit(['rev-parse', `refs/heads/${branch}`], mirrorDir); console.log(`[sync-repo-to-github] Gitea ${branch}: ${localSha}`); } catch (_) {} } // Remote (GitHub) Commit-SHAs VOR dem Push ermitteln und vergleichen try { - const remoteRefsRaw = runGit([...ghAuthArgs, 'ls-remote', '--heads', 'origin'], mirrorDir); + const remoteRefsRaw = await runGit([...ghAuthArgs, 'ls-remote', '--heads', 'origin'], mirrorDir); const remoteMap = {}; (remoteRefsRaw || '').split('\n').forEach(line => { const parts = line.trim().split(/\s+/); @@ -5003,14 +5226,14 @@ ipcMain.handle('sync-repo-to-github', async (event, data) => { let pushedCount = 0; for (const branch of allBranches) { console.log(`[sync-repo-to-github] Pushe Branch: ${branch}`); - runGit([...ghAuthArgs, 'push', '--force', 'origin', `refs/heads/${branch}:refs/heads/${branch}`], mirrorDir); + await runGit([...ghAuthArgs, 'push', '--force', 'origin', `refs/heads/${branch}:refs/heads/${branch}`], mirrorDir); pushedCount++; } console.log(`[sync-repo-to-github] ${pushedCount} Branch(es) erfolgreich gepusht`); // Auf GitHub nicht mehr vorhandene Branches aufräumen (prune via API, non-fatal) try { - const remoteRefsRaw = runGit([...ghAuthArgs, 'ls-remote', '--heads', 'origin'], mirrorDir); + const remoteRefsRaw = await runGit([...ghAuthArgs, 'ls-remote', '--heads', 'origin'], mirrorDir); const remoteHeads = (remoteRefsRaw || '').split('\n') .map(l => { const m = l.match(/refs\/heads\/(.+)$/); return m ? m[1].trim() : null; }) .filter(Boolean); @@ -5018,7 +5241,7 @@ ipcMain.handle('sync-repo-to-github', async (event, data) => { for (const remoteBranch of remoteHeads) { if (!localSet.has(remoteBranch) && isSafeGitRef(remoteBranch)) { console.log(`[sync-repo-to-github] Lösche veralteten Remote-Branch: ${remoteBranch}`); - runGit([...ghAuthArgs, 'push', 'origin', `--delete`, remoteBranch], mirrorDir); + await runGit([...ghAuthArgs, 'push', 'origin', `--delete`, remoteBranch], mirrorDir); } } } catch (pruneErr) { @@ -5027,7 +5250,7 @@ ipcMain.handle('sync-repo-to-github', async (event, data) => { // Tags mit Force-Push übertragen (non-fatal) try { - runGit([...ghAuthArgs, 'push', 'origin', '--tags', '--force'], mirrorDir); + await runGit([...ghAuthArgs, 'push', 'origin', '--tags', '--force'], mirrorDir); console.log('[sync-repo-to-github] Tags erfolgreich gepusht'); } catch (tagsErr) { console.warn('[sync-repo-to-github] Tags-Push Warnung:', tagsErr?.message || tagsErr); @@ -5105,4 +5328,29 @@ ipcMain.handle('test-github-connection', async (_event, data) => { console.error('test-github-connection error', e); return { ok: false, error: mapIpcError(e) }; } -}); \ No newline at end of file +}); + +/* ----------------------------- + Neue Funktionen: Upload-Vorschau, Diagnose, lokale Änderungen, PRs/Issues, Repo-Backup + ----------------------------- */ +require('./src/features/featuresIpc.js').registerFeatureIpc({ + ipcMain, + app, + readCredentials, + buildItemsFromPaths, + clearGitTransportBlock, + getGitTransportBlocks: () => { loadBrokenGitTransports(); return Object.fromEntries(brokenGitTransports); }, + prefs: appPrefs, + openPath: (dir) => shell.openPath(dir), + notify: (title, body) => { + try { + const { Notification } = require('electron'); + if (Notification.isSupported()) new Notification({ title, body, icon: ppath.join(__dirname, 'assets', 'icon.png') }).show(); + } catch (e) { console.warn('Benachrichtigung:', e.message); } + }, + broadcast: (channel, payload) => { + for (const win of BrowserWindow.getAllWindows()) { + try { if (!win.isDestroyed()) win.webContents.send(channel, payload); } catch (_) {} + } + } +}); diff --git a/package-lock.json b/package-lock.json index 08411ab..a98f360 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5275 +1,3885 @@ -{ - "name": "git-manager-gui", - "version": "2.0.5", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "git-manager-gui", - "version": "2.0.5", - "dependencies": { - "archiver": "^6.0.0", - "axios": "^1.13.5", - "form-data": "^4.0.5", - "simple-git": "^3.32.3", - "unzipper": "^0.11.0" - }, - "devDependencies": { - "electron": "^41.0.4", - "electron-builder": "^26.8.1" - } - }, - "node_modules/@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@electron/asar": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", - "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@electron/asar/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@electron/fuses": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", - "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.1", - "fs-extra": "^9.0.1", - "minimist": "^1.2.5" - }, - "bin": { - "electron-fuses": "dist/bin.js" - } - }, - "node_modules/@electron/fuses/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/fuses/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/fuses/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/get": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", - "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@electron/notarize": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", - "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/notarize/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/notarize/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/notarize/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/osx-sign": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", - "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "compare-version": "^0.1.2", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "isbinaryfile": "^4.0.8", - "minimist": "^1.2.6", - "plist": "^3.0.5" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@electron/osx-sign/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/@electron/osx-sign/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/osx-sign/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/rebuild": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.3.tgz", - "integrity": "sha512-u9vpTHRMkOYCs/1FLiSVAFZ7FbjsXK+bQuzviJZa+lG7BHZl1nz52/IcGvwa3sk80/fc3llutBkbCq10Vh8WQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@malept/cross-spawn-promise": "^2.0.0", - "debug": "^4.1.1", - "detect-libc": "^2.0.1", - "got": "^11.7.0", - "graceful-fs": "^4.2.11", - "node-abi": "^4.2.0", - "node-api-version": "^0.2.1", - "node-gyp": "^11.2.0", - "ora": "^5.1.0", - "read-binary-file-arch": "^1.0.6", - "semver": "^7.3.5", - "tar": "^7.5.6", - "yargs": "^17.0.1" - }, - "bin": { - "electron-rebuild": "lib/cli.js" - }, - "engines": { - "node": ">=22.12.0" - } - }, - "node_modules/@electron/rebuild/node_modules/node-abi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.26.0.tgz", - "integrity": "sha512-8QwIZqikRvDIkXS2S93LjzhsSPJuIbfaMETWH+Bx8oOT9Sa9UsUtBFQlc3gBNd1+QINjaTloitXr1W3dQLi9Iw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.6.3" - }, - "engines": { - "node": ">=22.12.0" - } - }, - "node_modules/@electron/rebuild/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/universal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", - "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron/asar": "^3.3.1", - "@malept/cross-spawn-promise": "^2.0.0", - "debug": "^4.3.1", - "dir-compare": "^4.2.0", - "fs-extra": "^11.1.1", - "minimatch": "^9.0.3", - "plist": "^3.1.0" - }, - "engines": { - "node": ">=16.4" - } - }, - "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@electron/universal/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/universal/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@electron/universal/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/windows-sign": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", - "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "dependencies": { - "cross-dirname": "^0.1.0", - "debug": "^4.3.4", - "fs-extra": "^11.1.1", - "minimist": "^1.2.8", - "postject": "^1.0.0-alpha.6" - }, - "bin": { - "electron-windows-sign": "bin/electron-windows-sign.js" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@electron/windows-sign/node_modules/fs-extra": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@electron/windows-sign/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/windows-sign/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1" - } - }, - "node_modules/@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "license": "MIT" - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/@malept/flatpak-bundler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "tmp-promise": "^3.0.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@npmcli/agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", - "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/agent/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==", - "dev": true, - "license": "ISC" - }, - "node_modules/@npmcli/fs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", - "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.12.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", - "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/plist": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", - "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/verror": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", - "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", - "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/7zip-bin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/app-builder-bin": { - "version": "5.0.0-alpha.12", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz", - "integrity": "sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/app-builder-lib": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.8.1.tgz", - "integrity": "sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@develar/schema-utils": "~2.6.5", - "@electron/asar": "3.4.1", - "@electron/fuses": "^1.8.0", - "@electron/get": "^3.0.0", - "@electron/notarize": "2.5.0", - "@electron/osx-sign": "1.3.3", - "@electron/rebuild": "^4.0.3", - "@electron/universal": "2.0.3", - "@malept/flatpak-bundler": "^0.4.0", - "@types/fs-extra": "9.0.13", - "async-exit-hook": "^2.0.1", - "builder-util": "26.8.1", - "builder-util-runtime": "9.5.1", - "chromium-pickle-js": "^0.2.0", - "ci-info": "4.3.1", - "debug": "^4.3.4", - "dotenv": "^16.4.5", - "dotenv-expand": "^11.0.6", - "ejs": "^3.1.8", - "electron-publish": "26.8.1", - "fs-extra": "^10.1.0", - "hosted-git-info": "^4.1.0", - "isbinaryfile": "^5.0.0", - "jiti": "^2.4.2", - "js-yaml": "^4.1.0", - "json5": "^2.2.3", - "lazy-val": "^1.0.5", - "minimatch": "^10.0.3", - "plist": "3.1.0", - "proper-lockfile": "^4.1.2", - "resedit": "^1.7.0", - "semver": "~7.7.3", - "tar": "^7.5.7", - "temp-file": "^3.4.0", - "tiny-async-pool": "1.3.0", - "which": "^5.0.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "dmg-builder": "26.8.1", - "electron-builder-squirrel-windows": "26.8.1" - } - }, - "node_modules/app-builder-lib/node_modules/@electron/get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", - "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/app-builder-lib/node_modules/ci-info": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", - "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/app-builder-lib/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/app-builder-lib/node_modules/fs-extra/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/app-builder-lib/node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/app-builder-lib/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==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/app-builder-lib/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/app-builder-lib/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/app-builder-lib/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/archiver": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.2.tgz", - "integrity": "sha512-UQ/2nW7NMl1G+1UnrLypQw1VdT9XZg/ECcKPq7l+STzStrSivFIXIp34D8M5zeNGW5NoOupdYCHv6VySCPNNlw==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^4.0.1", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^5.0.1" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/archiver-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz", - "integrity": "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==", - "license": "MIT", - "dependencies": { - "glob": "^8.0.0", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/archiver-utils/node_modules/glob/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/axios": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", - "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.11", - "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", - "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", - "license": "Apache-2.0", - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", - "license": "Apache-2.0", - "peerDependencies": { - "bare-abort-controller": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } - } - }, - "node_modules/bare-fs": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.6.tgz", - "integrity": "sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw==", - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4", - "bare-url": "^2.2.2", - "fast-fifo": "^1.3.2" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.0.tgz", - "integrity": "sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==", - "license": "Apache-2.0", - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.10.0.tgz", - "integrity": "sha512-DOPZF/DDcDruKDA43cOw6e9Quq5daua7ygcAwJE/pKJsRWhgSSemi7qVNGE5kyDIxIeN1533G/zfbvWX7Wcb9w==", - "license": "Apache-2.0", - "dependencies": { - "streamx": "^2.25.0", - "teex": "^1.0.1" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/bare-url": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz", - "integrity": "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==", - "license": "Apache-2.0", - "dependencies": { - "bare-path": "^3.0.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", - "license": "MIT" - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builder-util": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.8.1.tgz", - "integrity": "sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/debug": "^4.1.6", - "7zip-bin": "~5.2.0", - "app-builder-bin": "5.0.0-alpha.12", - "builder-util-runtime": "9.5.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.6", - "debug": "^4.3.4", - "fs-extra": "^10.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "js-yaml": "^4.1.0", - "sanitize-filename": "^1.6.3", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.4.0", - "tiny-async-pool": "1.3.0" - } - }, - "node_modules/builder-util-runtime": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.5.1.tgz", - "integrity": "sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/builder-util/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/builder-util/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/builder-util/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/cacache": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", - "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^4.0.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "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": "^12.0.0", - "tar": "^7.4.3", - "unique-filename": "^4.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/glob/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/cacache/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==", - "dev": true, - "license": "ISC" - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/compress-commons": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.3.tgz", - "integrity": "sha512-/UIcLWvwAQyVibgpQDPtfNM3SvqN7G9elAPAV7GM0L53EbNWwWiCsWtK8Fwed/APEbptPHXs5PuW+y8Bq8lFTA==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^5.0.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "license": "MIT" - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.1.tgz", - "integrity": "sha512-lO1dFui+CEUh/ztYIpgpKItKW9Bb4NWakCRJrnqAbFIYD+OZAwb2VfD5T5eXMw2FNcsDHkQcNl/Wh3iVXYwU6g==", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/cross-dirname": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", - "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/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/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/dir-compare": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", - "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimatch": "^3.0.5", - "p-limit": "^3.1.0 " - } - }, - "node_modules/dir-compare/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dmg-builder": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.8.1.tgz", - "integrity": "sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "app-builder-lib": "26.8.1", - "builder-util": "26.8.1", - "fs-extra": "^10.1.0", - "iconv-lite": "^0.6.2", - "js-yaml": "^4.1.0" - }, - "optionalDependencies": { - "dmg-license": "^1.0.11" - } - }, - "node_modules/dmg-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dmg-builder/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/dmg-builder/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/dmg-license": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", - "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.7", - "plist": "^3.0.4", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - }, - "bin": { - "dmg-license": "bin/dmg-license.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "dotenv": "^16.4.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "license": "BSD-3-Clause", - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron": { - "version": "41.0.4", - "resolved": "https://registry.npmjs.org/electron/-/electron-41.0.4.tgz", - "integrity": "sha512-rO08CxnAsAkKPFj3OZnxFkKrlnpSL3OCOewMDj5kaohVo++7e8hIT5Sl+tNl9WkNKiLvfZSW180ueA9s5zh9dg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^24.9.0", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "node_modules/electron-builder": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.8.1.tgz", - "integrity": "sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "app-builder-lib": "26.8.1", - "builder-util": "26.8.1", - "builder-util-runtime": "9.5.1", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "dmg-builder": "26.8.1", - "fs-extra": "^10.1.0", - "lazy-val": "^1.0.5", - "simple-update-notifier": "2.0.0", - "yargs": "^17.6.2" - }, - "bin": { - "electron-builder": "cli.js", - "install-app-deps": "install-app-deps.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/electron-builder-squirrel-windows": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.8.1.tgz", - "integrity": "sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "app-builder-lib": "26.8.1", - "builder-util": "26.8.1", - "electron-winstaller": "5.4.0" - } - }, - "node_modules/electron-builder/node_modules/ci-info": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", - "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-publish": { - "version": "26.8.1", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.8.1.tgz", - "integrity": "sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/fs-extra": "^9.0.11", - "builder-util": "26.8.1", - "builder-util-runtime": "9.5.1", - "chalk": "^4.1.2", - "form-data": "^4.0.5", - "fs-extra": "^10.1.0", - "lazy-val": "^1.0.5", - "mime": "^2.5.2" - } - }, - "node_modules/electron-publish/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-publish/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-publish/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/electron-winstaller": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", - "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@electron/asar": "^3.2.1", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.21", - "temp": "^0.9.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "@electron/windows-sign": "^1.1.2" - } - }, - "node_modules/electron-winstaller/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "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==", - "dev": true, - "license": "MIT" - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "license": "Apache-2.0", - "dependencies": { - "bare-events": "^2.7.0" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", - "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "optional": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/filelist": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", - "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" - }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-corefoundation": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", - "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "cli-truncate": "^2.1.0", - "node-addon-api": "^1.6.3" - }, - "engines": { - "node": "^8.11.2 || >=10" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/isbinaryfile": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", - "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/lazy-val": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-fetch-happen": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", - "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "ssri": "^12.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-fetch": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz", - "integrity": "sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^3.0.1" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "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/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/node-api-version": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", - "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - } - }, - "node_modules/node-api-version/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", - "integrity": "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^14.0.3", - "nopt": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "tar": "^7.4.3", - "tinyglobby": "^0.2.12", - "which": "^5.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/node-gyp/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==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^3.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/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==", - "dev": true, - "license": "ISC" - }, - "node_modules/pe-library": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", - "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/postject": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", - "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "commander": "^9.4.0" - }, - "bin": { - "postject": "dist/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/postject/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/proc-log": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", - "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-binary-file-arch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", - "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "bin": { - "read-binary-file-arch": "cli.js" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resedit": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", - "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pe-library": "^0.4.1" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jet2jet" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/sax": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=11.0.0" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/simple-git": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.33.0.tgz", - "integrity": "sha512-D4V/tGC2sjsoNhoMybKyGoE+v8A60hRawKQ1iFRA1zwuDgGZCBJ4ByOzZ5J8joBbi4Oam0qiPH+GhzmSBwbJng==", - "license": "MIT", - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "^4.3.4", - "socks": "^2.8.3" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true - }, - "node_modules/ssri": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz", - "integrity": "sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/streamx": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", - "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", - "license": "MIT", - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "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==", - "dev": true, - "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/string-width-cjs": { - "name": "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==", - "dev": true, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar": { - "version": "7.5.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", - "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", - "dev": 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/tar-stream": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", - "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "bare-fs": "^4.5.5", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/teex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", - "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", - "license": "MIT", - "dependencies": { - "streamx": "^2.12.5" - } - }, - "node_modules/temp": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" - } - }, - "node_modules/temp-file/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/temp-file/node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/temp-file/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/text-decoder": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", - "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", - "license": "Apache-2.0", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/tiny-async-pool": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", - "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^5.5.0" - } - }, - "node_modules/tiny-async-pool/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tmp": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", - "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/unique-filename": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz", - "integrity": "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^5.0.0" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/unique-slug": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz", - "integrity": "sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unzipper": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.11.6.tgz", - "integrity": "sha512-anERl79akvqLbAxfjIFe4hK0wsi0fH4uGLwNEl4QEnG+KKs3QQeApYgOS/f6vH2EdACUlZg35psmd/3xL2duFQ==", - "license": "MIT", - "dependencies": { - "big-integer": "^1.6.17", - "bluebird": "~3.4.1", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "dev": true, - "license": "(WTFPL OR MIT)" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/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==", - "dev": true, - "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/wrap-ansi-cjs": { - "name": "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zip-stream": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.2.tgz", - "integrity": "sha512-LfOdrUvPB8ZoXtvOBz6DlNClfvi//b5d56mSWyJi7XbH/HfhOHfUhOqxhT/rUiR7yiktlunqRo+jY6y/cWC/5g==", - "license": "MIT", - "dependencies": { - "archiver-utils": "^4.0.1", - "compress-commons": "^5.0.1", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 12.0.0" - } - } - } -} +{ + "name": "git-manager-gui", + "version": "2.2.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "git-manager-gui", + "version": "2.2.0", + "dependencies": { + "archiver": "^6.0.0", + "axios": "^1.13.5", + "form-data": "^4.0.5", + "simple-git": "^3.32.3", + "unzipper": "^0.11.0" + }, + "devDependencies": { + "electron": "^44.6.0", + "electron-builder": "^26.17.0" + } + }, + "node_modules/@electron-internal/extract-zip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.5.tgz", + "integrity": "sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/asar": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz", + "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.1.6", + "minimatch": "^3.0.4" + }, + "bin": { + "asar": "bin/asar.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/get": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.1.0.tgz", + "integrity": "sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^3.0.0", + "graceful-fs": "^4.2.11", + "progress": "^2.0.3", + "semver": "^7.6.3", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=22.12.0" + }, + "optionalDependencies": { + "undici": "^7.24.4" + } + }, + "node_modules/@electron/notarize": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@electron/notarize/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/osx-sign": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "bin": { + "electron-osx-flat": "bin/electron-osx-flat.js", + "electron-osx-sign": "bin/electron-osx-sign.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/@electron/rebuild": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.2.1.tgz", + "integrity": "sha512-IS4pG3BysRrCLJ8xTAfvg+IQDbiUoAzdJy2SfjcYKnLDy5DpCdjnPdhS5Zf5UMfrkB24xu0KC+TqcOxg+eG+6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^12.2.0", + "read-binary-file-arch": "^1.0.6" + }, + "bin": { + "electron-rebuild": "lib/cli.js" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/node_modules/fs-extra": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.1.tgz", + "integrity": "sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.4.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.1.tgz", + "integrity": "sha512-KYAb4c9BJQI6QqGKthV68OHe0badztdXJWKo0WtBA9IuCFPTKvE5ZdUBglP833aMjhaSPNO4A5j/EkzZtGlKjA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "license": "MIT" + }, + "node_modules/@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/malept" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" + } + ], + "license": "Apache-2.0", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/@malept/flatpak-bundler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", + "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "fs-extra": "^9.0.0", + "lodash": "^4.17.15", + "tmp-promise": "^3.0.2" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.11.0.tgz", + "integrity": "sha512-8xh4avo53/vXO6UEv9yaoJ83hY581geaLTygf61NPIXP5AeIZCPjJhpTaYU23IZkG+NpLN/C9FYzWp7hphIT9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz", + "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "tslib": "^2.8.1", + "webcrypto-core": "^1.9.2" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.12.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz", + "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.15.tgz", + "integrity": "sha512-/5NV/vDALVFDXgLmfsy9TRCBlKwO2LNBFzpzvb9iIj+jR+eSc6DLYYvVOdivT/jm7MtU6TebYuRmzEOI7w40UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/app-builder-lib": { + "version": "26.17.0", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.17.0.tgz", + "integrity": "sha512-wfL7EhujuODDW3uMSD8RPcr/MLzmT0dmpVfWV0wFUWXI0rIdaukzAJ7EFUSyHXOpxuBZqaIGlQt6VeQhtHhetw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.4", + "@electron/universal": "2.0.3", + "@malept/flatpak-bundler": "^0.4.0", + "@noble/hashes": "^1.8.0", + "@peculiar/webcrypto": "^1.7.1", + "@types/fs-extra": "9.0.13", + "ajv": "^8.18.0", + "asn1js": "^3.0.10", + "async-exit-hook": "^2.0.1", + "builder-util": "26.16.0", + "builder-util-runtime": "9.7.0", + "chromium-pickle-js": "^0.2.0", + "ci-info": "4.3.1", + "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", + "ejs": "^3.1.8", + "electron-publish": "26.16.0", + "fs-extra": "^10.1.0", + "hosted-git-info": "^4.1.0", + "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "lazy-val": "^1.0.5", + "minimatch": "^10.2.5", + "pkijs": "^3.4.0", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "unzipper": "^0.12.3", + "which": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "dmg-builder": "26.17.0", + "electron-builder-squirrel-windows": "26.17.0" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/app-builder-lib/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/app-builder-lib/node_modules/unzipper": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.5.tgz", + "integrity": "sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "11.3.1", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "node_modules/app-builder-lib/node_modules/unzipper/node_modules/fs-extra": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/archiver": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.2.tgz", + "integrity": "sha512-UQ/2nW7NMl1G+1UnrLypQw1VdT9XZg/ECcKPq7l+STzStrSivFIXIp34D8M5zeNGW5NoOupdYCHv6VySCPNNlw==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^4.0.1", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^5.0.1" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/archiver-utils": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz", + "integrity": "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==", + "license": "MIT", + "dependencies": { + "glob": "^8.0.0", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asn1js": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.1.0.tgz", + "integrity": "sha512-HWYi1THkOqguCiO+vwj09ZkQFD2kKEsejYHAYCtX0D80WVdoDnvRc9IukXX/jeb0T9NRWJnRtqwdbHltnFjwXA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.2.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.6.tgz", + "integrity": "sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.0.tgz", + "integrity": "sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==", + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.10.0.tgz", + "integrity": "sha512-DOPZF/DDcDruKDA43cOw6e9Quq5daua7ygcAwJE/pKJsRWhgSSemi7qVNGE5kyDIxIeN1533G/zfbvWX7Wcb9w==", + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz", + "integrity": "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "license": "MIT" + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builder-util": { + "version": "26.16.0", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.16.0.tgz", + "integrity": "sha512-RLyJhB7Si3YkzKR9ubQslWuXW3Vhs3CGe1i+SeixBZ0qTd1mk3XBmssvY22TlB6CS5blyko8Gu1JzpYk8UkYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/debug": "^4.1.6", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", + "source-map-support": "^0.5.19", + "stat-mode": "^1.0.0", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/builder-util-runtime": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.7.0.tgz", + "integrity": "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/compare-version": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", + "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/compress-commons": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.3.tgz", + "integrity": "sha512-/UIcLWvwAQyVibgpQDPtfNM3SvqN7G9elAPAV7GM0L53EbNWwWiCsWtK8Fwed/APEbptPHXs5PuW+y8Bq8lFTA==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^5.0.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "license": "MIT" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.1.tgz", + "integrity": "sha512-lO1dFui+CEUh/ztYIpgpKItKW9Bb4NWakCRJrnqAbFIYD+OZAwb2VfD5T5eXMw2FNcsDHkQcNl/Wh3iVXYwU6g==", + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/dir-compare": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " + } + }, + "node_modules/dmg-builder": { + "version": "26.17.0", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.17.0.tgz", + "integrity": "sha512-EAw1f2iGkICmUvAVBOjm7v5mxJdB7/+OZSycHFhKBimiTkCXtvkCC6wBKzHo7ZQYi58C2MmwIleRbgRnROlK2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.17.0", + "builder-util": "26.16.0", + "fs-extra": "^10.1.0", + "js-yaml": "^4.1.0" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron": { + "version": "44.6.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-44.6.0.tgz", + "integrity": "sha512-qjzKZ82yTsAoo0Q/gqdy4PEMQkzYpukZqIduaHWZYHapFhK9wgWwU4YId60xHmwTCraqF4AfVCm05o90dZJKMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@electron-internal/extract-zip": "^1.0.1", + "@electron/get": "^5.0.0", + "@types/node": "^24.9.0" + }, + "bin": { + "electron": "cli.js", + "install-electron": "install.js" + }, + "engines": { + "node": ">= 22.12.0" + } + }, + "node_modules/electron-builder": { + "version": "26.17.0", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.17.0.tgz", + "integrity": "sha512-iYHBRiagS9sDIbZx1ZD113f5rEGQvtpvTvHf70ovHKJ8mRvxwIkWX7JCwfmVQmVS4eX735p7TZmoxHnBPwF3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "app-builder-lib": "26.17.0", + "builder-util": "26.16.0", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "dmg-builder": "26.17.0", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "simple-update-notifier": "2.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "electron-builder": "cli.js", + "install-app-deps": "install-app-deps.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/electron-builder-squirrel-windows": { + "version": "26.17.0", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.17.0.tgz", + "integrity": "sha512-uyh+D+B0m12qCRp9c/7dwBirHTh7JcvAzj5eTEbb4dXPPGAhYPx1nozzbu1fC6AdULfat6ZNqgWhipTFpb82lQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "app-builder-lib": "26.17.0", + "builder-util": "26.16.0", + "electron-winstaller": "5.4.0" + } + }, + "node_modules/electron-builder/node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-publish": { + "version": "26.16.0", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.16.0.tgz", + "integrity": "sha512-Vt3KzQIiw9BImvNOYtndg9Mjki+tl4+1sQiC/+G5j8khWaENOJFWodiB+sUl6yyHwtd37avehskdtPw7f8y/+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/fs-extra": "^9.0.11", + "aws4": "^1.13.2", + "builder-util": "26.16.0", + "builder-util-runtime": "9.7.0", + "chalk": "^4.1.2", + "form-data": "^4.0.5", + "fs-extra": "^10.1.0", + "lazy-val": "^1.0.5", + "mime": "^2.5.2" + } + }, + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/electron-winstaller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/electron-winstaller/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.9.tgz", + "integrity": "sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/filelist": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.6.tgz", + "integrity": "sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.3.0.tgz", + "integrity": "sha512-M5t5LlJpS1UHMjvwRQVdFHvPISGeLAxNcrWuJkeGh0KxsqCHZ1O3NXZU/8x7cD0BDcGW8kapxMKTvwlqrNkHkA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isbinaryfile": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz", + "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "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==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/lazy-val": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", + "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "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/node-abi": { + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.39.0.tgz", + "integrity": "sha512-pULjI3qsVrn6K5DZz5tCpX2dL8IKM9/xBMRz29hBko8UFXZ/C3QxRMl/Z7wKaQwaxPmYU+7UPKbDf7EO+ASvfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.6.3" + }, + "engines": { + "node": ">=22.12.0" + } + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-gyp": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", + "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", + "dev": 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/node-gyp/node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/undici": { + "version": "6.29.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.29.1.tgz", + "integrity": "sha512-EvRlUt/QqAEvXdQeRMYUfwOQsfzpDztykrG2owGEE/rBOBoYv9uF39ZzsNDh4lTFHhTr2XOZjKkYgueD12ZmGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkijs": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.3.tgz", + "integrity": "sha512-V9kOzaItwDgqlryhXysQsAXUEKi5O7kqWUaP3dXI7MLvkPqWWMb4wVb1QAtmEDCKI+XIAINsZoNKMFF7sZb1eg==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "website" + ], + "dependencies": { + "@noble/hashes": "1.8.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.2.0.tgz", + "integrity": "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/sanitize-filename": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz", + "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==", + "dev": true, + "license": "WTFPL OR ISC", + "dependencies": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "node_modules/sax": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-git": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.33.0.tgz", + "integrity": "sha512-D4V/tGC2sjsoNhoMybKyGoE+v8A60hRawKQ1iFRA1zwuDgGZCBJ4ByOzZ5J8joBbi4Oam0qiPH+GhzmSBwbJng==", + "license": "MIT", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.1.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "dev": 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/tar-stream": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", + "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-file": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", + "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^10.0.0" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": 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/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", + "dev": true, + "license": "WTFPL", + "dependencies": { + "utf8-byte-length": "^1.0.1" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici": { + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.1.tgz", + "integrity": "sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unzipper": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.11.6.tgz", + "integrity": "sha512-anERl79akvqLbAxfjIFe4hK0wsi0fH4uGLwNEl4QEnG+KKs3QQeApYgOS/f6vH2EdACUlZg35psmd/3xL2duFQ==", + "license": "MIT", + "dependencies": { + "big-integer": "^1.6.17", + "bluebird": "~3.4.1", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2" + } + }, + "node_modules/utf8-byte-length": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", + "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/webcrypto-core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz", + "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.2.tgz", + "integrity": "sha512-LfOdrUvPB8ZoXtvOBz6DlNClfvi//b5d56mSWyJi7XbH/HfhOHfUhOqxhT/rUiR7yiktlunqRo+jY6y/cWC/5g==", + "license": "MIT", + "dependencies": { + "archiver-utils": "^4.0.1", + "compress-commons": "^5.0.1", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 12.0.0" + } + } + } +} diff --git a/package.json b/package.json index 9d9c9e0..01c5a20 100644 --- a/package.json +++ b/package.json @@ -1,73 +1,74 @@ -{ - "name": "git-manager-gui", - "version": "2.1.7", - "description": "Git Manager GUI - Verwaltung von Git Repositories", - "author": "M_Viper", - "main": "main.js", - "scripts": { - "start": "electron .", - "build": "electron-builder", - "test": "node --test __tests__/*.test.js", - "pdf": "electron generate-pdf.js" - }, - "dependencies": { - "axios": "^1.13.5", - "form-data": "^4.0.5", - "simple-git": "^3.32.3", - "archiver": "^6.0.0", - "unzipper": "^0.11.0" - }, - "overrides": { - "minimatch": "^3.1.4" - }, - "devDependencies": { - "electron": "^41.0.4", - "electron-builder": "^26.8.1" - }, - "build": { - "asar": true, - "appId": "com.viper.gitmanager", - "productName": "Git Manager GUI", - "files": [ - "**/*", - "!node_modules/.cache", - "!**/*.map", - "!**/.git", - "!**/.git/**", - "!repos/**", - "!data/**", - "!backup/**", - "!*.zip", - "!*.rar", - "!*.log" - ], - "extraResources": [ - "repos/", - { - "from": "data", - "to": "data", - "filter": [ - "**/*", - "!credentials.json" - ] - } - ], - "directories": { - "buildResources": "assets" - }, - "win": { - "icon": "assets/icon.png", - "target": [ - "nsis" - ] - }, - "nsis": { - "oneClick": false, - "perMachine": false, - "allowToChangeInstallationDirectory": true, - "createDesktopShortcut": true, - "createStartMenuShortcut": true, - "shortcutName": "Git Manager GUI" - } - } -} +{ + "name": "git-manager-gui", + "version": "2.2.0", + "description": "Git Manager GUI - Verwaltung von Git Repositories", + "author": "M_Viper", + "main": "main.js", + "scripts": { + "start": "electron .", + "build": "electron-builder --win dir && node scripts/build-setup.js", + "test": "node --test __tests__/*.test.js", + "pdf": "electron generate-pdf.js" + }, + "dependencies": { + "archiver": "^6.0.0", + "axios": "^1.13.5", + "form-data": "^4.0.5", + "simple-git": "^3.32.3", + "unzipper": "^0.11.0" + }, + "overrides": { + "minimatch": "^3.1.4" + }, + "devDependencies": { + "electron": "^44.6.0", + "electron-builder": "^26.17.0" + }, + "build": { + "asar": true, + "appId": "com.viper.gitmanager", + "productName": "Git Manager GUI", + "files": [ + "**/*", + "!node_modules/.cache", + "!**/*.map", + "!**/.git", + "!**/.git/**", + "!repos/**", + "!data/**", + "!backup/**", + "!*.zip", + "!*.rar", + "!*.log", + "!vendor/**", + "!installer/**", + "!scripts/**", + "!__tests__/**", + "!assets/icon.ico" + ], + "extraResources": [ + "repos/", + { + "from": "data", + "to": "data", + "filter": [ + "**/*", + "!credentials.json" + ] + }, + { + "from": "vendor/mingit", + "to": "mingit" + } + ], + "directories": { + "buildResources": "assets" + }, + "win": { + "icon": "assets/icon.png", + "target": [ + "dir" + ] + } + } +} diff --git a/preload.js b/preload.js index 9a33e62..df3baf1 100644 --- a/preload.js +++ b/preload.js @@ -104,6 +104,9 @@ contextBridge.exposeInMainWorld('electronAPI', { // Local Repository Commits getLocalCommits: (data) => ipcRenderer.invoke('get-local-commits', data), getLocalCommitDiff: (data) => ipcRenderer.invoke('get-local-commit-diff', data), + findGitignoredInRepo: (data) => ipcRenderer.invoke('find-gitignored-in-repo', data), + deleteGiteaPaths: (data) => ipcRenderer.invoke('delete-gitea-paths', data), + getLocalCommitFiles: (data) => ipcRenderer.invoke('get-local-commit-files', data), getLocalCommitDetails: (data) => ipcRenderer.invoke('get-local-commit-details', data), // === FAVORITEN & ZULETZT GEÖFFNET === @@ -151,6 +154,33 @@ contextBridge.exposeInMainWorld('electronAPI', { return () => ipcRenderer.removeListener('push-progress', listener); }, + // Neue Funktionen + prefsGet: () => ipcRenderer.invoke('prefs-get'), + prefsSet: (data) => ipcRenderer.invoke('prefs-set', data), + openKnownFolder: (which) => ipcRenderer.invoke('open-known-folder', { which }), + gitTransportState: () => ipcRenderer.invoke('git-transport-state'), + gitTransportClear: (host) => ipcRenderer.invoke('git-transport-clear', { host }), + previewUploadPaths: (data) => ipcRenderer.invoke('preview-upload-paths', data), + runServerDiagnosis: (data) => ipcRenderer.invoke('run-server-diagnosis', data), + localGit: (data) => ipcRenderer.invoke('local-git', data), + giteaCollab: (data) => ipcRenderer.invoke('gitea-collab', data), + repoBackupGetConfig: () => ipcRenderer.invoke('repo-backup-get-config'), + repoBackupSetConfig: (data) => ipcRenderer.invoke('repo-backup-set-config', data), + repoBackupRunNow: () => ipcRenderer.invoke('repo-backup-run-now'), + repoBackupCancel: () => ipcRenderer.invoke('repo-backup-cancel'), + repoBackupList: (data) => ipcRenderer.invoke('repo-backup-list', data), + repoRestoreLocal: (data) => ipcRenderer.invoke('repo-restore-local', data), + repoRestoreGitea: (data) => ipcRenderer.invoke('repo-restore-gitea', data), + onRepoRestoreProgress: (cb) => { + const listener = (event, payload) => { try { cb(payload); } catch (_) {} }; + ipcRenderer.on('repo-restore-progress', listener); + return () => ipcRenderer.removeListener('repo-restore-progress', listener); + }, + onRepoBackupProgress: (cb) => { + const listener = (event, payload) => { try { cb(payload); } catch (_) {} }; + ipcRenderer.on('repo-backup-progress', listener); + return () => ipcRenderer.removeListener('repo-backup-progress', listener); + }, onFolderUploadProgress: (cb) => { const listener = (event, payload) => { try { cb(payload); } catch (_) {} }; ipcRenderer.on('folder-upload-progress', listener); diff --git a/updater.js b/updater.js index 6b2ef6f..ddcfd69 100644 --- a/updater.js +++ b/updater.js @@ -358,7 +358,10 @@ class Updater { if (process.platform === 'win32') { try { - const child = spawn(filePath, [], { + // Das eigene Setup (ab 2.1.8) aktualisiert mit --update ohne Rückfragen und startet die App neu. + // Ältere NSIS-Setups kennen den Schalter nicht und bekommen ihn deshalb nicht. + const isOwnSetup = /^git-manager-gui-setup/i.test(path.basename(filePath)); + const child = spawn(filePath, isOwnSetup ? ['--update'] : [], { detached: true, stdio: 'ignore', shell: false
- - -