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 - - - -![Static Badge](https://img.shields.io/badge/Release-1.2.4-blue?style=flat&logo=Test) - - - -![Static Badge](https://img.shields.io/badge/Build-1.2.5--beta-yellow?style=flat&logo=Test) - -> 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`. - - -

- Exemple 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 - -

- Exemple d'application -

- -> Voici un exemple de l’application lancée après avoir saisi une URL. - ---- - -## ℹ️ À propos - -Ce projet a été réalisé en utilisant [![yt-dlp](https://img.shields.io/badge/yt--dlp-Visit%20Repo-181717?style=for-the-badge&logo=github&logoColor=white)](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 - - PayPal - -

- ---- - -## 📄 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 +
+ Banner - +
-![Static Badge](https://img.shields.io/badge/Release-1.2.4-blue?style=flat&logo=Test) - - - -![Static Badge](https://img.shields.io/badge/Build-1.2.5--beta-yellow?style=flat&logo=Test) - -> 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”. -

- Example 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

- Exemple d'application +

-> Here is an example of the app after launch and entering a URL +--- + +## Technologies + +This project uses: + +
+ + + + + + + + + + + + + + + + + + + + + +
--- -## ℹ️ About +## Contributing -This project was built using [![yt-dlp](https://img.shields.io/badge/yt--dlp-Visit%20Repo-181717?style=for-the-badge&logo=github&logoColor=white)](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 - - PayPal - -

+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 @@ "> - - - -
+
+ + +
-
-

Freedom Loader

-

Because why not?

-
- -
- +
-
- Sera enregistré dans - + Will be save on + +
+ +
+
+
+ +
+
+
-
-
- -
- - -
+ + +
+
+ + - + 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}

- Thumbnail -
    -
  • 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 += ` +
+ Thumbnail +

${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}

+ Thumbnail +
    +
  • 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 };