diff --git a/.gitignore b/.gitignore
index 7361a1d..b044080 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@
/ressources/ffmpeg.exe
/ressources/ffprobe.exe
+/ressources/deno.exe
logs/*.json
logs/*.log
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..9b73fd6
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,15 @@
+{
+ "editor.quickSuggestions": {
+ "comments": "off",
+ "strings": "off",
+ "other": "off"
+ },
+ "editor.suggestOnTriggerCharacters": false,
+ "editor.parameterHints.enabled": false,
+ "editor.codeLens": false,
+ "editor.lightbulb.enabled": "off",
+ "editor.inlineSuggest.enabled": false,
+ "github.copilot.enable": {
+ "*": false
+ }
+}
diff --git a/README-FR.md b/README-FR.md
deleted file mode 100644
index 345eadb..0000000
--- a/README-FR.md
+++ /dev/null
@@ -1,114 +0,0 @@
-# Freedom Loader
-
-
-
-
-
-
-
-
-
-> Ce projet a pour but de permettre le téléchargement de contenu Vidéo/Audio de manière gratuite, open source et libre. Il permettra à terme de choisir
-
-## 🚀 Fonctionnalités
-
-- ✅ Téléchargement de vidéos avec les métadonnées (MP4)
-- ✅ Téléchargement audio uniquement, avec la couverture ainsi que les métadonnées (MP3)
-- ✅ Support des playlists complètes
-- ✅ Récupération automatique des métadonnées (titre, durée, etc.)
-- ✅ Logs détaillés : console et fichiers rotatifs (7 jours)
-- ✅ Choix du chemin de sortie personnalisé avec sauvegarde
-- ✅ Plusieurs thèmes graphiques au choix pour personnaliser l’interface
-- ✅ Interface simple, intuitive
-- ✅ Notification quand le téléchargement est fini (Click = Ouverture Dossier Output)
-- ✅ Discord Rich Presence
-
----
-
-## 🔧 Installation
-
-Pour installer l'application, il vous suffit de télécharger l'installateur dans la section releases, de prendre la dernière version et de l'exécuter.
-
----
-
-## ❓ Questions fréquentes
-
-### _Où se situent mes fichiers une fois téléchargés ?_
-
-Dans le dossier Téléchargements (**C:\Users\VOTRE NOM\Downloads**) de votre ordinateur, dans un dossier nommé **Freedom Loader Output**
-
-
-### _Une fois le programme installé et lancé, j'ai une erreur_
-
-Essayez de relancer l'application, de consulter les logs ou d'ouvrir la console de développement du navigateur en faisant le raccourci `CTRL + SHIFT + I` ou via `View > Toggle Developer Tools`.
-
-
-
-
-
-
-## 🏗️ Fonctionnalités à venir (Roadmap)
-
-- [ ] Plus de choix de formats
-- [ ] Support des sous-titres
-- [ ] Meilleure UI / UX
-- [ ] Choix des langues
-- [ ] Téléchargement d’une partie de la vidéo
-- [ ] Renommage du fichier de sortie
-- [x] ~~Extraction / découpage de la vidéo via chapitrage natif~~
-- [ ] Téléchargements parallèles
-- [ ] Suppression automatique des parties sponsorisées (skip sponsor)
-- [x] ~~Choix personnalisé du chemin de sortie (par défaut **C:\Users\Utilisateur\Downloads**, où un dossier **Freedom Loader Output** sera créé)~~
-
----
-
-## 🖼️ Aperçu
-
-
-
-
-
-> Voici un exemple de l’application lancée après avoir saisi une URL.
-
----
-
-## ℹ️ À propos
-
-Ce projet a été réalisé en utilisant [](https://github.com/yt-dlp/yt-dlp)
-Merci à eux de nous permettre d’utiliser leur API gratuitement et en open source.
-
-Ce projet est open source et accueille volontiers vos contributions.
-Voici comment participer :
-
-- **🪲 Signalement de bugs**
- Merci d’utiliser le [système d’issues GitHub](https://github.com/MasterAcnolo/Freedom-Loader/issues) pour remonter les bugs rencontrés.
- Essayez de fournir une reproduction claire et les logs si possible. Les logs se trouvent dans le dossier d’installation du programme. Exemple de chemin :
- `C:\Users\[VOTRE NOM]\Desktop\Freedom Loader\resources\app\logs`
- Le fichier aura un nom du type `combined-20xx-xx-xx.log`.
-
-- **🛠️ Contribution**
- Les Pull Requests sont les bienvenues ! Merci de forker le repo et de soumettre votre PR après avoir vérifié le respect des guidelines (tests, style, etc.).
-
-- **💡 Suggestions de fonctionnalités**
- Vous pouvez proposer de nouvelles idées via une [issue de type feature request](https://github.com/MasterAcnolo/Freedom-Loader/issues).
- Toute proposition claire et détaillée sera étudiée.
-
-- **💰 Soutenir le projet**
-
- Si vous souhaitez m’encourager, vous pouvez faire un don sur
-
-
-
-
-
----
-
-## 📄 Licence
-
-Ce projet est sous licence **MIT** — voir le fichier [LICENSE](./LICENSE) pour plus d’informations.
-
----
-
-## ⚠️ Disclaimer
-
-J’ai bien évidemment eu recours à l’IA pour m’aider sur certaines parties du projet. Utilisez l’IA avec parcimonie et soyez toujours conscient de ce que vous faites.
diff --git a/README.md b/README.md
index d8e8739..c70556f 100644
--- a/README.md
+++ b/README.md
@@ -1,114 +1,173 @@
-# Freedom Loader
+
+
-
+
-
-
-
-
-
-
-> This project aims to enable free, open-source, and unrestricted downloading of Video/Audio content. Eventually, it will allow users to choose
-
-## 🚀 Features
-
-- ✅ Video download with metadata(MP4)
-- ✅ Audio-only download with thumbail and metadata(MP3)
-- ✅ Full playlist support
-- ✅ Automatic metadata retrieval (title, duration, etc.)
-- ✅ Detailed logs: console and rotating files (7 days)
-- ✅ Custom output path selection with saving
-- ✅ Multiple graphical themes available for interface customization
-- ✅ Simple, intuitive, and responsive interface
-- ✅ Notification system when download finished (Click = Open Output Folder)
-- ✅ Discord Rich Presence
-
----
-
-## 🔧 Installation
-
-To install the application, simply download the installer from the releases section. Take the latest version and run it.
-
----
-
-## ❓ Frequently Asked Questions
-
-### _Where are my downloaded files located?_
-
-In your computer's Downloads folder (**C:\Users\YOUR NAME\Downloads**), inside a folder named **Freedom Loader Output**
+
-### _After installing and running the program, I get an error_
+Freedom Loader is a **Windows desktop** application built with **Electron**.
+It provides a simple and reliable way to download video or audio content with metadata and advanced options, without ads or questionable third-party services.
+The goal is to offer a clean, user-friendly, and transparent download experience. It's important for me to make media content downloading accessible to people who love music or videos and don’t always have an internet connection.
-Try restarting the application, checking the logs, or opening the browser's developer console by pressing `CTRL + SHIFT + I` or by going to `View > Toggle Developer Tools`
+---
+
+## Features
+
+- Video download with metadata (MP4)
+- Audio-only download with thumbnail and tags (MP3)
+- Full playlist support and better display in UI
+- Automatic metadata retrieval (title, duration, author, etc.)
+- Detailed logs (console + rotating files for 7 days)
+- Progress Bar for download and network speed indicator
+- Better UX when fetching info
+- Custom output path with persistence
+- Automatic dependency updates (YT-DLP)
+- Automatic Application Update
+- Multiple UI themes
+- Simple, responsive interface
+- Notifications on download completion (click to open folder)
+- Discord Rich Presence
+
+---
+
+## Installation
+
+Download the latest installer from the **Releases** page and run it (Defender could stop you but click on "Run Anyway" and it's good).
+Actually, **Firefox Browser** is the only browser supported for get cookies. You should install it. Follow the tutorial in the wiki page if you need some help, Firefox Section. [Link](https://masteracnolo.github.io/FreedomLoader/pages/wiki.html)
+
+---
+
+## FAQ
+
+### Where are my downloaded files stored?
+
+In your **Downloads** folder, inside **Freedom Loader**.
+Example path:
+`C:\Users\[YOUR NAME]\Downloads\Freedom Loader`
+
+### I get an error after launching the app
+
+Try restarting the application, checking the logs, or opening the developer console:
+`CTRL + SHIFT + I` -> “Toggle Developer Tools”.
-
-
+
-## 🏗️ Upcoming Features (Roadmap)
+---
+## Roadmap
+
+- [x] ~~Website for Freedom Loader~~
- [ ] More format options
+- [ ] Linux version
+- [x] ~~Auto-updating YT-DLP~~
+- [x] ~~Automatic project updates~~
+- [x] ~~Better download status~~
+- [ ] Better website support (currently only YouTube is fully supported, other site could work but i can't prove it)
- [ ] Subtitle support
-- [ ] Improved UI / UX
+- [x] ~~UI/UX improvements~~
- [ ] Language selection
-- [ ] Download a specific part of the video
-- [ ] Rename output file
-- [x] ~~Extract / Split video using native chapters~~
+- [ ] Download specific parts of a video
+- [ ] Custom file naming
- [ ] Parallel downloads
-- [ ] Skip sponsored parts of videos
-- [x] ~~Custom output path selection (default **C:\Users\Username\Downloads** with a **Freedom Loader Output** folder created)~~
+- [ ] Automatic sponsor skipping
+- [x] ~~Extract/split video using native chapters~~
+- [x] ~~Custom output path selection~~
---
-## 🖼️ Preview
+## Preview
-
+
-> Here is an example of the app after launch and entering a URL
+---
+
+## Technologies
+
+This project uses:
+
+
---
-## ℹ️ About
+## Contributing
-This project was built using [](https://github.com/yt-dlp/yt-dlp)
-Thanks to them for providing a free and open-source API.
+Contributions are welcome.
-This project is open-source and welcomes your contributions.
-Here is how to get involved:
+### Bug Reports
-- **🪲 Bug Reporting**
- Please use the [GitHub issues system](https://github.com/MasterAcnolo/Freedom-Loader/issues) to report any bugs you encounter.
- Try to provide clear reproduction steps and logs if possible. Logs are located in the installation folder of the program. Example path:
- `C:\Users\[YOUR NAME]\Desktop\Freedom Loader\resources\app\logs`
- The log file will be named something like `combined-20xx-xx-xx.log`
-
-- **🛠️ Contribution**
- Pull Requests are welcome! Please fork the repo and submit your PR after ensuring you meet the contribution guidelines (tests, style, etc.).
-
-- **💡 Feature Suggestions**
- You can propose new ideas via a [feature request issue](https://github.com/MasterAcnolo/Freedom-Loader/issues).
- Any clear and detailed proposal will be reviewed.
-
-- **💰 Support the Project**
-
- If you'd like to support me, you can donate via
-
-
-
-
+Use the GitHub Issues system and include reproduction steps and logs when possible.
+Logs can be found here:
+`C:\Users\[USERNAME]\AppData\Local\FreedomLoader\logs\LOGS-20xx-xx-xx.log`
+
+### Feature Requests
+
+Open a feature request issue with a clear description and use cases.
+
+### Pull Requests
+
+Fork the repository, make your changes, and submit a PR once everything is tested and clean.
---
-## 📄 License
+## Support the Project
-This project is licensed under the **MIT License** — see the [LICENSE](./LICENSE) file for details.
+If you'd like to support development:
+
+
+
+
---
-## ⚠️ Disclaimer
+## License
-I have obviously used AI assistance for some parts of this project. Use AI sparingly and always be aware of what you are doing.
+Freedom Loader is released under the **GNU General Public License v3.0 (GPLv3)**.
+You are free to use, modify, and redistribute the software under the terms of this license.
+
+See the full license in the [LICENSE](./LICENSE) file.
+
+---
+
+## Note
+
+AI assistance was used occasionally to speed up development, but all code and decisions were reviewed and validated manually.
diff --git a/build/apercu1.0.0.png b/build/apercu1.0.0.png
deleted file mode 100644
index 9f0e1ee..0000000
Binary files a/build/apercu1.0.0.png and /dev/null differ
diff --git a/build/apercu1.0.1.png b/build/apercu1.0.1.png
deleted file mode 100644
index 212f852..0000000
Binary files a/build/apercu1.0.1.png and /dev/null differ
diff --git a/build/apercu1.2.4.png b/build/apercu1.2.4.png
new file mode 100644
index 0000000..6a22151
Binary files /dev/null and b/build/apercu1.2.4.png differ
diff --git a/build/app-icon.ico b/build/app-icon.ico
new file mode 100644
index 0000000..0f7fc93
Binary files /dev/null and b/build/app-icon.ico differ
diff --git a/build/banner.png b/build/banner.png
new file mode 100644
index 0000000..0948bc6
Binary files /dev/null and b/build/banner.png differ
diff --git a/build/error.png b/build/error.png
new file mode 100644
index 0000000..6db73a9
Binary files /dev/null and b/build/error.png differ
diff --git a/build/installer-icon.ico b/build/installer-icon.ico
deleted file mode 100644
index 9d832c7..0000000
Binary files a/build/installer-icon.ico and /dev/null differ
diff --git a/build/uninstaller-icon.ico b/build/uninstaller-icon.ico
index d3d3c02..819d5e9 100644
Binary files a/build/uninstaller-icon.ico and b/build/uninstaller-icon.ico differ
diff --git a/config.js b/config.js
new file mode 100644
index 0000000..e460608
--- /dev/null
+++ b/config.js
@@ -0,0 +1,10 @@
+const packageJson = require("./package.json");
+const { app } = require("electron");
+
+module.exports = {
+ version: packageJson.version,
+ applicationPort: "8787",
+ debugMode: true,
+ localMode: !app.isPackaged,
+ DiscordRPCID: "1410934537051181146",
+}
\ No newline at end of file
diff --git a/forge.config.js b/forge.config.js
deleted file mode 100644
index fa4a113..0000000
--- a/forge.config.js
+++ /dev/null
@@ -1,44 +0,0 @@
-const { FusesPlugin } = require('@electron-forge/plugin-fuses');
-const { FuseV1Options, FuseVersion } = require('@electron/fuses');
-
-module.exports = {
- packagerConfig: {
- asar: true,
- },
- rebuildConfig: {},
- makers: [
- {
- name: '@electron-forge/maker-squirrel',
- config: {},
- },
- {
- name: '@electron-forge/maker-zip',
- platforms: ['darwin'],
- },
- {
- name: '@electron-forge/maker-deb',
- config: {},
- },
- {
- name: '@electron-forge/maker-rpm',
- config: {},
- },
- ],
- plugins: [
- {
- name: '@electron-forge/plugin-auto-unpack-natives',
- config: {},
- },
- // Fuses are used to enable/disable various Electron functionality
- // at package time, before code signing the application
- new FusesPlugin({
- version: FuseVersion.V1,
- [FuseV1Options.RunAsNode]: false,
- [FuseV1Options.EnableCookieEncryption]: true,
- [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false,
- [FuseV1Options.EnableNodeCliInspectArguments]: false,
- [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true,
- [FuseV1Options.OnlyLoadAppFromAsar]: true,
- }),
- ],
-};
diff --git a/main.js b/main.js
index a835d2d..978ab0e 100644
--- a/main.js
+++ b/main.js
@@ -1,46 +1,43 @@
-/*
- This file is part of Freedom Loader.
-
- Copyright (C) 2025 MasterAcnolo
-
- Freedom Loader is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License.
-
- Freedom Loader is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-*/
-
+const config = require("./config.js");
const { app, BrowserWindow, ipcMain, dialog, Menu, shell } = require("electron");
-app.disableHardwareAcceleration(); // Désactive l'accélération GPU pour éviter les erreurs GPU sur certains systèmes
const path = require("path");
const os = require("os");
const { logger, logSessionStart, logSessionEnd, logDir } = require("./server/logger");
+const { AutoUpdater } = require("./server/update.js");
let mainWindow;
-// Utilise le vrai dossier de logs défini dans logger.js
const logsFolderPath = logDir;
-app.setAppUserModelId("com.masteracnolo.freedomloader"); /* Pour la notif */
-/*
- Fonction principale qui crée la fenêtre principale de l'application.
- Elle évite la création multiple et configure les dimensions et options de la fenêtre.
- Charge l'URL locale du serveur Express et gère les erreurs éventuelles.
-*/
-async function createWindow() {
- logger.info("Création de la fenêtre...");
+const defaultDownloadPath = path.join(os.homedir(), "Downloads", "Freedom Loader");
+app.setAppUserModelId("com.masteracnolo.freedomloader"); // pour notifications Windows
+app.disableHardwareAcceleration();
+
+// Gestion single instance
+const gotLock = app.requestSingleInstanceLock();
+
+if (!gotLock) {
+ // Une instance existe déjà -> fermer l'ancienne et continuer la nouvelle
+ // Ici la nouvelle instance continue normalement
+} else {
+ app.on("second-instance", () => {
+ // La vieille instance se ferme
+ if (mainWindow) {
+ logger.info("New Instance Detected, closing the older...");
+ mainWindow.destroy();
+ mainWindow = null;
+ }
+ });
+}
+
+// Création fenêtre principale
+async function createMainWindow() {
if (mainWindow) {
- logger.warn("La fenêtre existe déjà, pas de nouvelle création");
+ logger.warn("Window already exists, no new creation!");
return;
}
mainWindow = new BrowserWindow({
- title: "Freedom Loader 1.2.4", // A Changer à chaque Version
+ title: `Freedom Loader ${config.version}`,
width: 750,
height: 800,
minWidth: 750,
@@ -48,118 +45,112 @@ async function createWindow() {
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
- preload: path.join(__dirname, "preload.js"), // Chargement du preload script sécurisé
+ preload: path.join(__dirname, "preload.js"),
},
- // titleBarStyle: 'hidden', // Option possible pour une barre de titre personnalisée
});
try {
- await mainWindow.loadURL("http://localhost:8080");
- logger.info("Fenêtre chargée");
+ await mainWindow.loadURL(`http://localhost:${config.applicationPort}`);
+ logger.info("Window Loaded");
} catch (err) {
- logger.error("Erreur chargement fenêtre:", err);
+ logger.error("Window Loading Error:", err);
}
- // Événement déclenché à la fermeture de la fenêtre principale
mainWindow.on("closed", () => {
- logger.info("Fenêtre principale fermée");
+ logger.info("Main Window Closed");
mainWindow = null;
});
}
-/*
- Définition du chemin par défaut pour les téléchargements.
- Ici, on utilise le dossier 'Downloads' de l'utilisateur avec un sous-dossier spécifique à l'application.
-*/
-const defaultDownloadPath = path.join(os.homedir(), "Downloads", "Freedom Loader");
-
-/*
- Gestionnaire IPC qui permet au renderer de demander à l'utilisateur
- de sélectionner un dossier via une boîte de dialogue native.
- On retourne le chemin sélectionné ou null si annulation.
-*/
+// IPC
ipcMain.handle("select-download-folder", async () => {
- logger.info("Demande de sélection d'un dossier reçue depuis le renderer");
try {
- const result = await dialog.showOpenDialog({
- properties: ["openDirectory"]
- });
+ const result = await dialog.showOpenDialog({ properties: ["openDirectory"] });
if (!result.canceled && result.filePaths.length > 0) {
logger.info(`Dossier sélectionné : ${result.filePaths[0]}`);
return result.filePaths[0];
}
return null;
} catch (err) {
- logger.error(`Erreur lors de la sélection de dossier : ${err.message}`);
+ logger.error(`Error when creating Output Folder : ${err.message}`);
return null;
}
});
-/*
- Gestionnaire IPC pour exposer au renderer le chemin par défaut de téléchargement
- afin qu'il puisse l'afficher ou l'utiliser comme valeur initiale.
-*/
-ipcMain.handle("get-default-download-path", () => {
- return defaultDownloadPath;
+ipcMain.handle("get-default-download-path", () => defaultDownloadPath);
+
+ipcMain.on("set-progress", (event, percent) => {
+ if (mainWindow) mainWindow.setProgressBar(percent / 100); // Electron attend 0 → 1
});
-/*
- Événement déclenché quand l'application est prête.
- On démarre le serveur Express, puis on crée la fenêtre principale.
- En cas d'erreur, on log et on quitte l'application proprement.
-*/
+// Menu
+function setupMenu() {
+ const menuTemplate = [
+ {
+ label: "Logs",
+ submenu: [
+ {
+ label: "Open Logs",
+ click: () => shell.openPath(logsFolderPath),
+ },
+ ],
+ },
+ {
+ label: "Website",
+ submenu: [
+ {
+ label: "Go to Website",
+ click: () => shell.openExternal("https://masteracnolo.github.io/FreedomLoader/"),
+ },
+ ],
+ },
+ {
+ label: "Documentation",
+ submenu: [
+ {
+ label: "Go to Wiki",
+ click: () => shell.openExternal("https://masteracnolo.github.io/FreedomLoader/pages/wiki.html"),
+ },
+ ],
+ },
+
+ ];
+
+ const defaultMenu = Menu.getApplicationMenu();
+ const mergedTemplate = defaultMenu
+ ? [...defaultMenu.items.map(item => item), ...menuTemplate]
+ : menuTemplate;
+
+ Menu.setApplicationMenu(Menu.buildFromTemplate(mergedTemplate));
+}
+
+// App ready
app.whenReady().then(async () => {
logSessionStart();
- logger.info("App prête, démarrage du serveur Express...");
- const expressServer = require("./server/server.js");
+ logger.info("App Ready, Server Express starting...");
+
+ const serverPath = path.join(__dirname, "server", "server.js");
+ const expressServer = require(serverPath);
+
try {
await expressServer.startServer();
- logger.info("Serveur Express démarré");
- await createWindow();
+ logger.info("Express Server Started");
- // Ajout du menu personnalisé
- const menuTemplate = [
- // ... Menu standard Electron ...
- {
- label: "Logs",
- submenu: [
- {
- label: "Ouvrir les logs",
- click: () => {
- shell.openPath(logsFolderPath);
- }
- }
- ]
- }
- ];
+ const { startRPC } = require("./server/discordRPC");
+ startRPC();
- // Fusionner avec le menu par défaut
- const defaultMenu = Menu.getApplicationMenu();
- let template = menuTemplate;
- if (defaultMenu) {
- template = [...Menu.getApplicationMenu().items.map(item => item), ...menuTemplate];
- }
- const finalMenu = Menu.buildFromTemplate(template);
- Menu.setApplicationMenu(finalMenu);
-
- } catch (error) {
- logger.error("Erreur serveur ou fenêtre :", error);
+ await createMainWindow();
+ AutoUpdater(mainWindow);
+ setupMenu();
+ } catch (err) {
+ logger.error("Window or Server error :", err);
app.quit();
}
});
-/*
- Quitte l'application lorsque toutes les fenêtres sont fermées,
- sauf sous macOS où il est habituel de garder l'application active.
-*/
app.on("window-all-closed", () => {
- logger.info("Toutes fenêtres fermées, quitte l'app");
+ logger.info("All Window Closed, shuting down app");
if (process.platform !== "darwin") app.quit();
});
-/*
- Avant de quitter l'application, on log la fin de session pour traçabilité.
-*/
-app.on("before-quit", () => {
- logSessionEnd();
-});
+app.on("before-quit", () => logSessionEnd());
diff --git a/package-lock.json b/package-lock.json
index 5fc0b92..afa1ce3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,30 +1,24 @@
{
"name": "freedom-loader",
- "version": "1.2.2",
+ "version": "1.3.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "freedom-loader",
- "version": "1.2.2",
+ "version": "1.3.0",
"dependencies": {
"chalk": "^4.1.2",
"debug": "^4.4.1",
"discord-rpc": "^4.0.1",
"electron-squirrel-startup": "^1.0.1",
+ "electron-updater": "^6.6.2",
"express": "^5.1.0",
+ "webidl-conversions": "^8.0.0",
"winston": "^3.17.0",
"winston-daily-rotate-file": "^5.0.0"
},
"devDependencies": {
- "@electron-forge/cli": "^7.8.1",
- "@electron-forge/maker-deb": "^7.8.1",
- "@electron-forge/maker-rpm": "^7.8.1",
- "@electron-forge/maker-squirrel": "^7.8.1",
- "@electron-forge/maker-zip": "^7.8.1",
- "@electron-forge/plugin-auto-unpack-natives": "^7.8.1",
- "@electron-forge/plugin-fuses": "^7.8.1",
- "@electron/fuses": "^1.8.0",
"electron": "^37.1.0",
"electron-builder": "^26.0.12"
}
@@ -39,12 +33,12 @@
}
},
"node_modules/@dabh/diagnostics": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
- "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz",
+ "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==",
"license": "MIT",
"dependencies": {
- "colorspace": "1.1.x",
+ "@so-ric/colorspace": "^1.1.6",
"enabled": "2.0.x",
"kuler": "^2.0.0"
}
@@ -67,376 +61,10 @@
"url": "https://opencollective.com/webpack"
}
},
- "node_modules/@electron-forge/cli": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-7.9.0.tgz",
- "integrity": "sha512-FIs9rV6gN1v8rY73j/dvhQWF8tht035bN2LatY/z99H2KpWr0lhD03MOkIM2lRgrPEqVTExA4JEl9ja9yXBD3Q==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/malept"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-cli?utm_medium=referral&utm_source=npm_fund"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@electron-forge/core": "7.9.0",
- "@electron-forge/core-utils": "7.9.0",
- "@electron-forge/shared-types": "7.9.0",
- "@electron/get": "^3.0.0",
- "@inquirer/prompts": "^6.0.1",
- "@listr2/prompt-adapter-inquirer": "^2.0.22",
- "chalk": "^4.0.0",
- "commander": "^11.1.0",
- "debug": "^4.3.1",
- "fs-extra": "^10.0.0",
- "listr2": "^7.0.2",
- "log-symbols": "^4.0.0",
- "semver": "^7.2.1"
- },
- "bin": {
- "electron-forge": "dist/electron-forge.js",
- "electron-forge-vscode-nix": "script/vscode.sh",
- "electron-forge-vscode-win": "script/vscode.cmd"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/core": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-7.9.0.tgz",
- "integrity": "sha512-S5uFv9sFAVYSO80/K4HZsJL9L2Bs51IxCqR0a2Lk4NdKr9Fpzp6txwuALSJzM1bIpohtqbjmgut49o95wg30ZA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/malept"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/subscription/pkg/npm-.electron-forge-core?utm_medium=referral&utm_source=npm_fund"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@electron-forge/core-utils": "7.9.0",
- "@electron-forge/maker-base": "7.9.0",
- "@electron-forge/plugin-base": "7.9.0",
- "@electron-forge/publisher-base": "7.9.0",
- "@electron-forge/shared-types": "7.9.0",
- "@electron-forge/template-base": "7.9.0",
- "@electron-forge/template-vite": "7.9.0",
- "@electron-forge/template-vite-typescript": "7.9.0",
- "@electron-forge/template-webpack": "7.9.0",
- "@electron-forge/template-webpack-typescript": "7.9.0",
- "@electron-forge/tracer": "7.9.0",
- "@electron/get": "^3.0.0",
- "@electron/packager": "^18.3.5",
- "@electron/rebuild": "^3.7.0",
- "@malept/cross-spawn-promise": "^2.0.0",
- "@vscode/sudo-prompt": "^9.3.1",
- "chalk": "^4.0.0",
- "debug": "^4.3.1",
- "fast-glob": "^3.2.7",
- "filenamify": "^4.1.0",
- "find-up": "^5.0.0",
- "fs-extra": "^10.0.0",
- "global-dirs": "^3.0.0",
- "got": "^11.8.5",
- "interpret": "^3.1.1",
- "jiti": "^2.4.2",
- "listr2": "^7.0.2",
- "lodash": "^4.17.20",
- "log-symbols": "^4.0.0",
- "node-fetch": "^2.6.7",
- "rechoir": "^0.8.0",
- "semver": "^7.2.1",
- "source-map-support": "^0.5.13",
- "username": "^5.1.0"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/core-utils": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-7.9.0.tgz",
- "integrity": "sha512-votOf1+20cUJim0smYZW7OylXrl89JlpuFTgFpn5WFpDfAV6C0iH9202K1sa33v9OQ989JnpWDZtQNQzQHHNtg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/shared-types": "7.9.0",
- "@electron/rebuild": "^3.7.0",
- "@malept/cross-spawn-promise": "^2.0.0",
- "chalk": "^4.0.0",
- "debug": "^4.3.1",
- "find-up": "^5.0.0",
- "fs-extra": "^10.0.0",
- "log-symbols": "^4.0.0",
- "semver": "^7.2.1"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/maker-base": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-7.9.0.tgz",
- "integrity": "sha512-u0jo2kaYRxh/Rai6DyFSGJcNLRVWxiKaGUjMhX1LrKolufUkCxxR4TEmv4Hvl03WTr9pQb06umlIrVMaNb+j9A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/shared-types": "7.9.0",
- "fs-extra": "^10.0.0",
- "which": "^2.0.2"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/maker-deb": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-7.9.0.tgz",
- "integrity": "sha512-b1TRMKkeuZ2PTKVsTMWLY+82O6UQVPQ17x5hkWe0lyIxRyCfJr6hD+AqYbvEJ50ncDkvyCtENBT6GnhfbKOGxA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/maker-base": "7.9.0",
- "@electron-forge/shared-types": "7.9.0"
- },
- "engines": {
- "node": ">= 16.4.0"
- },
- "optionalDependencies": {
- "electron-installer-debian": "^3.2.0"
- }
- },
- "node_modules/@electron-forge/maker-rpm": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-7.9.0.tgz",
- "integrity": "sha512-if7Odo/LFn1MIGW6ftEnhP77+0pTeMd9e9YvM8+qiaztV/jVNB0RGuuzKOtQXzbrrjps/YWG15x+U4/XUIUylg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/maker-base": "7.9.0",
- "@electron-forge/shared-types": "7.9.0"
- },
- "engines": {
- "node": ">= 16.4.0"
- },
- "optionalDependencies": {
- "electron-installer-redhat": "^3.2.0"
- }
- },
- "node_modules/@electron-forge/maker-squirrel": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-7.9.0.tgz",
- "integrity": "sha512-Ea3MrieWC1KRct1QSZeOBY+GIqHZO5bXj6xCuj81f6nz8JMCsXdgvKosdbfcJMSKu4SYZ52PtoweA6uAACfLww==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/maker-base": "7.9.0",
- "@electron-forge/shared-types": "7.9.0",
- "fs-extra": "^10.0.0"
- },
- "engines": {
- "node": ">= 16.4.0"
- },
- "optionalDependencies": {
- "electron-winstaller": "^5.3.0"
- }
- },
- "node_modules/@electron-forge/maker-zip": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-7.9.0.tgz",
- "integrity": "sha512-UGeziReiz8yuDTjliOjvbdyulIHpKAWkDeW3kOcMTUmRcCgrCkBNr+Pp6ih8Q3aBhG+CCd4++oe2rDnnuVvxFw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/maker-base": "7.9.0",
- "@electron-forge/shared-types": "7.9.0",
- "cross-zip": "^4.0.0",
- "fs-extra": "^10.0.0",
- "got": "^11.8.5"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/plugin-auto-unpack-natives": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/plugin-auto-unpack-natives/-/plugin-auto-unpack-natives-7.9.0.tgz",
- "integrity": "sha512-PQeTq7Mp2bQkj/fdf+DjnSFKLWyBCSdLqZqNadszA9+2QcxFVv+v2ckTuwkHAdoecVNOdza/VZZIDbVFLhUHkQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/plugin-base": "7.9.0",
- "@electron-forge/shared-types": "7.9.0"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/plugin-base": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-7.9.0.tgz",
- "integrity": "sha512-2cnShgfes0sqH7A3+54fWhfJEfU++1OC2HE50a4sWtWEDwyWLGbwW7tp9BgSXrvIexO2AGKHQ1pKIjpZYVC0fA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/shared-types": "7.9.0"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/plugin-fuses": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/plugin-fuses/-/plugin-fuses-7.9.0.tgz",
- "integrity": "sha512-HZ8O6hw+lJZewlBfFmxmHAvIA//o75u0g68K8zAjYKq5QFSC/PQNjQ8+qv0PjnlaQ13R1o/fyu+HZZUj7cgSbA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/plugin-base": "7.9.0",
- "@electron-forge/shared-types": "7.9.0"
- },
- "engines": {
- "node": ">= 16.4.0"
- },
- "peerDependencies": {
- "@electron/fuses": "^1.0.0"
- }
- },
- "node_modules/@electron-forge/publisher-base": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-7.9.0.tgz",
- "integrity": "sha512-z3eH4+C++LiDqlKmri04IbSNNWLRYLvc49uNiOgfvnejplLsos720TTbwgruyI3D2fbpmhrVmz9kp9H9YzXdVg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/shared-types": "7.9.0"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/shared-types": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-7.9.0.tgz",
- "integrity": "sha512-6jZF+zq3SYMnweQpgr5fwlSgOd2yOZ5qlfz/CgXyVljiv0e0UThzpOjfTLuwuVgZX7a60xV+h0mg1h82Glu3wQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/tracer": "7.9.0",
- "@electron/packager": "^18.3.5",
- "@electron/rebuild": "^3.7.0",
- "listr2": "^7.0.2"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/template-base": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-7.9.0.tgz",
- "integrity": "sha512-DvXdJHh4qP+LBX6xNBlO0nfljvJNTmiQNfLRfSouRdYCWbr5hC7wyWAX803HqwRsVLRZj2oiLYZjmyG3jESp8Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/core-utils": "7.9.0",
- "@electron-forge/shared-types": "7.9.0",
- "@malept/cross-spawn-promise": "^2.0.0",
- "debug": "^4.3.1",
- "fs-extra": "^10.0.0",
- "semver": "^7.2.1",
- "username": "^5.1.0"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/template-vite": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-7.9.0.tgz",
- "integrity": "sha512-m8Fi40XaF7YDJo7YqmfJbkjRRsttN9EEHkmq+McLrDUbln15Ppm59RAwUhizDQzs4enmLcNQPaFllbAg/2t8vQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/shared-types": "7.9.0",
- "@electron-forge/template-base": "7.9.0",
- "fs-extra": "^10.0.0"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/template-vite-typescript": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-7.9.0.tgz",
- "integrity": "sha512-qGK649YnC3iOVrj/hHUu/TXG7Nn/a7QykEOPrCrxROWL7mtw8CMUE+FOVETd+eew7/4ldUNzl+5b9ebP8jHOmg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/shared-types": "7.9.0",
- "@electron-forge/template-base": "7.9.0",
- "fs-extra": "^10.0.0"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/template-webpack": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-7.9.0.tgz",
- "integrity": "sha512-ser22QczYGor7N6bnMUwexdWbLMNApr6zpBoT+Xfn6P4Ks67ttzcfkAges7GXHNjXwox4ePYZ3+D7cWQem5C4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/shared-types": "7.9.0",
- "@electron-forge/template-base": "7.9.0",
- "fs-extra": "^10.0.0"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/template-webpack-typescript": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-7.9.0.tgz",
- "integrity": "sha512-z7PB72sI11LBSPz9w9nwwk0le/lZ3VT8TrLc0NYh4F4LbZ19Z+lxcraaAdf21efvWzodhWx8khAyA8WvkNxVSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron-forge/shared-types": "7.9.0",
- "@electron-forge/template-base": "7.9.0",
- "fs-extra": "^10.0.0"
- },
- "engines": {
- "node": ">= 16.4.0"
- }
- },
- "node_modules/@electron-forge/tracer": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@electron-forge/tracer/-/tracer-7.9.0.tgz",
- "integrity": "sha512-7itsjW1WJQADg7Ly61ggI5CCRt+QDVx3HOZC1w69jMUtnipKyPRCbvTBf1oplsNqbIzZxceXdfex6W53YNehvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chrome-trace-event": "^1.0.3"
- },
- "engines": {
- "node": ">= 14.17.5"
- }
- },
"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==",
+ "version": "3.2.18",
+ "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.18.tgz",
+ "integrity": "sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -451,14 +79,17 @@
"node": ">=10.12.0"
}
},
- "node_modules/@electron/asar/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==",
+ "node_modules/@electron/asar/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
- "license": "MIT",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
"engines": {
- "node": ">= 6"
+ "node": "*"
}
},
"node_modules/@electron/fuses": {
@@ -492,10 +123,33 @@
"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": "3.1.0",
- "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz",
- "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==",
+ "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": {
@@ -508,57 +162,12 @@
"sumchecker": "^3.0.1"
},
"engines": {
- "node": ">=14"
+ "node": ">=12"
},
"optionalDependencies": {
"global-agent": "^3.0.0"
}
},
- "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/@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/@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/@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/@electron/node-gyp": {
"version": "10.2.0-electron.1",
"resolved": "git+ssh://git@github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2",
@@ -628,6 +237,19 @@
"node": ">=10"
}
},
+ "node_modules/@electron/node-gyp/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/@electron/notarize": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz",
@@ -659,10 +281,33 @@
"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==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz",
+ "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@@ -681,49 +326,10 @@
"node": ">=12.0.0"
}
},
- "node_modules/@electron/packager": {
- "version": "18.4.4",
- "resolved": "https://registry.npmjs.org/@electron/packager/-/packager-18.4.4.tgz",
- "integrity": "sha512-fTUCmgL25WXTcFpM1M72VmFP8w3E4d+KNzWxmTDRpvwkfn/S206MAtM2cy0GF78KS9AwASMOUmlOIzCHeNxcGQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "@electron/asar": "^3.2.13",
- "@electron/get": "^3.0.0",
- "@electron/notarize": "^2.1.0",
- "@electron/osx-sign": "^1.0.5",
- "@electron/universal": "^2.0.1",
- "@electron/windows-sign": "^1.0.0",
- "@malept/cross-spawn-promise": "^2.0.0",
- "debug": "^4.0.1",
- "extract-zip": "^2.0.0",
- "filenamify": "^4.1.0",
- "fs-extra": "^11.1.0",
- "galactus": "^1.0.0",
- "get-package-info": "^1.0.0",
- "junk": "^3.1.0",
- "parse-author": "^2.0.0",
- "plist": "^3.0.0",
- "prettier": "^3.4.2",
- "resedit": "^2.0.0",
- "resolve": "^1.1.6",
- "semver": "^7.1.3",
- "yargs-parser": "^21.1.1"
- },
- "bin": {
- "electron-packager": "bin/electron-packager.js"
- },
- "engines": {
- "node": ">= 16.13.0"
- },
- "funding": {
- "url": "https://github.com/electron/packager?sponsor=1"
- }
- },
- "node_modules/@electron/packager/node_modules/fs-extra": {
- "version": "11.3.2",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz",
- "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==",
+ "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": {
@@ -732,13 +338,49 @@
"universalify": "^2.0.0"
},
"engines": {
- "node": ">=14.14"
+ "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": "3.7.2",
- "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.2.tgz",
- "integrity": "sha512-19/KbIR/DAxbsCkiaGMXIdPnMCJLkcf8AvGnduJtWBs/CBwiAjY1apCqOLVxrXg+rtXFCngbXhBanWjxLUt1Mg==",
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.0.tgz",
+ "integrity": "sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -764,14 +406,65 @@
"node": ">=12.13.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==",
+ "node_modules/@electron/rebuild/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": {
- "@electron/asar": "^3.3.1",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@electron/rebuild/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/rebuild/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/@electron/rebuild/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/universal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz",
+ "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@electron/asar": "^3.2.7",
"@malept/cross-spawn-promise": "^2.0.0",
"debug": "^4.3.1",
"dir-compare": "^4.2.0",
@@ -808,6 +501,19 @@
"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": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
@@ -824,12 +530,24 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "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",
@@ -850,6 +568,8 @@
"integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==",
"dev": true,
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
@@ -859,6 +579,33 @@
"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/@gar/promisify": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
@@ -866,227 +613,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@inquirer/checkbox": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-3.0.1.tgz",
- "integrity": "sha512-0hm2nrToWUdD6/UHnel/UKGdk1//ke5zGUpHIvk5ZWmaKezlGxZkOJXNSWsdxO/rEqTkbB3lNC2J6nBElV2aAQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^9.2.1",
- "@inquirer/figures": "^1.0.6",
- "@inquirer/type": "^2.0.0",
- "ansi-escapes": "^4.3.2",
- "yoctocolors-cjs": "^2.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/confirm": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-4.0.1.tgz",
- "integrity": "sha512-46yL28o2NJ9doViqOy0VDcoTzng7rAb6yPQKU7VDLqkmbCaH4JqK4yk4XqlzNWy9PVC5pG1ZUXPBQv+VqnYs2w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^9.2.1",
- "@inquirer/type": "^2.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/core": {
- "version": "9.2.1",
- "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-9.2.1.tgz",
- "integrity": "sha512-F2VBt7W/mwqEU4bL0RnHNZmC/OxzNx9cOYxHqnXX3MP6ruYvZUZAW9imgN9+h/uBT/oP8Gh888J2OZSbjSeWcg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/figures": "^1.0.6",
- "@inquirer/type": "^2.0.0",
- "@types/mute-stream": "^0.0.4",
- "@types/node": "^22.5.5",
- "@types/wrap-ansi": "^3.0.0",
- "ansi-escapes": "^4.3.2",
- "cli-width": "^4.1.0",
- "mute-stream": "^1.0.0",
- "signal-exit": "^4.1.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^6.2.0",
- "yoctocolors-cjs": "^2.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/editor": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-3.0.1.tgz",
- "integrity": "sha512-VA96GPFaSOVudjKFraokEEmUQg/Lub6OXvbIEZU1SDCmBzRkHGhxoFAVaF30nyiB4m5cEbDgiI2QRacXZ2hw9Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^9.2.1",
- "@inquirer/type": "^2.0.0",
- "external-editor": "^3.1.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/expand": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-3.0.1.tgz",
- "integrity": "sha512-ToG8d6RIbnVpbdPdiN7BCxZGiHOTomOX94C2FaT5KOHupV40tKEDozp12res6cMIfRKrXLJyexAZhWVHgbALSQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^9.2.1",
- "@inquirer/type": "^2.0.0",
- "yoctocolors-cjs": "^2.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/figures": {
- "version": "1.0.13",
- "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz",
- "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/input": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-3.0.1.tgz",
- "integrity": "sha512-BDuPBmpvi8eMCxqC5iacloWqv+5tQSJlUafYWUe31ow1BVXjW2a5qe3dh4X/Z25Wp22RwvcaLCc2siHobEOfzg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^9.2.1",
- "@inquirer/type": "^2.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/number": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-2.0.1.tgz",
- "integrity": "sha512-QpR8jPhRjSmlr/mD2cw3IR8HRO7lSVOnqUvQa8scv1Lsr3xoAMMworcYW3J13z3ppjBFBD2ef1Ci6AE5Qn8goQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^9.2.1",
- "@inquirer/type": "^2.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/password": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-3.0.1.tgz",
- "integrity": "sha512-haoeEPUisD1NeE2IanLOiFr4wcTXGWrBOyAyPZi1FfLJuXOzNmxCJPgUrGYKVh+Y8hfGJenIfz5Wb/DkE9KkMQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^9.2.1",
- "@inquirer/type": "^2.0.0",
- "ansi-escapes": "^4.3.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/prompts": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-6.0.1.tgz",
- "integrity": "sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/checkbox": "^3.0.1",
- "@inquirer/confirm": "^4.0.1",
- "@inquirer/editor": "^3.0.1",
- "@inquirer/expand": "^3.0.1",
- "@inquirer/input": "^3.0.1",
- "@inquirer/number": "^2.0.1",
- "@inquirer/password": "^3.0.1",
- "@inquirer/rawlist": "^3.0.1",
- "@inquirer/search": "^2.0.1",
- "@inquirer/select": "^3.0.1"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/rawlist": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-3.0.1.tgz",
- "integrity": "sha512-VgRtFIwZInUzTiPLSfDXK5jLrnpkuSOh1ctfaoygKAdPqjcjKYmGh6sCY1pb0aGnCGsmhUxoqLDUAU0ud+lGXQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^9.2.1",
- "@inquirer/type": "^2.0.0",
- "yoctocolors-cjs": "^2.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/search": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-2.0.1.tgz",
- "integrity": "sha512-r5hBKZk3g5MkIzLVoSgE4evypGqtOannnB3PKTG9NRZxyFRKcfzrdxXXPcoJQsxJPzvdSU2Rn7pB7lw0GCmGAg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^9.2.1",
- "@inquirer/figures": "^1.0.6",
- "@inquirer/type": "^2.0.0",
- "yoctocolors-cjs": "^2.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/select": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-3.0.1.tgz",
- "integrity": "sha512-lUDGUxPhdWMkN/fHy1Lk7pF3nK1fh/gqeyWXmctefhxLYxlDsc7vsPBEpxrfVGDsVdyYJsiJoD4bJ1b623cV1Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/core": "^9.2.1",
- "@inquirer/figures": "^1.0.6",
- "@inquirer/type": "^2.0.0",
- "ansi-escapes": "^4.3.2",
- "yoctocolors-cjs": "^2.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@inquirer/type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-2.0.0.tgz",
- "integrity": "sha512-XvJRx+2KR3YXyYtPUUy+qd9i7p+GO9Ko6VIIpWlBrpWwXDv8WLFeHTxz35CfQFUiBMLXlGHhGzys7lqit9gWag==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mute-stream": "^1.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/@isaacs/balanced-match": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
@@ -1213,35 +739,6 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/@listr2/prompt-adapter-inquirer": {
- "version": "2.0.22",
- "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-2.0.22.tgz",
- "integrity": "sha512-hV36ZoY+xKL6pYOt1nPNnkciFkn89KZwqLhAFzJvYysAvL5uBQdiADZx/8bIDXIukzzwG0QlPYolgMzQUtKgpQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@inquirer/type": "^1.5.5"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "@inquirer/prompts": ">= 3 < 8"
- }
- },
- "node_modules/@listr2/prompt-adapter-inquirer/node_modules/@inquirer/type": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.5.5.tgz",
- "integrity": "sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mute-stream": "^1.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
"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",
@@ -1297,42 +794,27 @@
"node": ">=10"
}
},
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "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": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
+ "universalify": "^2.0.0"
},
- "engines": {
- "node": ">= 8"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "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": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
+ "node": ">= 10.0.0"
}
},
"node_modules/@npmcli/fs": {
@@ -1349,6 +831,19 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
+ "node_modules/@npmcli/fs/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/@npmcli/move-file": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz",
@@ -1388,6 +883,16 @@
"url": "https://github.com/sindresorhus/is?sponsor=1"
}
},
+ "node_modules/@so-ric/colorspace": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz",
+ "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==",
+ "license": "MIT",
+ "dependencies": {
+ "color": "^5.0.2",
+ "text-hex": "1.0.x"
+ }
+ },
"node_modules/@szmarczak/http-timer": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
@@ -1468,20 +973,10 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@types/mute-stream": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz",
- "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*"
- }
- },
"node_modules/@types/node": {
- "version": "22.18.6",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.6.tgz",
- "integrity": "sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==",
+ "version": "22.19.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz",
+ "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1524,13 +1019,6 @@
"license": "MIT",
"optional": true
},
- "node_modules/@types/wrap-ansi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz",
- "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@types/yauzl": {
"version": "2.10.3",
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
@@ -1542,13 +1030,6 @@
"@types/node": "*"
}
},
- "node_modules/@vscode/sudo-prompt": {
- "version": "9.3.1",
- "resolved": "https://registry.npmjs.org/@vscode/sudo-prompt/-/sudo-prompt-9.3.1.tgz",
- "integrity": "sha512-9ORTwwS74VaTn38tNbQhsA5U44zkJfcb0BdTSyyG6frP4e8KMtHuTXYmwefe5dpL8XB1aGSIVTaLjD3BbWb5iA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@xmldom/xmldom": {
"version": "0.8.11",
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz",
@@ -1650,22 +1131,6 @@
"ajv": "^6.9.1"
}
},
- "node_modules/ansi-escapes": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
- "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "type-fest": "^0.21.3"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
@@ -1747,134 +1212,10 @@
"electron-builder-squirrel-windows": "26.0.12"
}
},
- "node_modules/app-builder-lib/node_modules/@electron/asar": {
- "version": "3.2.18",
- "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.18.tgz",
- "integrity": "sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==",
- "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/app-builder-lib/node_modules/@electron/asar/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/app-builder-lib/node_modules/@electron/osx-sign": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.1.tgz",
- "integrity": "sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==",
- "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/app-builder-lib/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/app-builder-lib/node_modules/@electron/rebuild": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.7.0.tgz",
- "integrity": "sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron/node-gyp": "git+https://github.com/electron/node-gyp.git#06b29aafb7708acef8b3669835c8a7857ebc92d2",
- "@malept/cross-spawn-promise": "^2.0.0",
- "chalk": "^4.0.0",
- "debug": "^4.1.1",
- "detect-libc": "^2.0.1",
- "fs-extra": "^10.0.0",
- "got": "^11.7.0",
- "node-abi": "^3.45.0",
- "node-api-version": "^0.2.0",
- "ora": "^5.1.0",
- "read-binary-file-arch": "^1.0.6",
- "semver": "^7.3.5",
- "tar": "^6.0.5",
- "yargs": "^17.0.1"
- },
- "bin": {
- "electron-rebuild": "lib/cli.js"
- },
- "engines": {
- "node": ">=12.13.0"
- }
- },
- "node_modules/app-builder-lib/node_modules/@electron/universal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.1.tgz",
- "integrity": "sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@electron/asar": "^3.2.7",
- "@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/app-builder-lib/node_modules/@electron/universal/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/app-builder-lib/node_modules/@electron/universal/node_modules/fs-extra": {
- "version": "11.3.2",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz",
- "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==",
+ "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": {
@@ -1883,102 +1224,49 @@
"universalify": "^2.0.0"
},
"engines": {
- "node": ">=14.14"
+ "node": ">=12"
}
},
- "node_modules/app-builder-lib/node_modules/@electron/universal/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "node_modules/app-builder-lib/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/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",
- "dependencies": {
- "brace-expansion": "^2.0.1"
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=10"
}
},
- "node_modules/app-builder-lib/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==",
+ "node_modules/app-builder-lib/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": ">= 6"
- }
- },
- "node_modules/app-builder-lib/node_modules/isbinaryfile": {
- "version": "5.0.6",
- "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.6.tgz",
- "integrity": "sha512-I+NmIfBHUl+r2wcDd6JwE9yWje/PIVY/R5/CmV8dXLZd5K+L9X2klAOwfAHNnondLXkbHyTAleQAWonpTJBTtw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 18.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/gjtorikian/"
- }
- },
- "node_modules/app-builder-lib/node_modules/minimatch": {
- "version": "10.0.3",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz",
- "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/app-builder-lib/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/app-builder-lib/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": ">= 10.0.0"
}
},
"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": {
@@ -2036,16 +1324,6 @@
"node": ">= 4.0.0"
}
},
- "node_modules/author-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz",
- "integrity": "sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -2096,13 +1374,6 @@
"readable-stream": "^3.4.0"
}
},
- "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/body-parser": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
@@ -2143,19 +1414,6 @@
"concat-map": "0.0.1"
}
},
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
@@ -2228,7 +1486,6 @@
"version": "9.3.1",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.3.1.tgz",
"integrity": "sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.3.4",
@@ -2238,6 +1495,44 @@
"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/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -2405,13 +1700,6 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/chownr": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
@@ -2422,16 +1710,6 @@
"node": ">=10"
}
},
- "node_modules/chrome-trace-event": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
- "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0"
- }
- },
"node_modules/chromium-pickle-js": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
@@ -2466,19 +1744,16 @@
}
},
"node_modules/cli-cursor": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
- "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
+ "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": "^4.0.0"
+ "restore-cursor": "^3.1.0"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
}
},
"node_modules/cli-spinners": {
@@ -2512,16 +1787,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cli-width": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
- "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">= 12"
- }
- },
"node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
@@ -2537,24 +1802,6 @@
"node": ">=12"
}
},
- "node_modules/cliui/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/clone": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
@@ -2579,13 +1826,16 @@
}
},
"node_modules/color": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
- "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz",
+ "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==",
"license": "MIT",
"dependencies": {
- "color-convert": "^1.9.3",
- "color-string": "^1.6.0"
+ "color-convert": "^3.1.3",
+ "color-string": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/color-convert": {
@@ -2607,45 +1857,45 @@
"license": "MIT"
},
"node_modules/color-string": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
- "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.3.tgz",
+ "integrity": "sha512-r/wfcFshhORndnDjn3GtNVLA4QL4TAi0A/XIBNuWUIEAVyUBNWYLuckrDz/JM1aQlpIDzKuY5hAYdHcLYgwJsg==",
"license": "MIT",
"dependencies": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
+ "color-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/color-string/node_modules/color-name": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
+ "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20"
}
},
"node_modules/color/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz",
+ "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==",
"license": "MIT",
"dependencies": {
- "color-name": "1.1.3"
+ "color-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.6"
}
},
"node_modules/color/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "license": "MIT"
- },
- "node_modules/colorette": {
- "version": "2.0.20",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
- "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/colorspace": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
- "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
+ "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
"license": "MIT",
- "dependencies": {
- "color": "^3.1.3",
- "text-hex": "1.0.x"
+ "engines": {
+ "node": ">=12.20"
}
},
"node_modules/combined-stream": {
@@ -2662,13 +1912,13 @@
}
},
"node_modules/commander": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz",
- "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==",
+ "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": ">=16"
+ "node": ">= 6"
}
},
"node_modules/compare-version": {
@@ -2819,7 +2069,9 @@
"resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz",
"integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/cross-spawn": {
"version": "7.0.6",
@@ -2836,30 +2088,6 @@
"node": ">= 8"
}
},
- "node_modules/cross-zip": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.1.tgz",
- "integrity": "sha512-n63i0lZ0rvQ6FXiGQ+/JFCKAUyPFhLQYJIqKaa+tSJtfKeULF/IDNDAbdnSIxgS4NTuw2b0+lj8LzfITuq+ZxQ==",
- "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",
- "engines": {
- "node": ">=12.10"
- }
- },
"node_modules/debug": {
"version": "4.4.3",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
@@ -2987,9 +2215,9 @@
}
},
"node_modules/detect-libc": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.1.tgz",
- "integrity": "sha512-ecqj/sy1jcK1uWrwpR67UhYrIFQ+5WlGxth34WquCbamhFA6hkkwiu37o6J5xCHdo1oixJRfVRw+ywV+Hq/0Aw==",
+ "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": {
@@ -3015,6 +2243,19 @@
"p-limit": "^3.1.0 "
}
},
+ "node_modules/dir-compare/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/discord-rpc": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/discord-rpc/-/discord-rpc-4.0.1.tgz",
@@ -3046,6 +2287,44 @@
"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",
@@ -3146,9 +2425,9 @@
}
},
"node_modules/electron": {
- "version": "37.5.1",
- "resolved": "https://registry.npmjs.org/electron/-/electron-37.5.1.tgz",
- "integrity": "sha512-RqN3dl6I5yhmynkUc3pUzM6qFCvANau3VGRX9xQEh7FYdwmkqVxKXYM5enrE9LW7j7PzHomQQn6+J2xaF7BHsQ==",
+ "version": "37.10.0",
+ "resolved": "https://registry.npmjs.org/electron/-/electron-37.10.0.tgz",
+ "integrity": "sha512-cVa3/q6kdIMrCTW1eMfkcItTcdBTj2HSlwbEYcDY8ol66mARdPOEsnX4bi/DO0oo4WM5jfA0YjxllE8Jnby2mg==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -3203,338 +2482,44 @@
"electron-winstaller": "5.4.0"
}
},
- "node_modules/electron-installer-common": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/electron-installer-common/-/electron-installer-common-0.10.4.tgz",
- "integrity": "sha512-8gMNPXfAqUE5CfXg8RL0vXpLE9HAaPkgLXVoHE3BMUzogMWenf4LmwQ27BdCUrEhkjrKl+igs2IHJibclR3z3Q==",
+ "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": "Apache-2.0",
- "optional": true,
+ "license": "MIT",
"dependencies": {
- "@electron/asar": "^3.2.5",
- "@malept/cross-spawn-promise": "^1.0.0",
- "debug": "^4.1.1",
- "fs-extra": "^9.0.0",
- "glob": "^7.1.4",
- "lodash": "^4.17.15",
- "parse-author": "^2.0.0",
- "semver": "^7.1.1",
- "tmp-promise": "^3.0.2"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
"engines": {
- "node": ">= 10.0.0"
- },
- "funding": {
- "url": "https://github.com/electron-userland/electron-installer-common?sponsor=1"
+ "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": {
- "@types/fs-extra": "^9.0.1"
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/electron-installer-common/node_modules/@malept/cross-spawn-promise": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
- "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
- "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",
- "optional": true,
- "dependencies": {
- "cross-spawn": "^7.0.1"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/electron-installer-common/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==",
+ "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",
- "optional": true,
- "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-installer-debian": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz",
- "integrity": "sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin",
- "linux"
- ],
- "dependencies": {
- "@malept/cross-spawn-promise": "^1.0.0",
- "debug": "^4.1.1",
- "electron-installer-common": "^0.10.2",
- "fs-extra": "^9.0.0",
- "get-folder-size": "^2.0.1",
- "lodash": "^4.17.4",
- "word-wrap": "^1.2.3",
- "yargs": "^16.0.2"
- },
- "bin": {
- "electron-installer-debian": "src/cli.js"
- },
"engines": {
"node": ">= 10.0.0"
}
},
- "node_modules/electron-installer-debian/node_modules/@malept/cross-spawn-promise": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
- "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
- "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",
- "optional": true,
- "dependencies": {
- "cross-spawn": "^7.0.1"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/electron-installer-debian/node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "node_modules/electron-installer-debian/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",
- "optional": true,
- "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-installer-debian/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",
- "optional": true,
- "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/electron-installer-debian/node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/electron-installer-debian/node_modules/yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/electron-installer-redhat": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz",
- "integrity": "sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin",
- "linux"
- ],
- "dependencies": {
- "@malept/cross-spawn-promise": "^1.0.0",
- "debug": "^4.1.1",
- "electron-installer-common": "^0.10.2",
- "fs-extra": "^9.0.0",
- "lodash": "^4.17.15",
- "word-wrap": "^1.2.3",
- "yargs": "^16.0.2"
- },
- "bin": {
- "electron-installer-redhat": "src/cli.js"
- },
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/electron-installer-redhat/node_modules/@malept/cross-spawn-promise": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
- "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
- "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",
- "optional": true,
- "dependencies": {
- "cross-spawn": "^7.0.1"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/electron-installer-redhat/node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "node_modules/electron-installer-redhat/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",
- "optional": true,
- "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-installer-redhat/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",
- "optional": true,
- "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/electron-installer-redhat/node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/electron-installer-redhat/node_modules/yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true,
- "license": "ISC",
- "optional": true,
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/electron-publish": {
"version": "26.0.11",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.0.11.tgz",
@@ -3552,6 +2537,44 @@
"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-squirrel-startup": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.1.tgz",
@@ -3576,6 +2599,69 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"license": "MIT"
},
+ "node_modules/electron-updater": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.6.2.tgz",
+ "integrity": "sha512-Cr4GDOkbAUqRHP5/oeOmH/L2Bn6+FQPxVLZtPbcmKZC63a1F3uu5EefYOssgZXG3u/zBlubbJ5PJdITdMVggbw==",
+ "license": "MIT",
+ "dependencies": {
+ "builder-util-runtime": "9.3.1",
+ "fs-extra": "^10.1.0",
+ "js-yaml": "^4.1.0",
+ "lazy-val": "^1.0.5",
+ "lodash.escaperegexp": "^4.1.2",
+ "lodash.isequal": "^4.5.0",
+ "semver": "^7.6.3",
+ "tiny-typed-emitter": "^2.1.0"
+ }
+ },
+ "node_modules/electron-updater/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==",
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/electron-updater/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/electron-updater/node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/electron-updater/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "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",
@@ -3583,6 +2669,7 @@
"dev": true,
"hasInstallScript": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@electron/asar": "^3.2.1",
"debug": "^4.1.1",
@@ -3603,6 +2690,7 @@
"integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"graceful-fs": "^4.1.2",
"jsonfile": "^4.0.0",
@@ -3612,93 +2700,6 @@
"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",
- "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",
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/electron/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/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/electron/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/electron/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/electron/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/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -3758,16 +2759,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/error-ex": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
- "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
@@ -3861,129 +2852,10 @@
"node": ">= 0.6"
}
},
- "node_modules/eventemitter3": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
- "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/execa/node_modules/cross-spawn": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
- "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- },
- "engines": {
- "node": ">=4.8"
- }
- },
- "node_modules/execa/node_modules/get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/execa/node_modules/path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/execa/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/execa/node_modules/shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/execa/node_modules/shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/execa/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/execa/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
"node_modules/exponential-backoff": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz",
- "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==",
+ "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"
},
@@ -4029,34 +2901,6 @@
"url": "https://opencollective.com/express"
}
},
- "node_modules/external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
- "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/external-editor/node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/extract-zip": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
@@ -4096,23 +2940,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/fast-glob": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.8"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -4120,16 +2947,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/fastq": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
- "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
"node_modules/fd-slicer": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
@@ -4195,47 +3012,6 @@
"node": ">=10"
}
},
- "node_modules/filename-reserved-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
- "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/filenamify": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
- "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "filename-reserved-regex": "^2.0.0",
- "strip-outer": "^1.0.1",
- "trim-repeated": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/finalhandler": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
@@ -4253,37 +3029,6 @@
"node": ">= 0.8"
}
},
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/flora-colossus": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-2.0.0.tgz",
- "integrity": "sha512-dz4HxH6pOvbUzZpZ/yXhafjbR2I8cenK5xL0KtBFb7U2ADsR+OwXifnxZjij/pZWF775uSCMzWVd+jDik2H2IA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^4.3.4",
- "fs-extra": "^10.1.0"
- },
- "engines": {
- "node": ">= 12"
- }
- },
"node_modules/fn.name": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
@@ -4307,6 +3052,19 @@
"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.4",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
@@ -4366,18 +3124,18 @@
}
},
"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==",
+ "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": "^6.0.1",
- "universalify": "^2.0.0"
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=6 <7 || >=8"
}
},
"node_modules/fs-minipass": {
@@ -4409,30 +3167,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/galactus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/galactus/-/galactus-1.0.0.tgz",
- "integrity": "sha512-R1fam6D4CyKQGNlvJne4dkNF+PvUUl7TAJInvTGa9fti9qAv95quQz29GXapA4d8Ec266mJJxFVh82M4GIIGDQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^4.3.4",
- "flora-colossus": "^2.0.0",
- "fs-extra": "^10.1.0"
- },
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/gar": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz",
- "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==",
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
- "dev": true,
- "license": "MIT",
- "optional": true
- },
"node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -4443,21 +3177,6 @@
"node": "6.* || 8.* || >= 10.*"
}
},
- "node_modules/get-folder-size": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz",
- "integrity": "sha512-+CEb+GDCM7tkOS2wdMKTn9vU7DgnKUTuDlehkNJKNSovdCOVxs14OfKCk4cvSaR3za4gj+OBdl9opPN9xrJ0zA==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "gar": "^1.0.4",
- "tiny-each-async": "2.0.3"
- },
- "bin": {
- "get-folder-size": "bin/get-folder-size"
- }
- },
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -4482,39 +3201,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/get-package-info": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-package-info/-/get-package-info-1.0.0.tgz",
- "integrity": "sha512-SCbprXGAPdIhKAXiG+Mk6yeoFH61JlYunqdFQFHDtLjJlDjFf6x07dsS8acO+xWt52jpdVo49AlVDnUVK1sDNw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bluebird": "^3.1.1",
- "debug": "^2.2.0",
- "lodash.get": "^4.0.0",
- "read-pkg-up": "^2.0.0"
- },
- "engines": {
- "node": ">= 4.0"
- }
- },
- "node_modules/get-package-info/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/get-package-info/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
@@ -4566,17 +3252,17 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"license": "ISC",
"dependencies": {
- "is-glob": "^4.0.1"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">= 6"
+ "node": "*"
}
},
"node_modules/global-agent": {
@@ -4598,20 +3284,18 @@
"node": ">=10.0"
}
},
- "node_modules/global-dirs": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
- "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
+ "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": "MIT",
- "dependencies": {
- "ini": "2.0.0"
+ "license": "ISC",
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/globalthis": {
@@ -4674,7 +3358,6 @@
"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==",
- "dev": true,
"license": "ISC"
},
"node_modules/has-flag": {
@@ -4933,30 +3616,10 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC"
},
- "node_modules/ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/interpret": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
- "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10.13.0"
- }
- },
"node_modules/ip-address": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz",
- "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==",
+ "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": {
@@ -4972,13 +3635,6 @@
"node": ">= 0.10"
}
},
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/is-ci": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
@@ -4992,32 +3648,6 @@
"is-ci": "bin.js"
}
},
- "node_modules/is-core-module": {
- "version": "2.16.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
- "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -5028,19 +3658,6 @@
"node": ">=8"
}
},
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/is-interactive": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
@@ -5058,16 +3675,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
"node_modules/is-promise": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
@@ -5075,13 +3682,15 @@
"license": "MIT"
},
"node_modules/is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
- "dev": true,
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-unicode-supported": {
@@ -5098,13 +3707,13 @@
}
},
"node_modules/isbinaryfile": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
- "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
+ "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": ">= 8.0.0"
+ "node": ">= 18.0.0"
},
"funding": {
"url": "https://github.com/sponsors/gjtorikian/"
@@ -5151,21 +3760,10 @@
"node": ">=10"
}
},
- "node_modules/jiti": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.0.tgz",
- "integrity": "sha512-VXe6RjJkBPj0ohtqaO8vSWP3ZhAKo66fKrFNCll4BTcwljPLz03pCbaNKfzGP5MbrCYcbJ7v0nOYYwUzTEIdXQ==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "jiti": "lib/jiti-cli.mjs"
- }
- },
"node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
@@ -5210,28 +3808,15 @@
}
},
"node_modules/jsonfile": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
- "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "universalify": "^2.0.0"
- },
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
- "node_modules/junk": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz",
- "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -5252,191 +3837,8 @@
"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/listr2": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/listr2/-/listr2-7.0.2.tgz",
- "integrity": "sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cli-truncate": "^3.1.0",
- "colorette": "^2.0.20",
- "eventemitter3": "^5.0.1",
- "log-update": "^5.0.1",
- "rfdc": "^1.3.0",
- "wrap-ansi": "^8.1.0"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/listr2/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/listr2/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/listr2/node_modules/cli-truncate": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
- "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "slice-ansi": "^5.0.0",
- "string-width": "^5.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/listr2/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/listr2/node_modules/is-fullwidth-code-point": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
- "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/listr2/node_modules/slice-ansi": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
- "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^6.0.0",
- "is-fullwidth-code-point": "^4.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
- "node_modules/listr2/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/listr2/node_modules/strip-ansi": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
- "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/listr2/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/load-json-file": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
- "integrity": "sha512-3p6ZOGNbiX4CdvEd1VcE6yi78UrGNpjHO33noGwHCnT/o2fyllJDepsm8+mFFv/DvtwFHht5HIHSyOy5a+ChVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "strip-bom": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@@ -5444,12 +3846,17 @@
"dev": true,
"license": "MIT"
},
- "node_modules/lodash.get": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
- "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
- "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.",
- "dev": true,
+ "node_modules/lodash.escaperegexp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+ "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
+ "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.",
"license": "MIT"
},
"node_modules/log-symbols": {
@@ -5469,170 +3876,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/log-update": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz",
- "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-escapes": "^5.0.0",
- "cli-cursor": "^4.0.0",
- "slice-ansi": "^5.0.0",
- "strip-ansi": "^7.0.1",
- "wrap-ansi": "^8.0.1"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/log-update/node_modules/ansi-escapes": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz",
- "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "type-fest": "^1.0.2"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/log-update/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/log-update/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/log-update/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/log-update/node_modules/is-fullwidth-code-point": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
- "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/log-update/node_modules/slice-ansi": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
- "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^6.0.0",
- "is-fullwidth-code-point": "^4.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
- "node_modules/log-update/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/log-update/node_modules/strip-ansi": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
- "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/log-update/node_modules/type-fest": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
- "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
- "dev": true,
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/log-update/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/logform": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz",
@@ -5763,19 +4006,6 @@
"node": ">= 0.6"
}
},
- "node_modules/map-age-cleaner": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
- "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-defer": "^1.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/matcher": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
@@ -5808,21 +4038,6 @@
"node": ">= 0.8"
}
},
- "node_modules/mem": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
- "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "map-age-cleaner": "^0.1.1",
- "mimic-fn": "^2.0.0",
- "p-is-promise": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/merge-descriptors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
@@ -5835,30 +4050,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
"node_modules/mime": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
@@ -5914,16 +4105,19 @@
}
},
"node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
+ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
"dev": true,
- "license": "ISC",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "@isaacs/brace-expansion": "^5.0.0"
},
"engines": {
- "node": "*"
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/minimist": {
@@ -6061,16 +4255,6 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
- "node_modules/mute-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz",
- "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
"node_modules/negotiator": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
@@ -6080,17 +4264,10 @@
"node": ">= 0.6"
}
},
- "node_modules/nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/node-abi": {
- "version": "3.77.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.77.0.tgz",
- "integrity": "sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==",
+ "version": "3.85.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.85.0.tgz",
+ "integrity": "sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6100,6 +4277,19 @@
"node": ">=10"
}
},
+ "node_modules/node-abi/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/node-addon-api": {
"version": "1.7.2",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz",
@@ -6117,6 +4307,19 @@
"semver": "^7.3.5"
}
},
+ "node_modules/node-api-version/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/node-fetch": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
@@ -6153,36 +4356,6 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
- "node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "node_modules/normalize-package-data/node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/normalize-package-data/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/normalize-url": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
@@ -6196,29 +4369,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/npm-run-path/node_modules/path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/object-hash": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
@@ -6321,50 +4471,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/ora/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/ora/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/ora/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/os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/p-cancelable": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
@@ -6375,36 +4481,6 @@
"node": ">=8"
}
},
- "node_modules/p-defer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
- "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/p-is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
- "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -6421,22 +4497,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/p-map": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
@@ -6453,16 +4513,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
"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",
@@ -6470,32 +4520,6 @@
"dev": true,
"license": "BlueOak-1.0.0"
},
- "node_modules/parse-author": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz",
- "integrity": "sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "author-regex": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "error-ex": "^1.2.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -6505,16 +4529,6 @@
"node": ">= 0.8"
}
},
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -6535,13 +4549,6 @@
"node": ">=8"
}
},
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/path-scurry": {
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
@@ -6586,28 +4593,15 @@
"url": "https://opencollective.com/express"
}
},
- "node_modules/path-type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
- "integrity": "sha512-dUnb5dXUf+kzhC/W/F4e5/SkluXIFf5VUHolW1Eg1irn1hGWjPGdsRcvYJ1nD6lhk8Ir7VM0bHJKsYTx8Jx9OQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pify": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/pe-library": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-1.0.1.tgz",
- "integrity": "sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==",
+ "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": ">=14",
- "npm": ">=7"
+ "node": ">=12",
+ "npm": ">=6"
},
"funding": {
"type": "github",
@@ -6628,29 +4622,6 @@
"dev": true,
"license": "ISC"
},
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/plist": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
@@ -6672,6 +4643,8 @@
"integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==",
"dev": true,
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"commander": "^9.4.0"
},
@@ -6688,26 +4661,12 @@
"integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
"dev": true,
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": "^12.20.0 || >=14"
}
},
- "node_modules/prettier": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
- "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
"node_modules/proc-log": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz",
@@ -6798,27 +4757,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
"node_modules/quick-lru": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
@@ -6885,98 +4823,6 @@
"read-binary-file-arch": "cli.js"
}
},
- "node_modules/read-pkg": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
- "integrity": "sha512-eFIBOPW7FGjzBuk3hdXEuNSiTZS/xEMlH49HxMyzb0hyPfu4EhVjT2DH32K1hSSmVq4sebAWnZuuY5auISUTGA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "load-json-file": "^2.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/read-pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
- "integrity": "sha512-1orxQfbWGUiTn9XsPlChs6rLie/AV9jwZTGmu2NZw/CUDJQchXJFYE0Fq5j7+n558T1JhDWLdhyd1Zj+wLY//w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "find-up": "^2.0.0",
- "read-pkg": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/read-pkg-up/node_modules/find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "locate-path": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/read-pkg-up/node_modules/locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/read-pkg-up/node_modules/p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-try": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/read-pkg-up/node_modules/p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/read-pkg-up/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
@@ -6991,19 +4837,6 @@
"node": ">= 6"
}
},
- "node_modules/rechoir": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
- "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "resolve": "^1.20.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- }
- },
"node_modules/register-scheme": {
"version": "0.0.2",
"resolved": "git+ssh://git@github.com/devsnek/node-register-scheme.git#e7cc9a63a1f512565da44cb57316d9fb10750e17",
@@ -7026,44 +4859,23 @@
}
},
"node_modules/resedit": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/resedit/-/resedit-2.0.3.tgz",
- "integrity": "sha512-oTeemxwoMuxxTYxXUwjkrOPfngTQehlv0/HoYFNkB4uzsP1Un1A9nI8JQKGOFkxpqkC7qkMs0lUsGrvUlbLNUA==",
+ "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": "^1.0.1"
+ "pe-library": "^0.4.1"
},
"engines": {
- "node": ">=14",
- "npm": ">=7"
+ "node": ">=12",
+ "npm": ">=6"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/jet2jet"
}
},
- "node_modules/resolve": {
- "version": "1.22.10",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
- "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-core-module": "^2.16.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/resolve-alpn": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
@@ -7085,9 +4897,9 @@
}
},
"node_modules/restore-cursor": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
- "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
+ "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": {
@@ -7095,19 +4907,9 @@
"signal-exit": "^3.0.2"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
}
},
- "node_modules/restore-cursor/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/retry": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
@@ -7118,24 +4920,6 @@
"node": ">= 4"
}
},
- "node_modules/reusify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
- "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rfdc": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
- "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -7188,30 +4972,6 @@
"node": ">= 18"
}
},
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -7258,23 +5018,19 @@
}
},
"node_modules/sax": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
- "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
- "dev": true,
- "license": "ISC"
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz",
+ "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==",
+ "license": "BlueOak-1.0.0"
},
"node_modules/semver": {
- "version": "7.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
- "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "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"
- },
- "engines": {
- "node": ">=10"
}
},
"node_modules/semver-compare": {
@@ -7324,20 +5080,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/serialize-error/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/serve-static": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
@@ -7455,32 +5197,11 @@
}
},
"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==",
+ "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",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/simple-swizzle": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz",
- "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==",
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.3.1"
- }
- },
- "node_modules/simple-swizzle/node_modules/is-arrayish": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz",
- "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==",
- "license": "MIT"
+ "license": "ISC"
},
"node_modules/simple-update-notifier": {
"version": "2.0.0",
@@ -7495,6 +5216,19 @@
"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",
@@ -7586,42 +5320,6 @@
"source-map": "^0.6.0"
}
},
- "node_modules/spdx-correct": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
- "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-exceptions": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
- "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
- "dev": true,
- "license": "CC-BY-3.0"
- },
- "node_modules/spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-license-ids": {
- "version": "3.0.22",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz",
- "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==",
- "dev": true,
- "license": "CC0-1.0"
- },
"node_modules/sprintf-js": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
@@ -7738,49 +5436,6 @@
"node": ">=8"
}
},
- "node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/strip-outer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
- "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "escape-string-regexp": "^1.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/strip-outer/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/sumchecker": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
@@ -7806,19 +5461,6 @@
"node": ">=8"
}
},
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/tar": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
@@ -7853,6 +5495,7 @@
"integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"mkdirp": "^0.5.1",
"rimraf": "~2.6.2"
@@ -7872,12 +5515,51 @@
"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/mkdirp": {
"version": "0.5.6",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"minimist": "^1.2.6"
},
@@ -7892,6 +5574,7 @@
"deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
"license": "ISC",
+ "peer": true,
"dependencies": {
"glob": "^7.1.3"
},
@@ -7925,25 +5608,20 @@
"semver": "bin/semver"
}
},
- "node_modules/tiny-each-async": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz",
- "integrity": "sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==",
- "dev": true,
- "license": "MIT",
- "optional": true
+ "node_modules/tiny-typed-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz",
+ "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==",
+ "license": "MIT"
},
"node_modules/tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "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",
- "dependencies": {
- "os-tmpdir": "~1.0.2"
- },
"engines": {
- "node": ">=0.6.0"
+ "node": ">=14.14"
}
},
"node_modules/tmp-promise": {
@@ -7956,29 +5634,6 @@
"tmp": "^0.2.0"
}
},
- "node_modules/tmp-promise/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/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -7994,29 +5649,6 @@
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
"license": "MIT"
},
- "node_modules/trim-repeated": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
- "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "escape-string-regexp": "^1.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/trim-repeated/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/triple-beam": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
@@ -8037,11 +5669,12 @@
}
},
"node_modules/type-fest": {
- "version": "0.21.3",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
- "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "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"
},
@@ -8064,9 +5697,9 @@
}
},
"node_modules/typescript": {
- "version": "5.9.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz",
- "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==",
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -8111,13 +5744,13 @@
}
},
"node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "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": ">= 10.0.0"
+ "node": ">= 4.0.0"
}
},
"node_modules/unpipe": {
@@ -8139,20 +5772,6 @@
"punycode": "^2.1.0"
}
},
- "node_modules/username": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/username/-/username-5.1.0.tgz",
- "integrity": "sha512-PCKbdWw85JsYMvmCv5GH3kXmM66rCd9m1hBEDutPNv94b/pqCMT4NtcKyeWYvLFiE8b+ha1Jdl8XAaUdPn5QTg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "execa": "^1.0.0",
- "mem": "^4.3.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/utf8-byte-length": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz",
@@ -8166,17 +5785,6 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
- "node_modules/validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
@@ -8213,10 +5821,13 @@
}
},
"node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "license": "BSD-2-Clause"
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.0.tgz",
+ "integrity": "sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=20"
+ }
},
"node_modules/whatwg-url": {
"version": "5.0.0",
@@ -8228,6 +5839,12 @@
"webidl-conversions": "^3.0.0"
}
},
+ "node_modules/whatwg-url/node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "license": "BSD-2-Clause"
+ },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -8245,13 +5862,13 @@
}
},
"node_modules/winston": {
- "version": "3.17.0",
- "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz",
- "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==",
+ "version": "3.18.3",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz",
+ "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==",
"license": "MIT",
"dependencies": {
"@colors/colors": "^1.6.0",
- "@dabh/diagnostics": "^2.0.2",
+ "@dabh/diagnostics": "^2.0.8",
"async": "^3.2.3",
"is-stream": "^2.0.0",
"logform": "^2.7.0",
@@ -8298,33 +5915,10 @@
"node": ">= 12.0.0"
}
},
- "node_modules/winston/node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/word-wrap": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
- "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
- "dev": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "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": {
@@ -8333,7 +5927,10 @@
"strip-ansi": "^6.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs": {
@@ -8461,19 +6058,6 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
- },
- "node_modules/yoctocolors-cjs": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz",
- "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
}
}
}
diff --git a/package.json b/package.json
index 381b057..8fb9fe7 100644
--- a/package.json
+++ b/package.json
@@ -1,12 +1,12 @@
{
"name": "freedom-loader",
"productName": "Freedom Loader",
- "version": "1.2.4",
+ "version": "1.3.0",
"author": "MasterAcnolo",
"description": "Freedom Loader",
"main": "main.js",
"scripts": {
- "start": "electron-forge start",
+ "start": "electron --trace-warnings .",
"dist": "electron-builder"
},
"dependencies": {
@@ -14,29 +14,32 @@
"debug": "^4.4.1",
"discord-rpc": "^4.0.1",
"electron-squirrel-startup": "^1.0.1",
+ "electron-updater": "^6.6.2",
"express": "^5.1.0",
+ "webidl-conversions": "^8.0.0",
"winston": "^3.17.0",
"winston-daily-rotate-file": "^5.0.0"
},
"devDependencies": {
- "@electron-forge/cli": "^7.8.1",
- "@electron-forge/maker-deb": "^7.8.1",
- "@electron-forge/maker-rpm": "^7.8.1",
- "@electron-forge/maker-squirrel": "^7.8.1",
- "@electron-forge/maker-zip": "^7.8.1",
- "@electron-forge/plugin-auto-unpack-natives": "^7.8.1",
- "@electron-forge/plugin-fuses": "^7.8.1",
- "@electron/fuses": "^1.8.0",
"electron": "^37.1.0",
"electron-builder": "^26.0.12"
},
"build": {
"appId": "com.masteracnolo.freedomloader",
"productName": "Freedom Loader",
+ "publish": [
+ {
+ "provider": "github",
+ "owner": "MasterAcnolo",
+ "repo": "Freedom-Loader"
+ }
+ ],
"files": [
"**/*",
"node_modules/**/*",
- "!logs/*.json"
+ "!logs/*.json",
+ "server/**/*",
+ "server/node_modules/**/*"
],
"directories": {
"buildResources": "build"
@@ -47,6 +50,14 @@
"from": "build/confirm-icon.png",
"to": "confirm-icon.png"
},
+ {
+ "from": "build/app-icon.ico",
+ "to": "app-icon.ico"
+ },
+ {
+ "from": "build/error.png",
+ "to": "error.png"
+ },
{
"from": "ressources/yt-dlp.exe",
"to": "yt-dlp.exe"
@@ -58,17 +69,25 @@
{
"from": "ressources/ffprobe.exe",
"to": "ffprobe.exe"
+ },
+ {
+ "from": "ressources/deno.exe",
+ "to": "deno.exe"
+ },
+ {
+ "from": "server",
+ "to": "server"
}
],
"win": {
"target": "nsis",
- "icon": "build/installer-icon.ico"
+ "icon": "build/app-icon.ico"
},
"nsis": {
"oneClick": false,
"perMachine": true,
"allowToChangeInstallationDirectory": true,
- "installerIcon": "build/installer-icon.ico",
+ "installerIcon": "build/app-icon.ico",
"uninstallerIcon": "build/uninstaller-icon.ico",
"createDesktopShortcut": true,
"createStartMenuShortcut": true,
diff --git a/preload.js b/preload.js
index 6a2f152..a1f3787 100644
--- a/preload.js
+++ b/preload.js
@@ -1,31 +1,7 @@
-/*
- This file is part of Freedom Loader.
-
- Copyright (C) 2025 MasterAcnolo
-
- Freedom Loader is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License.
-
- Freedom Loader is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-*/
-
const { contextBridge, ipcRenderer } = require("electron");
-/*
- Expose dans le contexte global (window.electronAPI) deux méthodes sécurisées
- pour que le renderer puisse interagir avec le main process via IPC.
-
- - getDefaultDownloadPath : récupère le chemin de téléchargement par défaut.
- - selectDownloadFolder : ouvre la boîte de dialogue pour choisir un dossier.
-*/
contextBridge.exposeInMainWorld("electronAPI", {
getDefaultDownloadPath: () => ipcRenderer.invoke("get-default-download-path"),
selectDownloadFolder: () => ipcRenderer.invoke("select-download-folder"),
+ setProgress: (percent) => ipcRenderer.send("set-progress", percent)
});
diff --git a/public/assets/favicon.ico b/public/assets/favicon.ico
deleted file mode 100644
index 679f4f9..0000000
Binary files a/public/assets/favicon.ico and /dev/null differ
diff --git a/public/assets/icons/GitHub Icon.ico b/public/assets/icons/GitHub Icon.ico
deleted file mode 100644
index 798a024..0000000
Binary files a/public/assets/icons/GitHub Icon.ico and /dev/null differ
diff --git a/public/assets/icons/GitHub Icon.svg b/public/assets/icons/GitHub Icon.svg
deleted file mode 100644
index a8d1174..0000000
--- a/public/assets/icons/GitHub Icon.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/public/assets/icons/file-audio-solid.svg b/public/assets/icons/file-audio-solid.svg
deleted file mode 100644
index d0582af..0000000
--- a/public/assets/icons/file-audio-solid.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/public/assets/images/Cyberpunk.webp b/public/assets/images/Cyberpunk.webp
deleted file mode 100644
index bb0dfd5..0000000
Binary files a/public/assets/images/Cyberpunk.webp and /dev/null differ
diff --git a/public/assets/images/Drift.jpg b/public/assets/images/Drift.jpg
new file mode 100644
index 0000000..9fe9e29
Binary files /dev/null and b/public/assets/images/Drift.jpg differ
diff --git a/public/assets/images/Songbird.webp b/public/assets/images/Songbird.webp
new file mode 100644
index 0000000..e43a4b8
Binary files /dev/null and b/public/assets/images/Songbird.webp differ
diff --git a/public/assets/images/Spicy.png b/public/assets/images/Spicy.png
new file mode 100644
index 0000000..c190be6
Binary files /dev/null and b/public/assets/images/Spicy.png differ
diff --git a/public/assets/images/Vilbrequin.webp b/public/assets/images/Vilbrequin.webp
deleted file mode 100644
index 02c5d06..0000000
Binary files a/public/assets/images/Vilbrequin.webp and /dev/null differ
diff --git a/public/assets/images/spicy.webp b/public/assets/images/spicy.webp
deleted file mode 100644
index 2f83d64..0000000
Binary files a/public/assets/images/spicy.webp and /dev/null differ
diff --git a/public/assets/logo/Freedom Loader White.png b/public/assets/logo/Freedom Loader White.png
new file mode 100644
index 0000000..61dd582
Binary files /dev/null and b/public/assets/logo/Freedom Loader White.png differ
diff --git a/public/assets/logo/Freedom Loader.png b/public/assets/logo/Freedom Loader.png
new file mode 100644
index 0000000..a2d89b0
Binary files /dev/null and b/public/assets/logo/Freedom Loader.png differ
diff --git a/public/assets/logo/FreedomLoader2.png b/public/assets/logo/FreedomLoader2.png
new file mode 100644
index 0000000..bcf7375
Binary files /dev/null and b/public/assets/logo/FreedomLoader2.png differ
diff --git a/public/index.html b/public/index.html
index ab90727..f0eafd9 100644
--- a/public/index.html
+++ b/public/index.html
@@ -11,79 +11,80 @@
">
-
-
-
-
+
+ Thème :
+
+
-
- Freedom Loader
- Because why not?
-
-
-
+
+
-
+
diff --git a/public/script/chirac.js b/public/script/chirac.js
deleted file mode 100644
index fab95b6..0000000
--- a/public/script/chirac.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- This file is part of Freedom Loader.
-
- Copyright (C) 2025 MasterAcnolo
-
- Freedom Loader is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License.
-
- Freedom Loader is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-*/
-
-function Chirac(){
- const title = document.getElementById("title");
- title.innerHTML = "Chirac Loader";
-
- const subtitle = document.getElementById("subtitle");
- subtitle.innerHTML = "J'aime les pommes";
- subtitle.style.color= "black";
-
- document.body.style.backgroundImage = "url('assets/images/goat2.webp')";
- document.body.style.backgroundSize = "cover";
- document.body.style.backgroundPosition = "center";
- document.body.style.backgroundAttachment = "fixed";
-
- console.log("Je serai le président de tous les français");
-}
\ No newline at end of file
diff --git a/public/script/custompath.js b/public/script/custompath.js
index 54eaaea..4bb81ad 100644
--- a/public/script/custompath.js
+++ b/public/script/custompath.js
@@ -1,45 +1,15 @@
-/*
- This file is part of Freedom Loader.
-
- Copyright (C) 2025 MasterAcnolo
-
- Freedom Loader is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License.
-
- Freedom Loader is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-*/
-
-/*
- Ce script attend que le DOM soit complètement chargé pour initialiser
- l'affichage et la gestion du chemin de sauvegarde personnalisé.
-
- 1. Récupère le chemin de téléchargement par défaut depuis le main process via l'API exposée.
- 2. Met à jour le texte affiché dans l'élément avec l'id "savePath".
- 3. Crée un input caché nommé "savePath" dans le formulaire pour envoyer ce chemin lors du submit.
- 4. Ajoute un écouteur sur le bouton "changePath" pour permettre à l'utilisateur
- de choisir un dossier via une boîte de dialogue native.
- 5. Met à jour l'affichage et la valeur cachée du chemin sélectionné.
-*/
-
window.addEventListener("DOMContentLoaded", async () => {
const savePathElem = document.getElementById("savePath");
- // 1️Essayer de charger depuis le localStorage
+ // Essayer de charger depuis le localStorage
let savedPath = localStorage.getItem("customDownloadPath");
- // 2️Sinon demander le chemin par défaut à l'API Electron
+ // Sinon demander le chemin par défaut à l'API Electron
if (!savedPath) {
savedPath = await window.electronAPI.getDefaultDownloadPath();
}
- // 3 Afficher le chemin
+ // Afficher le chemin
if (savePathElem) {
savePathElem.textContent = savedPath;
}
diff --git a/public/script/customthemes.js b/public/script/customthemes.js
index 0510f8d..34b5ec0 100644
--- a/public/script/customthemes.js
+++ b/public/script/customthemes.js
@@ -1,107 +1,63 @@
-/*
- This file is part of Freedom Loader.
-
- Copyright (C) 2025 MasterAcnolo
-
- Freedom Loader is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License.
-
- Freedom Loader is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-*/
-
-// Liste des thèmes disponibles (clé = nom, valeur = label affiché)
const themes = {
- default: "Default",
- dark: "Sombre",
- light: "Clair",
- nf : "NF",
- chirac: "Chirac",
- fanatic: "Fanatic",
- cyberpunk: "Cyberpunk",
- spicy: "Spicy",
- vilbrequin: "Vilbrequin"
-};
-
-const themeSubtitles = {
- default: "Because why not?",
- dark: "Darkness is my ally",
- light: "Qui aime ce thème ?",
- nf : "You call it music, i call it my Therapist",
- chirac: "J'aime les pommes",
- fanatic: "Always Fnatic !",
- cyberpunk: "Wake up, choom. We’ve got a city to burn.",
- spicy: "The Spiciest One",
- vilbrequin: "Rend l'argent"
+ default: { label: "Default", subtitle: "Because why not?" },
+ dark: { label: "Sombre", subtitle: "Darkness is my ally" },
+ light: { label: "Clair", subtitle: "Qui aime ce thème ?" },
+ neon: { label: "Néon", subtitle: "How was your day ?"},
+ nf: { label: "NF", subtitle: "You call it music, i call it my Therapist" },
+ songbird: { label: "Songbird", subtitle: "From Her to Eternity" },
+ drift: { label: "Drift", subtitle: "Si la route t'appelle, contre appel" },
+ fanatic: { label: "Fanatic", subtitle: "Always Fnatic !" },
+ chirac: { label: "Chirac", subtitle: "J'aime les pommes" },
+ spicy: { label: "Spicy", subtitle: "The Spiciest One" },
};
const themeSelect = document.getElementById("themeSelect");
-// Remplir le select avec les options
function populateThemeSelect() {
- for (const [key, label] of Object.entries(themes)) {
+ for (const [themeKey, themeInfo] of Object.entries(themes)) {
const option = document.createElement("option");
- option.value = key;
- option.textContent = label;
+ option.value = themeKey;
+ option.textContent = themeInfo.label;
themeSelect.appendChild(option);
}
}
-// Appliquer le thème sur le body et changer le subtitle
-function applyTheme(themeName) {
- // Supprime les classes thème précédentes
+function applyTheme(themeKey) {
document.body.classList.remove(...Object.keys(themes));
- // Ajoute la classe du thème actuel
- document.body.classList.add(themeName);
+ document.body.classList.add(themeKey);
- // Modifier le subtitle
- const subtitle = document.getElementById("subtitle");
- if (subtitle && themeSubtitles[themeName]) {
- subtitle.textContent = themeSubtitles[themeName];
+ const subtitleElement = document.getElementById("subtitle");
+ if (subtitleElement && themes[themeKey]) {
+ subtitleElement.textContent = themes[themeKey].subtitle;
}
- // Optionnel : animation spéciale Chirac
- if (themeName === "chirac") {
- requestAnimationFrame(() => {
- document.body.classList.add("theme-active");
- });
- } else {
- document.body.classList.remove("theme-active");
- }
}
-// Sauvegarder le thème en localStorage
-function saveTheme(themeName) {
- localStorage.setItem("selectedTheme", themeName);
+function saveTheme(themeKey) {
+ localStorage.setItem("selectedTheme", themeKey);
}
-// Charger le thème au démarrage
function loadTheme() {
const savedTheme = localStorage.getItem("selectedTheme");
+
if (savedTheme && themes[savedTheme]) {
applyTheme(savedTheme);
themeSelect.value = savedTheme;
} else {
- applyTheme("dark");
+ applyTheme("dark"); // thème par défaut
themeSelect.value = "dark";
}
}
-// Quand l’utilisateur change le select
-themeSelect.addEventListener("change", (e) => {
- const selected = e.target.value;
- if (themes[selected]) {
- applyTheme(selected);
- saveTheme(selected);
+// Quand l'utilisateur change le thème depuis le select
+themeSelect.addEventListener("change", (event) => {
+ const selectedTheme = event.target.value;
+ if (themes[selectedTheme]) {
+ applyTheme(selectedTheme);
+ saveTheme(selectedTheme);
}
});
// Initialisation
populateThemeSelect();
-loadTheme();
+loadTheme();
\ No newline at end of file
diff --git a/public/script/downloadstatus.js b/public/script/downloadstatus.js
index 9f30b03..e3b6a23 100644
--- a/public/script/downloadstatus.js
+++ b/public/script/downloadstatus.js
@@ -1,73 +1,37 @@
-/*
- This file is part of Freedom Loader.
-
- Copyright (C) 2025 MasterAcnolo
-
- Freedom Loader is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License.
-
- Freedom Loader is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-*/
-
-// Récupération du formulaire de téléchargement
const form = document.getElementById("downloadForm");
-
-// Élément où on affichera l’état du téléchargement (en cours, erreur, succès)
const statusDiv = document.getElementById("downloadStatus");
-
-// Récupération du bouton de soumission pour pouvoir le désactiver pendant la requête
const button = form.querySelector("button");
-// Écouteur d’événement pour intercepter la soumission du formulaire
form.addEventListener("submit", async (e) => {
- e.preventDefault(); // Empêche le rechargement automatique de la page
+ e.preventDefault();
+ button.disabled = true; // Empêche les clics multiples
+ statusDiv.textContent = "Download in progress...";
- // Désactive le bouton pour éviter les clics multiples pendant la requête
- button.disabled = true;
-
- // Affiche un message d’attente pour informer l’utilisateur
- statusDiv.textContent = "Téléchargement en cours...";
-
- // Prépare les données du formulaire au format URL-encoded
const formData = new FormData(form);
const params = new URLSearchParams(formData);
try {
- // Envoie la requête POST vers /download avec les données du formulaire
const res = await fetch("/download", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: params,
});
- // Si la réponse n’est pas un succès (code HTTP 4xx ou 5xx)
if (!res.ok) {
- statusDiv.textContent = "❌ Erreur pendant le téléchargement.";
+ statusDiv.textContent = res;
return;
}
- // Récupère le texte envoyé par le serveur (message de succès ou erreur)
const text = await res.text();
-
- // Affiche le message retourné par le serveur
statusDiv.textContent = text;
+
} catch {
- // Gestion des erreurs réseau ou autres exceptions
- statusDiv.textContent = "❌ Une erreur s’est produite.";
+ statusDiv.textContent = "❌ An Error has Occured.";
} finally {
- // Réactive le bouton pour permettre d’autres soumissions
button.disabled = false;
- // Efface le message d’état après 5 secondes pour garder l’interface propre
setTimeout(() => {
statusDiv.textContent = "";
}, 5000);
}
-});
+});
\ No newline at end of file
diff --git a/public/script/fetchinfo.js b/public/script/fetchinfo.js
index 4287f97..bffb928 100644
--- a/public/script/fetchinfo.js
+++ b/public/script/fetchinfo.js
@@ -1,136 +1,180 @@
-/*
- This file is part of Freedom Loader.
+function formatDate(dateStr) {
+ if (!dateStr || dateStr.length !== 8) return "Inconnue";
+ return `${dateStr.slice(6,8)}/${dateStr.slice(4,6)}/${dateStr.slice(0,4)}`;
+}
- Copyright (C) 2025 MasterAcnolo
+function formatSize(bytes) {
+ return bytes ? (bytes / (1024*1024)).toFixed(2) + " Mo" : "Inconnue";
+}
- Freedom Loader is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License.
+async function fetchVideoInfo(url) {
+ try {
+ const res = await fetch("/info", {
+ method: "POST",
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
+ body: new URLSearchParams({ url }),
+ });
- Freedom Loader is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
+ if (!res.ok) return { error: `An Error occured when fetching info` };
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-*/
+ const data = await res.json();
+ if (!data) return { error: "Data is Missing" };
+
+ return data;
+ } catch (e) {
+ return { error: "Network or JSON Issue" };
+ }
+}
-// On attend que le DOM soit complètement chargé
document.addEventListener("DOMContentLoaded", () => {
- // Récupération des éléments du DOM pour interaction
const urlInput = document.getElementById("UrlInput");
const infoDiv = document.getElementById("videoInfo");
+ const loaderBox = document.getElementById("loaderBox");
- // Stocke la dernière URL fetchée pour éviter les requêtes répétées inutiles
let lastFetchedUrl = "";
- // Active les logs DEBUG pour le développement
- const DEBUG = true;
-
- // Écoute les changements dans l'input URL
urlInput.addEventListener("input", async () => {
const url = urlInput.value.trim();
- if (DEBUG) console.log("[DEBUG] Input détecté :", url);
-
- // Si l'URL est vide ou trop courte, on reset l'affichage
- if (!url || url.length < 5) {
- if (DEBUG) console.log("[DEBUG] URL vide ou trop courte, reset affichage.");
+ // Si champ vide -> reset total
+ if (!url || url.length < 2) {
infoDiv.innerHTML = "";
- infoDiv.classList.remove("visible");
+ infoDiv.classList.remove("visible", "playlist-mode");
lastFetchedUrl = "";
return;
}
- // Si l'URL est identique à la dernière requêtée, on ne refait pas la requête
- if (url === lastFetchedUrl) {
- if (DEBUG) console.log("[DEBUG] Même URL que précédemment, pas de fetch.");
+ if (url === lastFetchedUrl) return;
+ lastFetchedUrl = url;
+
+ loaderBox.style.display = "flex";
+ const data = await fetchVideoInfo(url);
+ loaderBox.style.display = "none";
+
+ // Gestion des erreurs
+ if (data.error) {
+ infoDiv.innerHTML = `
+
+ ${data.error}
+
+ `;
+ infoDiv.classList.add("visible");
+ infoDiv.classList.remove("playlist-mode");
+ loaderBox.style.display = "none";
return;
}
- // Mémorise l'URL actuelle comme dernière URL traitée
- lastFetchedUrl = url;
-
- try {
- if (DEBUG) console.log("[DEBUG] Envoi requête POST vers /info avec URL:", url);
-
- // Envoi de la requête POST pour récupérer les infos de la vidéo
- const res = await fetch("/info", {
- method: "POST",
- headers: { "Content-Type": "application/x-www-form-urlencoded" },
- body: new URLSearchParams({ url }),
- });
-
- if (DEBUG) console.log("[DEBUG] Réponse status:", res.status);
-
- // Si la réponse HTTP est une erreur, on affiche un message
- if (!res.ok) {
- console.error(`[ERROR] Réponse HTTP ${res.status}: ${res.statusText}`);
- infoDiv.innerHTML = "❌ Impossible de récupérer les infos (erreur serveur).";
- infoDiv.classList.remove("visible");
- return;
- }
-
- // Parse la réponse JSON contenant les infos vidéo
- const data = await res.json();
- if (DEBUG) console.log("[DEBUG] Données reçues:", data);
-
- // Vérification simple que les données attendues sont présentes
- if (!data || !data.title || !data.thumbnail) {
- console.warn("[WARNING] Données incomplètes", data);
- infoDiv.innerHTML = "❌ Données incomplètes reçues.";
- infoDiv.classList.remove("visible");
- return;
- }
-
- // Formatage de la durée en minutes et secondes
- const minutes = Math.floor(data.duration / 60);
- const seconds = data.duration % 60;
- const durationStr = `${minutes}m ${seconds.toString().padStart(2, "0")}s`;
-
- // Formatage de la date d'upload au format JJ/MM/AAAA
- const date = data.upload_date || "";
- const readableDate = date
- ? `${date.slice(6, 8)}/${date.slice(4, 6)}/${date.slice(0, 4)}`
- : "Inconnue";
-
- // Conversion taille approximative en Mo
- const sizeMB = data.filesize_approx
- ? (data.filesize_approx / (1024 * 1024)).toFixed(2) + " Mo"
- : "Inconnue";
-
- // Gestion des catégories, affichage par défaut si absentes
- const categories = data.categories
- ? data.categories.join(", ")
- : "Non spécifiées";
-
- // Construction du HTML pour afficher les informations de la vidéo
+ // ---------- PLAYLIST ----------
+ if (data.type === "playlist") {
+ infoDiv.classList.add("playlist-mode");
infoDiv.innerHTML = `
- ${data.title}
-
-
- Durée : ${durationStr}
- Uploader : ${data.uploader || "Inconnu"}
- Date d’upload : ${readableDate}
- Vues : ${data.view_count?.toLocaleString() || "?"}
- Likes : ${data.like_count?.toLocaleString() || "?"}
- URL : ${data.webpage_url}
- Channel : ${data.channel_url}
- Taille estimée : ${sizeMB}
- Catégories : ${categories}
-
+ Playlist Detected: ${data.title}
+ Video Count: ${data.count}
+ Channel : ${data.channel || "Unknown"}
+
`;
- // Affiche la div contenant les infos
- infoDiv.classList.add("visible");
+ const listDiv = document.getElementById("playlistVideos");
- if (DEBUG) console.log("[DEBUG] Info affichée avec succès.");
- } catch (e) {
- // En cas d'erreur réseau ou JSON, on affiche un message d'erreur
- console.error("[CRITICAL] Erreur lors de la récupération:", e);
- infoDiv.innerHTML = "❌ Erreur réseau ou JSON.";
- infoDiv.classList.remove("visible");
+ data.videos.forEach(v => {
+ const durationStr = v.duration
+ ? `${Math.floor(v.duration / 60)}m ${(v.duration % 60).toString().padStart(2,"0")}s` : "Inconnue";
+
+ const videoUrl = v.id ? `https://www.youtube.com/watch?v=${v.id}` : v.url;
+
+ listDiv.innerHTML += `
+
+
+
${v.title}
+
Duration : ${durationStr}
+
URL
+ 📋
+
+
+ `;
+ });
+
+ // Gestion du bouton copier
+ listDiv.addEventListener("click", (event) => {
+ if (event.target.classList.contains("copy-btn")) {
+ const btn = event.target;
+ if (btn.disabled) return;
+
+ btn.disabled = true;
+ const url = btn.dataset.url;
+ navigator.clipboard.writeText(url)
+ .then(() => {
+ const original = btn.textContent;
+
+ btn.style.opacity = 0;
+ btn.style.transform = "scale(0.7)";
+
+ setTimeout(() => {
+ btn.textContent = "✅";
+ btn.style.opacity = 1;
+ btn.style.transform = "scale(1)";
+
+ setTimeout(() => {
+ btn.style.opacity = 0;
+ btn.style.transform = "scale(0.7)";
+
+ setTimeout(() => {
+ btn.textContent = original;
+ btn.style.opacity = 1;
+ btn.style.transform = "scale(1)";
+ btn.disabled = false;
+ }, 300);
+
+ }, 1000);
+
+ }, 300);
+ })
+ .catch(() => {
+ const original = btn.textContent;
+ btn.textContent = "❌";
+ setTimeout(() => {
+ btn.textContent = original;
+ btn.disabled = false;
+ }, 1500);
+ });
+ }
+ });
+
+ infoDiv.classList.add("visible");
+ return;
}
+
+ infoDiv.classList.remove("playlist-mode");
+
+ // ---------- VIDEO NORMALE ----------
+ const durationStr = data.duration
+ ? `${Math.floor(data.duration/60)}m ${(data.duration%60).toString().padStart(2,"0")}s`
+ : "Unknown";
+
+ const sizeStr = formatSize(data.filesize_approx);
+ const readableDate = formatDate(data.upload_date);
+ const categories = data.categories?.join(", ") || "Non spécifiées";
+
+ infoDiv.innerHTML = `
+ ${data.title}
+
+
+ Duration : ${durationStr}
+ Uploader : ${data.uploader || "Inconnu"}
+ Upload Date : ${readableDate}
+ Views : ${data.view_count?.toLocaleString() || "?"}
+ Likes : ${data.like_count?.toLocaleString() || "?"}
+ URL : ${data.webpage_url}
+ Channel : ${data.channel_url}
+ Estimed Size : ${sizeStr}
+ Category : ${categories}
+
+ `;
+
+ infoDiv.classList.add("visible");
});
-});
+
+})
\ No newline at end of file
diff --git a/public/script/progressBar.js b/public/script/progressBar.js
new file mode 100644
index 0000000..4deb4f3
--- /dev/null
+++ b/public/script/progressBar.js
@@ -0,0 +1,63 @@
+const progressWrapper = document.getElementById("downloadProgressWrapper");
+const progressBar = document.getElementById("downloadProgress");
+const progressBarText = document.getElementById("downloadProgressText")
+
+const speedElement = document.getElementById("downloadSpeedText");
+const speedEvt = new EventSource("/download/speed");
+
+function startProgress() {
+ progressWrapper.style.display = "block";
+ progressBar.style.width = "0%";
+ progressBarText.style.display = "block";
+ progressBarText.innerHTML = "0%";
+
+ speedElement.style.display = "block";
+ speedElement.innerHTML = "0 Mib/s";
+}
+
+function updateProgress(percent) {
+ progressBar.style.width = `${percent}%`;
+ progressBarText.innerHTML = `${percent}%`;
+}
+
+function resetProgress() {
+ progressBar.style.width = "0%";
+ progressBarText.textContent = "";
+ progressBarText.style.display = "none";
+ progressWrapper.style.display = "none";
+
+ speedElement.textContent = "0 Mib/s";
+ speedElement.style.display = "none";
+}
+
+// Connexion SSE
+const evtSource = new EventSource("/download/progress");
+evtSource.onmessage = e => {
+ if (e.data === "reset") {
+ startProgress();
+ window.electronAPI.setProgress(0);
+ return;
+ }
+
+ if (e.data === "done") {
+ resetProgress();
+ window.electronAPI.setProgress(-1);
+ return;
+ }
+
+ const percent = parseFloat(e.data);
+
+ if (!isNaN(percent)) {
+ updateProgress(percent);
+ window.electronAPI.setProgress(percent); // update barre des tâches
+ if (percent >= 100) setTimeout(() => {
+ resetProgress();
+ window.electronAPI.setProgress(-1); // retire la barre
+ }, 500);
+ }
+};
+
+speedEvt.onmessage = e => {
+ speedElement.style.display = "block";
+ speedElement.textContent = e.data; // ex: "5.2MiB/s"
+};
\ No newline at end of file
diff --git a/public/styles/components/loader.css b/public/styles/components/loader.css
new file mode 100644
index 0000000..812b5a3
--- /dev/null
+++ b/public/styles/components/loader.css
@@ -0,0 +1,34 @@
+.loader-box {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 10px 20px;
+ background: var(--form-bg-color);
+ border: 2px solid var(--mp3-text-color);
+ border-radius: 8px;
+ color: var(--mp3-text-color);
+ font-weight: bold;
+ animation: pulse 1.2s infinite;
+}
+
+.loader-box div {
+ width: 10px;
+ height: 10px;
+ background: var(--form-button-bg-color);
+ border-radius: 3px;
+ animation: bounce 1.2s infinite;
+}
+
+.loader-box div:nth-child(1) { animation-delay: 0s; }
+.loader-box div:nth-child(2) { animation-delay: 0.2s; }
+.loader-box div:nth-child(3) { animation-delay: 0.4s; }
+
+@keyframes bounce {
+ 0%, 80%, 100% { transform: scale(0); }
+ 40% { transform: scale(1); }
+}
+
+@keyframes pulse {
+ 0%, 100% { box-shadow: 0 0 5px var(--form-button-bg-color); }
+ 50% { box-shadow: 0 0 20px var(--form-button-bg-color); }
+}
diff --git a/public/styles/components/progressBar.css b/public/styles/components/progressBar.css
new file mode 100644
index 0000000..7a38726
--- /dev/null
+++ b/public/styles/components/progressBar.css
@@ -0,0 +1,41 @@
+/* Wrapper de la barre de téléchargement */
+#downloadProgressWrapper {
+ width: 100%;
+ max-width: 400px;
+ height: 12px;
+ background-color: #444;
+ border-radius: 6px;
+ overflow: hidden;
+ margin: 10px auto;
+ display: none;
+ box-shadow: inset 0 1px 3px rgba(0,0,0,0.5);
+}
+
+/* Barre de progression */
+#downloadProgress {
+ height: 100%;
+ width: 0%;
+ background-color: var(--video-info-link-color, #4caf50);
+ border-radius: 6px 0 0 6px;
+ transition: width 0.2s ease;
+}
+
+#downloadProgressText, #downloadSpeedText {
+ text-align: center;
+ font-size: 0.8rem;
+ color: #fff;
+ content: "";
+
+}
+
+/* Responsive pour mobile */
+@media (max-width: 480px) {
+ #downloadProgressWrapper {
+ max-width: 90%;
+ height: 10px;
+ }
+
+ #downloadProgressText, #downloadSpeedText {
+ font-size: 0.7rem;
+ }
+}
diff --git a/public/styles/layout/container.css b/public/styles/layout/container.css
index bcf2d87..14e1ad4 100644
--- a/public/styles/layout/container.css
+++ b/public/styles/layout/container.css
@@ -3,10 +3,23 @@
top: 0;
left: 0;
right: 0;
- /* height: 10000px; */
padding: 1em;
z-index: 1000;
display: flex;
flex-direction: column;
align-items: center;
}
+
+#downloadStatus {
+ margin-top: 1em;
+ min-height: 1.5em;
+ font-weight: bold;
+ text-align: center;
+ color: var(--download-status-color);
+}
+
+label {
+ display: flex;
+ align-items: center;
+ font-size: 0.9em;
+}
\ No newline at end of file
diff --git a/public/styles/layout/ctr-infos.css b/public/styles/layout/ctr-infos.css
deleted file mode 100644
index 1eb8e74..0000000
--- a/public/styles/layout/ctr-infos.css
+++ /dev/null
@@ -1,14 +0,0 @@
-#downloadStatus {
-
- margin-top: 1em;
- min-height: 1.5em;
- font-weight: bold;
- text-align: center;
- color: var(--download-status-color);
-}
-
-label {
- display: flex;
- align-items: center;
- font-size: 0.9em;
-}
\ No newline at end of file
diff --git a/public/styles/layout/videoinfo.css b/public/styles/layout/videoinfo.css
index 4ed8b11..743dc00 100644
--- a/public/styles/layout/videoinfo.css
+++ b/public/styles/layout/videoinfo.css
@@ -21,7 +21,6 @@
#videoInfo.visible {
opacity: 1;
max-height: 1500px;
- overflow: visible;
}
#videoInfo h3 {
@@ -68,6 +67,81 @@
text-decoration: underline;
}
+/* --- Playlist Mode --- */
+#videoInfo.playlist-mode {
+ max-width: 900px;
+}
+
+/* Style du bloc "Playlist détectée" */
+#videoInfo.playlist-mode > p {
+ text-align: center;
+ font-size: 1.1rem;
+ font-weight: 600;
+}
+
+/* Layout liste des vidéos */
+#playlistVideos {
+ margin-top: 1em;
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ gap: 18px;
+}
+
+/* Un item de playlist */
+#playlistVideos > div {
+ background: var(--playlist-background-color);
+ border-radius: 10px;
+ padding: 10px;
+ box-shadow: 0 4px 12px rgba(0,0,0,0.15);
+ text-align: center;
+ transition: transform 0.2s ease;
+}
+
+#playlistVideos > div p {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-wrap: wrap;
+}
+
+#videoInfo.playlist-mode {
+ max-width: 95%;
+}
+
+#playlistVideos > div:hover {
+ transform: scale(1.05);
+}
+
+#playlistVideos img {
+ width: 100%;
+ border-radius: 8px;
+ margin-bottom: 8px;
+}
+
+.copy-btn {
+ all: unset;
+ background: transparent;
+ border: none;
+ cursor: pointer;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 4px;
+ vertical-align: middle;
+ transition: transform 0.1s ease, color 0.1s ease, opacity 0.15s ease;
+ font-size: 1em;
+}
+
+#playlistVideos > div p a{
+ text-decoration: none;
+ color: var(--video-info-link-color);
+}
+
+#playlistVideos > div p a:hover{
+ text-decoration: underline;
+}
+
+
/* Responsive */
@media (max-width: 480px) {
#videoInfo {
diff --git a/public/styles/styles.css b/public/styles/styles.css
index 16c0fa0..d0a3261 100644
--- a/public/styles/styles.css
+++ b/public/styles/styles.css
@@ -1,13 +1,17 @@
+/* Layout */
@import url("layout/form.css");
@import url("layout/container.css");
-@import url("layout/ctr-infos.css");
@import url("layout/header.css");
@import url("layout/videoinfo.css");
+
+/* Components */
@import url("components/checkbox.css");
@import url("components/themebutton.css");
-/* @import url("variables.css"); */
+@import url("components/loader.css");
+
@import url("theme/themeimport.css");
@import url("components/editpathbutton.css");
+@import url("components/progressBar.css");
@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');
@@ -24,7 +28,7 @@ html,body{
margin: 0;
padding: 0;
scroll-behavior: smooth;
- /* outline: 2px solid red; */ /*<-- Utile pour le début ça */
+ /*outline: 2px solid red; /*<-- Utile pour le debug ça */
font-family: "Poppins", sans-serif;
font-weight: 500;
font-style: normal;
@@ -33,10 +37,6 @@ html,body{
body {
margin: 0;
background-color: var(--background-color);
- /* background-image: linear-gradient(to left top, #838383, #a1a1a1, #bfbfbf, #dfdfdf, #ffffff);
- background-size: cover;
- background-position: center;
- background-attachment: fixed; */
width: 100%;
height: 100%;
color: var(--default-text-color);
@@ -46,7 +46,6 @@ body {
display: flex;
flex-direction: column;
align-items: center;
-
}
diff --git a/public/styles/theme/chirac-theme.css b/public/styles/theme/chirac-theme.css
index 8efbaac..daee9f3 100644
--- a/public/styles/theme/chirac-theme.css
+++ b/public/styles/theme/chirac-theme.css
@@ -1,16 +1,15 @@
body.chirac {
- /* Background image Chirac */
+
background-image: url('../../assets/images/Chirac.png');
- /* background-position: right; */
background-repeat: no-repeat;
background-size: cover;
background-attachment: fixed;
- /* Couleurs drapeau français */
- --background-color: rgba(255, 255, 255, 0.85); /* blanc légèrement transparent pour lisibilité */
- --default-text-color: #002395; /* bleu foncé */
- --subtitle-color: #EF4135; /* rouge vif */
- --mp3-text-color: #002395; /* bleu */
+
+ --background-color: rgba(255, 255, 255, 0.85);
+ --default-text-color: #002395;
+ --subtitle-color: #EF4135;
+ --mp3-text-color: #002395;
/* Formulaire */
--form-bg-color: rgba(255, 255, 255, 0.9);
@@ -19,9 +18,9 @@ body.chirac {
--form-input-border-focus-color: #EF4135;
--form-input-text-color: #002395;
--form-input-placeholder-color: #999999;
- --form-button-bg-color: #002395; /* bleu */
+ --form-button-bg-color: #002395;
--form-button-text-color: #ffffff;
- --form-button-bg-hover-color: #EF4135; /* rouge */
+ --form-button-bg-hover-color: #EF4135;
/* Checkbox */
--checkbox-bg-default: #cccccc;
@@ -34,21 +33,17 @@ body.chirac {
/* Video Info Box */
--infos-box-color: rgba(255, 255, 255, 0.9);
- --video-info-text-color: #002395;
+ --video-info-text-color: #000000;
--video-info-heading-color: #EF4135;
--video-info-list-color: #444444;
--video-info-list-strong-color: #000000;
--video-info-link-color: #002395;
--video-info-link-hover-color: #EF4135;
- /* animation d'apparition */
- opacity: 0;
- transition: opacity 0.8s ease, background-color 0.8s ease;
+ /* Playlist Color */
+ --playlist-background-color: #d1d1d1ca;
}
-body.chirac.theme-active {
- opacity: 1;
-}
/*
diff --git a/public/styles/theme/cyberpunk-theme.css b/public/styles/theme/cyberpunk-theme.css
deleted file mode 100644
index 0cecee6..0000000
--- a/public/styles/theme/cyberpunk-theme.css
+++ /dev/null
@@ -1,45 +0,0 @@
-body.cyberpunk {
- /* Couleurs générales */
- --background-color: #0d0d0d; /* noir profond */
- --default-text-color: #e0e0e0; /* texte gris clair */
- --subtitle-color: #ffea00; /* turquoise néon pour les sous-titres */
- --mp3-text-color: #ffea00; /* jaune vif pour la checkbox */
-
- /* Formulaire */
- --form-bg-color: #141414; /* fond formulaire sombre */
- --form-input-bg-color: #1a1a1a; /* inputs sombres */
- --form-input-border-color: #333333; /* bordure sobre */
- --form-input-border-focus-color: #ffea00; /* focus jaune néon */
- --form-input-text-color: #e0e0e0; /* texte clair */
- --form-input-placeholder-color: #777777; /* placeholder plus doux */
- --form-button-bg-color: #ffea00; /* bouton jaune */
- --form-button-text-color: #0d0d0d; /* texte bouton noir */
- --form-button-bg-hover-color: #d4c000; /* hover jaune plus foncé */
-
- /* Checkbox */
- --checkbox-bg-default: #333333; /* fond checkbox sobre */
- --checkbox-bg-checked: #ffea00; /* coché en jaune vif */
- --checkbox-checkmark-border-color: #0d0d0d; /* checkmark noir */
- --checkbox-pulse-color: rgba(255, 234, 0, 0.5); /* pulse néon jaune */
-
- /* Download status */
- --download-status-color: #fffbd1; /* turquoise néon */
-
- /* Video Info Box */
- --infos-box-color: #1a1a1a; /* fond infos */
- --video-info-text-color: #e0e0e0; /* texte clair */
- --video-info-heading-color: #ffea00; /* titres turquoise néon */
- --video-info-list-color: #cccccc; /* texte liste gris clair */
- --video-info-list-strong-color: #ffffff; /* texte important blanc */
- --video-info-link-color: #ffea00; /* liens jaune néon */
- --video-info-link-hover-color: #d4c000; /* liens hover plus foncé */
-}
-
-body.cyberpunk {
- background-image: url('../../assets/images/Cyberpunk.webp');
- background-size: cover;
- background-position: center;
- background-repeat: no-repeat;
- background-attachment: fixed;
-}
-
diff --git a/public/styles/theme/dark-theme.css b/public/styles/theme/dark-theme.css
index 534b815..b259c33 100644
--- a/public/styles/theme/dark-theme.css
+++ b/public/styles/theme/dark-theme.css
@@ -33,4 +33,7 @@ body.dark {
--video-info-list-strong-color: #ffffff;
--video-info-link-color: #2196f3;
--video-info-link-hover-color: #1976d2;
+
+ /* Playlist Color */
+ --playlist-background-color: #303030;
}
diff --git a/public/styles/theme/default-theme.css b/public/styles/theme/default-theme.css
index a3fa903..a3d2017 100644
--- a/public/styles/theme/default-theme.css
+++ b/public/styles/theme/default-theme.css
@@ -26,13 +26,16 @@
--download-status-color: #007bff;
/* Video Info Box */
- --infos-box-color: #f0f0f0;
- --video-info-text-color: #222222;
+ --infos-box-color: #0c0140;
+ --video-info-text-color: #ffffff;
--video-info-heading-color: #007bff;
--video-info-list-color: #444444;
--video-info-list-strong-color: #000000;
--video-info-link-color: #007bff;
--video-info-link-hover-color: #0056b3;
+
+ /* Playlist Color */
+ --playlist-background-color: #070823a3;
}
body.default .download-path #savePath {
diff --git a/public/styles/theme/drift-theme.css b/public/styles/theme/drift-theme.css
new file mode 100644
index 0000000..9d318a7
--- /dev/null
+++ b/public/styles/theme/drift-theme.css
@@ -0,0 +1,51 @@
+body.drift {
+
+ background-image: url('../../assets/images/Drift.jpg');
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+
+ /* Palette principale */
+ --background-color: #0f1218;
+ --default-text-color: #3d4b61;
+ --subtitle-color: #1a1a1a;
+ --mp3-text-color: #c0d4ff;
+
+ /* Formulaire */
+ --form-bg-color: #1e222a;
+ --form-input-bg-color: #13171d;
+ --form-input-border-color: #3b4b6d;
+ --form-input-border-focus-color: #6ea8ff;
+ --form-input-text-color: #f0f4ff;
+ --form-input-placeholder-color: #7a8fae;
+ --form-button-bg-color: #2a2979;
+ --form-button-text-color: #ffffff;
+ --form-button-bg-hover-color: #353393;
+
+ /* Checkbox */
+ --checkbox-bg-default: #2a2e38;
+ --checkbox-bg-checked: #2a2979;
+ --checkbox-checkmark-border-color: #ffffff;
+ --checkbox-pulse-color: rgba(76,108,255,0.3);
+
+ /* Download status */
+ --download-status-color: #ff8e8e;
+
+ /* Video Info Box */
+ --infos-box-color: #1e222ad0;
+ --video-info-text-color: #e8e8f0;
+ --video-info-heading-color: #9ab6ff;
+ --video-info-list-color: #c0d4ff;
+ --video-info-list-strong-color: #ffffff;
+ --video-info-link-color: #4c6cff;
+ --video-info-link-hover-color: #6c8dff;
+
+ /* Playlist Color */
+ --playlist-background-color: #424b5cc2;
+ }
+
+
+
+body.drift .download-path{
+ color: #ededed;
+}
diff --git a/public/styles/theme/fanatic-theme.css b/public/styles/theme/fanatic-theme.css
index 8553866..3f8ff0c 100644
--- a/public/styles/theme/fanatic-theme.css
+++ b/public/styles/theme/fanatic-theme.css
@@ -1,36 +1,39 @@
body.fanatic{
/* Couleurs générales */
- --background-color: #121212; /* fond bleu nuit/noir */
- --default-text-color: #eee; /* texte clair principal */
- --subtitle-color: #FF5900; /* sous-titres, accent orange vif */
- --mp3-text-color: #ffffff; /* texte checkbox inline */
+ --background-color: #121212;
+ --default-text-color: #eee;
+ --subtitle-color: #FF5900;
+ --mp3-text-color: #ffffff;
/* Formulaire */
- --form-bg-color: #1e1e1e; /* fond formulaire sombre */
- --form-input-bg-color: #2b2b2b; /* fond inputs sombres */
- --form-input-border-color: #333333; /* bordure inputs */
- --form-input-border-focus-color: #FF5900; /* bordure focus orange */
- --form-input-text-color: #eeeeee; /* texte inputs clair */
- --form-input-placeholder-color: #666666; /* placeholder gris foncé */
- --form-button-bg-color: #FF5900; /* bouton orange */
- --form-button-text-color: #121212; /* texte bouton sombre */
- --form-button-bg-hover-color: #e65500; /* bouton hover orange foncé */
+ --form-bg-color: #1e1e1e;
+ --form-input-bg-color: #2b2b2b;
+ --form-input-border-color: #333333;
+ --form-input-border-focus-color: #FF5900;
+ --form-input-text-color: #eeeeee;
+ --form-input-placeholder-color: #666666;
+ --form-button-bg-color: #FF5900;
+ --form-button-text-color: #121212;
+ --form-button-bg-hover-color: #e65500;
/* Checkbox */
- --checkbox-bg-default: #555555; /* gris moyen */
- --checkbox-bg-checked: #ff6600; /* orange vif */
- --checkbox-checkmark-border-color: #eee; /* blanc cassé */
- --checkbox-pulse-color: rgba(255, 102, 0, 0.5); /* pulse orange translucide */
+ --checkbox-bg-default: #555555;
+ --checkbox-bg-checked: #ff6600;
+ --checkbox-checkmark-border-color: #eee;
+ --checkbox-pulse-color: rgba(255, 102, 0, 0.5);
/* Download status */
- --download-status-color: #FF5900; /* orange */
+ --download-status-color: #FF5900;
/* Video Info Box */
- --infos-box-color: #222222; /* fond infos sombre */
- --video-info-text-color: #eee; /* texte clair */
- --video-info-heading-color: #FF5900; /* titres orange */
- --video-info-list-color: #ccc; /* texte liste gris clair */
- --video-info-list-strong-color: #fff; /* texte important blanc */
- --video-info-link-color: #FF5900; /* liens orange */
- --video-info-link-hover-color: #e65500; /* liens hover orange foncé */
+ --infos-box-color: #222222;
+ --video-info-text-color: #eee;
+ --video-info-heading-color: #FF5900;
+ --video-info-list-color: #ccc;
+ --video-info-list-strong-color: #fff;
+ --video-info-link-color: #FF5900;
+ --video-info-link-hover-color: #e65500;
+
+ /* Playlist Color */
+ --playlist-background-color: #2b2b2b;
}
diff --git a/public/styles/theme/light-theme.css b/public/styles/theme/light-theme.css
index cd562b7..862f47d 100644
--- a/public/styles/theme/light-theme.css
+++ b/public/styles/theme/light-theme.css
@@ -1,20 +1,20 @@
body.light {
/* Couleurs générales */
- --background-color: #dadada; /* fond clair */
- --default-text-color: #222222; /* texte sombre */
- --subtitle-color: #007bff; /* bleu accent */
- --mp3-text-color: #000000; /* texte checkbox */
+ --background-color: #dadada;
+ --default-text-color: #222222;
+ --subtitle-color: #007bff;
+ --mp3-text-color: #000000;
/* Formulaire */
- --form-bg-color: #ffffff; /* fond formulaire blanc */
- --form-input-bg-color: #fafafa; /* fond inputs */
- --form-input-border-color: #cccccc; /* bordure inputs */
- --form-input-border-focus-color: #007bff; /* focus bleu */
- --form-input-text-color: #333333; /* texte inputs */
- --form-input-placeholder-color: #888888; /* placeholder */
- --form-button-bg-color: #007bff; /* bouton bleu */
- --form-button-text-color: #ffffff; /* texte bouton */
- --form-button-bg-hover-color: #0056b3; /* hover bleu foncé */
+ --form-bg-color: #ffffff;
+ --form-input-bg-color: #fafafa;
+ --form-input-border-color: #cccccc;
+ --form-input-border-focus-color: #007bff;
+ --form-input-text-color: #333333;
+ --form-input-placeholder-color: #888888;
+ --form-button-bg-color: #007bff;
+ --form-button-text-color: #ffffff;
+ --form-button-bg-hover-color: #0056b3;
/* Checkbox */
--checkbox-bg-default: #cccccc;
@@ -33,4 +33,7 @@ body.light {
--video-info-list-strong-color: #000000;
--video-info-link-color: #007bff;
--video-info-link-hover-color: #0056b3;
+
+ /* Playlist Color */
+ --playlist-background-color: #c5c5c5b2;
}
diff --git a/public/styles/theme/neon-theme.css b/public/styles/theme/neon-theme.css
new file mode 100644
index 0000000..987cd83
--- /dev/null
+++ b/public/styles/theme/neon-theme.css
@@ -0,0 +1,50 @@
+body.neon {
+
+ background: (url("../../assets/images/drift.jpg"));
+ background-image: linear-gradient(135deg, #0f0c29, #302b63, #24243e); /* dégradé sombre violet/bleu */
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+
+ /* Couleurs générales */
+ --background-color: #1b1b2f;
+ --default-text-color: #e0e0ff;
+ --subtitle-color: #a3a3ff;
+ --mp3-text-color: #c0c0ff;
+
+ /* Formulaire */
+ --form-bg-color: #2c2c4a;
+ --form-input-bg-color: #1f1f3a;
+ --form-input-border-color: #5858f0;
+ --form-input-border-focus-color: #a3a3ff;
+ --form-input-text-color: #ffffff;
+ --form-input-placeholder-color: #8888ff;
+ --form-button-bg-color: #5858f0;
+ --form-button-text-color: #ffffff;
+ --form-button-bg-hover-color: #7a7aff;
+
+ /* Checkbox */
+ --checkbox-bg-default: #302b63;
+ --checkbox-bg-checked: #5858f0;
+ --checkbox-checkmark-border-color: #ffffff;
+ --checkbox-pulse-color: rgba(88,88,240,0.3);
+
+ /* Download status */
+ --download-status-color: #a3a3ff;
+
+ /* Video Info Box */
+ --infos-box-color: #2c2c4a;
+ --video-info-text-color: #e0e0ff;
+ --video-info-heading-color: #a3a3ff;
+ --video-info-list-color: #c0c0ff;
+ --video-info-list-strong-color: #ffffff;
+ --video-info-link-color: #5858f0;
+ --video-info-link-hover-color: #7a7aff;
+
+ /* Playlist Color */
+ --playlist-background-color: #3e3e64;
+}
+
+body.neon .download-path {
+ color: var(--default-text-color);
+}
diff --git a/public/styles/theme/nf-theme.css b/public/styles/theme/nf-theme.css
index 198b6a7..65b086a 100644
--- a/public/styles/theme/nf-theme.css
+++ b/public/styles/theme/nf-theme.css
@@ -1,46 +1,47 @@
body.nf {
- /* Couleurs générales */
- --background-color: #1a1a1a; /* fond sombre neutre */
- --default-text-color: #e6dfd5; /* texte beige clair */
- --subtitle-color: #f5f0e6; /* beige très clair (titres) */
- --mp3-text-color: #d8cfc2; /* texte checkbox */
- /* Formulaire */
- --form-bg-color: #2a2a2a; /* fond formulaire gris sombre */
- --form-input-bg-color: #222222; /* fond inputs sombre */
- --form-input-border-color: #4a4036; /* bordure beige/brun */
- --form-input-border-focus-color: #cbb89d; /* beige doré en focus */
- --form-input-text-color: #f0e8dd; /* texte clair/beige */
- --form-input-placeholder-color: #9a8f80; /* placeholder beige/gris */
- --form-button-bg-color: #cbb89d; /* bouton beige doré */
- --form-button-text-color: #1a1a1a; /* texte sombre */
- --form-button-bg-hover-color: #b7a588; /* hover beige plus foncé */
-
- /* Checkbox */
- --checkbox-bg-default: #4a4036; /* brun/gris */
- --checkbox-bg-checked: #cbb89d; /* beige doré */
- --checkbox-checkmark-border-color: #1a1a1a; /* noir profond */
- --checkbox-pulse-color: rgba(203,184,157,0.3); /* halo beige doux */
-
- /* Download status */
- --download-status-color: #cbb89d; /* beige doré */
-
- /* Video Info Box */
- --infos-box-color: #2a2a2a; /* fond sombre */
- --video-info-text-color: #e6dfd5; /* texte beige clair */
- --video-info-heading-color: #f5f0e6; /* titres beige clair */
- --video-info-list-color: #d8cfc2; /* texte liste */
- --video-info-list-strong-color: #ffffff; /* texte fort blanc cassé */
- --video-info-link-color: #cbb89d; /* liens beige doré */
- --video-info-link-hover-color: #b7a588; /* hover beige plus foncé */
-}
-
-/* Fond inspiré de ton image beige */
-body.nf {
- background-image: url('../../assets/images/NF.jpg'); /* mets ton image ici */
+ background-image: url('../../assets/images/NF.jpg');
background-size: cover;
background-position: 70% center;
background-attachment: fixed;
+
+ /* Couleurs générales */
+ --background-color: #1a1a1a;
+ --default-text-color: #e6dfd5;
+ --subtitle-color: #f5f0e6;
+ --mp3-text-color: #d8cfc2;
+
+ /* Formulaire */
+ --form-bg-color: #2a2a2a;
+ --form-input-bg-color: #222222;
+ --form-input-border-color: #4a4036;
+ --form-input-border-focus-color: #cbb89d;
+ --form-input-text-color: #f0e8dd;
+ --form-input-placeholder-color: #9a8f80;
+ --form-button-bg-color: #cbb89d;
+ --form-button-text-color: #1a1a1a;
+ --form-button-bg-hover-color: #b7a588;
+
+ /* Checkbox */
+ --checkbox-bg-default: #4a4036;
+ --checkbox-bg-checked: #cbb89d;
+ --checkbox-checkmark-border-color: #1a1a1a;
+ --checkbox-pulse-color: rgba(203,184,157,0.3);
+
+ /* Download status */
+ --download-status-color: #cbb89d;
+
+ /* Video Info Box */
+ --infos-box-color: #2a2a2a;
+ --video-info-text-color: #e6dfd5;
+ --video-info-heading-color: #f5f0e6;
+ --video-info-list-color: #d8cfc2;
+ --video-info-list-strong-color: #ffffff;
+ --video-info-link-color: #cbb89d;
+ --video-info-link-hover-color: #b7a588;
+
+ /* Playlist Color */
+ --playlist-background-color: #4f4f4f;
}
body.nf .download-path {
diff --git a/public/styles/theme/songbird-theme.css b/public/styles/theme/songbird-theme.css
new file mode 100644
index 0000000..3eaaab3
--- /dev/null
+++ b/public/styles/theme/songbird-theme.css
@@ -0,0 +1,49 @@
+body.songbird {
+
+ background-image: url('../../assets/images/Songbird.webp');
+ background-size: cover;
+ background-position: center center;
+ background-attachment: fixed;
+
+ /* Couleurs générales */
+ --background-color: #0a0a0a; /* noir profond */
+ --default-text-color: #ff2a2a; /* rouge néon */
+ --subtitle-color: #f2f2f2; /* rouge sombre */
+ --mp3-text-color: #ff4d4d; /* rouge un peu plus clair */
+
+ /* Formulaire */
+ --form-bg-color: rgba(20,0,0,0.85); /* noir semi-transparent avec rouge */
+ --form-input-bg-color: #1a0a0a;
+ --form-input-border-color: #ff2a2a;
+ --form-input-border-focus-color: #b30000;
+ --form-input-text-color: #ffffff;
+ --form-input-placeholder-color: #950404;
+ --form-button-bg-color: #b30000;
+ --form-button-text-color: #ffffff;
+ --form-button-bg-hover-color: #ff2a2a;
+
+ /* Checkbox */
+ --checkbox-bg-default: #630000;
+ --checkbox-bg-checked: #ff2a2a;
+ --checkbox-checkmark-border-color: #ffffff;
+ --checkbox-pulse-color: rgba(255,42,42,0.3);
+
+ /* Download status */
+ --download-status-color: #ff2a2a;
+
+ /* Video Info Box */
+ --infos-box-color: rgba(30,0,0,0.9);
+ --video-info-text-color: #ff4d4d;
+ --video-info-heading-color: #ff2a2a;
+ --video-info-list-color: #b30000;
+ --video-info-list-strong-color: #ffffff;
+ --video-info-link-color: #ff2a2a;
+ --video-info-link-hover-color: #b30000;
+
+ /* Playlist Color */
+ --playlist-background-color: #3f0000;
+}
+
+body.cyberpunk .download-path {
+ color: var(--default-text-color);
+}
diff --git a/public/styles/theme/spicy-theme.css b/public/styles/theme/spicy-theme.css
index 948f133..3866a59 100644
--- a/public/styles/theme/spicy-theme.css
+++ b/public/styles/theme/spicy-theme.css
@@ -1,50 +1,47 @@
-/*
-
-
-
-*/
-
body.spicy {
- /* Couleurs générales */
- --background-color: #121212; /* fond noir profond */
- --default-text-color: #581010; /* texte clair */
- --subtitle-color: #3d0909; /* accent rouge piment */
- --mp3-text-color: #ffffff; /* texte checkbox inline */
+ /* Couleurs générales */
+ --background-color: #121212; /* fond noir profond */
+ --default-text-color: #ffffff; /* texte clair */
+ --subtitle-color: #f87918; /* accent rouge piment */
+ --mp3-text-color: #ffffff; /* texte checkbox inline */
- /* Formulaire */
- --form-bg-color: #1a1a1a; /* fond formulaire gris très foncé */
- --form-input-bg-color: #2b2b2b; /* fond inputs gris foncé */
- --form-input-border-color: #444444; /* bordure gris */
- --form-input-border-focus-color: #ff1a1a; /* focus rouge piment */
- --form-input-text-color: #eeeeee; /* texte inputs */
- --form-input-placeholder-color: #888888; /* placeholder gris moyen */
- --form-button-bg-color: #ff1a1a; /* bouton rouge vif */
- --form-button-text-color: #ffffff; /* texte bouton blanc */
- --form-button-bg-hover-color: #cc0000; /* hover rouge foncé */
+ /* Formulaire */
+ --form-bg-color: #1a1a1a; /* fond formulaire gris très foncé */
+ --form-input-bg-color: #2b2b2b; /* fond inputs gris foncé */
+ --form-input-border-color: #444444; /* bordure gris */
+ --form-input-border-focus-color: #ff1a1a; /* focus rouge piment */
+ --form-input-text-color: #eeeeee; /* texte inputs */
+ --form-input-placeholder-color: #888888; /* placeholder gris moyen */
+ --form-button-bg-color: #ff1a1a; /* bouton rouge vif */
+ --form-button-text-color: #ffffff; /* texte bouton blanc */
+ --form-button-bg-hover-color: #cc0000; /* hover rouge foncé */
- /* Checkbox */
- --checkbox-bg-default: #555555; /* gris moyen */
- --checkbox-bg-checked: #ff1a1a; /* rouge piment */
- --checkbox-checkmark-border-color: #f5f5f5; /* blanc cassé */
- --checkbox-pulse-color: rgba(255, 26, 26, 0.5); /* pulse rouge translucide */
+ /* Checkbox */
+ --checkbox-bg-default: #555555; /* gris moyen */
+ --checkbox-bg-checked: #ff1a1a; /* rouge piment */
+ --checkbox-checkmark-border-color: #f5f5f5; /* blanc cassé */
+ --checkbox-pulse-color: rgba(255, 26, 26, 0.5); /* pulse rouge translucide */
- /* Download status */
- --download-status-color: #ffffff; /* rouge vif */
+ /* Download status */
+ --download-status-color: #ffffff; /* rouge vif */
- /* Video Info Box */
- --infos-box-color: #1a1a1a; /* fond infos gris foncé */
- --video-info-text-color: #f5f5f5; /* texte clair */
- --video-info-heading-color: #ff1a1a; /* titres rouges */
- --video-info-list-color: #cccccc; /* texte liste gris clair */
- --video-info-list-strong-color: #ffffff; /* texte important blanc */
- --video-info-link-color: #ff1a1a; /* liens rouges */
- --video-info-link-hover-color: #cc0000; /* liens hover rouge foncé */
+ /* Video Info Box */
+ --infos-box-color: #1a1a1a; /* fond infos gris foncé */
+ --video-info-text-color: #f5f5f5; /* texte clair */
+ --video-info-heading-color: #ff1a1a; /* titres rouges */
+ --video-info-list-color: #cccccc; /* texte liste gris clair */
+ --video-info-list-strong-color: #ffffff; /* texte important blanc */
+ --video-info-link-color: #ff1a1a; /* liens rouges */
+ --video-info-link-hover-color: #cc0000; /* liens hover rouge foncé */
+
+ /* Playlist Color */
+ --playlist-background-color: #353232;
}
/* Optionnel: background piments */
body.spicy {
- background-image: url('../../assets/images/spicy.webp');
- background-size:contain;
+ background-image: url('../../assets/images/Spicy.png');
+ background-size:cover;
background-position: center;
background-attachment: fixed;
background-repeat: no-repeat;
diff --git a/public/styles/theme/themeimport.css b/public/styles/theme/themeimport.css
index 3748f0c..eb320a6 100644
--- a/public/styles/theme/themeimport.css
+++ b/public/styles/theme/themeimport.css
@@ -3,7 +3,8 @@
@import url("default-theme.css");
@import url("fanatic-theme.css");
@import url("light-theme.css");
-@import url("cyberpunk-theme.css");
-@import url("spicy-theme.css");
-@import url("vilbrequin-theme.css");
-@import url("nf-theme.css");
\ No newline at end of file
+@import url("nf-theme.css");
+@import url("drift-theme.css");
+@import url("neon-theme.css");
+@import url("songbird-theme.css");
+@import url("spicy-theme.css")
\ No newline at end of file
diff --git a/public/styles/theme/vilbrequin-theme.css b/public/styles/theme/vilbrequin-theme.css
deleted file mode 100644
index ec9df97..0000000
--- a/public/styles/theme/vilbrequin-theme.css
+++ /dev/null
@@ -1,48 +0,0 @@
-body.vilbrequin {
- /* Couleurs générales */
- --background-color: #0a1f3d; /* bleu Vilbrequin profond */
- --default-text-color: #535353; /* texte clair */
- --subtitle-color: #001696; /* bleu clair accent (turbo vibes) */
- --mp3-text-color: #ffffff; /* texte checkbox inline */
-
- /* Formulaire */
- --form-bg-color: #12284f; /* fond formulaire bleu foncé */
- --form-input-bg-color: #1c3760; /* fond inputs bleu + clair */
- --form-input-border-color: #2a4b80; /* bordure bleue */
- --form-input-border-focus-color: #00bfff; /* focus bleu clair */
- --form-input-text-color: #f0f0f0; /* texte inputs clair */
- --form-input-placeholder-color: #b0c4de; /* placeholder gris bleuté */
- --form-button-bg-color: #ffd700; /* bouton jaune turbo */
- --form-button-text-color: #0a1f3d; /* texte bouton sombre */
- --form-button-bg-hover-color: #e6c200; /* hover jaune foncé */
-
- /* Checkbox */
- --checkbox-bg-default: #2a4b80; /* bleu moyen */
- --checkbox-bg-checked: #00bfff; /* bleu clair accent */
- --checkbox-checkmark-border-color: #f0f0f0; /* blanc cassé */
- --checkbox-pulse-color: rgba(0,191,255,0.5); /* pulse bleu clair translucide */
-
- /* Download status */
- --download-status-color: #ffd700; /* jaune turbo */
-
- /* Video Info Box */
- --infos-box-color: #12284f; /* fond infos bleu foncé */
- --video-info-text-color: #f0f0f0; /* texte clair */
- --video-info-heading-color: #00bfff; /* titres bleu clair */
- --video-info-list-color: #dcdcdc; /* texte liste gris clair */
- --video-info-list-strong-color: #ffffff; /* texte important blanc */
- --video-info-link-color: #00bfff; /* liens bleu clair */
- --video-info-link-hover-color: #009acd; /* liens hover bleu plus foncé */
-}
-
-/* Optionnel: motif turbo ou jantes */
-body.vilbrequin {
- background-image: url('../../assets/images/Vilbrequin.webp'); /* adapte ton image */
- background-size: cover;
- background-position: center;
- background-attachment: fixed;
-}
-
-body.vilbrequin .download-path{
- color: white;
-}
\ No newline at end of file
diff --git a/public/styles/variables.css b/public/styles/variables.css
index 7061e41..cfbb85d 100644
--- a/public/styles/variables.css
+++ b/public/styles/variables.css
@@ -1,20 +1,20 @@
:root {
/* Couleurs générales */
- --background-color: #001224; /* body background bleu nuit */
- --default-text-color: #eee; /* texte clair principal */
- --subtitle-color: #007bff; /* sous-titres, header p */
- --mp3-text-color: #000000; /* couleur texte checkbox inline */
+ --background-color: #001224;
+ --default-text-color: #eee;
+ --subtitle-color: #007bff;
+ --mp3-text-color: #000000;
/* Formulaire */
- --form-bg-color: #ffffff; /* fond du formulaire */
- --form-input-bg-color: #f9f9f9; /* fond inputs */
- --form-input-border-color: #cccccc; /* bordure inputs */
- --form-input-border-focus-color: #0056b3; /* bordure focus */
- --form-input-text-color: #333333; /* texte inputs */
- --form-input-placeholder-color: #aaaaaa; /* placeholder */
- --form-button-bg-color: #007bff; /* bouton bg */
- --form-button-text-color: #ffffff; /* texte bouton */
- --form-button-bg-hover-color: #0056b3; /* bouton hover */
+ --form-bg-color: #ffffff;
+ --form-input-bg-color: #f9f9f9;
+ --form-input-border-color: #cccccc;
+ --form-input-border-focus-color: #0056b3;
+ --form-input-text-color: #333333;
+ --form-input-placeholder-color: #aaaaaa;
+ --form-button-bg-color: #007bff;
+ --form-button-text-color: #ffffff;
+ --form-button-bg-hover-color: #0056b3;
/* Checkbox */
--checkbox-bg-default: #cccccc;
diff --git a/ressources/yt-dlp.exe b/ressources/yt-dlp.exe
index e5d9be2..5b72abe 100644
Binary files a/ressources/yt-dlp.exe and b/ressources/yt-dlp.exe differ
diff --git a/server/controller/download.controller.js b/server/controller/download.controller.js
new file mode 100644
index 0000000..3b820ee
--- /dev/null
+++ b/server/controller/download.controller.js
@@ -0,0 +1,65 @@
+const { fetchDownload } = require("../services/download.services");
+const { logger } = require("../logger");
+const { isValidUrl, isSafePath } = require("../helpers/validation");
+const { buildYtDlpArgs } = require("../helpers/buildArgs");
+const { notifyDownloadFinished } = require("../helpers/notify");
+
+const listeners = [];
+const speedListeners = [];
+
+async function downloadController(req, res) {
+ try {
+ const options = {
+ url: req.body.url,
+ audioOnly: req.body.audioOnly === "1",
+ quality: req.body.quality || "best",
+ outputFolder: req.body.savePath || undefined,
+ };
+
+ if (!options.url || !isValidUrl(options.url)) return res.status(400).send("❌ Invalid URL !");
+ if (options.outputFolder && !isSafePath(options.outputFolder)) return res.status(400).send("❌ Save Path Not Allowed.");
+
+ const filePath = await fetchDownload(options, listeners, speedListeners);
+ notifyDownloadFinished(filePath);
+ res.send("✅ Download Done !");
+
+ } catch (err) {
+ logger.error(`Server Error in /download : ${err.message}`);
+ res.status(500).send(`❌ ${err.message}`);
+ }
+}
+
+function progressController(req, res) {
+ res.set({
+ 'Content-Type': 'text/event-stream',
+ 'Cache-Control': 'no-cache',
+ 'Connection': 'keep-alive',
+ });
+
+ const sendProgress = percent => res.write(`data: ${percent}\n\n`);
+ listeners.push(sendProgress);
+
+ req.on('close', () => {
+ listeners.splice(listeners.indexOf(sendProgress), 1);
+ res.end();
+ });
+}
+
+function speedController(req, res) {
+ res.set({
+ 'Content-Type': 'text/event-stream',
+ 'Cache-Control': 'no-cache',
+ 'Connection': 'keep-alive',
+ });
+
+ const sendSpeed = speed => res.write(`data: ${speed}\n\n`);
+ speedListeners.push(sendSpeed);
+
+ req.on('close', () => {
+ speedListeners.splice(speedListeners.indexOf(sendSpeed), 1);
+ res.end();
+ });
+}
+
+
+module.exports = { downloadController, progressController, speedController};
diff --git a/server/controller/info.controller.js b/server/controller/info.controller.js
new file mode 100644
index 0000000..187d074
--- /dev/null
+++ b/server/controller/info.controller.js
@@ -0,0 +1,48 @@
+const express = require("express");
+const router = express.Router();
+
+const { fetchInfo } = require("../services/info.services");
+const { parseVideo, parsePlaylist } = require("../helpers/parseInfo");
+const { logger } = require("../logger");
+const { isValidUrl } = require("../helpers/validation");
+
+async function infoController(req, res){
+
+ const url = req.body.url || req.query.url; // Gérer POST et GET
+
+
+ /* Si pas d'url ou url invalide*/
+ if (!url || !isValidUrl(url)) return res.status(400).send("❌ Invalid URL Or Missing");
+
+ logger.info(`/Info Request receive by the Info Controller. URL: ${url}`);
+
+ if (url.includes("?list")) {
+ logger.info("Estimated Data Type: Playlist")
+
+ } else{
+ logger.info("Estimated Data Type: Video")
+ }
+
+ try {
+ const data = await fetchInfo(url);
+
+ if (data._type === "playlist") {
+
+ const playlist = parsePlaylist(data);
+ logger.info(`Playlist : ${playlist.title} (${playlist.count} vidéos)`);
+ return res.json(playlist);
+
+ } else{
+ const video = parseVideo(data);
+ logger.info(`Unique Video: ${video.title}`);
+ return res.json(video);
+ }
+
+
+ } catch (err) {
+ return res.status(500).send(`❌ ${err.message}`);
+ }
+
+}
+
+module.exports = {infoController};
\ No newline at end of file
diff --git a/server/discordRPC.js b/server/discordRPC.js
index d48a77a..591cc43 100644
--- a/server/discordRPC.js
+++ b/server/discordRPC.js
@@ -1,47 +1,51 @@
-/*
- This file is part of Freedom Loader.
-
- Copyright (C) 2025 MasterAcnolo
-
- Freedom Loader is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License.
-
- Freedom Loader is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-*/
-
+const config = require('../config');
const RPC = require("discord-rpc");
-const clientId = "1410934537051181146";
+const { logger } = require("./logger");
+
+const clientId = `${config.DiscordRPCID}`;
const rpc = new RPC.Client({ transport: "ipc" });
+let intervalId;
+
function startRPC() {
rpc.on("ready", () => {
- console.log("✅ Connecté à Discord !");
-
const presence = {
- largeImageKey: "icon",
- smallImageKey: "acnolo_pfp",
- smallImageText: "By MasterAcnolo",
- startTimestamp: new Date(), // compteur de temps
- details: "github.com/MasterAcnolo/Freedom-Loader",
+ largeImageKey: "icon",
+ smallImageKey: "acnolo_pfp",
+ smallImageText: "By MasterAcnolo",
+ startTimestamp: new Date(),
+ details: `Open Source Download Tools - ${config.version}`,
+ state: "masteracnolo.github.io/No-Sense/FreedomLoader",
};
rpc.setActivity(presence);
- // Mise à jour toutes les 15 secondes si tu veux garder le compteur à jour
- setInterval(() => {
+ // Met à jour la présence toutes les 15s
+ intervalId = setInterval(() => {
rpc.setActivity(presence);
}, 15000);
});
+ async function cleanExit() {
+ try {
+ if (intervalId) clearInterval(intervalId);
+
+ if (rpc && rpc.transport) {
+ await rpc.destroy();
+ }
+ } catch (err) {
+ logger.error("Error while closing the RPC:", err);
+ } finally {
+ process.exit();
+ }
+ }
+
+ process.on("exit", cleanExit);
+ process.on("SIGINT", cleanExit);
+ process.on("SIGTERM", cleanExit);
+
rpc.login({ clientId }).catch(err => {
- console.error("Erreur Discord RPC :", err);
+ logger.error("Unable to connect to the RPC:", err);
});
}
diff --git a/server/helpers/buildArgs.js b/server/helpers/buildArgs.js
new file mode 100644
index 0000000..6d16353
--- /dev/null
+++ b/server/helpers/buildArgs.js
@@ -0,0 +1,43 @@
+const path = require("path");
+
+const getUserBrowser = require("./getBrowser");
+const { ffmpegPath, denoPath} = require("./path");
+
+
+function buildYtDlpArgs({ url, audioOnly, quality, outputFolder }) {
+
+ const args = [
+ "--cookies-from-browser", `${getUserBrowser()}`,
+ "--no-continue",
+ "--no-overwrites",
+ "--embed-thumbnail",
+ "--add-metadata",
+ "--concurrent-fragments", "8",
+ "--retries", "10",
+ "--fragment-retries", "10",
+ "--ffmpeg-location", ffmpegPath,
+ "--extractor-args","youtube:player_client=default",
+ "--js-runtimes", `deno:${denoPath}`
+ ];
+
+ if (audioOnly) args.push("-f", "bestaudio", "--extract-audio", "--audio-format", "mp3");
+ else args.push("--merge-output", "mp4");
+
+ const qualityMap = {
+ best: "bestvideo+bestaudio/best/mp4",
+ medium: "bestvideo[height<=720]+bestaudio/best[height<=720]/mp4",
+ worst: "worstvideo+worstaudio/worst/mp4",
+ 1080: "bestvideo[height<=1080]+bestaudio/best[height<=1080]/mp4",
+ 720: "bestvideo[height<=720]+bestaudio/best[height<=720]/mp4",
+ 480: "bestvideo[height<=480]+bestaudio/best[height<=480]/mp4",
+ };
+
+ args.push("-f", qualityMap[quality] || "best");
+ args.push("-o", path.join(outputFolder, "%(title)s.%(ext)s"));
+ args.push(url);
+
+ return args;
+}
+
+module.exports = { buildYtDlpArgs };
+
diff --git a/server/helpers/getBrowser.js b/server/helpers/getBrowser.js
new file mode 100644
index 0000000..f51c8f2
--- /dev/null
+++ b/server/helpers/getBrowser.js
@@ -0,0 +1,32 @@
+const fs = require("fs");
+const os = require("os");
+const path = require("path");
+const notify = require("./notify")
+
+function getUserBrowser() {
+ const userProfile = os.homedir();
+
+ // Liste des navigateurs supportés par yt-dlp (Actuellement je peux que garantir Firefox, Désolé)
+ const browsers = [
+ { name: "firefox", path: path.join(userProfile, "AppData", "Roaming", "Mozilla", "Firefox", "Profiles") },
+ // { name: "chrome", path: path.join(userProfile, "AppData", "Local", "Google", "Chrome", "User Data", "Default") },
+ // { name: "brave", path: path.join(userProfile, "AppData", "Local", "BraveSoftware", "Brave-Browser", "User Data", "Default") },
+ // { name: "edge", path: path.join(userProfile, "AppData", "Local", "Microsoft", "Edge", "User Data", "Default") },
+ // { name: "opera", path: path.join(userProfile, "AppData", "Roaming", "Opera Software", "Opera Stable") },
+ // { name: "vivaldi", path: path.join(userProfile, "AppData", "Local", "Vivaldi", "User Data", "Default") },
+ // { name: "safari", path: path.join(userProfile, "AppData", "Local", "Apple Computer", "Safari") },
+ // { name: "whale", path: path.join(userProfile, "AppData", "Local", "Naver", "Naver Whale", "User Data", "Default") }
+ ];
+
+ for (const browser of browsers) {
+ if (fs.existsSync(browser.path)) {
+ return browser.name;
+ } else{
+ notify.notifyFirefoxBrowserMissing();
+ }
+ }
+ notify.notifyCookiesBrowserError()
+ return ;
+}
+
+module.exports = getUserBrowser
\ No newline at end of file
diff --git a/server/helpers/notify.js b/server/helpers/notify.js
new file mode 100644
index 0000000..f9a24b7
--- /dev/null
+++ b/server/helpers/notify.js
@@ -0,0 +1,44 @@
+const { Notification, shell } = require("electron");
+const path = require("path");
+
+function notifyDownloadFinished(folder) {
+ const iconPath = path.join(process.resourcesPath, "confirm-icon.png");
+ const notif = new Notification({
+ title: "Freedom Loader",
+ body: "Your download is complete, click here to open it.",
+ icon: iconPath,
+ });
+
+ notif.on("click", () => shell.openPath(folder));
+ notif.show();
+}
+
+function notifyCookiesBrowserError(){
+ const iconPath = path.join(process.resourcesPath, "error.png");
+ const notif = new Notification({
+ title: "Cookies Error",
+ body: "Unable to retrieve cookies. Please log in to your browser and click here to view the tutorial.",
+ icon: iconPath,
+ });
+
+ notif.on("click", () => shell.openExternal("https://youtube.com/shorts/cN9f4s1Mf88?si=519QCVd_-fzJqRf1"));
+ notif.show();
+}
+
+function notifyFirefoxBrowserMissing(){
+ const iconPath = path.join(process.ressourcesPath, "error.png");
+ const notif = new Notification({
+ title: "Firefox Missing",
+ body: "Firefox was not found on your system. Click here to follow the installation guide",
+ icon: iconPath,
+ });
+
+ notif.on("click", () => shell.openExternal("https://youtube.com/shorts/cN9f4s1Mf88?si=519QCVd_-fzJqRf1"))
+ notif.show();
+}
+
+module.exports = {
+ notifyDownloadFinished,
+ notifyCookiesBrowserError,
+ notifyFirefoxBrowserMissing
+};
\ No newline at end of file
diff --git a/server/helpers/parseInfo.js b/server/helpers/parseInfo.js
new file mode 100644
index 0000000..c397493
--- /dev/null
+++ b/server/helpers/parseInfo.js
@@ -0,0 +1,33 @@
+function parseVideo(data) {
+
+ return {
+ type: "video",
+ // id: data.id,
+ // title: data.title,
+ // url: data.webpage_url,
+ // duration: data.duration,
+ // thumbnail: data.thumbnail,
+ // uploader: data.uploader
+ ...data
+ };
+}
+
+function parsePlaylist(data) {
+
+ return {
+ type: "playlist",
+ title: data.title || data.id,
+ channel: data.uploader,
+ count: data.entries.length,
+ videos: (data.entries || []).map(v => ({
+ id: v.id,
+ title: v.title,
+ url: v.webpage_url,
+ duration: v.duration,
+ thumbnail: v.thumbnail,
+ uploader: v.uploader
+ }))
+ };
+}
+
+module.exports = { parseVideo, parsePlaylist };
diff --git a/server/helpers/path.js b/server/helpers/path.js
new file mode 100644
index 0000000..d045c44
--- /dev/null
+++ b/server/helpers/path.js
@@ -0,0 +1,26 @@
+const path = require("path");
+const fs = require("fs");
+const { app } = require("electron");
+const config = require("../../config");
+
+let userYtDlp;
+let ffmpegPath;
+let denoPath;
+
+const sourceYtDlp = path.join(process.resourcesPath, "yt-dlp.exe");
+
+if (config.localMode) {
+ userYtDlp = path.join(__dirname, "../../ressources/yt-dlp.exe");
+ ffmpegPath = path.join(__dirname, "../../ressources"); // <- contient ffmpeg.exe et ffprobe.exe
+ denoPath = path.join(__dirname, "../../ressources/deno.exe");
+} else {
+ userYtDlp = path.join(app.getPath("userData"), "yt-dlp.exe");
+ ffmpegPath = path.join(process.resourcesPath, "ffmpeg.exe");
+ denoPath = path.join(process.resourcesPath, "deno.exe");
+
+ if (!fs.existsSync(userYtDlp)) {
+ fs.copyFileSync(sourceYtDlp, userYtDlp);
+ }
+}
+
+module.exports = { userYtDlp, ffmpegPath, denoPath };
diff --git a/server/helpers/validation.js b/server/helpers/validation.js
new file mode 100644
index 0000000..b6ede30
--- /dev/null
+++ b/server/helpers/validation.js
@@ -0,0 +1,21 @@
+const path = require("path");
+
+function isValidUrl(url) {
+ try {
+ new URL(url);
+ return true;
+
+ } catch {
+ return false;
+ }
+
+}
+
+function isSafePath(folder) {
+ if (!folder || folder.length < 3) return false;
+ const unsafe = ["System32", "/etc", "\\Windows"];
+ const resolved = path.resolve(folder);
+ return !unsafe.some(u => resolved.includes(u));
+}
+
+module.exports = { isValidUrl, isSafePath };
diff --git a/server/logger.js b/server/logger.js
index c795e39..632d553 100644
--- a/server/logger.js
+++ b/server/logger.js
@@ -1,110 +1,61 @@
-/*
- This file is part of Freedom Loader.
-
- Copyright (C) 2025 MasterAcnolo
-
- Freedom Loader is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License.
-
- Freedom Loader is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-*/
-
const { createLogger, format, transports } = require("winston");
const DailyRotateFile = require("winston-daily-rotate-file");
-const fs = require("fs"); // Pour vérifier/créer le dossier de logs
-const path = require("path"); // Pour gérer proprement les chemins
-const os = require("os"); // Pour gérer les chemins aussi
+const fs = require("fs");
+const path = require("path");
+const os = require("os");
+const config = require("../config")
-// Définition du dossier où seront stockés les logs
-// const logDir = path.join(__dirname, "../logs"); Désactivé parce que cela requiert d'exec en admin mode. Donc pas pratique pour les gens
+// Dossier de logs Windows
+const logDir = path.join(os.homedir(), "AppData", "Local", "FreedomLoader", "logs");
-let logDir;
-if (process.platform === "win32") {
- logDir = path.join(os.homedir(), "AppData", "Local", "FreedomLoader", "logs");
-} else {
- logDir = path.join(os.homedir(), ".freedomloader", "logs");
-}
+// Création du dossier "logs" si nécessaire
+fs.mkdirSync(logDir, { recursive: true });
-// Création du dossier logs s’il n’existe pas encore
-//if (!fs.existsSync(logDir)) fs.mkdirSync(logDir); OBSOLETE
+const logFormat = format.combine(
+ format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
+ format.printf(({ timestamp, level, message }) => `${timestamp} | ${level.toUpperCase()} | ${message}`)
+);
-fs.mkdirSync(logDir, { recursive: true }); // Evite les erreurs
-
-
-// Fonction utilitaire pour générer une ligne indiquant le début d’une session de logs
-function getSessionStartLine() {
- const now = new Date().toISOString();
- return `--- Démarrage de la session : ${now} ---`;
-}
-
-// Fonction utilitaire pour générer une ligne indiquant la fin d’une session de logs
-function getSessionEndLine() {
- const now = new Date().toISOString();
- return `--- Fin de la session : ${now} ---`;
-}
-
-// Configuration principale de Winston
-// - Niveau minimum d’écriture : info (enregistre info, warn, error, etc.)
-// - Formatage des logs avec timestamp lisible et format personnalisé
-// - Transports : écriture dans fichier journalier + console avec couleurs
+// Configuration du logger
const logger = createLogger({
level: "info",
- format: format.combine(
- format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
- format.printf(({ timestamp, level, message }) =>
- `${timestamp} | ${level.toUpperCase()} | ${message}`
- )
- ),
+ format: logFormat,
transports: [
- // Rotation quotidienne des fichiers de logs
new DailyRotateFile({
- dirname: logDir, // dossier cible pour les logs
- filename: "LOGS-%DATE%.log", // nom du fichier par date
- datePattern: "YYYY-MM-DD", // pattern de date dans le nom
- zippedArchive: false, // ne pas compresser les archives
- maxFiles: "7d", // conserve 14 jours d’historique
- format: format.combine(
- format.timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
- format.printf(({ timestamp, level, message }) =>
- `${timestamp} | ${level.toUpperCase()} | ${message}`
- )
- ),
- options: { flags: "a" }, // mode ajout à la fin (append)
+ dirname: logDir,
+ filename: "LOGS-%DATE%.log",
+ datePattern: "YYYY-MM-DD",
+ zippedArchive: false,
+ maxFiles: "7d",
+ format: logFormat,
+ options: { flags: "a" },
}),
- // Affichage des logs en console avec coloration et format simple
new transports.Console({
- format: format.combine(
- format.colorize(),
- format.timestamp({ format: "HH:mm:ss" }),
- format.printf(({ timestamp, level, message }) =>
- `${timestamp} | ${level} | ${message}`
- )
- ),
+ format: logFormat,
}),
],
});
-// Helper pour marquer clairement le début de session dans les logs
-function logSessionStart() {
- logger.info(getSessionStartLine());
+function getSessionStartLine() {
+ return `--- Starting session: ${new Date().toISOString()} ---`;
+}
+
+function getSessionEndLine() {
+ return `--- Ending session: ${new Date().toISOString()} ---`;
+}
+
+function logSessionStart() {
+ logger.info(getSessionStartLine());
+ logger.info(`Application Version: ${config.version}`)
}
-// Helper pour marquer la fin de session dans les logs
function logSessionEnd() {
logger.info(getSessionEndLine());
}
-// Export du logger principal et des helpers pour usage dans d’autres modules
module.exports = {
logger,
logSessionStart,
logSessionEnd,
logDir,
-};
+};
\ No newline at end of file
diff --git a/server/routes/download.js b/server/routes/download.js
deleted file mode 100644
index 04f93d9..0000000
--- a/server/routes/download.js
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- This file is part of Freedom Loader.
-
- Copyright (C) 2025 MasterAcnolo
-
- Freedom Loader is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License.
-
- Freedom Loader is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-*/
-
-const express = require("express");
-const router = express.Router();
-const { execFile } = require("child_process");
-const path = require("path");
-const fs = require("fs");
-const { Notification } = require("electron");
-const logger = require("../logger").logger;
-
-// Path vers le fichier exécutable yt-dlp (outil tiers pour le téléchargement)
-// const ytDlpPath = path.join(process.resourcesPath, '../../yt-dlp.exe');
-const ytDlpPath = path.join(process.resourcesPath, 'yt-dlp.exe');
-
-execFile(ytDlpPath, ["-U"], (err, stdout, stderr) => {
- if (err) {
- logger.error("Erreur update yt-dlp:", err);
- return;
- }
- logger.info(`Update yt-dlp : ${stdout}`);
-});
-
-router.post("/", (req, res) => {
- try {
- // Récupération des options envoyées par le frontend via le formulaire
- // On vérifie la présence de l'URL, le choix audioOnly, et la qualité demandée
- const options = {
- url: req.body.url,
- audioOnly: req.body.audioOnly === "1",
- quality: req.body.quality || "best",
- };
-
- // Validation simple : si l'URL est manquante, on rejette la requête
- if (!options.url) {
- logger.warn("Requête POST /download sans URL");
- return res.status(400).send("❌ URL manquante !");
- }
-
- // Récupération du chemin de sauvegarde personnalisé envoyé depuis Electron,
- // ou on utilise un chemin par défaut stocké dans app.locals
- let requestedOutputFolder = req.body.savePath || req.app.locals.outputFolder;
-
- // On normalise le chemin pour éviter des erreurs liées aux séparateurs ou chemins relatifs
- requestedOutputFolder = path.normalize(requestedOutputFolder);
-
- /*
- Sécurité basique : On refuse certains chemins sensibles ou suspects
- (ex: System32, /etc, Windows) pour éviter que l'application n'écrive dans des dossiers système.
- On vérifie aussi la longueur minimale du chemin pour éviter des valeurs vides ou invalides.
- */
- if (
- !requestedOutputFolder ||
- requestedOutputFolder.length < 3 ||
- requestedOutputFolder.includes("System32") ||
- requestedOutputFolder.includes("/etc") ||
- requestedOutputFolder.includes("\\Windows")
- ) {
- logger.warn(`Chemin potentiellement dangereux refusé : ${requestedOutputFolder}`);
- return res.status(400).send("❌ Chemin de sauvegarde non autorisé.");
- }
-
- // Vérifie que le dossier de sortie existe, sinon le crée récursivement
- if (!fs.existsSync(requestedOutputFolder)) {
- fs.mkdirSync(requestedOutputFolder, { recursive: true });
- logger.info(`Dossier de sortie créé : ${requestedOutputFolder}`);
- }
-
- // Construction du template de sortie pour yt-dlp (nom de fichier basé sur le titre)
- const outputTemplate = path.join(requestedOutputFolder, "%(title)s.%(ext)s");
-
- // Construction du tableau d'arguments à passer à yt-dlp
- // --no-continue pour forcer un téléchargement propre
- // --restrict-filenames pour éviter les caractères problématiques dans les noms
- const args = [
- "--no-continue", // pas de reprise, c'est un choix que j'ai fait voila
- //"--restrict-filenames", // noms de fichiers sans caractères spéciaux (Cyrilique, accents, etc.)
- "--no-overwrites", // évite d'écraser un fichier existant
- "--embed-thumbnail", // ajoute la pochette
- "--add-metadata", // ajoute les tags (titre, artiste, etc.)
- "--concurrent-fragments", "8",// accélère le téléchargement
- "--retries", "10", // réessaie jusqu'à 10 fois en cas d'erreur
- "--fragment-retries", "10" , // réessaie aussi 10 fois chaque fragment
- "--ffmpeg-location", path.join(process.resourcesPath, "ffmpeg.exe")
- ];
-
- // Si l'option audioOnly est activée, on ajoute les flags pour extraction audio en mp3
- if (options.audioOnly) {
- args.push(
- "-f",
- "bestaudio",
- "--extract-audio",
- "--audio-format",
- "mp3",
- );
- }
-
-
- // Correspondance entre la qualité choisie et le format à demander à yt-dlp
- const qualityMap = {
- best: "bestvideo+bestaudio/best",
- medium: "bestvideo[height<=720]+bestaudio/best[height<=720]",
- worst: "worstvideo+worstaudio/worst",
- 1080: "bestvideo[height<=1080]+bestaudio/best[height<=1080]",
- 720: "bestvideo[height<=720]+bestaudio/best[height<=720]",
- 480: "bestvideo[height<=480]+bestaudio/best[height<=480]",
- };
-
- // Sélection du format basé sur la qualité, par défaut 'best' si option invalide
- const format = qualityMap[options.quality] || "best";
- args.push("-f", format);
-
- // Ajout du template de sortie et de l'URL à télécharger
- args.push("-o", outputTemplate);
- args.push(options.url);
-
- // Log de la commande complète pour traçabilité et débogage
- logger.info(`Téléchargement demandé : url=${options.url}, audioOnly=${options.audioOnly}, quality=${options.quality}`);
- logger.info(`Commande yt-dlp : ${ytDlpPath} ${args.join(" ")}`);
-
- // Lancement du processus yt-dlp avec les arguments définis
- const child = execFile(ytDlpPath, args);
-
- /*
- Gestion des sorties standards (stdout) du processus,
- on log chaque ligne pour suivre la progression ou informations diverses
- */
- child.stdout.on("data", (data) => {
- data.toString().split("\n").forEach(line => {
- if (line.trim()) logger.info(`[yt-dlp stdout] ${line.trim()}`);
- });
- });
-
- /*
- Gestion des erreurs (stderr) du processus,
- on log chaque ligne d'erreur pour diagnostic
- */
- child.stderr.on("data", (data) => {
- data.toString().split("\n").forEach(line => {
- if (line.trim()) logger.error(`[yt-dlp stderr] ${line.trim()}`);
- });
- });
-
- /*
- En cas d'erreur lors du lancement du processus yt-dlp,
- on log l'erreur et on répond au client avec un statut 500
- */
- child.on("error", (err) => {
- logger.error(`Erreur lancement yt-dlp : ${err.message}`);
- res.status(500).send(`❌ Erreur lors de l'exécution : ${err.message}`);
- });
-
- /*
- Quand le processus se termine, on vérifie le code de sortie.
- Code 0 = succès, on informe le client que le téléchargement est terminé.
- Sinon, on envoie une erreur au client avec le code d'échec.
- */
- child.on("close", (code) => {
- logger.info(`yt-dlp terminé avec code de sortie : ${code}`);
- if (code === 0) {
-
- const iconPath = path.join(process.resourcesPath, "confirm-icon.png"); // la sécurité pour toutes les machines
-
- console.log("Icon path pour la notif :", iconPath);
-
- const notif = new Notification({
- title: "Freedom Loader",
- body: "Ton téléchargement est terminé, clique ici pour l'ouvrir.",
- icon: iconPath,
- });
-
- notif.on("click", () => {
- console.log("Notification cliquée !");
- //Pour pouvoir ouvrir le dossier de la vidéo
- const { shell } = require("electron");
- shell.openPath(requestedOutputFolder);
- });
-
- notif.show();
- res.send("✅ Téléchargement terminé !");
- } else {
- res.status(500).send(`❌ yt-dlp a échoué avec le code : ${code}`);
- }
- });
-
- } catch (err) {
- // Capture toute autre erreur serveur non prévue, log et réponse 500
- logger.error(`Erreur serveur dans /download : ${err.message}`);
- res.status(500).send(`Erreur serveur : ${err.message}`);
- }
-});
-
-module.exports = router;
diff --git a/server/routes/download.route.js b/server/routes/download.route.js
new file mode 100644
index 0000000..a57b244
--- /dev/null
+++ b/server/routes/download.route.js
@@ -0,0 +1,11 @@
+const express = require("express");
+const router = express.Router();
+const { downloadController, progressController, speedController } = require("../controller/download.controller");
+
+router.post("/", downloadController);
+
+// SSE pour la progression du téléchargement
+router.get("/progress", progressController);
+router.get("/speed", speedController);
+
+module.exports = router;
\ No newline at end of file
diff --git a/server/routes/info.js b/server/routes/info.js
deleted file mode 100644
index a14fffb..0000000
--- a/server/routes/info.js
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- This file is part of Freedom Loader.
-
- Copyright (C) 2025 MasterAcnolo
-
- Freedom Loader is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License.
-
- Freedom Loader is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-*/
-
-const express = require("express");
-const router = express.Router();
-const { execFile } = require("child_process");
-const path = require("path");
-const fs = require("fs");
-const { logger } = require("../logger"); // On récupère ton logger Winston
-
-// Path absolu vers l'exécutable yt-dlp
-const ytDlpPath = path.join(__dirname, '../../ressources/yt-dlp.exe');
-
-// Vérification que yt-dlp.exe existe bien au lancement du module
-if (!fs.existsSync(ytDlpPath)) {
- logger.error(`❌ yt-dlp.exe introuvable à ${ytDlpPath}`);
- throw new Error(`yt-dlp.exe introuvable à ${ytDlpPath}`);
-}
-
-// Route POST pour récupérer les métadonnées d'une vidéo via yt-dlp
-router.post("/", (req, res) => {
- const url = req.body.url;
-
- // Validation basique : on refuse la requête sans URL
- if (!url) {
- logger.warn("Requête metadata sans URL");
- return res.status(400).send("❌ URL manquante");
- }
-
- logger.info(`Requête metadata reçue pour ${url}`);
-
- // Exécution de yt-dlp avec l'option --dump-json pour récupérer les infos vidéo
- execFile(
- ytDlpPath,
- ["--dump-json", url],
- { timeout: 10_000 }, // Timeout fixé à 10 secondes pour éviter blocage
- (error, stdout, stderr) => {
- if (error) {
- // En cas d'erreur, on log l'erreur et le stderr, puis on renvoie un code 500
- logger.error(`Erreur exécution yt-dlp: ${error.message}`);
- logger.debug(`stderr: ${stderr}`);
- return res.status(500).send("❌ Impossible de récupérer les infos.");
- }
-
- try {
- // yt-dlp peut retourner plusieurs JSON séparés par des sauts de ligne
- // On split et parse chacun proprement
- const infos = stdout
- .trim()
- .split("\n")
- .map(line => JSON.parse(line));
-
- logger.info(`Infos récupérées pour ${url} (${infos.length} élément(s))`);
-
- // Si on a un seul élément, on renvoie directement l'objet JSON, sinon un tableau
- res.json(infos.length === 1 ? infos[0] : infos);
- } catch (e) {
- // Si parsing JSON échoue, on log et renvoie une erreur 500
- logger.error(`Erreur parsing JSON: ${e.message}`);
- return res.status(500).send("❌ JSON illisible.");
- }
- }
- );
-});
-
-module.exports = router;
diff --git a/server/routes/info.route.js b/server/routes/info.route.js
new file mode 100644
index 0000000..f7465fe
--- /dev/null
+++ b/server/routes/info.route.js
@@ -0,0 +1,7 @@
+const express = require("express");
+const router = express.Router();
+const { infoController } = require("../controller/info.controller");
+
+router.post("/", infoController);
+
+module.exports = router;
\ No newline at end of file
diff --git a/server/server.js b/server/server.js
index daa9cce..fba428c 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1,106 +1,70 @@
-/*
- This file is part of Freedom Loader.
-
- Copyright (C) 2025 MasterAcnolo
-
- Freedom Loader is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License.
-
- Freedom Loader is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-*/
-
-const express = require("express"); // Framework web pour créer l’API et servir les fichiers
-const { exec } = require("child_process"); // Permet d’exécuter des commandes systèmes (pas utilisé directement ici)
-const fs = require("fs"); // Module système pour gérer fichiers et dossiers
-const path = require("path"); // Gestion propre des chemins de fichiers et dossiers
-const debug = require("debug")("freedom-loader:server");
-// Module de debug coloré en console, pratique pour dev
-
+const express = require("express");
+const fs = require("fs");
+const path = require("path");
const { logger, logSessionStart, logSessionEnd } = require("./logger");
-// Import du logger Winston et helpers pour marquer début/fin de session
+const config = require("../config");
+const { execFile } = require("child_process");
+const { userYtDlp } = require("./helpers/path");
-const app = express(); // Création de l’instance Express, notre serveur web
-// Définition du dossier par défaut où enregistrer les téléchargements
-// On prend le dossier Téléchargements de l’utilisateur Windows (USERPROFILE)
-const downloadsPath = path.join(process.env.USERPROFILE, "Downloads");
-const outputFolder = path.join(downloadsPath, "Freedom Loader");
+const app = express();
-// Création du dossier de sortie s’il n’existe pas déjà
-if (!fs.existsSync(outputFolder)) {
- try {
- fs.mkdirSync(outputFolder, { recursive: true }); // création récursive au cas où
- logger.info("Dossier Freedom Loader cree dans Telechargements.");
- } catch (err) {
- logger.error("Impossible de creer le dossier :", err);
- process.exit(1); // Arrêt du programme si dossier non créé (critique)
- }
-} else {
- logger.info("Dossier Freedom Loader deja existant.");
+app.use(express.json());
+
+// Dossier de téléchargement
+const outputFolder = path.join(process.env.USERPROFILE, "Downloads", "Freedom Loader");
+
+// Création du dossier si nécessaire
+try {
+ fs.mkdirSync(outputFolder, { recursive: true });
+ logger.info(`Freedom Loader folder ready in ${outputFolder}`);
+} catch (err) {
+ logger.error("Unable to create folder:", err);
+ process.exit(1);
}
-// On rend ce dossier accessible globalement via app.locals pour l’utiliser dans les routes
-app.locals.outputFolder = outputFolder;
+// Mise à jour yt-dlp au
+execFile(userYtDlp, ["-U"], (err, stdout, stderr) => {
+ if (err) logger.warn("yt-dlp update error:", err);
+ else logger.info(`Update yt-dlp : ${stdout}`);
+});
-// Middleware pour parser le corps des requêtes POST en application/x-www-form-urlencoded
+// Middlewares
app.use(express.urlencoded({ extended: true }));
+app.use(express.static(path.join(__dirname, "../public")));
-// Définition du dossier contenant les fichiers statiques (frontend)
-// Permet d’accéder au HTML, CSS, JS côté client
-const staticPath = path.join(__dirname, "../public");
-debug("Serveur statique sur", staticPath);
-app.use(express.static(staticPath));
+// Routes
+app.use("/download", require("./routes/download.route"));
+app.use("/info", require("./routes/info.route"));
-// Import et enregistrement des routes API
-// Ces routes gèrent les requêtes pour les infos vidéo et téléchargement
-const infoRoute = require("./routes/info");
-const downloadRoute = require("./routes/download");
-debug("Routes /download et /info installees");
-app.use("/download", downloadRoute);
-app.use("/info", infoRoute);
-
-// Route GET / qui sert la page principale index.html
app.get("/", (req, res) => {
- debug("Requete GET / servie");
res.sendFile(path.join(__dirname, "../public/index.html"));
});
-// Fonction pour démarrer le serveur Express
-// Retourne une Promise pour pouvoir await le démarrage dans d’autres modules
-function startServer() {
+// Fonction pour démarrer le serveur
+async function startServer() {
return new Promise((resolve, reject) => {
- logger.info("Demarrage du serveur Express...");
- const serverInstance = app.listen(8080, () => {
- logger.info("Serveur Express pret sur http://localhost:8080");
- resolve(serverInstance); // Serveur prêt, on résout la promesse
+ const server = app.listen(config.applicationPort, () => {
+ logger.info(`Express server ready at http://localhost:${config.applicationPort}`);
+ resolve(server);
});
- // Gestion des erreurs serveur lors du démarrage
- serverInstance.on("error", (err) => {
- logger.error("Erreur serveur Express :", err);
- reject(err); // Rejet de la promesse en cas d’erreur critique
+
+ server.on("error", (err) => {
+ logger.error("Express Server Error :", err);
+ reject(err);
});
+
+ const gracefulExit = () => {
+ logSessionEnd();
+ server.close(() => {
+ logger.info("Express Server close cleanly.");
+ process.exit();
+ });
+ };
+
+ process.on("SIGINT", gracefulExit);
+ process.on("SIGTERM", gracefulExit);
});
}
-// Gestion propre de la fermeture du process pour logger la fin de session
-process.on("SIGINT", () => { // Capture Ctrl+C (interruption)
- logSessionEnd();
- process.exit();
-});
-process.on("SIGTERM", () => { // Capture kill ou arrêt du process
- logSessionEnd();
- process.exit();
-});
-
-// Export de la fonction startServer pour permettre son appel depuis d’autres fichiers
-module.exports = { startServer };
-
-const { startRPC } = require("./discordRPC");
-startRPC();
+module.exports = { startServer };
\ No newline at end of file
diff --git a/server/services/download.services.js b/server/services/download.services.js
new file mode 100644
index 0000000..789fbd7
--- /dev/null
+++ b/server/services/download.services.js
@@ -0,0 +1,62 @@
+const { execFile } = require("child_process");
+const { userYtDlp } = require("../helpers/path");
+const path = require("path");
+const fs = require("fs");
+const { logger } = require("../logger");
+const { buildYtDlpArgs } = require("../helpers/buildArgs");
+const notify = require("../helpers/notify")
+
+function fetchDownload(options, listeners, speedListeners) {
+
+ return new Promise((resolve, reject) => {
+ const outputFolder = options.outputFolder || path.join(process.env.USERPROFILE, "Downloads", "Freedom Loader");
+ fs.mkdirSync(outputFolder, { recursive: true });
+
+ const args = buildYtDlpArgs({ ...options, outputFolder });
+ logger.info(`[yt-dlp args] ${args.join(" ")}`);
+
+ const child = execFile(userYtDlp, args);
+
+ child.on("error", err => reject(new Error(`YT-DLP Error : ${err.message}`)));
+
+ child.on("close", code => {
+ listeners.forEach(fn => fn("done"));
+ if (code === 0) resolve(outputFolder);
+ else reject(new Error(`YT-DLP failed with code : ${code}`));
+ });
+
+
+ child.stdout.on("data", data => {
+ data.toString().split("\n").forEach(line => {
+ if (!line.trim()) return;
+ logger.info(`[yt-dlp] ${line}`);
+
+ /* Barre de Chargement*/
+ if (line.startsWith("[download] Destination:")) listeners.forEach(fn => fn("reset"));
+ const match = line.match(/\[download\]\s+(\d+\.\d+)%/);
+ if (match) listeners.forEach(fn => fn(parseFloat(match[1])));
+
+ if (line.includes("MiB/s") || line.includes("KiB/s")) {
+ const match = line.match(/\d+(\.\d+)?[KM]?iB\/s/);
+ if (match) {
+ const speed = match[0];
+ speedListeners.forEach(fn => fn(speed));
+ }
+ }
+
+ if (line.match(/ERROR: Could not copy .* cookie database/i)) {
+ notify.notifyCookiesBrowserError();
+ }
+
+ });
+ });
+
+ child.stderr.on("data", data => {
+ data.toString().split("\n").forEach(line => line.trim() && logger.error(`[yt-dlp stderr] ${line}`));
+ });
+
+
+ });
+}
+
+module.exports = { fetchDownload };
diff --git a/server/services/info.services.js b/server/services/info.services.js
new file mode 100644
index 0000000..66038fd
--- /dev/null
+++ b/server/services/info.services.js
@@ -0,0 +1,51 @@
+const { execFile } = require("child_process");
+const { userYtDlp, denoPath } = require("../helpers/path");
+const getUserBrowser = require("../helpers/getBrowser");
+const { logger } = require("../logger");
+
+function fetchInfo(url) {
+ const args = [
+ "--js-runtimes", `deno:${denoPath}`,
+ "--dump-single-json",
+ "--ignore-errors",
+ "--yes-playlist",
+ "--cookies-from-browser",`${getUserBrowser()}`,
+ "--extractor-args","youtube:player_client=default",
+ "--ignore-no-formats-error",
+ ];
+
+ return new Promise((resolve, reject) => {
+
+ execFile(userYtDlp,[...args, url],
+ { timeout: 30_000, // 30s, si jamais plus, abandon de la requête
+ maxBuffer: 10 * 1024 * 1024 }, // 10MO de réponse max (Par défaut: 200ko)
+
+ (error, stdout, stderr) => {
+
+ if (stderr) {
+ const lower = stderr.toLowerCase();
+ if (lower.includes("sign in to confirm") || lower.includes("failed to decrypt") || lower.includes("could not copy")) {
+ return reject(new Error(`Unable to extract cookies from ${getUserBrowser()}. Please log in to this browser and try again.`));
+ }
+ }
+
+ if (error) {
+ logger.error(`YT-DLP Error: ${error.message}`);
+ if (stderr) logger.debug(`stderr: ${stderr}`);
+ return reject(new Error("Unable to fetch Info."));
+ }
+
+ if (!stdout) return reject(new Error("No Data Received."));
+
+ try {
+ const data = JSON.parse(stdout);
+ resolve(data);
+ } catch (e) {
+ logger.error(`JSON Parsing Error: ${e.message}`);
+ reject(new Error("JSON unreadable."));
+ }
+ });
+ });
+}
+
+module.exports = { fetchInfo };
diff --git a/server/update.js b/server/update.js
new file mode 100644
index 0000000..d644bfc
--- /dev/null
+++ b/server/update.js
@@ -0,0 +1,45 @@
+const { autoUpdater } = require("electron-updater");
+const { app, Notification } = require("electron");
+const { logger } = require("./logger");
+
+function AutoUpdater() {
+
+ autoUpdater.on("update-available", (info) => {
+ logger.info(`New Version Available : ${info.version}`);
+ new Notification({
+ title: "Freedom Loader",
+ body: `New Version Available : ${info.version}. Application will restart`
+ }).show();
+ });
+
+ autoUpdater.on("update-downloaded", (info) => {
+ logger.info(`Update Downloaded : ${info.version}`);
+ new Notification({
+ title: "Freedom Loader",
+ body: `Update ${info.version} downloaded.`
+ }).show();
+
+ setTimeout(() => {
+ autoUpdater.quitAndInstall();
+ }, 5000);
+ });
+
+ autoUpdater.on("error", (err) => {
+ logger.error("Auto Update Error :", err.message);
+ new Notification({
+ title: "Freedom Loader - Update Error",
+ body: err.message
+ }).show();
+ });
+
+ app.whenReady().then(async () => {
+ try {
+ await autoUpdater.checkForUpdates();
+ logger.info("Update check completed");
+ } catch (err) {
+ logger.error("Error during update check :", err.message);
+ }
+ });
+}
+
+module.exports = { AutoUpdater };