diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5cc4aa4d..539d1f0c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,8 +40,9 @@ jobs: sudo apt-get install -y libarchive-tools yarn build:linux env: - MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }} - MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_AUTH_URL }} + MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_STAGING_API_URL }} + MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_STAGING_AUTH_URL }} + MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_STAGING_CHECKOUT_URL }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -50,8 +51,9 @@ jobs: if: matrix.os == 'windows-latest' run: yarn build:win env: - MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }} - MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_AUTH_URL }} + MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_STAGING_API_URL }} + MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_STAGING_AUTH_URL }} + MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_STAGING_CHECKOUT_URL }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -61,7 +63,6 @@ jobs: with: name: Build-${{ matrix.os }} path: | - dist/win-unpacked/** dist/*-portable.exe dist/*.zip dist/*.dmg diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 96b6a08d..bc03a2db 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -44,6 +44,7 @@ jobs: env: MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }} MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_AUTH_URL }} + MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_CHECKOUT_URL }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -54,10 +55,27 @@ jobs: env: MAIN_VITE_API_URL: ${{ vars.MAIN_VITE_API_URL }} MAIN_VITE_AUTH_URL: ${{ vars.MAIN_VITE_AUTH_URL }} + MAIN_VITE_CHECKOUT_URL: ${{ vars.MAIN_VITE_CHECKOUT_URL }} SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} MAIN_VITE_SENTRY_DSN: ${{ vars.MAIN_VITE_SENTRY_DSN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Create artifact + uses: actions/upload-artifact@v4 + with: + name: Build-${{ matrix.os }} + path: | + dist/win-unpacked/** + dist/*-portable.exe + dist/*.zip + dist/*.dmg + dist/*.deb + dist/*.rpm + dist/*.tar.gz + dist/*.yml + dist/*.blockmap + dist/*.pacman + - name: Release uses: softprops/action-gh-release@v1 with: diff --git a/.gitignore b/.gitignore index fb4badd7..b9dcfecb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -.vscode -node_modules +.vscode/ +node_modules/ hydra-download-manager/ fastlist.exe __pycache__ @@ -10,3 +10,4 @@ out .env .vite sentry.properties +ludusavi/ \ No newline at end of file diff --git a/README.md b/README.md index 64612f4b..1012c05d 100644 --- a/README.md +++ b/README.md @@ -13,18 +13,18 @@ [![build](https://img.shields.io/github/actions/workflow/status/hydralauncher/hydra/build.yml)](https://github.com/hydralauncher/hydra/actions) [![release](https://img.shields.io/github/package-json/v/hydralauncher/hydra)](https://github.com/hydralauncher/hydra/releases) -[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](README.pt-BR.md) -[![en](https://img.shields.io/badge/lang-en-red.svg)](README.md) -[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](README.ru.md) -[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](README.uk-UA.md) -[![be](https://img.shields.io/badge/lang-be-orange)](README.be.md) -[![es](https://img.shields.io/badge/lang-es-red)](README.es.md) -[![fr](https://img.shields.io/badge/lang-fr-blue)](README.fr.md) -[![de](https://img.shields.io/badge/lang-de-black)](README.de.md) -[![ita](https://img.shields.io/badge/lang-it-red)](README.it.md) -[![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md) -[![da](https://img.shields.io/badge/lang-da-red)](README.da.md) -[![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) +[![pt-BR](https://img.shields.io/badge/lang-pt--BR-green.svg)](./README.pt-BR.md) +[![en](https://img.shields.io/badge/lang-en-red.svg)](./README.md) +[![ru](https://img.shields.io/badge/lang-ru-yellow.svg)](./README.ru.md) +[![uk-UA](https://img.shields.io/badge/lang-uk--UA-blue)](./README.uk-UA.md) +[![be](https://img.shields.io/badge/lang-be-orange)](./README.be.md) +[![es](https://img.shields.io/badge/lang-es-red)](./README.es.md) +[![fr](https://img.shields.io/badge/lang-fr-blue)](./README.fr.md) +[![de](https://img.shields.io/badge/lang-de-black)](./README.de.md) +[![ita](https://img.shields.io/badge/lang-it-red)](./README.it.md) +[![cs](https://img.shields.io/badge/lang-cs-purple)](./README.cs.md) +[![da](https://img.shields.io/badge/lang-da-red)](./README.da.md) +[![nb](https://img.shields.io/badge/lang-nb-blue)](./README.nb.md) ![Hydra Catalogue](./docs/screenshot.png) diff --git a/README.be.md b/docs/README.be.md similarity index 99% rename from README.be.md rename to docs/README.be.md index cc6bafb5..b861d582 100644 --- a/README.be.md +++ b/docs/README.be.md @@ -26,7 +26,7 @@ [![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) -![Hydra Catalogue](./docs/screenshot.png) +![Hydra Catalogue](./screenshot.png) diff --git a/README.cs.md b/docs/README.cs.md similarity index 99% rename from README.cs.md rename to docs/README.cs.md index 7179711a..866a841c 100644 --- a/README.cs.md +++ b/docs/README.cs.md @@ -26,7 +26,7 @@ [![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) -![Hydra Katalog](./docs/screenshot.png) +![Hydra Katalog](./screenshot.png) diff --git a/README.da.md b/docs/README.da.md similarity index 99% rename from README.da.md rename to docs/README.da.md index 9f0eb7f7..abfe7817 100644 --- a/README.da.md +++ b/docs/README.da.md @@ -25,7 +25,7 @@ [![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md) [![da](https://img.shields.io/badge/lang-da-red)](README.da.md) -![Hydra Catalogue](./docs/screenshot.png) +![Hydra Catalogue](./screenshot.png) diff --git a/README.de.md b/docs/README.de.md similarity index 99% rename from README.de.md rename to docs/README.de.md index 1d7f05f8..a1629fbb 100644 --- a/README.de.md +++ b/docs/README.de.md @@ -26,7 +26,7 @@ [![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) -![Hydra Katalog](./docs/screenshot.png) +![Hydra Katalog](./screenshot.png) diff --git a/README.es.md b/docs/README.es.md similarity index 99% rename from README.es.md rename to docs/README.es.md index 09d8e4e2..525d3e02 100644 --- a/README.es.md +++ b/docs/README.es.md @@ -26,7 +26,7 @@ [![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) -![Hydra Catalogue](./docs/screenshot.png) +![Hydra Catalogue](./screenshot.png) diff --git a/README.fr.md b/docs/README.fr.md similarity index 99% rename from README.fr.md rename to docs/README.fr.md index 351b73a9..648c30ea 100644 --- a/README.fr.md +++ b/docs/README.fr.md @@ -26,7 +26,7 @@ [![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) -![Catalogue Hydra](./docs/screenshot.png) +![Catalogue Hydra](./screenshot.png) diff --git a/README.it.md b/docs/README.it.md similarity index 99% rename from README.it.md rename to docs/README.it.md index b78abe2b..656a9aac 100644 --- a/README.it.md +++ b/docs/README.it.md @@ -26,7 +26,7 @@ [![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) -![Hydra Catalogue](./docs/screenshot.png) +![Hydra Catalogue](./screenshot.png) diff --git a/README.nb.md b/docs/README.nb.md similarity index 99% rename from README.nb.md rename to docs/README.nb.md index 5be4fcbb..62f04781 100644 --- a/README.nb.md +++ b/docs/README.nb.md @@ -25,7 +25,7 @@ [![cs](https://img.shields.io/badge/lang-cs-purple)](README.cs.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) -![Hydra Catalogue](./docs/screenshot.png) +![Hydra Catalogue](./screenshot.png) diff --git a/README.pl.md b/docs/README.pl.md similarity index 99% rename from README.pl.md rename to docs/README.pl.md index b4cd5a6a..2ee4e847 100644 --- a/README.pl.md +++ b/docs/README.pl.md @@ -26,7 +26,7 @@ [![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) -![Hydra Catalogue](./docs/screenshot.png) +![Hydra Catalogue](./screenshot.png) diff --git a/README.pt-BR.md b/docs/README.pt-BR.md similarity index 99% rename from README.pt-BR.md rename to docs/README.pt-BR.md index 1fdba5ea..83f0c420 100644 --- a/README.pt-BR.md +++ b/docs/README.pt-BR.md @@ -26,7 +26,7 @@ [![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) -![Hydra Catalogue](./docs/screenshot.png) +![Hydra Catalogue](./screenshot.png) diff --git a/README.ru.md b/docs/README.ru.md similarity index 99% rename from README.ru.md rename to docs/README.ru.md index 7bc0d9d8..6c0a6a0f 100644 --- a/README.ru.md +++ b/docs/README.ru.md @@ -26,7 +26,7 @@ [![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) -![Hydra Catalogue](./docs/screenshot.png) +![Hydra Catalogue](./screenshot.png) diff --git a/README.uk-UA.md b/docs/README.uk-UA.md similarity index 99% rename from README.uk-UA.md rename to docs/README.uk-UA.md index d69ffc21..db2f2c12 100644 --- a/README.uk-UA.md +++ b/docs/README.uk-UA.md @@ -26,7 +26,7 @@ [![da](https://img.shields.io/badge/lang-da-red)](README.da.md) [![nb](https://img.shields.io/badge/lang-nb-blue)](README.nb.md) -![Hydra Catalogue](./docs/screenshot.png) +![Hydra Catalogue](./screenshot.png) diff --git a/electron-builder.yml b/electron-builder.yml index 06473566..a7151ed3 100644 --- a/electron-builder.yml +++ b/electron-builder.yml @@ -3,6 +3,7 @@ productName: Hydra directories: buildResources: build extraResources: + - ludusavi - hydra-download-manager - seeds - from: node_modules/create-desktop-shortcuts/src/windows.vbs diff --git a/package.json b/package.json index 6fd3f905..827f3faa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "hydralauncher", - "version": "2.1.7", + "version": "3.0.0", "description": "Hydra", "main": "./out/main/index.js", "author": "Los Broxas", @@ -23,7 +23,7 @@ "start": "electron-vite preview", "dev": "electron-vite dev", "build": "npm run typecheck && electron-vite build", - "postinstall": "electron-builder install-app-deps", + "postinstall": "electron-builder install-app-deps && node ./postinstall.cjs", "build:unpack": "npm run build && electron-builder --dir", "build:win": "electron-vite build && electron-builder --win", "build:mac": "electron-vite build && electron-builder --mac", @@ -44,7 +44,7 @@ "@vanilla-extract/recipes": "^0.5.2", "auto-launch": "^5.0.6", "axios": "^1.7.7", - "better-sqlite3": "^11.2.1", + "better-sqlite3": "^11.3.0", "check-disk-space": "^3.4.0", "classnames": "^2.5.1", "color": "^4.2.3", @@ -52,19 +52,18 @@ "create-desktop-shortcuts": "^1.11.0", "date-fns": "^3.6.0", "dexie": "^4.0.8", - "electron-log": "^5.1.4", - "electron-updater": "^6.1.8", - "fetch-cookie": "^3.0.1", + "electron-log": "^5.2.0", + "electron-updater": "^6.3.9", "flexsearch": "^0.7.43", "i18next": "^23.11.2", "i18next-browser-languagedetector": "^7.2.1", - "icojs": "^0.19.3", + "icojs": "^0.19.4", "jsdom": "^24.0.0", "jsonwebtoken": "^9.0.2", "knex": "^3.1.0", "lodash-es": "^4.17.21", "lottie-react": "^2.4.0", - "parse-torrent": "^11.0.16", + "parse-torrent": "^11.0.17", "piscina": "^4.5.1", "react-hook-form": "^7.53.0", "react-i18next": "^14.1.0", @@ -72,6 +71,7 @@ "react-redux": "^9.1.1", "react-router-dom": "^6.22.3", "sudo-prompt": "^9.2.1", + "tar": "^7.4.3", "typeorm": "^0.3.20", "user-agents": "^1.1.193", "yaml": "^2.4.1", @@ -88,6 +88,7 @@ "@swc/core": "^1.4.16", "@types/auto-launch": "^5.0.5", "@types/color": "^3.0.6", + "@types/folder-hash": "^4.0.4", "@types/jsdom": "^21.1.6", "@types/jsonwebtoken": "^9.0.6", "@types/lodash-es": "^4.17.12", @@ -99,7 +100,7 @@ "@vanilla-extract/vite-plugin": "^4.0.7", "@vitejs/plugin-react": "^4.2.1", "electron": "^30.3.0", - "electron-builder": "^24.9.1", + "electron-builder": "^25.1.8", "electron-vite": "^2.0.0", "eslint": "^8.56.0", "eslint-plugin-jsx-a11y": "^6.8.0", diff --git a/postinstall.cjs b/postinstall.cjs new file mode 100644 index 00000000..25d27c0a --- /dev/null +++ b/postinstall.cjs @@ -0,0 +1,49 @@ +const { default: axios } = require("axios"); +const util = require("node:util"); +const fs = require("node:fs"); +const path = require("node:path"); + +const exec = util.promisify(require("node:child_process").exec); + +const fileName = { + win32: "ludusavi-v0.25.0-win64.zip", + linux: "ludusavi-v0.25.0-linux.zip", + darwin: "ludusavi-v0.25.0-mac.zip", +}; + +const downloadLudusavi = async () => { + if (fs.existsSync("ludusavi")) { + console.log("Ludusavi already exists, skipping download..."); + return; + } + + const file = fileName[process.platform]; + const downloadUrl = `https://github.com/mtkennerly/ludusavi/releases/download/v0.25.0/${file}`; + + console.log(`Downloading ${file}...`); + + const response = await axios.get(downloadUrl, { responseType: "stream" }); + + const stream = response.data.pipe(fs.createWriteStream(file)); + + stream.on("finish", async () => { + console.log(`Downloaded ${file}, extracting...`); + + const pwd = process.cwd(); + + const targetPath = path.join(pwd, "ludusavi"); + + await exec(`npx extract-zip ${file} ${targetPath}`); + + if (process.platform !== "win32") { + fs.chmodSync(path.join(targetPath, "ludusavi"), 0o755); + } + + console.log("Extracted. Renaming folder..."); + + console.log(`Extracted ${file}, removing compressed downloaded file...`); + fs.rmSync(file); + }); +}; + +downloadLudusavi(); diff --git a/requirements.txt b/requirements.txt index 3685495b..a379f371 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,6 @@ libtorrent cx_Freeze cx_Logging; sys_platform == 'win32' -lief; sys_platform == 'win32' pywin32; sys_platform == 'win32' psutil Pillow diff --git a/resources/achievement-sound.mp3 b/resources/achievement-sound.mp3 new file mode 100644 index 00000000..e942cb6b Binary files /dev/null and b/resources/achievement-sound.mp3 differ diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 105367e1..49460f4c 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -130,7 +130,38 @@ "download": "Download", "executable_path_in_use": "Executable already in use by \"{{game}}\"", "warning": "Warning:", - "hydra_needs_to_remain_open": "for this download, Hydra needs to remain open util its conclusion. In case Hydra closes before the conclusion, you will lose your progress." + "hydra_needs_to_remain_open": "for this download, Hydra needs to remain open util its conclusion. In case Hydra closes before the conclusion, you will lose your progress.", + "achievements": "Achievements", + "achievements_count": "Achievements {{unlockedCount}}/{{achievementsCount}}", + "cloud_save": "Cloud save", + "cloud_save_description": "Save your progress in the cloud and continue playing on any device", + "backups": "Backups", + "install_backup": "Install", + "delete_backup": "Delete", + "create_backup": "New backup", + "last_backup_date": "Last backup on {{date}}", + "no_backup_preview": "No save games were found for this title", + "restoring_backup": "Restoring backup ({{progress}} complete)…", + "uploading_backup": "Uploading backup…", + "no_backups": "You haven't created any backups for this game yet", + "backup_uploaded": "Backup uploaded", + "backup_deleted": "Backup deleted", + "backup_restored": "Backup restored", + "see_all_achievements": "See all achievements", + "sign_in_to_see_achievements": "Sign in to see achievements", + "mapping_method_automatic": "Automatic", + "mapping_method_manual": "Manual", + "mapping_method_label": "Mapping method", + "files_automatically_mapped": "Files automatically mapped", + "no_backups_created": "No backups created for this game", + "manage_files": "Manage files", + "loading_save_preview": "Searching for save games…", + "wine_prefix": "Wine Prefix", + "wine_prefix_description": "The Wine prefix used to run this game", + "no_download_option_info": "No information available", + "backup_deletion_failed": "Failed to delete backup", + "max_number_of_artifacts_reached": "Maximum number of backups reached for this game", + "achievements_not_sync": "Your achievements are not synchronized" }, "activation": { "title": "Activate Hydra", @@ -217,7 +248,8 @@ "source_already_exists": "This source has been already added", "must_be_valid_url": "The source must be a valid URL", "blocked_users": "Blocked users", - "user_unblocked": "User has been unblocked" + "user_unblocked": "User has been unblocked", + "enable_achievement_notifications": "When an achievement in unlocked" }, "notifications": { "download_complete": "Download complete", @@ -226,7 +258,9 @@ "repack_count_one": "{{count}} repack added", "repack_count_other": "{{count}} repacks added", "new_update_available": "Version {{version}} available", - "restart_to_install_update": "Restart Hydra to install the update" + "restart_to_install_update": "Restart Hydra to install the update", + "notification_achievement_unlocked_title": "Achievement unlocked for {{game}}", + "notification_achievement_unlocked_body": "{{achievement}} and other {{count}} were unlocked" }, "system_tray": { "open": "Open Hydra", @@ -312,6 +346,26 @@ "report_reason_spam": "Spam", "report_reason_other": "Other", "profile_reported": "Profile reported", - "your_friend_code": "Your friend code:" + "your_friend_code": "Your friend code:", + "upload_banner": "Upload banner", + "uploading_banner": "Uploading banner…" + }, + "achievement": { + "achievement_unlocked": "Achievement unlocked", + "user_achievements": "{{displayName}}'s Achievements", + "your_achievements": "Your Achievements", + "unlocked_at": "Unlocked at:", + "subscription_needed": "A Hydra Cloud subscription is required to see this content", + "new_achievements_unlocked": "Unlocked {{achievementCount}} new achievements from {{gameCount}} games" + }, + "tour": { + "subscription_tour_title": "Hydra Cloud Subscription", + "subscribe_now": "Subscribe now", + "cloud_saving": "Cloud saving (up to {{gameCount}} games)", + "cloud_achievements": "Save your achievements on the cloud", + "animated_profile_picture": "Animated profile pictures", + "premium_support": "Premium Support", + "show_and_compare_achievements": "Show and compare your achievements to other users", + "animated_profile_banner": "Animated profile banner" } } diff --git a/src/locales/es/translation.json b/src/locales/es/translation.json index 02ab0c5d..c9cad20f 100644 --- a/src/locales/es/translation.json +++ b/src/locales/es/translation.json @@ -1,16 +1,16 @@ { "language_name": "Español", "app": { - "successfully_signed_in": "Sesión iniciada correctamente" + "successfully_signed_in": "Sesión iniciada exitosamente" }, "home": { "featured": "Destacado", - "trending": "Tendencias", + "trending": "Tendencia", "surprise_me": "¡Sorpréndeme!", - "no_results": "No se encontraron resultados", + "no_results": "Sin resultados encontrados", + "start_typing": "Empieza a escribir para buscar...", "hot": "Popular Ahora", - "weekly": "📅 Destacados de esta semana", - "start_typing": "Empieza a escribir para buscar..." + "weekly": "📅 Mejores juegos de la semana" }, "sidebar": { "catalogue": "Catálogo", @@ -22,8 +22,8 @@ "downloading": "{{title}} ({{percentage}} - Descargando…)", "filter": "Buscar en la biblioteca", "home": "Inicio", - "queued": "{{title}} (En Cola)", - "game_has_no_executable": "El juego no tiene un ejecutable", + "queued": "{{title}} (En cola)", + "game_has_no_executable": "El juego no tiene un ejecutable seleccionado", "sign_in": "Iniciar sesión", "friends": "Amigos" }, @@ -34,8 +34,8 @@ "downloads": "Descargas", "search_results": "Resultados de búsqueda", "settings": "Ajustes", - "version_available_install": "Version {{version}} disponible. Haz clic aquí para reiniciar e instalar.", - "version_available_download": "Version {{version}} disponible. Haz clic aquí para descargar." + "version_available_install": "Versión {{version}} disponible. Presiona acá para descargar y reinstalar.", + "version_available_download": "Versión {{version}} disponible. Presiona aquí para descargar." }, "bottom_panel": { "no_downloads_in_progress": "Sin descargas en progreso", @@ -99,7 +99,7 @@ "open_screenshot": "Abrir captura {{number}}", "download_settings": "Ajustes de descarga", "downloader": "Método de descarga", - "select_executable": "Seleccionar", + "select_executable": "Seleccionar ejecutable", "no_executable_selected": "No se seleccionó un ejecutable", "open_folder": "Abrir carpeta", "open_download_location": "Ver archivos descargados", @@ -119,16 +119,49 @@ "last_downloaded_option": "Última opción descargada", "create_shortcut_success": "Atajo creado con éxito", "create_shortcut_error": "Error al crear un atajo", - "allow_nsfw_content": "Continuar", - "download": "Descargar", - "download_count": "Descargas", - "download_error": "Esta opción de descarga no está disponible.", - "executable_path_in_use": "El ejecutable se encuentra en uso por \"{{game}}\"", - "nsfw_content_description": "{{title}} puede ser no adecuado para todas las edades por su contenido. \n¿Deseas continuar de igual forma?", "nsfw_content_title": "Este juego contiene contenido inapropiado.", - "player_count": "Jugadores activos", + "nsfw_content_description": "{{title}} puede ser no adecuado para todas las edades por su contenido. \n¿Deseas continuar de igual forma?", + "allow_nsfw_content": "Continuar", "refuse_nsfw_content": "No, gracias", - "stats": "Estadísticas" + "stats": "Estadísticas", + "download_count": "Downloads", + "player_count": "Jugadores activos", + "download_error": "Esta opción de descarga no está disponible.", + "download": "Descargar", + "executable_path_in_use": "El ejecutable se encuentra en uso por \"{{game}}\"", + "warning": "Advertencia:", + "hydra_needs_to_remain_open": "Para esta descarga, Hydra necesita mantenerse abierta hasta que concluya. En caso de que Hydra se cierre antes de que concluya, podrías perder todo el progreso.", + "achievements": "Logros", + "achievements_count": "Logros {{unlockedCount}}/{{achievementsCount}}", + "cloud_save": "Guardado en la nube", + "cloud_save_description": "Guarda tu progreso en la nube y continúa jugando en cualquier dispositivo", + "backups": "Copias de Seguridad", + "install_backup": "Instalar", + "delete_backup": "Eliminar", + "create_backup": "Nueva Copia de Seguridad", + "last_backup_date": "Última copia de seguridad el {{date}}", + "no_backup_preview": "No se encontraron datos de guardados para este juego", + "restoring_backup": "Restaurando copia de seguridad ({{progress}} completado)…", + "uploading_backup": "Subiendo copia de seguridad…", + "no_backups": "No has creado ninguna copia de seguridad para este juego aún", + "backup_uploaded": "Copia de seguridad subida", + "backup_deleted": "Copia de seguridad eliminada", + "backup_restored": "Copia de seguridad restaurada", + "see_all_achievements": "Ver todos los logros", + "sign_in_to_see_achievements": "Inicia sesión para ver los logros", + "mapping_method_automatic": "Automático", + "mapping_method_manual": "Manual", + "mapping_method_label": "Método de mapeo", + "files_automatically_mapped": "Archivos mapeados automáticamente", + "no_backups_created": "Sin copias de seguridad creadas para este juego", + "manage_files": "Gestionar archivos", + "loading_save_preview": "Buscando datos de guardados de juegos…", + "wine_prefix": "Prefijo de Wine", + "wine_prefix_description": "El prefijo de Wine usado para ejecutar este juego", + "no_download_option_info": "Sin información disponible", + "backup_deletion_failed": "La eliminación de la copia de seguridad falló", + "max_number_of_artifacts_reached": "Número máximo de copias de seguridad de este juego alcanzadas", + "achievements_not_sync": "Tus logros no están sincronizadas" }, "activation": { "title": "Activar Hydra", @@ -205,20 +238,18 @@ "found_download_option_one": "Se encontró {{countFormatted}} opción de descarga", "found_download_option_other": "Se encontraron {{countFormatted}} opciones de descarga", "import": "Importar", - "blocked_users": "Usuarios bloqueados", - "download_options_one": "", - "download_options_other": "", - "download_options_zero": "", - "friends_only": "Solo amigos", - "must_be_valid_url": "La fuente debe ser una URL válida.", - "privacy": "Privacidad", + "public": "Público", "private": "Privado", + "friends_only": "Solo amigos", + "privacy": "Privacidad", "profile_visibility": "Visibilidad del perfil", "profile_visibility_description": "Elige quién puede ver tu perfil y biblioteca", - "public": "Público", "required_field": "Este campo es obligatorio", "source_already_exists": "Esta fuente ya ha sido agregada.", - "user_unblocked": "El usuario ha sido desbloqueado" + "must_be_valid_url": "La fuente debe ser una URL válida.", + "blocked_users": "Usuarios bloqueados", + "user_unblocked": "El usuario ha sido desbloqueado", + "enable_achievement_notifications": "Cuando un logro se desbloquea" }, "notifications": { "download_complete": "Descarga completada", @@ -227,7 +258,9 @@ "repack_count_one": "{{count}} repack ha sido añadido", "repack_count_other": "{{count}} repacks añadidos", "new_update_available": "Version {{version}} disponible", - "restart_to_install_update": "Reinicia Hydra para instalar la actualización" + "restart_to_install_update": "Reinicia Hydra para instalar la actualización", + "notification_achievement_unlocked_title": "Logro desbloqueado de {{game}}", + "notification_achievement_unlocked_body": "{{achievement}} y otros {{count}} fueron desbloqueados" }, "system_tray": { "open": "Abrir Hydra", @@ -238,7 +271,7 @@ }, "binary_not_found_modal": { "title": "Programas no instalados", - "description": "Los ejecutables de Wine o Lutris no se encontraron en su sistema", + "description": "Los ejecutables de Wine o Lutris no se encontraron en tu sistema", "instructions": "Comprueba como instalar de forma correcta uno de los dos en tu distro de Linux para ejecutar el juego con normalidad" }, "modal": { @@ -296,23 +329,43 @@ "no_blocked_users": "No has bloqueado a ningún usuario", "friend_code_copied": "Código de amigo copiado", "undo_friendship_modal_text": "Esto deshará tu amistad con {{displayName}}", - "displayname_max_length": "El nombre a mostrar debe tener como máximo 50 caracteres", - "displayname_min_length": "El nombre a mostrar debe tener al menos 3 caracteres", - "locked_profile": "Este perfil es privado.", "privacy_hint": "Para ajustar quién puede ver esto, ve a <0>Configuración.", - "profile_locked": "Este perfil es privado", - "profile_reported": "Perfil reportado", - "report": "Reportar", - "report_description": "Información adicional", - "report_description_placeholder": "Información adicional", + "locked_profile": "Este perfil es privado", + "image_process_failure": "Error al procesar la imagen", + "required_field": "Este campo es obligatorio", + "displayname_min_length": "El nombre a mostrar debe tener al menos 3 caracteres", + "displayname_max_length": "El nombre a mostrar debe tener como máximo 50 caracteres", "report_profile": "Reportar este perfil", "report_reason": "¿Cual es el motivo del reporte?", + "report_description": "Información adicional", + "report_description_placeholder": "Información adicional", + "report": "Reportar", "report_reason_hate": "Discursos de odio", - "report_reason_other": "Otro", "report_reason_sexual_content": "Contenido sexual", - "report_reason_spam": "Spam/Contenido no deseado", "report_reason_violence": "Violencia", - "required_field": "Este campo es obligatorio", - "image_process_failure": "Error al procesar la imagen" + "report_reason_spam": "Spam / Contenido no deseado", + "report_reason_other": "Otro", + "profile_reported": "Perfil reportado", + "your_friend_code": "Tu código de amigo:", + "upload_banner": "Subir un banner", + "uploading_banner": "Subiendo banner…" + }, + "achievement": { + "achievement_unlocked": "Logro desbloqueado", + "user_achievements": "Logros de {{displayName}}", + "your_achievements": "Tus Logros", + "unlocked_at": "Desbloqueado el:", + "subscription_needed": "Se necesita una suscripción a Hydra Cloud se necesita para ver este contenido", + "new_achievements_unlocked": "Desbloqueados {{achievementCount}} nuevos logros de {{gameCount}} juegos" + }, + "tour": { + "subscription_tour_title": "Suscripción Hydra Cloud", + "subscribe_now": "Suscribirse ahora", + "cloud_saving": "Guardado en la nube (hasta {{gameCount}} juegos)", + "cloud_achievements": "Guarda tus logros en la nube", + "animated_profile_picture": "Fotos de perfil animadas", + "premium_support": "Soporte Premium", + "show_and_compare_achievements": "Muestra y compara tus logros con otros usuarios", + "animated_profile_banner": "Fondo de perfil animado" } } diff --git a/src/locales/pt-BR/translation.json b/src/locales/pt-BR/translation.json index fcb18659..c79c0847 100644 --- a/src/locales/pt-BR/translation.json +++ b/src/locales/pt-BR/translation.json @@ -5,9 +5,9 @@ }, "home": { "featured": "Destaques", - "trending": "Populares", - "hot": "Populares agora", + "hot": "Populares", "weekly": "📅 Mais baixados da semana", + "achievements": "🏆 Pra platinar", "surprise_me": "Surpreenda-me", "no_results": "Nenhum resultado encontrado", "start_typing": "Comece a digitar para pesquisar…" @@ -126,7 +126,38 @@ "download": "Baixar", "executable_path_in_use": "Executável em uso por \"{{game}}\"", "warning": "Aviso:", - "hydra_needs_to_remain_open": "para este download, o Hydra precisa ficar aberto até a conclusão. Caso o Hydra encerre antes da conclusão, perderá seu progresso." + "hydra_needs_to_remain_open": "para este download, o Hydra precisa ficar aberto até a conclusão. Caso o Hydra encerre antes da conclusão, perderá seu progresso.", + "achievements": "Conquistas", + "achievements_count": "Conquistas ({{unlockedCount}}/{{achievementsCount}})", + "cloud_save": "Salvamento em nuvem", + "cloud_save_description": "Matenha seu progresso na nuvem e continue de onde parou em qualquer dispositivo", + "backups": "Backups", + "install_backup": "Restaurar", + "delete_backup": "Apagar", + "create_backup": "Novo backup", + "last_backup_date": "Último backup em {{date}}", + "no_backup_preview": "Não foi possível encontrar nenhum salvamento para este jogo", + "restoring_backup": "Restaurando backup ({{progress}} concluído)…", + "uploading_backup": "Criando backup…", + "no_backups": "Você ainda não fez nenhum backup deste jogo", + "backup_uploaded": "Backup criado", + "backup_deleted": "Backup apagado", + "backup_restored": "Backup restaurado", + "see_all_achievements": "Ver todas as conquistas", + "sign_in_to_see_achievements": "Faça login para ver as conquistas", + "mapping_method_automatic": "Automático", + "mapping_method_manual": "Manual", + "mapping_method_label": "Método de mapeamento", + "files_automatically_mapped": "Arquivos automaticamente mapeados", + "no_backups_created": "Nenhum backup criado para este jogo", + "manage_files": "Gerenciar arquivos", + "loading_save_preview": "Buscando por arquivos de salvamento…", + "wine_prefix": "Prefixo Wine", + "wine_prefix_description": "O prefixo Wine que foi utilizado para instalar o jogo", + "no_download_option_info": "Sem informações disponíveis", + "backup_deletion_failed": "Falha ao apagar backup", + "max_number_of_artifacts_reached": "Número máximo de backups atingido para este jogo", + "achievements_not_sync": "Suas conquistas não estão sincronizadas" }, "activation": { "title": "Ativação", @@ -168,7 +199,7 @@ "enable_download_notifications": "Quando um download for concluído", "enable_repack_list_notifications": "Quando a lista de repacks for atualizada", "real_debrid_api_token_label": "Token de API do Real-Debrid", - "quit_app_instead_hiding": "Encerrar o Hydra em vez de apenas minimizá-lo ao fechar.", + "quit_app_instead_hiding": "Encerrar o Hydra em vez de apenas minimizá-lo ao fechar", "launch_with_system": "Iniciar o Hydra junto com o sistema", "general": "Geral", "behavior": "Comportamento", @@ -216,7 +247,8 @@ "source_already_exists": "Essa fonte já foi adicionada", "must_be_valid_url": "A fonte deve ser uma URL válida", "blocked_users": "Usuários bloqueados", - "user_unblocked": "Usuário desbloqueado" + "user_unblocked": "Usuário desbloqueado", + "enable_achievement_notifications": "Quando uma conquista é desbloqueada" }, "notifications": { "download_complete": "Download concluído", @@ -316,6 +348,25 @@ "report_reason_spam": "Spam", "report_reason_other": "Outro", "profile_reported": "Perfil reportado", - "your_friend_code": "Seu código de amigo:" + "your_friend_code": "Seu código de amigo:", + "upload_banner": "Carregar banner", + "uploading_banner": "Carregando banner…" + }, + "achievement": { + "achievement_unlocked": "Conquista desbloqueada", + "your_achievements": "Suas Conquistas", + "user_achievements": "Conquistas de {{displayName}}", + "unlocked_at": "Desbloqueado em:", + "subscription_needed": "Você precisa de uma assinatura Hydra Cloud para visualizar este conteúdo", + "new_achievements_unlocked": "{{achievementCount}} novas conquistas de {{gameCount}} jogos" + }, + "tour": { + "subscription_tour_title": "Assinatura Hydra Cloud", + "subscribe_now": "Inscreva-se agora", + "cloud_achievements": "Salvamento de conquistas em nuvem", + "animated_profile_picture": "Fotos de perfil animadas", + "premium_support": "Suporte Premium", + "show_and_compare_achievements": "Exiba e compare suas conquistas com outros usuários", + "animated_profile_banner": "Banner animado no perfil" } } diff --git a/src/locales/pt-PT/translation.json b/src/locales/pt-PT/translation.json index 85c1a3c5..423c4518 100644 --- a/src/locales/pt-PT/translation.json +++ b/src/locales/pt-PT/translation.json @@ -115,7 +115,10 @@ "download": "Transferir", "executable_path_in_use": "Executável em uso por \"{{game}}\"", "warning": "Aviso:", - "hydra_needs_to_remain_open": "para este download, o Hydra precisa ficar aberto até a conclusão. Caso o Hydra encerre antes da conclusão, perderá seu progresso." + "hydra_needs_to_remain_open": "para este download, o Hydra precisa ficar aberto até a conclusão. Caso o Hydra encerre antes da conclusão, perderá seu progresso.", + "achievements": "Conquistas", + "achievements_count": "Conquistas ({{unlockedCount}}/{{achievementsCount}})", + "see_all_achievements": "Ver todas as conquistas" }, "activation": { "title": "Ativação", @@ -157,7 +160,7 @@ "enable_download_notifications": "Quando uma transferência for concluída", "enable_repack_list_notifications": "Quando a lista de repacks for atualizada", "real_debrid_api_token_label": "Token de API do Real-Debrid", - "quit_app_instead_hiding": "Encerrar o Hydra em vez de apenas minimizá-lo ao fechar.", + "quit_app_instead_hiding": "Encerrar o Hydra em vez de apenas minimizá-lo ao fechar", "launch_with_system": "Iniciar o Hydra com o sistema", "general": "Geral", "behavior": "Comportamento", @@ -277,5 +280,11 @@ "friend_code_copied": "Código de amigo copiado", "image_process_failure": "Falha ao processar a imagem", "your_friend_code": "Seu código de amigo:" + }, + "achievement": { + "achievement_unlocked": "Conquista desbloqueada", + "unlocked_at": "Desbloqueado em:", + "subscription_needed": "Você precisa de uma assinatura Hydra Cloud para visualizar este conteúdo", + "new_achievements_unlocked": "Encontradas {{achievementCount}} novas conquistas de {{gameCount}} jogos" } } diff --git a/src/main/constants.ts b/src/main/constants.ts index 92973118..4e2f1c00 100644 --- a/src/main/constants.ts +++ b/src/main/constants.ts @@ -4,7 +4,12 @@ import path from "node:path"; export const defaultDownloadsPath = app.getPath("downloads"); export const databaseDirectory = path.join(app.getPath("appData"), "hydra"); -export const databasePath = path.join(databaseDirectory, "hydra.db"); +export const databasePath = path.join( + databaseDirectory, + import.meta.env.MAIN_VITE_API_URL.includes("staging") + ? "hydra_test.db" + : "hydra.db" +); export const logsPath = path.join(app.getPath("appData"), "hydra", "logs"); @@ -12,4 +17,6 @@ export const seedsPath = app.isPackaged ? path.join(process.resourcesPath, "seeds") : path.join(__dirname, "..", "..", "seeds"); +export const backupsPath = path.join(app.getPath("userData"), "Backups"); + export const appVersion = app.getVersion(); diff --git a/src/main/data-source.ts b/src/main/data-source.ts index 29c72f8c..80a40f47 100644 --- a/src/main/data-source.ts +++ b/src/main/data-source.ts @@ -7,6 +7,8 @@ import { Repack, UserPreferences, UserAuth, + GameAchievement, + UserSubscription, } from "@main/entity"; import { databasePath } from "./constants"; @@ -16,11 +18,13 @@ export const dataSource = new DataSource({ entities: [ Game, Repack, + UserAuth, UserPreferences, + UserSubscription, GameShopCache, DownloadSource, DownloadQueue, - UserAuth, + GameAchievement, ], synchronize: false, database: databasePath, diff --git a/src/main/entity/game-achievements.entity.ts b/src/main/entity/game-achievements.entity.ts new file mode 100644 index 00000000..0cb15f6e --- /dev/null +++ b/src/main/entity/game-achievements.entity.ts @@ -0,0 +1,19 @@ +import { Column, Entity, PrimaryGeneratedColumn } from "typeorm"; + +@Entity("game_achievement") +export class GameAchievement { + @PrimaryGeneratedColumn() + id: number; + + @Column("text") + objectId: string; + + @Column("text") + shop: string; + + @Column("text", { nullable: true }) + unlockedAchievements: string | null; + + @Column("text", { nullable: true }) + achievements: string | null; +} diff --git a/src/main/entity/game-shop-cache.entity.ts b/src/main/entity/game-shop-cache.entity.ts index f83e1b0c..3382da1c 100644 --- a/src/main/entity/game-shop-cache.entity.ts +++ b/src/main/entity/game-shop-cache.entity.ts @@ -18,6 +18,9 @@ export class GameShopCache { @Column("text", { nullable: true }) serializedData: string; + /** + * @deprecated Use IndexedDB's `howLongToBeatEntries` instead + */ @Column("text", { nullable: true }) howLongToBeatSerializedData: string; diff --git a/src/main/entity/game.entity.ts b/src/main/entity/game.entity.ts index 190e7470..19905c32 100644 --- a/src/main/entity/game.entity.ts +++ b/src/main/entity/game.entity.ts @@ -39,6 +39,9 @@ export class Game { @Column("text", { nullable: true }) executablePath: string | null; + @Column("text", { nullable: true }) + winePrefixPath: string | null; + @Column("int", { default: 0 }) playTimeInMilliseconds: number; diff --git a/src/main/entity/index.ts b/src/main/entity/index.ts index 9cb4f044..5829e6a2 100644 --- a/src/main/entity/index.ts +++ b/src/main/entity/index.ts @@ -1,7 +1,10 @@ export * from "./game.entity"; export * from "./repack.entity"; +export * from "./user-auth.entity"; export * from "./user-preferences.entity"; +export * from "./user-subscription.entity"; export * from "./game-shop-cache.entity"; +export * from "./game.entity"; +export * from "./game-achievements.entity"; export * from "./download-source.entity"; export * from "./download-queue.entity"; -export * from "./user-auth"; diff --git a/src/main/entity/user-auth.ts b/src/main/entity/user-auth.entity.ts similarity index 73% rename from src/main/entity/user-auth.ts rename to src/main/entity/user-auth.entity.ts index 6bfd6ad7..f34e23ec 100644 --- a/src/main/entity/user-auth.ts +++ b/src/main/entity/user-auth.entity.ts @@ -4,7 +4,9 @@ import { Column, CreateDateColumn, UpdateDateColumn, + OneToOne, } from "typeorm"; +import { UserSubscription } from "./user-subscription.entity"; @Entity("user_auth") export class UserAuth { @@ -20,6 +22,9 @@ export class UserAuth { @Column("text", { nullable: true }) profileImageUrl: string | null; + @Column("text", { nullable: true }) + backgroundImageUrl: string | null; + @Column("text", { default: "" }) accessToken: string; @@ -29,6 +34,9 @@ export class UserAuth { @Column("int", { default: 0 }) tokenExpirationTimestamp: number; + @OneToOne("UserSubscription", "user") + subscription: UserSubscription | null; + @CreateDateColumn() createdAt: Date; diff --git a/src/main/entity/user-preferences.entity.ts b/src/main/entity/user-preferences.entity.ts index 92db958d..dc6d465d 100644 --- a/src/main/entity/user-preferences.entity.ts +++ b/src/main/entity/user-preferences.entity.ts @@ -26,6 +26,9 @@ export class UserPreferences { @Column("boolean", { default: false }) repackUpdatesNotificationsEnabled: boolean; + @Column("boolean", { default: true }) + achievementNotificationsEnabled: boolean; + @Column("boolean", { default: false }) preferQuitInsteadOfHiding: boolean; diff --git a/src/main/entity/user-subscription.entity.ts b/src/main/entity/user-subscription.entity.ts new file mode 100644 index 00000000..e74ada48 --- /dev/null +++ b/src/main/entity/user-subscription.entity.ts @@ -0,0 +1,42 @@ +import type { SubscriptionStatus } from "@types"; +import { + Entity, + PrimaryGeneratedColumn, + Column, + CreateDateColumn, + UpdateDateColumn, + OneToOne, + JoinColumn, +} from "typeorm"; +import { UserAuth } from "./user-auth.entity"; + +@Entity("user_subscription") +export class UserSubscription { + @PrimaryGeneratedColumn() + id: number; + + @Column("text", { default: "" }) + subscriptionId: string; + + @OneToOne("UserAuth", "subscription") + @JoinColumn() + user: UserAuth; + + @Column("text", { default: "" }) + status: SubscriptionStatus; + + @Column("text", { default: "" }) + planId: string; + + @Column("text", { default: "" }) + planName: string; + + @Column("datetime", { nullable: true }) + expiresAt: Date | null; + + @CreateDateColumn() + createdAt: Date; + + @UpdateDateColumn() + updatedAt: Date; +} diff --git a/src/main/events/auth/sign-out.ts b/src/main/events/auth/sign-out.ts index 724626b7..ed399f6d 100644 --- a/src/main/events/auth/sign-out.ts +++ b/src/main/events/auth/sign-out.ts @@ -7,7 +7,7 @@ import { gamesPlaytime, } from "@main/services"; import { dataSource } from "@main/data-source"; -import { DownloadQueue, Game, UserAuth } from "@main/entity"; +import { DownloadQueue, Game, UserAuth, UserSubscription } from "@main/entity"; const signOut = async (_event: Electron.IpcMainInvokeEvent) => { const databaseOperations = dataSource @@ -19,6 +19,10 @@ const signOut = async (_event: Electron.IpcMainInvokeEvent) => { await transactionalEntityManager .getRepository(UserAuth) .delete({ id: 1 }); + + await transactionalEntityManager + .getRepository(UserSubscription) + .delete({ id: 1 }); }) .then(() => { /* Removes all games being played */ diff --git a/src/main/events/autoupdater/check-for-updates.ts b/src/main/events/autoupdater/check-for-updates.ts index 6c8d3cb0..1dcc80f3 100644 --- a/src/main/events/autoupdater/check-for-updates.ts +++ b/src/main/events/autoupdater/check-for-updates.ts @@ -1,4 +1,4 @@ -import { AppUpdaterEvent } from "@types"; +import type { AppUpdaterEvent } from "@types"; import { registerEvent } from "../register-event"; import updater, { UpdateInfo } from "electron-updater"; import { WindowManager } from "@main/services"; diff --git a/src/main/events/catalogue/get-catalogue.ts b/src/main/events/catalogue/get-catalogue.ts index 4fdb95bd..a0542f25 100644 --- a/src/main/events/catalogue/get-catalogue.ts +++ b/src/main/events/catalogue/get-catalogue.ts @@ -15,7 +15,7 @@ const getCatalogue = async ( }); const response = await HydraApi.get<{ objectId: string; shop: GameShop }[]>( - `/games/${category}?${params.toString()}`, + `/catalogue/${category}?${params.toString()}`, {}, { needsAuth: false } ); @@ -30,7 +30,7 @@ const getCatalogue = async ( title: steamGame.name, shop: game.shop, cover: steamUrlBuilder.library(game.objectId), - objectID: game.objectId, + objectId: game.objectId, }; }) ); diff --git a/src/main/events/catalogue/get-game-shop-details.ts b/src/main/events/catalogue/get-game-shop-details.ts index 3a435013..08366abc 100644 --- a/src/main/events/catalogue/get-game-shop-details.ts +++ b/src/main/events/catalogue/get-game-shop-details.ts @@ -7,16 +7,16 @@ import { registerEvent } from "../register-event"; import { steamGamesWorker } from "@main/workers"; const getLocalizedSteamAppDetails = async ( - objectID: string, + objectId: string, language: string ): Promise => { if (language === "english") { - return getSteamAppDetails(objectID, language); + return getSteamAppDetails(objectId, language); } - return getSteamAppDetails(objectID, language).then( + return getSteamAppDetails(objectId, language).then( async (localizedAppDetails) => { - const steamGame = await steamGamesWorker.run(Number(objectID), { + const steamGame = await steamGamesWorker.run(Number(objectId), { name: "getById", }); @@ -34,21 +34,21 @@ const getLocalizedSteamAppDetails = async ( const getGameShopDetails = async ( _event: Electron.IpcMainInvokeEvent, - objectID: string, + objectId: string, shop: GameShop, language: string ): Promise => { if (shop === "steam") { const cachedData = await gameShopCacheRepository.findOne({ - where: { objectID, language }, + where: { objectID: objectId, language }, }); - const appDetails = getLocalizedSteamAppDetails(objectID, language).then( + const appDetails = getLocalizedSteamAppDetails(objectId, language).then( (result) => { if (result) { gameShopCacheRepository.upsert( { - objectID, + objectID: objectId, shop: "steam", language, serializedData: JSON.stringify(result), @@ -68,7 +68,7 @@ const getGameShopDetails = async ( if (cachedGame) { return { ...cachedGame, - objectID, + objectId, } as ShopDetails; } diff --git a/src/main/events/catalogue/get-game-stats.ts b/src/main/events/catalogue/get-game-stats.ts index 87cba054..9961a0b2 100644 --- a/src/main/events/catalogue/get-game-stats.ts +++ b/src/main/events/catalogue/get-game-stats.ts @@ -1,23 +1,17 @@ -import type { GameShop } from "@types"; - +import type { GameShop, GameStats } from "@types"; import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; -import type { GameStats } from "@types"; const getGameStats = async ( _event: Electron.IpcMainInvokeEvent, objectId: string, shop: GameShop ) => { - const params = new URLSearchParams({ - objectId, - shop, - }); - - const response = await HydraApi.get( - `/games/stats?${params.toString()}` + return HydraApi.get( + `/games/stats`, + { objectId, shop }, + { needsAuth: false } ); - return response; }; registerEvent("getGameStats", getGameStats); diff --git a/src/main/events/catalogue/get-games.ts b/src/main/events/catalogue/get-games.ts index 81717806..3eb1f135 100644 --- a/src/main/events/catalogue/get-games.ts +++ b/src/main/events/catalogue/get-games.ts @@ -1,28 +1,29 @@ import type { CatalogueEntry } from "@types"; import { registerEvent } from "../register-event"; -import { steamGamesWorker } from "@main/workers"; +import { HydraApi } from "@main/services"; import { steamUrlBuilder } from "@shared"; const getGames = async ( _event: Electron.IpcMainInvokeEvent, take = 12, - cursor = 0 -): Promise<{ results: CatalogueEntry[]; cursor: number }> => { - const steamGames = await steamGamesWorker.run( - { limit: take, offset: cursor }, - { name: "list" } + skip = 0 +): Promise => { + const searchParams = new URLSearchParams({ + take: take.toString(), + skip: skip.toString(), + }); + + const games = await HydraApi.get( + `/games/catalogue?${searchParams.toString()}`, + undefined, + { needsAuth: false } ); - return { - results: steamGames.map((steamGame) => ({ - title: steamGame.name, - shop: "steam", - cover: steamUrlBuilder.library(steamGame.id), - objectID: steamGame.id, - })), - cursor: cursor + steamGames.length, - }; + return games.map((game) => ({ + ...game, + cover: steamUrlBuilder.library(game.objectId), + })); }; registerEvent("getGames", getGames); diff --git a/src/main/events/catalogue/get-how-long-to-beat.ts b/src/main/events/catalogue/get-how-long-to-beat.ts index 642dd9a3..01966afc 100644 --- a/src/main/events/catalogue/get-how-long-to-beat.ts +++ b/src/main/events/catalogue/get-how-long-to-beat.ts @@ -1,45 +1,23 @@ -import type { GameShop, HowLongToBeatCategory } from "@types"; +import type { HowLongToBeatCategory } from "@types"; import { getHowLongToBeatGame, searchHowLongToBeat } from "@main/services"; import { registerEvent } from "../register-event"; -import { gameShopCacheRepository } from "@main/repository"; +import { formatName } from "@shared"; const getHowLongToBeat = async ( _event: Electron.IpcMainInvokeEvent, - objectID: string, - shop: GameShop, title: string ): Promise => { - const searchHowLongToBeatPromise = searchHowLongToBeat(title); + const response = await searchHowLongToBeat(title); - const gameShopCache = await gameShopCacheRepository.findOne({ - where: { objectID, shop }, + const game = response.data.find((game) => { + return formatName(game.game_name) === formatName(title); }); - const howLongToBeatCachedData = gameShopCache?.howLongToBeatSerializedData - ? JSON.parse(gameShopCache?.howLongToBeatSerializedData) - : null; - if (howLongToBeatCachedData) return howLongToBeatCachedData; + if (!game) return null; + const howLongToBeat = await getHowLongToBeatGame(String(game.game_id)); - return searchHowLongToBeatPromise.then(async (response) => { - const game = response.data.find( - (game) => game.profile_steam === Number(objectID) - ); - - if (!game) return null; - const howLongToBeat = await getHowLongToBeatGame(String(game.game_id)); - - gameShopCacheRepository.upsert( - { - objectID, - shop, - howLongToBeatSerializedData: JSON.stringify(howLongToBeat), - }, - ["objectID"] - ); - - return howLongToBeat; - }); + return howLongToBeat; }; registerEvent("getHowLongToBeat", getHowLongToBeat); diff --git a/src/main/events/catalogue/get-trending-games.ts b/src/main/events/catalogue/get-trending-games.ts index 8f8e02c0..acfebfd6 100644 --- a/src/main/events/catalogue/get-trending-games.ts +++ b/src/main/events/catalogue/get-trending-games.ts @@ -1,7 +1,7 @@ import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; import { userPreferencesRepository } from "@main/repository"; -import { TrendingGame } from "@types"; +import type { TrendingGame } from "@types"; const getTrendingGames = async (_event: Electron.IpcMainInvokeEvent) => { const userPreferences = await userPreferencesRepository.findOne({ diff --git a/src/main/events/catalogue/search-games.ts b/src/main/events/catalogue/search-games.ts index 8f81d40e..4ce42fd8 100644 --- a/src/main/events/catalogue/search-games.ts +++ b/src/main/events/catalogue/search-games.ts @@ -1,6 +1,6 @@ import { registerEvent } from "../register-event"; import { convertSteamGameToCatalogueEntry } from "../helpers/search-games"; -import { CatalogueEntry } from "@types"; +import type { CatalogueEntry } from "@types"; import { HydraApi } from "@main/services"; const searchGamesEvent = async ( diff --git a/src/main/events/cloud-save/delete-game-artifact.ts b/src/main/events/cloud-save/delete-game-artifact.ts new file mode 100644 index 00000000..e293bc56 --- /dev/null +++ b/src/main/events/cloud-save/delete-game-artifact.ts @@ -0,0 +1,12 @@ +import { HydraApi } from "@main/services"; +import { registerEvent } from "../register-event"; + +const deleteGameArtifact = async ( + _event: Electron.IpcMainInvokeEvent, + gameArtifactId: string +) => + HydraApi.delete<{ ok: boolean }>( + `/profile/games/artifacts/${gameArtifactId}` + ); + +registerEvent("deleteGameArtifact", deleteGameArtifact); diff --git a/src/main/events/cloud-save/download-game-artifact.ts b/src/main/events/cloud-save/download-game-artifact.ts new file mode 100644 index 00000000..ef00629b --- /dev/null +++ b/src/main/events/cloud-save/download-game-artifact.ts @@ -0,0 +1,150 @@ +import { HydraApi, logger, Ludusavi, WindowManager } from "@main/services"; +import fs from "node:fs"; +import * as tar from "tar"; +import { registerEvent } from "../register-event"; +import axios from "axios"; +import os from "node:os"; +import { app } from "electron"; +import path from "node:path"; +import { backupsPath } from "@main/constants"; +import type { GameShop } from "@types"; + +import YAML from "yaml"; +import { normalizePath } from "@main/helpers"; + +export interface LudusaviBackup { + files: { + [key: string]: { + hash: string; + size: number; + }; + }; +} + +const replaceLudusaviBackupWithCurrentUser = ( + backupPath: string, + title: string, + homeDir: string +) => { + const gameBackupPath = path.join(backupPath, title); + const mappingYamlPath = path.join(gameBackupPath, "mapping.yaml"); + + const data = fs.readFileSync(mappingYamlPath, "utf8"); + const manifest = YAML.parse(data) as { + backups: LudusaviBackup[]; + drives: Record; + }; + + const currentHomeDir = normalizePath(app.getPath("home")); + + /* Renaming logic */ + if (os.platform() === "win32") { + const mappedHomeDir = path.join( + gameBackupPath, + path.join("drive-C", homeDir.replace("C:", "")) + ); + + if (fs.existsSync(mappedHomeDir)) { + fs.renameSync( + mappedHomeDir, + path.join(gameBackupPath, "drive-C", currentHomeDir.replace("C:", "")) + ); + } + } + + const backups = manifest.backups.map((backup: LudusaviBackup) => { + const files = Object.entries(backup.files).reduce((prev, [key, value]) => { + const updatedKey = key.replace(homeDir, currentHomeDir); + + return { + ...prev, + [updatedKey]: value, + }; + }, {}); + + return { + ...backup, + files, + }; + }); + + fs.writeFileSync(mappingYamlPath, YAML.stringify({ ...manifest, backups })); +}; + +const downloadGameArtifact = async ( + _event: Electron.IpcMainInvokeEvent, + objectId: string, + shop: GameShop, + gameArtifactId: string +) => { + try { + const { downloadUrl, objectKey, homeDir } = await HydraApi.post<{ + downloadUrl: string; + objectKey: string; + homeDir: string; + }>(`/profile/games/artifacts/${gameArtifactId}/download`); + + const zipLocation = path.join(app.getPath("userData"), objectKey); + const backupPath = path.join(backupsPath, `${shop}-${objectId}`); + + if (fs.existsSync(backupPath)) { + fs.rmSync(backupPath, { + recursive: true, + force: true, + }); + } + + const response = await axios.get(downloadUrl, { + responseType: "stream", + onDownloadProgress: (progressEvent) => { + WindowManager.mainWindow?.webContents.send( + `on-backup-download-progress-${objectId}-${shop}`, + progressEvent + ); + }, + }); + + const writer = fs.createWriteStream(zipLocation); + + response.data.pipe(writer); + + writer.on("error", (err) => { + logger.error("Failed to write zip", err); + throw err; + }); + + fs.mkdirSync(backupPath, { recursive: true }); + + writer.on("close", () => { + tar + .x({ + file: zipLocation, + cwd: backupPath, + }) + .then(async () => { + const [game] = await Ludusavi.findGames(shop, objectId); + if (!game) throw new Error("Game not found in Ludusavi manifest"); + + replaceLudusaviBackupWithCurrentUser( + backupPath, + game.replaceAll(":", "_"), + normalizePath(homeDir) + ); + + Ludusavi.restoreBackup(backupPath).then(() => { + WindowManager.mainWindow?.webContents.send( + `on-backup-download-complete-${objectId}-${shop}`, + true + ); + }); + }); + }); + } catch (err) { + WindowManager.mainWindow?.webContents.send( + `on-backup-download-complete-${objectId}-${shop}`, + false + ); + } +}; + +registerEvent("downloadGameArtifact", downloadGameArtifact); diff --git a/src/main/events/cloud-save/get-game-artifacts.ts b/src/main/events/cloud-save/get-game-artifacts.ts new file mode 100644 index 00000000..fc47076a --- /dev/null +++ b/src/main/events/cloud-save/get-game-artifacts.ts @@ -0,0 +1,20 @@ +import { HydraApi } from "@main/services"; +import { registerEvent } from "../register-event"; +import type { GameArtifact, GameShop } from "@types"; + +const getGameArtifacts = async ( + _event: Electron.IpcMainInvokeEvent, + objectId: string, + shop: GameShop +) => { + const params = new URLSearchParams({ + objectId, + shop, + }); + + return HydraApi.get( + `/profile/games/artifacts?${params.toString()}` + ); +}; + +registerEvent("getGameArtifacts", getGameArtifacts); diff --git a/src/main/events/cloud-save/get-game-backup-preview.ts b/src/main/events/cloud-save/get-game-backup-preview.ts new file mode 100644 index 00000000..d2d9cbc8 --- /dev/null +++ b/src/main/events/cloud-save/get-game-backup-preview.ts @@ -0,0 +1,17 @@ +import { registerEvent } from "../register-event"; +import type { GameShop } from "@types"; +import { Ludusavi } from "@main/services"; +import path from "node:path"; +import { backupsPath } from "@main/constants"; + +const getGameBackupPreview = async ( + _event: Electron.IpcMainInvokeEvent, + objectId: string, + shop: GameShop +) => { + const backupPath = path.join(backupsPath, `${shop}-${objectId}`); + + return Ludusavi.getBackupPreview(shop, objectId, backupPath); +}; + +registerEvent("getGameBackupPreview", getGameBackupPreview); diff --git a/src/main/events/cloud-save/upload-save-game.ts b/src/main/events/cloud-save/upload-save-game.ts new file mode 100644 index 00000000..a573b3ba --- /dev/null +++ b/src/main/events/cloud-save/upload-save-game.ts @@ -0,0 +1,111 @@ +import { HydraApi, logger, Ludusavi, WindowManager } from "@main/services"; +import { registerEvent } from "../register-event"; +import fs from "node:fs"; +import path from "node:path"; +import * as tar from "tar"; +import crypto from "node:crypto"; +import type { GameShop } from "@types"; +import axios from "axios"; +import os from "node:os"; +import { backupsPath } from "@main/constants"; +import { app } from "electron"; +import { normalizePath } from "@main/helpers"; +import { gameRepository } from "@main/repository"; + +const bundleBackup = async ( + shop: GameShop, + objectId: string, + winePrefix: string | null +) => { + const backupPath = path.join(backupsPath, `${shop}-${objectId}`); + + // Remove existing backup + if (fs.existsSync(backupPath)) { + fs.rmSync(backupPath, { recursive: true }); + } + + await Ludusavi.backupGame(shop, objectId, backupPath, winePrefix); + + const tarLocation = path.join(backupsPath, `${crypto.randomUUID()}.tar`); + + await tar.create( + { + gzip: false, + file: tarLocation, + cwd: backupPath, + }, + ["."] + ); + + return tarLocation; +}; + +const uploadSaveGame = async ( + _event: Electron.IpcMainInvokeEvent, + objectId: string, + shop: GameShop, + downloadOptionTitle: string | null +) => { + const game = await gameRepository.findOne({ + where: { + objectID: objectId, + shop, + }, + }); + + const bundleLocation = await bundleBackup( + shop, + objectId, + game?.winePrefixPath ?? null + ); + + fs.stat(bundleLocation, async (err, stat) => { + if (err) { + logger.error("Failed to get zip file stats", err); + throw err; + } + + const { uploadUrl } = await HydraApi.post<{ + id: string; + uploadUrl: string; + }>("/profile/games/artifacts", { + artifactLengthInBytes: stat.size, + shop, + objectId, + hostname: os.hostname(), + homeDir: normalizePath(app.getPath("home")), + downloadOptionTitle, + platform: os.platform(), + }); + + fs.readFile(bundleLocation, async (err, fileBuffer) => { + if (err) { + logger.error("Failed to read zip file", err); + throw err; + } + + await axios.put(uploadUrl, fileBuffer, { + headers: { + "Content-Type": "application/tar", + }, + onUploadProgress: (progressEvent) => { + console.log(progressEvent); + }, + }); + + WindowManager.mainWindow?.webContents.send( + `on-upload-complete-${objectId}-${shop}`, + true + ); + + fs.rm(bundleLocation, (err) => { + if (err) { + logger.error("Failed to remove tar file", err); + throw err; + } + }); + }); + }); +}; + +registerEvent("uploadSaveGame", uploadSaveGame); diff --git a/src/main/events/helpers/search-games.ts b/src/main/events/helpers/search-games.ts index 1f1fc756..74e0b6a8 100644 --- a/src/main/events/helpers/search-games.ts +++ b/src/main/events/helpers/search-games.ts @@ -12,7 +12,7 @@ export interface SearchGamesArgs { export const convertSteamGameToCatalogueEntry = ( game: SteamGame ): CatalogueEntry => ({ - objectID: String(game.id), + objectId: String(game.id), title: game.name, shop: "steam" as GameShop, cover: steamUrlBuilder.library(String(game.id)), diff --git a/src/main/events/index.ts b/src/main/events/index.ts index f2853cbf..ba20a467 100644 --- a/src/main/events/index.ts +++ b/src/main/events/index.ts @@ -24,6 +24,8 @@ import "./library/update-executable-path"; import "./library/verify-executable-path"; import "./library/remove-game"; import "./library/remove-game-from-library"; +import "./library/select-game-wine-prefix"; +import "./misc/open-checkout"; import "./misc/open-external"; import "./misc/show-open-dialog"; import "./torrenting/cancel-game-download"; @@ -48,6 +50,8 @@ import "./user/unblock-user"; import "./user/get-user-friends"; import "./user/get-user-stats"; import "./user/report-user"; +import "./user/get-unlocked-achievements"; +import "./user/get-compared-unlocked-achievements"; import "./profile/get-friend-requests"; import "./profile/get-me"; import "./profile/undo-friendship"; @@ -56,8 +60,14 @@ import "./profile/update-profile"; import "./profile/process-profile-image"; import "./profile/send-friend-request"; import "./profile/sync-friend-requests"; +import "./cloud-save/download-game-artifact"; +import "./cloud-save/get-game-artifacts"; +import "./cloud-save/get-game-backup-preview"; +import "./cloud-save/upload-save-game"; +import "./cloud-save/delete-game-artifact"; import "./notifications/publish-new-repacks-notification"; import { isPortableVersion } from "@main/helpers"; +import "./misc/show-item-in-folder"; ipcMain.handle("ping", () => "pong"); ipcMain.handle("getVersion", () => appVersion); diff --git a/src/main/events/library/add-game-to-library.ts b/src/main/events/library/add-game-to-library.ts index b5c9a5d0..898c25cd 100644 --- a/src/main/events/library/add-game-to-library.ts +++ b/src/main/events/library/add-game-to-library.ts @@ -7,17 +7,18 @@ import type { GameShop } from "@types"; import { steamGamesWorker } from "@main/workers"; import { createGame } from "@main/services/library-sync"; import { steamUrlBuilder } from "@shared"; +import { updateLocalUnlockedAchivements } from "@main/services/achievements/update-local-unlocked-achivements"; const addGameToLibrary = async ( _event: Electron.IpcMainInvokeEvent, - objectID: string, + objectId: string, title: string, shop: GameShop ) => { return gameRepository .update( { - objectID, + objectID: objectId, }, { shop, @@ -27,23 +28,27 @@ const addGameToLibrary = async ( ) .then(async ({ affected }) => { if (!affected) { - const steamGame = await steamGamesWorker.run(Number(objectID), { + const steamGame = await steamGamesWorker.run(Number(objectId), { name: "getById", }); const iconUrl = steamGame?.clientIcon - ? steamUrlBuilder.icon(objectID, steamGame.clientIcon) + ? steamUrlBuilder.icon(objectId, steamGame.clientIcon) : null; await gameRepository.insert({ title, iconUrl, - objectID, + objectID: objectId, shop, }); } - const game = await gameRepository.findOne({ where: { objectID } }); + const game = await gameRepository.findOne({ + where: { objectID: objectId }, + }); + + updateLocalUnlockedAchivements(game!); createGame(game!).catch(() => {}); }); diff --git a/src/main/events/library/get-game-by-object-id.ts b/src/main/events/library/get-game-by-object-id.ts index 91cc1b5a..d68aac69 100644 --- a/src/main/events/library/get-game-by-object-id.ts +++ b/src/main/events/library/get-game-by-object-id.ts @@ -2,15 +2,15 @@ import { gameRepository } from "@main/repository"; import { registerEvent } from "../register-event"; -const getGameByObjectID = async ( +const getGameByObjectId = async ( _event: Electron.IpcMainInvokeEvent, - objectID: string + objectId: string ) => gameRepository.findOne({ where: { - objectID, + objectID: objectId, isDeleted: false, }, }); -registerEvent("getGameByObjectID", getGameByObjectID); +registerEvent("getGameByObjectId", getGameByObjectId); diff --git a/src/main/events/library/open-game-installer.ts b/src/main/events/library/open-game-installer.ts index 8532dae4..b21a6f16 100644 --- a/src/main/events/library/open-game-installer.ts +++ b/src/main/events/library/open-game-installer.ts @@ -50,7 +50,8 @@ const openGameInstaller = async ( } if (fs.lstatSync(gamePath).isFile()) { - return executeGameInstaller(gamePath); + shell.showItemInFolder(gamePath); + return true; } const setupPath = path.join(gamePath, "setup.exe"); diff --git a/src/main/events/library/select-game-wine-prefix.ts b/src/main/events/library/select-game-wine-prefix.ts new file mode 100644 index 00000000..a75a3cb0 --- /dev/null +++ b/src/main/events/library/select-game-wine-prefix.ts @@ -0,0 +1,13 @@ +import { gameRepository } from "@main/repository"; + +import { registerEvent } from "../register-event"; + +const selectGameWinePrefix = async ( + _event: Electron.IpcMainInvokeEvent, + id: number, + winePrefixPath: string +) => { + return gameRepository.update({ id }, { winePrefixPath }); +}; + +registerEvent("selectGameWinePrefix", selectGameWinePrefix); diff --git a/src/main/events/misc/open-checkout.ts b/src/main/events/misc/open-checkout.ts new file mode 100644 index 00000000..ba48f03b --- /dev/null +++ b/src/main/events/misc/open-checkout.ts @@ -0,0 +1,26 @@ +import { shell } from "electron"; +import { registerEvent } from "../register-event"; +import { userAuthRepository } from "@main/repository"; +import { HydraApi } from "@main/services"; + +const openCheckout = async (_event: Electron.IpcMainInvokeEvent) => { + const userAuth = await userAuthRepository.findOne({ where: { id: 1 } }); + + if (!userAuth) { + return; + } + + const paymentToken = await HydraApi.post("/auth/payment", { + refreshToken: userAuth.refreshToken, + }).then((response) => response.accessToken); + + const params = new URLSearchParams({ + token: paymentToken, + }); + + shell.openExternal( + `${import.meta.env.MAIN_VITE_CHECKOUT_URL}?${params.toString()}` + ); +}; + +registerEvent("openCheckout", openCheckout); diff --git a/src/main/events/misc/show-item-in-folder.ts b/src/main/events/misc/show-item-in-folder.ts new file mode 100644 index 00000000..bc774cda --- /dev/null +++ b/src/main/events/misc/show-item-in-folder.ts @@ -0,0 +1,11 @@ +import { shell } from "electron"; +import { registerEvent } from "../register-event"; + +const showItemInFolder = async ( + _event: Electron.IpcMainInvokeEvent, + filePath: string +) => { + return shell.showItemInFolder(filePath); +}; + +registerEvent("showItemInFolder", showItemInFolder); diff --git a/src/main/events/profile/get-friend-requests.ts b/src/main/events/profile/get-friend-requests.ts index 11d8a884..39573b67 100644 --- a/src/main/events/profile/get-friend-requests.ts +++ b/src/main/events/profile/get-friend-requests.ts @@ -1,6 +1,6 @@ import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; -import { FriendRequest } from "@types"; +import type { FriendRequest } from "@types"; const getFriendRequests = async ( _event: Electron.IpcMainInvokeEvent diff --git a/src/main/events/profile/get-me.ts b/src/main/events/profile/get-me.ts index 1eeecbf9..4f34ca32 100644 --- a/src/main/events/profile/get-me.ts +++ b/src/main/events/profile/get-me.ts @@ -1,48 +1,11 @@ import { registerEvent } from "../register-event"; -import * as Sentry from "@sentry/electron/main"; -import { HydraApi } from "@main/services"; -import { ProfileVisibility, UserDetails } from "@types"; -import { userAuthRepository } from "@main/repository"; -import { UserNotLoggedInError } from "@shared"; +import type { UserDetails } from "@types"; +import { getUserData } from "@main/services/user/get-user-data"; const getMe = async ( _event: Electron.IpcMainInvokeEvent ): Promise => { - return HydraApi.get(`/profile/me`) - .then(async (me) => { - userAuthRepository.upsert( - { - id: 1, - displayName: me.displayName, - profileImageUrl: me.profileImageUrl, - userId: me.id, - }, - ["id"] - ); - - Sentry.setUser({ id: me.id, username: me.username }); - - return me; - }) - .catch(async (err) => { - if (err instanceof UserNotLoggedInError) { - return null; - } - - const loggedUser = await userAuthRepository.findOne({ where: { id: 1 } }); - - if (loggedUser) { - return { - ...loggedUser, - id: loggedUser.userId, - username: "", - bio: "", - profileVisibility: "PUBLIC" as ProfileVisibility, - }; - } - - return null; - }); + return getUserData(); }; registerEvent("getMe", getMe); diff --git a/src/main/events/profile/sync-friend-requests.ts b/src/main/events/profile/sync-friend-requests.ts index 4b89701a..ffe995e6 100644 --- a/src/main/events/profile/sync-friend-requests.ts +++ b/src/main/events/profile/sync-friend-requests.ts @@ -1,9 +1,17 @@ import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; -import { FriendRequestSync } from "@types"; +import { UserNotLoggedInError } from "@shared"; +import type { FriendRequestSync } from "@types"; const syncFriendRequests = async (_event: Electron.IpcMainInvokeEvent) => { - return HydraApi.get(`/profile/friend-requests/sync`); + return HydraApi.get(`/profile/friend-requests/sync`).catch( + (err) => { + if (err instanceof UserNotLoggedInError) { + return { friendRequests: [] }; + } + throw err; + } + ); }; registerEvent("syncFriendRequests", syncFriendRequests); diff --git a/src/main/events/profile/update-friend-request.ts b/src/main/events/profile/update-friend-request.ts index 24929544..b265f88c 100644 --- a/src/main/events/profile/update-friend-request.ts +++ b/src/main/events/profile/update-friend-request.ts @@ -1,6 +1,6 @@ import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; -import { FriendRequestAction } from "@types"; +import type { FriendRequestAction } from "@types"; const updateFriendRequest = async ( _event: Electron.IpcMainInvokeEvent, diff --git a/src/main/events/profile/update-profile.ts b/src/main/events/profile/update-profile.ts index eb80bc47..7b90e483 100644 --- a/src/main/events/profile/update-profile.ts +++ b/src/main/events/profile/update-profile.ts @@ -1,56 +1,75 @@ import { registerEvent } from "../register-event"; -import { HydraApi, PythonInstance } from "@main/services"; +import { HydraApi } from "@main/services"; import fs from "node:fs"; import path from "node:path"; import type { UpdateProfileRequest, UserProfile } from "@types"; import { omit } from "lodash-es"; import axios from "axios"; - -interface PresignedResponse { - presignedUrl: string; - profileImageUrl: string; -} +import { fileTypeFromFile } from "file-type"; const patchUserProfile = async (updateProfile: UpdateProfileRequest) => { return HydraApi.patch("/profile", updateProfile); }; -const getNewProfileImageUrl = async (localImageUrl: string) => { - const { imagePath, mimeType } = - await PythonInstance.processProfileImage(localImageUrl); - - const stats = fs.statSync(imagePath); +const uploadImage = async ( + type: "profile-image" | "background-image", + imagePath: string +) => { + const stat = fs.statSync(imagePath); const fileBuffer = fs.readFileSync(imagePath); - const fileSizeInBytes = stats.size; + const fileSizeInBytes = stat.size; - const { presignedUrl, profileImageUrl } = - await HydraApi.post(`/presigned-urls/profile-image`, { + const response = await HydraApi.post<{ presignedUrl: string }>( + `/presigned-urls/${type}`, + { imageExt: path.extname(imagePath).slice(1), imageLength: fileSizeInBytes, - }); + } + ); - await axios.put(presignedUrl, fileBuffer, { + const mimeType = await fileTypeFromFile(imagePath); + + await axios.put(response.presignedUrl, fileBuffer, { headers: { - "Content-Type": mimeType, + "Content-Type": mimeType?.mime, }, }); - return profileImageUrl; + if (type === "background-image") { + return response["backgroundImageUrl"]; + } + + return response["profileImageUrl"]; }; const updateProfile = async ( _event: Electron.IpcMainInvokeEvent, updateProfile: UpdateProfileRequest ) => { - if (!updateProfile.profileImageUrl) { - return patchUserProfile(omit(updateProfile, "profileImageUrl")); + const payload = omit(updateProfile, [ + "profileImageUrl", + "backgroundImageUrl", + ]); + + if (updateProfile.profileImageUrl) { + const profileImageUrl = await uploadImage( + "profile-image", + updateProfile.profileImageUrl + ).catch(() => undefined); + + payload["profileImageUrl"] = profileImageUrl; } - const profileImageUrl = await getNewProfileImageUrl( - updateProfile.profileImageUrl - ).catch(() => undefined); + if (updateProfile.backgroundImageUrl) { + const backgroundImageUrl = await uploadImage( + "background-image", + updateProfile.backgroundImageUrl + ).catch(() => undefined); - return patchUserProfile({ ...updateProfile, profileImageUrl }); + payload["backgroundImageUrl"] = backgroundImageUrl; + } + + return patchUserProfile(payload); }; registerEvent("updateProfile", updateProfile); diff --git a/src/main/events/torrenting/start-game-download.ts b/src/main/events/torrenting/start-game-download.ts index a2c51a01..deac1d2c 100644 --- a/src/main/events/torrenting/start-game-download.ts +++ b/src/main/events/torrenting/start-game-download.ts @@ -14,7 +14,7 @@ const startGameDownload = async ( _event: Electron.IpcMainInvokeEvent, payload: StartGameDownloadPayload ) => { - const { objectID, title, shop, downloadPath, downloader, uri } = payload; + const { objectId, title, shop, downloadPath, downloader, uri } = payload; return dataSource.transaction(async (transactionalEntityManager) => { const gameRepository = transactionalEntityManager.getRepository(Game); @@ -23,7 +23,7 @@ const startGameDownload = async ( const game = await gameRepository.findOne({ where: { - objectID, + objectID: objectId, shop, }, }); @@ -51,18 +51,18 @@ const startGameDownload = async ( } ); } else { - const steamGame = await steamGamesWorker.run(Number(objectID), { + const steamGame = await steamGamesWorker.run(Number(objectId), { name: "getById", }); const iconUrl = steamGame?.clientIcon - ? steamUrlBuilder.icon(objectID, steamGame.clientIcon) + ? steamUrlBuilder.icon(objectId, steamGame.clientIcon) : null; await gameRepository.insert({ title, iconUrl, - objectID, + objectID: objectId, downloader, shop, status: "active", @@ -73,7 +73,7 @@ const startGameDownload = async ( const updatedGame = await gameRepository.findOne({ where: { - objectID, + objectID: objectId, }, }); diff --git a/src/main/events/user/get-blocked-users.ts b/src/main/events/user/get-blocked-users.ts index 3d213898..9696cd7b 100644 --- a/src/main/events/user/get-blocked-users.ts +++ b/src/main/events/user/get-blocked-users.ts @@ -1,13 +1,19 @@ import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; -import { UserBlocks } from "@types"; +import { UserNotLoggedInError } from "@shared"; +import type { UserBlocks } from "@types"; export const getBlockedUsers = async ( _event: Electron.IpcMainInvokeEvent, take: number, skip: number ): Promise => { - return HydraApi.get(`/profile/blocks`, { take, skip }); + return HydraApi.get(`/profile/blocks`, { take, skip }).catch((err) => { + if (err instanceof UserNotLoggedInError) { + return { blocks: [] }; + } + throw err; + }); }; registerEvent("getBlockedUsers", getBlockedUsers); diff --git a/src/main/events/user/get-compared-unlocked-achievements.ts b/src/main/events/user/get-compared-unlocked-achievements.ts new file mode 100644 index 00000000..0c117140 --- /dev/null +++ b/src/main/events/user/get-compared-unlocked-achievements.ts @@ -0,0 +1,44 @@ +import type { ComparedAchievements, GameShop } from "@types"; +import { registerEvent } from "../register-event"; +import { userPreferencesRepository } from "@main/repository"; +import { HydraApi } from "@main/services"; + +const getComparedUnlockedAchievements = async ( + _event: Electron.IpcMainInvokeEvent, + objectId: string, + shop: GameShop, + userId: string +) => { + const userPreferences = await userPreferencesRepository.findOne({ + where: { id: 1 }, + }); + + return HydraApi.get( + `/users/${userId}/games/achievements/compare`, + { + shop, + objectId, + language: userPreferences?.language || "en", + } + ).then((achievements) => { + const sortedAchievements = achievements.achievements.sort((a, b) => { + if (a.targetStat.unlocked && !b.targetStat.unlocked) return -1; + if (!a.targetStat.unlocked && b.targetStat.unlocked) return 1; + if (a.targetStat.unlocked && b.targetStat.unlocked) { + return b.targetStat.unlockTime! - a.targetStat.unlockTime!; + } + + return Number(a.hidden) - Number(b.hidden); + }); + + return { + ...achievements, + achievements: sortedAchievements, + } as ComparedAchievements; + }); +}; + +registerEvent( + "getComparedUnlockedAchievements", + getComparedUnlockedAchievements +); diff --git a/src/main/events/user/get-unlocked-achievements.ts b/src/main/events/user/get-unlocked-achievements.ts new file mode 100644 index 00000000..a831bc50 --- /dev/null +++ b/src/main/events/user/get-unlocked-achievements.ts @@ -0,0 +1,73 @@ +import type { GameShop, UnlockedAchievement, UserAchievement } from "@types"; +import { registerEvent } from "../register-event"; +import { gameAchievementRepository } from "@main/repository"; +import { getGameAchievementData } from "@main/services/achievements/get-game-achievement-data"; + +export const getUnlockedAchievements = async ( + objectId: string, + shop: GameShop, + useCachedData: boolean +): Promise => { + const cachedAchievements = await gameAchievementRepository.findOne({ + where: { objectId, shop }, + }); + + const achievementsData = await getGameAchievementData( + objectId, + shop, + useCachedData + ); + + const unlockedAchievements = JSON.parse( + cachedAchievements?.unlockedAchievements || "[]" + ) as UnlockedAchievement[]; + + return achievementsData + .map((achievementData) => { + const unlockedAchiementData = unlockedAchievements.find( + (localAchievement) => { + return ( + localAchievement.name.toUpperCase() == + achievementData.name.toUpperCase() + ); + } + ); + + const icongray = achievementData.icongray.endsWith("/") + ? achievementData.icon + : achievementData.icongray; + + if (unlockedAchiementData) { + return { + ...achievementData, + unlocked: true, + unlockTime: unlockedAchiementData.unlockTime, + }; + } + + return { + ...achievementData, + unlocked: false, + unlockTime: null, + icongray: icongray, + } as UserAchievement; + }) + .sort((a, b) => { + if (a.unlocked && !b.unlocked) return -1; + if (!a.unlocked && b.unlocked) return 1; + if (a.unlocked && b.unlocked) { + return b.unlockTime! - a.unlockTime!; + } + return Number(a.hidden) - Number(b.hidden); + }); +}; + +const getUnlockedAchievementsEvent = async ( + _event: Electron.IpcMainInvokeEvent, + objectId: string, + shop: GameShop +): Promise => { + return getUnlockedAchievements(objectId, shop, false); +}; + +registerEvent("getUnlockedAchievements", getUnlockedAchievementsEvent); diff --git a/src/main/events/user/get-user-friends.ts b/src/main/events/user/get-user-friends.ts index 5ff4c8a4..9a6f156c 100644 --- a/src/main/events/user/get-user-friends.ts +++ b/src/main/events/user/get-user-friends.ts @@ -1,7 +1,7 @@ import { userAuthRepository } from "@main/repository"; import { registerEvent } from "../register-event"; import { HydraApi } from "@main/services"; -import { UserFriends } from "@types"; +import type { UserFriends } from "@types"; export const getUserFriends = async ( userId: string, diff --git a/src/main/helpers/index.ts b/src/main/helpers/index.ts index bf29762a..db5569c8 100644 --- a/src/main/helpers/index.ts +++ b/src/main/helpers/index.ts @@ -1,6 +1,7 @@ import axios from "axios"; import { JSDOM } from "jsdom"; import UserAgent from "user-agents"; +import path from "node:path"; export const getFileBuffer = async (url: string) => fetch(url, { method: "GET" }).then((response) => @@ -27,3 +28,6 @@ export const requestWebPage = async (url: string) => { export const isPortableVersion = () => process.env.PORTABLE_EXECUTABLE_FILE !== null; + +export const normalizePath = (str: string) => + path.posix.normalize(str).replace(/\\/g, "/"); diff --git a/src/main/index.ts b/src/main/index.ts index c9e36b2c..1b1629ef 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, net, protocol, session } from "electron"; +import { app, BrowserWindow, net, protocol } from "electron"; import { init } from "@sentry/electron/main"; import updater from "electron-updater"; import i18n from "i18next"; @@ -102,47 +102,8 @@ app.whenReady().then(async () => { } WindowManager.createMainWindow(); + WindowManager.createNotificationWindow(); WindowManager.createSystemTray(userPreferences?.language || "en"); - - session.defaultSession.webRequest.onBeforeSendHeaders((details, callback) => { - callback({ - requestHeaders: { - ...details.requestHeaders, - "user-agent": - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", - }, - }); - }); - - session.defaultSession.webRequest.onHeadersReceived((details, callback) => { - const headers = { - "access-control-allow-origin": ["*"], - "access-control-allow-methods": ["GET, POST, PUT, DELETE, OPTIONS"], - "access-control-expose-headers": ["ETag"], - "access-control-allow-headers": [ - "Content-Type, Authorization, X-Requested-With, If-None-Match", - ], - "access-control-allow-credentials": ["true"], - }; - - if (details.method === "OPTIONS") { - callback({ - cancel: false, - responseHeaders: { - ...details.responseHeaders, - ...headers, - }, - statusLine: "HTTP/1.1 200 OK", - }); - } else { - callback({ - responseHeaders: { - ...details.responseHeaders, - ...headers, - }, - }); - } - }); }); app.on("browser-window-created", (_, window) => { diff --git a/src/main/knex-client.ts b/src/main/knex-client.ts index b6ec3e3d..5f81ffbc 100644 --- a/src/main/knex-client.ts +++ b/src/main/knex-client.ts @@ -6,6 +6,11 @@ import { UpdateUserLanguage } from "./migrations/20240913213944_update_user_lang import { EnsureRepackUris } from "./migrations/20240915035339_ensure_repack_uris"; import { app } from "electron"; import { FixMissingColumns } from "./migrations/20240918001920_FixMissingColumns"; +import { CreateGameAchievement } from "./migrations/20240919030940_create_game_achievement"; +import { AddAchievementNotificationPreference } from "./migrations/20241013012900_add_achievement_notification_preference"; +import { CreateUserSubscription } from "./migrations/20241015235142_create_user_subscription"; +import { AddBackgroundImageUrl } from "./migrations/20241016100249_add_background_image_url"; +import { AddWinePrefixToGame } from "./migrations/20241019081648_add_wine_prefix_to_game"; export type HydraMigration = Knex.Migration & { name: string }; @@ -17,6 +22,11 @@ class MigrationSource implements Knex.MigrationSource { UpdateUserLanguage, EnsureRepackUris, FixMissingColumns, + CreateGameAchievement, + AddAchievementNotificationPreference, + CreateUserSubscription, + AddBackgroundImageUrl, + AddWinePrefixToGame, ]); } getMigrationName(migration: HydraMigration): string { diff --git a/src/main/main.ts b/src/main/main.ts index 7f3d6370..69bc62e0 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -1,4 +1,9 @@ -import { DownloadManager, PythonInstance, startMainLoop } from "./services"; +import { + DownloadManager, + Ludusavi, + PythonInstance, + startMainLoop, +} from "./services"; import { downloadQueueRepository, userPreferencesRepository, @@ -15,6 +20,8 @@ const loadState = async (userPreferences: UserPreferences | null) => { RealDebridClient.authorize(userPreferences?.realDebridApiToken); } + Ludusavi.addManifestToLudusaviConfig(); + HydraApi.setupApi().then(() => { uploadGamesBatch(); }); diff --git a/src/main/migrations/20240919030940_create_game_achievement.ts b/src/main/migrations/20240919030940_create_game_achievement.ts new file mode 100644 index 00000000..791eeb29 --- /dev/null +++ b/src/main/migrations/20240919030940_create_game_achievement.ts @@ -0,0 +1,20 @@ +import type { HydraMigration } from "@main/knex-client"; +import type { Knex } from "knex"; + +export const CreateGameAchievement: HydraMigration = { + name: "CreateGameAchievement", + up: (knex: Knex) => { + return knex.schema.createTable("game_achievement", (table) => { + table.increments("id").primary(); + table.text("objectId").notNullable(); + table.text("shop").notNullable(); + table.text("achievements"); + table.text("unlockedAchievements"); + table.unique(["objectId", "shop"]); + }); + }, + + down: (knex: Knex) => { + return knex.schema.dropTable("game_achievement"); + }, +}; diff --git a/src/main/migrations/20241013012900_add_achievement_notification_preference.ts b/src/main/migrations/20241013012900_add_achievement_notification_preference.ts new file mode 100644 index 00000000..a4f48265 --- /dev/null +++ b/src/main/migrations/20241013012900_add_achievement_notification_preference.ts @@ -0,0 +1,17 @@ +import type { HydraMigration } from "@main/knex-client"; +import type { Knex } from "knex"; + +export const AddAchievementNotificationPreference: HydraMigration = { + name: "AddAchievementNotificationPreference", + up: (knex: Knex) => { + return knex.schema.alterTable("user_preferences", (table) => { + return table.boolean("achievementNotificationsEnabled").defaultTo(true); + }); + }, + + down: (knex: Knex) => { + return knex.schema.alterTable("user_preferences", (table) => { + return table.dropColumn("achievementNotificationsEnabled"); + }); + }, +}; diff --git a/src/main/migrations/20241015235142_create_user_subscription.ts b/src/main/migrations/20241015235142_create_user_subscription.ts new file mode 100644 index 00000000..5f9ecab1 --- /dev/null +++ b/src/main/migrations/20241015235142_create_user_subscription.ts @@ -0,0 +1,27 @@ +import type { HydraMigration } from "@main/knex-client"; +import type { Knex } from "knex"; + +export const CreateUserSubscription: HydraMigration = { + name: "CreateUserSubscription", + up: async (knex: Knex) => { + return knex.schema.createTable("user_subscription", (table) => { + table.increments("id").primary(); + table.string("subscriptionId").defaultTo(""); + table + .text("userId") + .notNullable() + .references("user_auth.id") + .onDelete("CASCADE"); + table.string("status").defaultTo(""); + table.string("planId").defaultTo(""); + table.string("planName").defaultTo(""); + table.dateTime("expiresAt").nullable(); + table.dateTime("createdAt").defaultTo(knex.fn.now()); + table.dateTime("updatedAt").defaultTo(knex.fn.now()); + }); + }, + + down: async (knex: Knex) => { + return knex.schema.dropTable("user_subscription"); + }, +}; diff --git a/src/main/migrations/20241016100249_add_background_image_url.ts b/src/main/migrations/20241016100249_add_background_image_url.ts new file mode 100644 index 00000000..b377c650 --- /dev/null +++ b/src/main/migrations/20241016100249_add_background_image_url.ts @@ -0,0 +1,17 @@ +import type { HydraMigration } from "@main/knex-client"; +import type { Knex } from "knex"; + +export const AddBackgroundImageUrl: HydraMigration = { + name: "AddBackgroundImageUrl", + up: (knex: Knex) => { + return knex.schema.alterTable("user_auth", (table) => { + return table.text("backgroundImageUrl").nullable(); + }); + }, + + down: async (knex: Knex) => { + return knex.schema.alterTable("user_auth", (table) => { + return table.dropColumn("backgroundImageUrl"); + }); + }, +}; diff --git a/src/main/migrations/20241019081648_add_wine_prefix_to_game.ts b/src/main/migrations/20241019081648_add_wine_prefix_to_game.ts new file mode 100644 index 00000000..517f6fb5 --- /dev/null +++ b/src/main/migrations/20241019081648_add_wine_prefix_to_game.ts @@ -0,0 +1,17 @@ +import type { HydraMigration } from "@main/knex-client"; +import type { Knex } from "knex"; + +export const AddWinePrefixToGame: HydraMigration = { + name: "AddWinePrefixToGame", + up: (knex: Knex) => { + return knex.schema.alterTable("game", (table) => { + return table.text("winePrefixPath").nullable(); + }); + }, + + down: async (knex: Knex) => { + return knex.schema.alterTable("game", (table) => { + return table.dropColumn("winePrefixPath"); + }); + }, +}; diff --git a/src/main/migrations/migration.stub b/src/main/migrations/migration.stub index 9cb0cbab..299b3fc2 100644 --- a/src/main/migrations/migration.stub +++ b/src/main/migrations/migration.stub @@ -3,8 +3,8 @@ import type { Knex } from "knex"; export const MigrationName: HydraMigration = { name: "MigrationName", - up: async (knex: Knex) => { - await knex.schema.createTable("table_name", (table) => {}); + up: (knex: Knex) => { + return knex.schema.createTable("table_name", async (table) => {}); }, down: async (knex: Knex) => {}, diff --git a/src/main/repository.ts b/src/main/repository.ts index 4464e775..cf3ab143 100644 --- a/src/main/repository.ts +++ b/src/main/repository.ts @@ -7,6 +7,8 @@ import { Repack, UserPreferences, UserAuth, + GameAchievement, + UserSubscription, } from "@main/entity"; export const gameRepository = dataSource.getRepository(Game); @@ -24,3 +26,9 @@ export const downloadSourceRepository = export const downloadQueueRepository = dataSource.getRepository(DownloadQueue); export const userAuthRepository = dataSource.getRepository(UserAuth); + +export const userSubscriptionRepository = + dataSource.getRepository(UserSubscription); + +export const gameAchievementRepository = + dataSource.getRepository(GameAchievement); diff --git a/src/main/services/achievements/achievement-watcher-manager.ts b/src/main/services/achievements/achievement-watcher-manager.ts new file mode 100644 index 00000000..2345e3be --- /dev/null +++ b/src/main/services/achievements/achievement-watcher-manager.ts @@ -0,0 +1,253 @@ +import { gameRepository } from "@main/repository"; +import { parseAchievementFile } from "./parse-achievement-file"; +import { Game } from "@main/entity"; +import { mergeAchievements } from "./merge-achievements"; +import fs, { readdirSync } from "node:fs"; +import { + findAchievementFileInExecutableDirectory, + findAchievementFiles, + findAllAchievementFiles, + getAlternativeObjectIds, +} from "./find-achivement-files"; +import type { AchievementFile, UnlockedAchievement } from "@types"; +import { achievementsLogger } from "../logger"; +import { Cracker } from "@shared"; +import { IsNull, Not } from "typeorm"; +import { WindowManager } from "../window-manager"; + +const fileStats: Map = new Map(); +const fltFiles: Map> = new Map(); + +const watchAchievementsWindows = async () => { + const games = await gameRepository.find({ + where: { + isDeleted: false, + }, + }); + + if (games.length === 0) return; + + const achievementFiles = findAllAchievementFiles(); + + for (const game of games) { + const gameAchievementFiles: AchievementFile[] = []; + + for (const objectId of getAlternativeObjectIds(game.objectID)) { + gameAchievementFiles.push(...(achievementFiles.get(objectId) || [])); + + gameAchievementFiles.push( + ...findAchievementFileInExecutableDirectory(game) + ); + } + + for (const file of gameAchievementFiles) { + compareFile(game, file); + } + } +}; + +const watchAchievementsWithWine = async () => { + const games = await gameRepository.find({ + where: { + isDeleted: false, + winePrefixPath: Not(IsNull()), + }, + }); + + for (const game of games) { + const gameAchievementFiles = findAchievementFiles(game); + const achievementFileInsideDirectory = + findAchievementFileInExecutableDirectory(game); + + gameAchievementFiles.push(...achievementFileInsideDirectory); + + for (const file of gameAchievementFiles) { + compareFile(game, file); + } + } +}; + +const compareFltFolder = async (game: Game, file: AchievementFile) => { + try { + const currentAchievements = new Set(readdirSync(file.filePath)); + const previousAchievements = fltFiles.get(file.filePath); + + fltFiles.set(file.filePath, currentAchievements); + if ( + !previousAchievements || + currentAchievements.difference(previousAchievements).size === 0 + ) { + return; + } + + achievementsLogger.log("Detected change in FLT folder", file.filePath); + await processAchievementFileDiff(game, file); + } catch (err) { + achievementsLogger.error(err); + fltFiles.set(file.filePath, new Set()); + } +}; + +const compareFile = (game: Game, file: AchievementFile) => { + if (file.type === Cracker.flt) { + return compareFltFolder(game, file); + } + + try { + const currentStat = fs.statSync(file.filePath); + const previousStat = fileStats.get(file.filePath); + fileStats.set(file.filePath, currentStat.mtimeMs); + + if (!previousStat || previousStat === -1) { + if (currentStat.mtimeMs) { + achievementsLogger.log( + "First change in file", + file.filePath, + previousStat, + currentStat.mtimeMs + ); + + return processAchievementFileDiff(game, file); + } + } + + if (previousStat === currentStat.mtimeMs) { + return; + } + + achievementsLogger.log( + "Detected change in file", + file.filePath, + previousStat, + currentStat.mtimeMs + ); + return processAchievementFileDiff(game, file); + } catch (err) { + fileStats.set(file.filePath, -1); + return; + } +}; + +const processAchievementFileDiff = async ( + game: Game, + file: AchievementFile +) => { + const unlockedAchievements = parseAchievementFile(file.filePath, file.type); + + if (unlockedAchievements.length) { + return mergeAchievements(game, unlockedAchievements, true); + } + + return 0; +}; + +export class AchievementWatcherManager { + private static hasFinishedMergingWithRemote = false; + + public static watchAchievements = () => { + if (!this.hasFinishedMergingWithRemote) return; + + if (process.platform === "win32") { + return watchAchievementsWindows(); + } + + return watchAchievementsWithWine(); + }; + + private static preProcessGameAchievementFiles = ( + game: Game, + gameAchievementFiles: AchievementFile[] + ) => { + const unlockedAchievements: UnlockedAchievement[] = []; + for (const achievementFile of gameAchievementFiles) { + const parsedAchievements = parseAchievementFile( + achievementFile.filePath, + achievementFile.type + ); + + try { + const currentStat = fs.statSync(achievementFile.filePath); + fileStats.set(achievementFile.filePath, currentStat.mtimeMs); + } catch { + fileStats.set(achievementFile.filePath, -1); + } + + if (parsedAchievements.length) { + unlockedAchievements.push(...parsedAchievements); + + achievementsLogger.log( + "Achievement file for", + game.title, + achievementFile.filePath, + parsedAchievements + ); + } + } + + return mergeAchievements(game, unlockedAchievements, false); + }; + + private static preSearchAchievementsWindows = async () => { + const games = await gameRepository.find({ + where: { + isDeleted: false, + }, + }); + + const gameAchievementFilesMap = findAllAchievementFiles(); + + return Promise.all( + games.map((game) => { + const gameAchievementFiles: AchievementFile[] = []; + + for (const objectId of getAlternativeObjectIds(game.objectID)) { + gameAchievementFiles.push( + ...(gameAchievementFilesMap.get(objectId) || []) + ); + + gameAchievementFiles.push( + ...findAchievementFileInExecutableDirectory(game) + ); + } + + return this.preProcessGameAchievementFiles(game, gameAchievementFiles); + }) + ); + }; + + private static preSearchAchievementsWithWine = async () => { + const games = await gameRepository.find({ + where: { + isDeleted: false, + winePrefixPath: Not(IsNull()), + }, + }); + + return Promise.all( + games.map((game) => { + const gameAchievementFiles = findAchievementFiles(game); + const achievementFileInsideDirectory = + findAchievementFileInExecutableDirectory(game); + + gameAchievementFiles.push(...achievementFileInsideDirectory); + + return this.preProcessGameAchievementFiles(game, gameAchievementFiles); + }) + ); + }; + + public static preSearchAchievements = async () => { + const newAchievementsCount = + process.platform === "win32" + ? await this.preSearchAchievementsWindows() + : await this.preSearchAchievementsWithWine(); + + WindowManager.notificationWindow?.webContents.send( + "on-combined-achievements-unlocked", + newAchievementsCount.filter((achievements) => achievements).length, + newAchievementsCount.reduce((acc, val) => acc + val, 0) + ); + + this.hasFinishedMergingWithRemote = true; + }; +} diff --git a/src/main/services/achievements/find-achivement-files.ts b/src/main/services/achievements/find-achivement-files.ts new file mode 100644 index 00000000..9195c13a --- /dev/null +++ b/src/main/services/achievements/find-achivement-files.ts @@ -0,0 +1,325 @@ +import path from "node:path"; +import fs from "node:fs"; +import { app } from "electron"; +import type { AchievementFile } from "@types"; +import { Cracker } from "@shared"; +import { Game } from "@main/entity"; +import { achievementsLogger } from "../logger"; + +const getAppDataPath = () => { + if (process.platform === "win32") { + return app.getPath("appData"); + } + + const user = app.getPath("home").split("/").pop(); + + return path.join("drive_c", "users", user || "", "AppData", "Roaming"); +}; + +const getDocumentsPath = () => { + if (process.platform === "win32") { + return app.getPath("documents"); + } + + const user = app.getPath("home").split("/").pop(); + + return path.join("drive_c", "users", user || "", "Documents"); +}; + +const getPublicDocumentsPath = () => { + if (process.platform === "win32") { + return path.join("C:", "Users", "Public", "Documents"); + } + + return path.join("drive_c", "users", "Public", "Documents"); +}; + +const getLocalAppDataPath = () => { + if (process.platform === "win32") { + return path.join(appData, "..", "Local"); + } + + const user = app.getPath("home").split("/").pop(); + + return path.join("drive_c", "users", user || "", "AppData", "Local"); +}; + +const getProgramDataPath = () => { + if (process.platform === "win32") { + return path.join("C:", "ProgramData"); + } + + return path.join("drive_c", "ProgramData"); +}; + +//TODO: change to a automatized method +const publicDocuments = getPublicDocumentsPath(); +const programData = getProgramDataPath(); +const appData = getAppDataPath(); +const documents = getDocumentsPath(); +const localAppData = getLocalAppDataPath(); + +const crackers = [ + Cracker.codex, + Cracker.goldberg, + Cracker.rune, + Cracker.onlineFix, + Cracker.userstats, + Cracker.rld, + Cracker.creamAPI, + Cracker.skidrow, + Cracker.smartSteamEmu, + Cracker.empress, + Cracker.flt, +]; + +const getPathFromCracker = (cracker: Cracker) => { + if (cracker === Cracker.codex) { + return [ + { + folderPath: path.join(publicDocuments, "Steam", "CODEX"), + fileLocation: ["achievements.ini"], + }, + { + folderPath: path.join(appData, "Steam", "CODEX"), + fileLocation: ["achievements.ini"], + }, + ]; + } + + if (cracker === Cracker.rune) { + return [ + { + folderPath: path.join(publicDocuments, "Steam", "RUNE"), + fileLocation: ["achievements.ini"], + }, + ]; + } + + if (cracker === Cracker.onlineFix) { + return [ + { + folderPath: path.join(publicDocuments, "OnlineFix"), + fileLocation: ["Stats", "Achievements.ini"], + }, + { + folderPath: path.join(publicDocuments, "OnlineFix"), + fileLocation: ["Achievements.ini"], + }, + ]; + } + + if (cracker === Cracker.goldberg) { + return [ + { + folderPath: path.join(appData, "Goldberg SteamEmu Saves"), + fileLocation: ["achievements.json"], + }, + { + folderPath: path.join(appData, "GSE Saves"), + fileLocation: ["achievements.json"], + }, + ]; + } + + if (cracker === Cracker.userstats) { + return []; + } + + if (cracker === Cracker.rld) { + return [ + { + folderPath: path.join(programData, "RLD!"), + fileLocation: ["achievements.ini"], + }, + { + folderPath: path.join(programData, "Steam", "Player"), + fileLocation: ["stats", "achievements.ini"], + }, + { + folderPath: path.join(programData, "Steam", "RLD!"), + fileLocation: ["stats", "achievements.ini"], + }, + { + folderPath: path.join(programData, "Steam", "dodi"), + fileLocation: ["stats", "achievements.ini"], + }, + ]; + } + + if (cracker === Cracker.empress) { + return [ + { + folderPath: path.join(appData, "EMPRESS", "remote"), + fileLocation: ["achievements.json"], + }, + { + folderPath: path.join(publicDocuments, "EMPRESS", "remote"), + fileLocation: ["achievements.json"], + }, + ]; + } + + if (cracker === Cracker.skidrow) { + return [ + { + folderPath: path.join(documents, "SKIDROW"), + fileLocation: ["SteamEmu", "UserStats", "achiev.ini"], + }, + { + folderPath: path.join(documents, "Player"), + fileLocation: ["SteamEmu", "UserStats", "achiev.ini"], + }, + { + folderPath: path.join(localAppData, "SKIDROW"), + fileLocation: ["SteamEmu", "UserStats", "achiev.ini"], + }, + ]; + } + + if (cracker === Cracker.creamAPI) { + return [ + { + folderPath: path.join(appData, "CreamAPI"), + fileLocation: ["stats", "CreamAPI.Achievements.cfg"], + }, + ]; + } + + if (cracker === Cracker.smartSteamEmu) { + return [ + { + folderPath: path.join(appData, "SmartSteamEmu"), + fileLocation: ["User", "Achievements.ini"], + }, + ]; + } + + if (cracker === Cracker._3dm) { + return []; + } + + if (cracker === Cracker.flt) { + return [ + // { + // folderPath: path.join(appData, "FLT"), + // fileLocation: ["stats"], + // }, + ]; + } + + if (cracker == Cracker.rle) { + return [ + { + folderPath: path.join(appData, "RLE"), + fileLocation: ["achievements.ini"], + }, + { + folderPath: path.join(appData, "RLE"), + fileLocation: ["Achievements.ini"], + }, + ]; + } + + achievementsLogger.error(`Cracker ${cracker} not implemented`); + throw new Error(`Cracker ${cracker} not implemented`); +}; + +export const getAlternativeObjectIds = (objectId: string) => { + // Dishonored + if (objectId === "205100") { + return ["205100", "217980", "31292"]; + } + + return [objectId]; +}; + +export const findAchievementFiles = (game: Game) => { + const achievementFiles: AchievementFile[] = []; + + for (const cracker of crackers) { + for (const { folderPath, fileLocation } of getPathFromCracker(cracker)) { + for (const objectId of getAlternativeObjectIds(game.objectID)) { + const filePath = path.join( + game.winePrefixPath ?? "", + folderPath, + objectId, + ...fileLocation + ); + + if (fs.existsSync(filePath)) { + achievementFiles.push({ + type: cracker, + filePath, + }); + } + } + } + } + + return achievementFiles; +}; + +export const findAchievementFileInExecutableDirectory = ( + game: Game +): AchievementFile[] => { + if (!game.executablePath) { + return []; + } + + return [ + { + type: Cracker.userstats, + filePath: path.join( + game.winePrefixPath ?? "", + game.executablePath, + "..", + "SteamData", + "user_stats.ini" + ), + }, + { + type: Cracker._3dm, + filePath: path.join( + game.winePrefixPath ?? "", + game.executablePath, + "..", + "3DMGAME", + "Player", + "stats", + "achievements.ini" + ), + }, + ]; +}; + +export const findAllAchievementFiles = () => { + const gameAchievementFiles = new Map(); + + for (const cracker of crackers) { + for (const { folderPath, fileLocation } of getPathFromCracker(cracker)) { + if (!fs.existsSync(folderPath)) { + continue; + } + + const objectIds = fs.readdirSync(folderPath); + + for (const objectId of objectIds) { + const filePath = path.join(folderPath, objectId, ...fileLocation); + + if (!fs.existsSync(filePath)) continue; + + const achivementFile = { + type: cracker, + filePath, + }; + + gameAchievementFiles.get(objectId) + ? gameAchievementFiles.get(objectId)!.push(achivementFile) + : gameAchievementFiles.set(objectId, [achivementFile]); + } + } + } + + return gameAchievementFiles; +}; diff --git a/src/main/services/achievements/get-game-achievement-data.ts b/src/main/services/achievements/get-game-achievement-data.ts new file mode 100644 index 00000000..02019dab --- /dev/null +++ b/src/main/services/achievements/get-game-achievement-data.ts @@ -0,0 +1,61 @@ +import { + gameAchievementRepository, + userPreferencesRepository, +} from "@main/repository"; +import { HydraApi } from "../hydra-api"; +import type { AchievementData, GameShop } from "@types"; +import { UserNotLoggedInError } from "@shared"; +import { logger } from "../logger"; + +export const getGameAchievementData = async ( + objectId: string, + shop: GameShop, + useCachedData: boolean +) => { + if (useCachedData) { + const cachedAchievements = await gameAchievementRepository.findOne({ + where: { objectId, shop }, + }); + + if (cachedAchievements && cachedAchievements.achievements) { + return JSON.parse(cachedAchievements.achievements) as AchievementData[]; + } + } + + const userPreferences = await userPreferencesRepository.findOne({ + where: { id: 1 }, + }); + + return HydraApi.get("/games/achievements", { + shop, + objectId, + language: userPreferences?.language || "en", + }) + .then((achievements) => { + gameAchievementRepository.upsert( + { + objectId, + shop, + achievements: JSON.stringify(achievements), + }, + ["objectId", "shop"] + ); + + return achievements; + }) + .catch((err) => { + if (err instanceof UserNotLoggedInError) { + throw err; + } + logger.error("Failed to get game achievements", err); + return gameAchievementRepository + .findOne({ + where: { objectId, shop }, + }) + .then((gameAchievements) => { + return JSON.parse( + gameAchievements?.achievements || "[]" + ) as AchievementData[]; + }); + }); +}; diff --git a/src/main/services/achievements/merge-achievements.ts b/src/main/services/achievements/merge-achievements.ts new file mode 100644 index 00000000..41bf575a --- /dev/null +++ b/src/main/services/achievements/merge-achievements.ts @@ -0,0 +1,160 @@ +import { + gameAchievementRepository, + userPreferencesRepository, +} from "@main/repository"; +import type { AchievementData, GameShop, UnlockedAchievement } from "@types"; +import { WindowManager } from "../window-manager"; +import { HydraApi } from "../hydra-api"; +import { getUnlockedAchievements } from "@main/events/user/get-unlocked-achievements"; +import { Game } from "@main/entity"; +import { achievementsLogger } from "../logger"; +import { SubscriptionRequiredError } from "@shared"; + +const saveAchievementsOnLocal = async ( + objectId: string, + shop: GameShop, + achievements: any[], + sendUpdateEvent: boolean +) => { + return gameAchievementRepository + .upsert( + { + objectId, + shop, + unlockedAchievements: JSON.stringify(achievements), + }, + ["objectId", "shop"] + ) + .then(() => { + if (!sendUpdateEvent) return; + + return getUnlockedAchievements(objectId, shop, true) + .then((achievements) => { + WindowManager.mainWindow?.webContents.send( + `on-update-achievements-${objectId}-${shop}`, + achievements + ); + }) + .catch(() => {}); + }); +}; + +export const mergeAchievements = async ( + game: Game, + achievements: UnlockedAchievement[], + publishNotification: boolean +) => { + const [localGameAchievement, userPreferences] = await Promise.all([ + gameAchievementRepository.findOne({ + where: { + objectId: game.objectID, + shop: game.shop, + }, + }), + userPreferencesRepository.findOne({ where: { id: 1 } }), + ]); + + const achievementsData = JSON.parse( + localGameAchievement?.achievements || "[]" + ) as AchievementData[]; + + const unlockedAchievements = JSON.parse( + localGameAchievement?.unlockedAchievements || "[]" + ).filter((achievement) => achievement.name) as UnlockedAchievement[]; + + const newAchievementsMap = new Map( + achievements.reverse().map((achievement) => { + return [achievement.name.toUpperCase(), achievement]; + }) + ); + + const newAchievements = [...newAchievementsMap.values()] + .filter((achievement) => { + return !unlockedAchievements.some((localAchievement) => { + return ( + localAchievement.name.toUpperCase() === achievement.name.toUpperCase() + ); + }); + }) + .map((achievement) => { + return { + name: achievement.name.toUpperCase(), + unlockTime: achievement.unlockTime, + }; + }); + + if ( + newAchievements.length && + publishNotification && + userPreferences?.achievementNotificationsEnabled + ) { + const achievementsInfo = newAchievements + .sort((a, b) => { + return a.unlockTime - b.unlockTime; + }) + .map((achievement) => { + return achievementsData.find((steamAchievement) => { + return ( + achievement.name.toUpperCase() === + steamAchievement.name.toUpperCase() + ); + }); + }) + .filter((achievement) => achievement) + .map((achievement) => { + return { + displayName: achievement!.displayName, + iconUrl: achievement!.icon, + }; + }); + + WindowManager.notificationWindow?.webContents.send( + "on-achievement-unlocked", + game.objectID, + game.shop, + achievementsInfo + ); + } + + const mergedLocalAchievements = unlockedAchievements.concat(newAchievements); + + if (game.remoteId) { + await HydraApi.put( + "/profile/games/achievements", + { + id: game.remoteId, + achievements: mergedLocalAchievements, + }, + { needsSubscription: true } + ) + .then((response) => { + return saveAchievementsOnLocal( + response.objectId, + response.shop, + response.achievements, + publishNotification + ); + }) + .catch((err) => { + if (!(err instanceof SubscriptionRequiredError)) { + achievementsLogger.error(err); + } + + return saveAchievementsOnLocal( + game.objectID, + game.shop, + mergedLocalAchievements, + publishNotification + ); + }); + } else { + await saveAchievementsOnLocal( + game.objectID, + game.shop, + mergedLocalAchievements, + publishNotification + ); + } + + return newAchievements.length; +}; diff --git a/src/main/services/achievements/parse-achievement-file.ts b/src/main/services/achievements/parse-achievement-file.ts new file mode 100644 index 00000000..07854935 --- /dev/null +++ b/src/main/services/achievements/parse-achievement-file.ts @@ -0,0 +1,291 @@ +import { Cracker } from "@shared"; +import { UnlockedAchievement } from "@types"; +import { existsSync, readFileSync, readdirSync } from "node:fs"; +import { achievementsLogger } from "../logger"; + +export const parseAchievementFile = ( + filePath: string, + type: Cracker +): UnlockedAchievement[] => { + if (!existsSync(filePath)) return []; + + if (type == Cracker.codex) { + const parsed = iniParse(filePath); + return processDefault(parsed); + } + + if (type == Cracker.rune) { + const parsed = iniParse(filePath); + return processDefault(parsed); + } + + if (type === Cracker.onlineFix) { + const parsed = iniParse(filePath); + return processOnlineFix(parsed); + } + + if (type === Cracker.goldberg) { + const parsed = jsonParse(filePath); + return processGoldberg(parsed); + } + + if (type == Cracker.userstats) { + const parsed = iniParse(filePath); + return processUserStats(parsed); + } + + if (type == Cracker.rld) { + const parsed = iniParse(filePath); + return processRld(parsed); + } + + if (type === Cracker.skidrow) { + const parsed = iniParse(filePath); + return processSkidrow(parsed); + } + + if (type === Cracker._3dm) { + const parsed = iniParse(filePath); + return process3DM(parsed); + } + + if (type === Cracker.flt) { + const achievements = readdirSync(filePath); + + return achievements.map((achievement) => { + return { + name: achievement, + unlockTime: Date.now(), + }; + }); + } + + if (type === Cracker.creamAPI) { + const parsed = iniParse(filePath); + return processCreamAPI(parsed); + } + + achievementsLogger.log( + `Unprocessed ${type} achievements found on ${filePath}` + ); + return []; +}; + +const iniParse = (filePath: string) => { + try { + const fileContent = readFileSync(filePath, "utf-8"); + + const lines = + fileContent.charCodeAt(0) === 0xfeff + ? fileContent.slice(1).split(/[\r\n]+/) + : fileContent.split(/[\r\n]+/); + + let objectName = ""; + const object: Record> = {}; + + for (const line of lines) { + if (line.startsWith("###") || !line.length) continue; + + if (line.startsWith("[") && line.endsWith("]")) { + objectName = line.slice(1, -1); + object[objectName] = {}; + } else { + const [name, ...value] = line.split("="); + object[objectName][name.trim()] = value.join("=").trim(); + } + } + + return object; + } catch (err) { + achievementsLogger.error(`Error parsing ${filePath}`, err); + return {}; + } +}; + +const jsonParse = (filePath: string) => { + try { + return JSON.parse(readFileSync(filePath, "utf-8")); + } catch (err) { + achievementsLogger.error(`Error parsing ${filePath}`, err); + return {}; + } +}; + +const processOnlineFix = (unlockedAchievements: any): UnlockedAchievement[] => { + const parsedUnlockedAchievements: UnlockedAchievement[] = []; + + for (const achievement of Object.keys(unlockedAchievements)) { + const unlockedAchievement = unlockedAchievements[achievement]; + + if (unlockedAchievement?.achieved == "true") { + parsedUnlockedAchievements.push({ + name: achievement, + unlockTime: unlockedAchievement.timestamp * 1000, + }); + } else if (unlockedAchievement?.Achieved == "true") { + const unlockTime = unlockedAchievement.TimeUnlocked; + + parsedUnlockedAchievements.push({ + name: achievement, + unlockTime: + unlockTime.length === 7 + ? unlockTime * 1000 * 1000 + : unlockTime * 1000, + }); + } + } + + return parsedUnlockedAchievements; +}; + +const processCreamAPI = (unlockedAchievements: any): UnlockedAchievement[] => { + const parsedUnlockedAchievements: UnlockedAchievement[] = []; + + for (const achievement of Object.keys(unlockedAchievements)) { + const unlockedAchievement = unlockedAchievements[achievement]; + + if (unlockedAchievement?.achieved == "true") { + const unlockTime = unlockedAchievement.unlocktime; + parsedUnlockedAchievements.push({ + name: achievement, + unlockTime: + unlockTime.length === 7 + ? unlockTime * 1000 * 1000 + : unlockTime * 1000, + }); + } + } + + return parsedUnlockedAchievements; +}; + +const processSkidrow = (unlockedAchievements: any): UnlockedAchievement[] => { + const parsedUnlockedAchievements: UnlockedAchievement[] = []; + const achievements = unlockedAchievements["Achievements"]; + + for (const achievement of Object.keys(achievements)) { + const unlockedAchievement = achievements[achievement].split("@"); + + if (unlockedAchievement[0] === "1") { + parsedUnlockedAchievements.push({ + name: achievement, + unlockTime: unlockedAchievement[unlockedAchievement.length - 1] * 1000, + }); + } + } + + return parsedUnlockedAchievements; +}; + +const processGoldberg = (unlockedAchievements: any): UnlockedAchievement[] => { + const newUnlockedAchievements: UnlockedAchievement[] = []; + + for (const achievement of Object.keys(unlockedAchievements)) { + const unlockedAchievement = unlockedAchievements[achievement]; + + if (unlockedAchievement?.earned) { + newUnlockedAchievements.push({ + name: achievement, + unlockTime: unlockedAchievement.earned_time * 1000, + }); + } + } + return newUnlockedAchievements; +}; + +const process3DM = (unlockedAchievements: any): UnlockedAchievement[] => { + const newUnlockedAchievements: UnlockedAchievement[] = []; + + const achievements = unlockedAchievements["State"]; + const times = unlockedAchievements["Time"]; + + for (const achievement of Object.keys(achievements)) { + if (achievements[achievement] == "0101") { + const time = times[achievement]; + + newUnlockedAchievements.push({ + name: achievement, + unlockTime: + new DataView( + new Uint8Array(Buffer.from(time.toString(), "hex")).buffer + ).getUint32(0, true) * 1000, + }); + } + } + + return newUnlockedAchievements; +}; + +const processDefault = (unlockedAchievements: any): UnlockedAchievement[] => { + const newUnlockedAchievements: UnlockedAchievement[] = []; + + for (const achievement of Object.keys(unlockedAchievements)) { + const unlockedAchievement = unlockedAchievements[achievement]; + + if (unlockedAchievement?.Achieved == "1") { + newUnlockedAchievements.push({ + name: achievement, + unlockTime: unlockedAchievement.UnlockTime * 1000, + }); + } + } + + return newUnlockedAchievements; +}; + +const processRld = (unlockedAchievements: any): UnlockedAchievement[] => { + const newUnlockedAchievements: UnlockedAchievement[] = []; + + for (const achievement of Object.keys(unlockedAchievements)) { + if (achievement === "Steam") continue; + + const unlockedAchievement = unlockedAchievements[achievement]; + + if (unlockedAchievement?.State) { + const unlocked = new DataView( + new Uint8Array( + Buffer.from(unlockedAchievement.State.toString(), "hex") + ).buffer + ).getUint32(0, true); + + if (unlocked === 1) { + newUnlockedAchievements.push({ + name: achievement, + unlockTime: + new DataView( + new Uint8Array( + Buffer.from(unlockedAchievement.Time.toString(), "hex") + ).buffer + ).getUint32(0, true) * 1000, + }); + } + } + } + + return newUnlockedAchievements; +}; + +const processUserStats = (unlockedAchievements: any): UnlockedAchievement[] => { + const newUnlockedAchievements: UnlockedAchievement[] = []; + + const achievements = unlockedAchievements["ACHIEVEMENTS"]; + + if (!achievements) return []; + + for (const achievement of Object.keys(achievements)) { + const unlockedAchievement = achievements[achievement]; + + const unlockTime = Number( + unlockedAchievement.slice(1, -1).replace("unlocked = true, time = ", "") + ); + + if (!isNaN(unlockTime)) { + newUnlockedAchievements.push({ + name: achievement.replace(/"/g, ``), + unlockTime: unlockTime * 1000, + }); + } + } + + return newUnlockedAchievements; +}; diff --git a/src/main/services/achievements/update-local-unlocked-achivements.ts b/src/main/services/achievements/update-local-unlocked-achivements.ts new file mode 100644 index 00000000..0393477c --- /dev/null +++ b/src/main/services/achievements/update-local-unlocked-achivements.ts @@ -0,0 +1,32 @@ +import { + findAchievementFiles, + findAchievementFileInExecutableDirectory, +} from "./find-achivement-files"; +import { parseAchievementFile } from "./parse-achievement-file"; +import { mergeAchievements } from "./merge-achievements"; +import type { UnlockedAchievement } from "@types"; +import { Game } from "@main/entity"; + +export const updateLocalUnlockedAchivements = async (game: Game) => { + const gameAchievementFiles = findAchievementFiles(game); + + const achievementFileInsideDirectory = + findAchievementFileInExecutableDirectory(game); + + gameAchievementFiles.push(...achievementFileInsideDirectory); + + const unlockedAchievements: UnlockedAchievement[] = []; + + for (const achievementFile of gameAchievementFiles) { + const localAchievementFile = parseAchievementFile( + achievementFile.filePath, + achievementFile.type + ); + + if (localAchievementFile.length) { + unlockedAchievements.push(...localAchievementFile); + } + } + + mergeAchievements(game, unlockedAchievements, false); +}; diff --git a/src/main/services/download/python-instance.ts b/src/main/services/download/python-instance.ts index 4a41c2dc..f59b20b8 100644 --- a/src/main/services/download/python-instance.ts +++ b/src/main/services/download/python-instance.ts @@ -7,7 +7,7 @@ import { startTorrentClient as startRPCClient, } from "./torrent-client"; import { gameRepository } from "@main/repository"; -import { DownloadProgress } from "@types"; +import type { DownloadProgress } from "@types"; import { QueryDeepPartialEntity } from "typeorm/query-builder/QueryPartialEntity"; import { calculateETA } from "./helpers"; import axios from "axios"; diff --git a/src/main/services/how-long-to-beat.ts b/src/main/services/how-long-to-beat.ts index c7164d09..1e5f3279 100644 --- a/src/main/services/how-long-to-beat.ts +++ b/src/main/services/how-long-to-beat.ts @@ -1,32 +1,65 @@ import axios from "axios"; import { requestWebPage } from "@main/helpers"; -import { HowLongToBeatCategory } from "@types"; +import type { + HowLongToBeatCategory, + HowLongToBeatSearchResponse, +} from "@types"; import { formatName } from "@shared"; import { logger } from "./logger"; +import UserAgent from "user-agents"; -export interface HowLongToBeatResult { - game_id: number; - profile_steam: number; -} +const state = { + apiKey: null as string | null, +}; -export interface HowLongToBeatSearchResponse { - data: HowLongToBeatResult[]; -} +const getHowLongToBeatSearchApiKey = async () => { + const userAgent = new UserAgent(); + + const document = await requestWebPage("https://howlongtobeat.com/"); + const scripts = Array.from(document.querySelectorAll("script")); + + const appScript = scripts.find((script) => + script.src.startsWith("/_next/static/chunks/pages/_app") + ); + + if (!appScript) return null; + + const response = await axios.get( + `https://howlongtobeat.com${appScript.src}`, + { + headers: { + "User-Agent": userAgent.toString(), + }, + } + ); + + const results = /fetch\("\/api\/search\/"\.concat\("(.*?)"\)/gm.exec( + response.data + ); + + if (!results) return null; + + return results[1]; +}; export const searchHowLongToBeat = async (gameName: string) => { + state.apiKey = state.apiKey ?? (await getHowLongToBeatSearchApiKey()); + if (!state.apiKey) return { data: [] }; + + const userAgent = new UserAgent(); + const response = await axios .post( - "https://howlongtobeat.com/api/search", + `https://howlongtobeat.com/api/search/${state.apiKey}`, { searchType: "games", searchTerms: formatName(gameName).split(" "), searchPage: 1, - size: 100, + size: 20, }, { headers: { - "User-Agent": - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", + "User-Agent": userAgent.toString(), Referer: "https://howlongtobeat.com/", }, } diff --git a/src/main/services/hydra-api.ts b/src/main/services/hydra-api.ts index ac3d153a..41d76408 100644 --- a/src/main/services/hydra-api.ts +++ b/src/main/services/hydra-api.ts @@ -1,35 +1,56 @@ -import { userAuthRepository } from "@main/repository"; +import { + userAuthRepository, + userSubscriptionRepository, +} from "@main/repository"; import axios, { AxiosError, AxiosInstance } from "axios"; import { WindowManager } from "./window-manager"; import url from "url"; import { uploadGamesBatch } from "./library-sync"; import { clearGamesRemoteIds } from "./library-sync/clear-games-remote-id"; import { logger } from "./logger"; -import { UserNotLoggedInError } from "@shared"; +import { UserNotLoggedInError, SubscriptionRequiredError } from "@shared"; import { omit } from "lodash-es"; import { appVersion } from "@main/constants"; +import { getUserData } from "./user/get-user-data"; interface HydraApiOptions { - needsAuth: boolean; + needsAuth?: boolean; + needsSubscription?: boolean; +} + +interface HydraApiUserAuth { + authToken: string; + refreshToken: string; + expirationTimestamp: number; + subscription: { expiresAt: Date | null } | null; } export class HydraApi { private static instance: AxiosInstance; private static readonly EXPIRATION_OFFSET_IN_MS = 1000 * 60 * 5; // 5 minutes + private static readonly ADD_LOG_INTERCEPTOR = true; private static secondsToMilliseconds = (seconds: number) => seconds * 1000; - private static userAuth = { + private static userAuth: HydraApiUserAuth = { authToken: "", refreshToken: "", expirationTimestamp: 0, + subscription: null, }; private static isLoggedIn() { return this.userAuth.authToken !== ""; } + private static hasCloudSubscription() { + return ( + this.userAuth.subscription?.expiresAt && + this.userAuth.subscription.expiresAt > new Date() + ); + } + static async handleExternalAuth(uri: string) { const { payload } = url.parse(uri, true).query; @@ -49,6 +70,7 @@ export class HydraApi { authToken: accessToken, refreshToken: refreshToken, expirationTimestamp: tokenExpirationTimestamp, + subscription: null, }; logger.log( @@ -66,6 +88,16 @@ export class HydraApi { ["id"] ); + await getUserData().then((userDetails) => { + if (userDetails?.subscription) { + this.userAuth.subscription = { + expiresAt: userDetails.subscription.expiresAt + ? new Date(userDetails.subscription.expiresAt) + : null, + }; + } + }); + if (WindowManager.mainWindow) { WindowManager.mainWindow.webContents.send("on-signin"); await clearGamesRemoteIds(); @@ -78,6 +110,7 @@ export class HydraApi { authToken: "", refreshToken: "", expirationTimestamp: 0, + subscription: null, }; } @@ -87,69 +120,76 @@ export class HydraApi { headers: { "User-Agent": `Hydra Launcher v${appVersion}` }, }); - this.instance.interceptors.request.use( - (request) => { - logger.log(" ---- REQUEST -----"); - const data = Array.isArray(request.data) - ? request.data - : omit(request.data, ["refreshToken"]); - logger.log(request.method, request.url, request.params, data); - return request; - }, - (error) => { - logger.error("request error", error); - return Promise.reject(error); - } - ); - - this.instance.interceptors.response.use( - (response) => { - logger.log(" ---- RESPONSE -----"); - const data = Array.isArray(response.data) - ? response.data - : omit(response.data, ["username", "accessToken", "refreshToken"]); - logger.log( - response.status, - response.config.method, - response.config.url, - data - ); - return response; - }, - (error) => { - logger.error(" ---- RESPONSE ERROR -----"); - - const { config } = error; - - logger.error( - config.method, - config.baseURL, - config.url, - config.headers, - config.data - ); - - if (error.response) { - logger.error("Response", error.response.status, error.response.data); - } else if (error.request) { - logger.error("Request", error.request); - } else { - logger.error("Error", error.message); + if (this.ADD_LOG_INTERCEPTOR) { + this.instance.interceptors.request.use( + (request) => { + logger.log(" ---- REQUEST -----"); + const data = Array.isArray(request.data) + ? request.data + : omit(request.data, ["refreshToken"]); + logger.log(request.method, request.url, request.params, data); + return request; + }, + (error) => { + logger.error("request error", error); + return Promise.reject(error); } + ); + this.instance.interceptors.response.use( + (response) => { + logger.log(" ---- RESPONSE -----"); + const data = Array.isArray(response.data) + ? response.data + : omit(response.data, ["username", "accessToken", "refreshToken"]); + logger.log( + response.status, + response.config.method, + response.config.url, + data + ); + return response; + }, + (error) => { + logger.error(" ---- RESPONSE ERROR -----"); + const { config } = error; + logger.error( + config.method, + config.baseURL, + config.url, + config.headers, + config.data + ); + if (error.response) { + logger.error( + "Response", + error.response.status, + error.response.data + ); + } else if (error.request) { + logger.error("Request", error.request); + } else { + logger.error("Error", error.message); + } + logger.error(" ----- END RESPONSE ERROR -------"); + return Promise.reject(error); + } + ); + } - logger.error(" ----- END RESPONSE ERROR -------"); - return Promise.reject(error); - } - ); + await getUserData(); const userAuth = await userAuthRepository.findOne({ where: { id: 1 }, + relations: { subscription: true }, }); this.userAuth = { authToken: userAuth?.accessToken ?? "", refreshToken: userAuth?.refreshToken ?? "", expirationTimestamp: userAuth?.tokenExpirationTimestamp ?? 0, + subscription: userAuth?.subscription + ? { expiresAt: userAuth.subscription?.expiresAt } + : null, }; } @@ -217,9 +257,11 @@ export class HydraApi { authToken: "", expirationTimestamp: 0, refreshToken: "", + subscription: null, }; userAuthRepository.delete({ id: 1 }); + userSubscriptionRepository.delete({ id: 1 }); this.sendSignOutEvent(); } @@ -227,15 +269,28 @@ export class HydraApi { throw err; }; + private static async validateOptions(options?: HydraApiOptions) { + const needsAuth = options?.needsAuth == undefined || options.needsAuth; + const needsSubscription = options?.needsSubscription === true; + + if (needsAuth) { + if (!this.isLoggedIn()) throw new UserNotLoggedInError(); + await this.revalidateAccessTokenIfExpired(); + } + + if (needsSubscription) { + if (!(await this.hasCloudSubscription())) { + throw new SubscriptionRequiredError(); + } + } + } + static async get( url: string, params?: any, options?: HydraApiOptions ) { - if (!options || options.needsAuth) { - if (!this.isLoggedIn()) throw new UserNotLoggedInError(); - await this.revalidateAccessTokenIfExpired(); - } + await this.validateOptions(options); return this.instance .get(url, { params, ...this.getAxiosConfig() }) @@ -248,10 +303,7 @@ export class HydraApi { data?: any, options?: HydraApiOptions ) { - if (!options || options.needsAuth) { - if (!this.isLoggedIn()) throw new UserNotLoggedInError(); - await this.revalidateAccessTokenIfExpired(); - } + await this.validateOptions(options); return this.instance .post(url, data, this.getAxiosConfig()) @@ -264,10 +316,7 @@ export class HydraApi { data?: any, options?: HydraApiOptions ) { - if (!options || options.needsAuth) { - if (!this.isLoggedIn()) throw new UserNotLoggedInError(); - await this.revalidateAccessTokenIfExpired(); - } + await this.validateOptions(options); return this.instance .put(url, data, this.getAxiosConfig()) @@ -280,10 +329,7 @@ export class HydraApi { data?: any, options?: HydraApiOptions ) { - if (!options || options.needsAuth) { - if (!this.isLoggedIn()) throw new UserNotLoggedInError(); - await this.revalidateAccessTokenIfExpired(); - } + await this.validateOptions(options); return this.instance .patch(url, data, this.getAxiosConfig()) @@ -292,10 +338,7 @@ export class HydraApi { } static async delete(url: string, options?: HydraApiOptions) { - if (!options || options.needsAuth) { - if (!this.isLoggedIn()) throw new UserNotLoggedInError(); - await this.revalidateAccessTokenIfExpired(); - } + await this.validateOptions(options); return this.instance .delete(url, this.getAxiosConfig()) diff --git a/src/main/services/index.ts b/src/main/services/index.ts index 8664062f..27abf579 100644 --- a/src/main/services/index.ts +++ b/src/main/services/index.ts @@ -8,3 +8,4 @@ export * from "./how-long-to-beat"; export * from "./process-watcher"; export * from "./main-loop"; export * from "./hydra-api"; +export * from "./ludusavi"; diff --git a/src/main/services/library-sync/upload-games-batch.ts b/src/main/services/library-sync/upload-games-batch.ts index 22dc595e..79559a35 100644 --- a/src/main/services/library-sync/upload-games-batch.ts +++ b/src/main/services/library-sync/upload-games-batch.ts @@ -4,6 +4,7 @@ import { IsNull } from "typeorm"; import { HydraApi } from "../hydra-api"; import { mergeWithRemoteGames } from "./merge-with-remote-games"; import { WindowManager } from "../window-manager"; +import { AchievementWatcherManager } from "../achievements/achievement-watcher-manager"; export const uploadGamesBatch = async () => { const games = await gameRepository.find({ @@ -28,6 +29,8 @@ export const uploadGamesBatch = async () => { await mergeWithRemoteGames(); + AchievementWatcherManager.preSearchAchievements(); + if (WindowManager.mainWindow) WindowManager.mainWindow.webContents.send("on-library-batch-complete"); }; diff --git a/src/main/services/logger.ts b/src/main/services/logger.ts index 1eb7060b..e3e52290 100644 --- a/src/main/services/logger.ts +++ b/src/main/services/logger.ts @@ -10,6 +10,10 @@ log.transports.file.resolvePathFn = ( return path.join(logsPath, "pythoninstance.txt"); } + if (message?.scope == "achievements") { + return path.join(logsPath, "achievements.txt"); + } + if (message?.level === "error") { return path.join(logsPath, "error.txt"); } @@ -29,3 +33,4 @@ log.initialize(); export const pythonInstanceLogger = log.scope("python-instance"); export const logger = log.scope("main"); +export const achievementsLogger = log.scope("achievements"); diff --git a/src/main/services/ludusavi.ts b/src/main/services/ludusavi.ts new file mode 100644 index 00000000..8b64ba11 --- /dev/null +++ b/src/main/services/ludusavi.ts @@ -0,0 +1,112 @@ +import type { GameShop, LudusaviBackup, LudusaviConfig } from "@types"; +import Piscina from "piscina"; + +import { app } from "electron"; +import fs from "node:fs"; +import path from "node:path"; +import YAML from "yaml"; + +import ludusaviWorkerPath from "../workers/ludusavi.worker?modulePath"; + +export class Ludusavi { + private static ludusaviPath = path.join(app.getPath("appData"), "ludusavi"); + private static ludusaviConfigPath = path.join( + this.ludusaviPath, + "config.yaml" + ); + private static binaryPath = app.isPackaged + ? path.join(process.resourcesPath, "ludusavi", "ludusavi") + : path.join(__dirname, "..", "..", "ludusavi", "ludusavi"); + + private static worker = new Piscina({ + filename: ludusaviWorkerPath, + workerData: { + binaryPath: this.binaryPath, + }, + }); + + static async findGames(shop: GameShop, objectId: string): Promise { + const games = await this.worker.run( + { objectId, shop }, + { name: "findGames" } + ); + + return games; + } + + static async getConfig() { + if (!fs.existsSync(this.ludusaviConfigPath)) { + await this.worker.run(undefined, { name: "generateConfig" }); + } + + const config = YAML.parse( + fs.readFileSync(this.ludusaviConfigPath, "utf-8") + ) as LudusaviConfig; + + return config; + } + + static async backupGame( + shop: GameShop, + objectId: string, + backupPath: string, + winePrefix?: string | null + ): Promise { + const games = await this.findGames(shop, objectId); + if (!games.length) throw new Error("Game not found"); + + return this.worker.run( + { title: games[0], backupPath, winePrefix }, + { name: "backupGame" } + ); + } + + static async getBackupPreview( + shop: GameShop, + objectId: string, + backupPath: string + ): Promise { + const games = await this.findGames(shop, objectId); + + if (!games.length) return null; + const [game] = games; + + const backupData = await this.worker.run( + { title: game, backupPath, preview: true }, + { name: "backupGame" } + ); + + return backupData; + } + + static async restoreBackup(backupPath: string) { + return this.worker.run(backupPath, { name: "restoreBackup" }); + } + + static async addManifestToLudusaviConfig() { + const config = await this.getConfig(); + + config.manifest.enable = false; + config.manifest.secondary = [ + { url: "https://cdn.losbroxas.org/manifest.yaml", enable: true }, + ]; + + fs.writeFileSync(this.ludusaviConfigPath, YAML.stringify(config)); + } + + static async addCustomGame(title: string, savePath: string) { + const config = await this.getConfig(); + const filteredGames = config.customGames.filter( + (game) => game.name !== title + ); + + filteredGames.push({ + name: title, + files: [savePath], + registry: [], + }); + + config.customGames = filteredGames; + fs.writeFileSync(this.ludusaviConfigPath, YAML.stringify(config)); + } +} diff --git a/src/main/services/main-loop.ts b/src/main/services/main-loop.ts index f2ec51ba..b4836b46 100644 --- a/src/main/services/main-loop.ts +++ b/src/main/services/main-loop.ts @@ -1,6 +1,7 @@ import { sleep } from "@main/helpers"; import { DownloadManager } from "./download"; import { watchProcesses } from "./process-watcher"; +import { AchievementWatcherManager } from "./achievements/achievement-watcher-manager"; export const startMainLoop = async () => { // eslint-disable-next-line no-constant-condition @@ -8,8 +9,9 @@ export const startMainLoop = async () => { await Promise.allSettled([ watchProcesses(), DownloadManager.watchDownloads(), + AchievementWatcherManager.watchAchievements(), ]); - await sleep(1000); + await sleep(1500); } }; diff --git a/src/main/services/process-watcher.ts b/src/main/services/process-watcher.ts index 2a194bf2..51b39bbe 100644 --- a/src/main/services/process-watcher.ts +++ b/src/main/services/process-watcher.ts @@ -2,7 +2,7 @@ import { IsNull, Not } from "typeorm"; import { gameRepository } from "@main/repository"; import { WindowManager } from "./window-manager"; import { createGame, updateGamePlaytime } from "./library-sync"; -import { GameRunning } from "@types"; +import type { GameRunning } from "@types"; import { PythonInstance } from "./download"; import { Game } from "@main/entity"; @@ -25,12 +25,12 @@ export const watchProcesses = async () => { if (games.length === 0) return; const processes = await PythonInstance.getProcessList(); + const processSet = new Set(processes.map((process) => process.exe)); + for (const game of games) { const executablePath = game.executablePath!; - const gameProcess = processes.find((runningProcess) => { - return executablePath == runningProcess.exe; - }); + const gameProcess = processSet.has(executablePath); if (gameProcess) { if (gamesPlaytime.has(game.id)) { diff --git a/src/main/services/steam-250.ts b/src/main/services/steam-250.ts index 9833c278..0abc2f14 100644 --- a/src/main/services/steam-250.ts +++ b/src/main/services/steam-250.ts @@ -17,7 +17,7 @@ export const requestSteam250 = async (path: string) => { return { title: $title.textContent, - objectID: steamGameUrl.split("/").pop(), + objectId: steamGameUrl.split("/").pop(), } as Steam250Game; }) .filter((game) => game != null); @@ -38,7 +38,7 @@ export const getSteam250List = async () => { ).flat(); const gamesMap: Map = gamesList.reduce((map, item) => { - if (item) map.set(item.objectID, item); + if (item) map.set(item.objectId, item); return map; }, new Map()); diff --git a/src/main/services/steam-grid.ts b/src/main/services/steam-grid.ts index c762eaf6..540e5857 100644 --- a/src/main/services/steam-grid.ts +++ b/src/main/services/steam-grid.ts @@ -1,3 +1,4 @@ +import type { GameShop } from "@types"; import axios from "axios"; export interface SteamGridResponse { @@ -20,9 +21,9 @@ export interface SteamGridGameResponse { } export const getSteamGridData = async ( - objectID: string, + objectId: string, path: string, - shop: string, + shop: GameShop, params: Record = {} ): Promise => { const searchParams = new URLSearchParams(params); @@ -32,7 +33,7 @@ export const getSteamGridData = async ( } const response = await axios.get( - `https://www.steamgriddb.com/api/v2/${path}/${shop}/${objectID}?${searchParams.toString()}`, + `https://www.steamgriddb.com/api/v2/${path}/${shop}/${objectId}?${searchParams.toString()}`, { headers: { Authorization: `Bearer ${import.meta.env.MAIN_VITE_STEAMGRIDDB_API_KEY}`, @@ -58,10 +59,10 @@ export const getSteamGridGameById = async ( return response.data; }; -export const getSteamGameClientIcon = async (objectID: string) => { +export const getSteamGameClientIcon = async (objectId: string) => { const { data: { id: steamGridGameId }, - } = await getSteamGridData(objectID, "games", "steam"); + } = await getSteamGridData(objectId, "games", "steam"); const steamGridGame = await getSteamGridGameById(steamGridGameId); return steamGridGame.data.platforms.steam.metadata.clienticon; diff --git a/src/main/services/steam.ts b/src/main/services/steam.ts index 53e243f3..1d8ed2d9 100644 --- a/src/main/services/steam.ts +++ b/src/main/services/steam.ts @@ -12,11 +12,11 @@ export interface SteamAppDetailsResponse { } export const getSteamAppDetails = async ( - objectID: string, + objectId: string, language: string ) => { const searchParams = new URLSearchParams({ - appids: objectID, + appids: objectId, l: language, }); @@ -25,7 +25,7 @@ export const getSteamAppDetails = async ( `http://store.steampowered.com/api/appdetails?${searchParams.toString()}` ) .then((response) => { - if (response.data[objectID].success) return response.data[objectID].data; + if (response.data[objectId].success) return response.data[objectId].data; return null; }) .catch((err) => { diff --git a/src/main/services/user/get-user-data.ts b/src/main/services/user/get-user-data.ts new file mode 100644 index 00000000..c3ca6eb8 --- /dev/null +++ b/src/main/services/user/get-user-data.ts @@ -0,0 +1,79 @@ +import type { ProfileVisibility, UserDetails } from "@types"; +import { HydraApi } from "../hydra-api"; +import { + userAuthRepository, + userSubscriptionRepository, +} from "@main/repository"; +import * as Sentry from "@sentry/electron/main"; +import { UserNotLoggedInError } from "@shared"; +import { logger } from "../logger"; + +export const getUserData = () => { + return HydraApi.get(`/profile/me`) + .then(async (me) => { + userAuthRepository.upsert( + { + id: 1, + displayName: me.displayName, + profileImageUrl: me.profileImageUrl, + backgroundImageUrl: me.backgroundImageUrl, + userId: me.id, + }, + ["id"] + ); + + if (me.subscription) { + await userSubscriptionRepository.upsert( + { + id: 1, + subscriptionId: me.subscription?.id || "", + status: me.subscription?.status || "", + planId: me.subscription?.plan.id || "", + planName: me.subscription?.plan.name || "", + expiresAt: me.subscription?.expiresAt || null, + user: { id: 1 }, + }, + ["id"] + ); + } else { + await userSubscriptionRepository.delete({ id: 1 }); + } + + Sentry.setUser({ id: me.id, username: me.username }); + + return me; + }) + .catch(async (err) => { + if (err instanceof UserNotLoggedInError) { + return null; + } + logger.error("Failed to get logged user", err); + const loggedUser = await userAuthRepository.findOne({ + where: { id: 1 }, + relations: { subscription: true }, + }); + + if (loggedUser) { + return { + ...loggedUser, + id: loggedUser.userId, + username: "", + bio: "", + profileVisibility: "PUBLIC" as ProfileVisibility, + subscription: loggedUser.subscription + ? { + id: loggedUser.subscription.subscriptionId, + status: loggedUser.subscription.status, + plan: { + id: loggedUser.subscription.planId, + name: loggedUser.subscription.planName, + }, + expiresAt: loggedUser.subscription.expiresAt, + } + : null, + } as UserDetails; + } + + return null; + }); +}; diff --git a/src/main/services/window-manager.ts b/src/main/services/window-manager.ts index 905e4b65..ecdf64f5 100644 --- a/src/main/services/window-manager.ts +++ b/src/main/services/window-manager.ts @@ -16,11 +16,13 @@ import trayIcon from "@resources/tray-icon.png?asset"; import { gameRepository, userPreferencesRepository } from "@main/repository"; import { IsNull, Not } from "typeorm"; import { HydraApi } from "./hydra-api"; +import UserAgent from "user-agents"; export class WindowManager { public static mainWindow: Electron.BrowserWindow | null = null; + public static notificationWindow: Electron.BrowserWindow | null = null; - private static loadURL(hash = "") { + private static loadMainWindowURL(hash = "") { // HMR for renderer base on electron-vite cli. // Load the remote URL for development or the local html file for production. if (is.dev && process.env["ELECTRON_RENDERER_URL"]) { @@ -37,6 +39,21 @@ export class WindowManager { } } + private static loadNotificationWindowURL() { + if (is.dev && process.env["ELECTRON_RENDERER_URL"]) { + this.notificationWindow?.loadURL( + `${process.env["ELECTRON_RENDERER_URL"]}#/achievement-notification` + ); + } else { + this.notificationWindow?.loadFile( + path.join(__dirname, "../renderer/index.html"), + { + hash: "achievement-notification", + } + ); + } + } + public static createMainWindow() { if (this.mainWindow) return; @@ -61,7 +78,59 @@ export class WindowManager { show: false, }); - this.loadURL(); + this.mainWindow.webContents.session.webRequest.onBeforeSendHeaders( + (details, callback) => { + if (details.webContentsId !== this.mainWindow?.webContents.id) { + return callback(details); + } + + const userAgent = new UserAgent(); + + callback({ + requestHeaders: { + ...details.requestHeaders, + "user-agent": userAgent.toString(), + }, + }); + } + ); + + this.mainWindow.webContents.session.webRequest.onHeadersReceived( + (details, callback) => { + if (details.webContentsId !== this.mainWindow?.webContents.id) { + return callback(details); + } + + const headers = { + "access-control-allow-origin": ["*"], + "access-control-allow-methods": ["GET, POST, PUT, DELETE, OPTIONS"], + "access-control-expose-headers": ["ETag"], + "access-control-allow-headers": [ + "Content-Type, Authorization, X-Requested-With, If-None-Match", + ], + }; + + if (details.method === "OPTIONS") { + return callback({ + cancel: false, + responseHeaders: { + ...details.responseHeaders, + ...headers, + }, + statusLine: "HTTP/1.1 200 OK", + }); + } + + return callback({ + responseHeaders: { + ...details.responseHeaders, + ...headers, + }, + }); + } + ); + + this.loadMainWindowURL(); this.mainWindow.removeMenu(); this.mainWindow.on("ready-to-show", () => { @@ -78,9 +147,36 @@ export class WindowManager { app.quit(); } WindowManager.mainWindow?.setProgressBar(-1); + WindowManager.mainWindow = null; }); } + public static createNotificationWindow() { + this.notificationWindow = new BrowserWindow({ + transparent: true, + maximizable: false, + autoHideMenuBar: true, + minimizable: false, + focusable: false, + skipTaskbar: true, + frame: false, + width: 350, + height: 104, + x: 0, + y: 0, + webPreferences: { + preload: path.join(__dirname, "../preload/index.mjs"), + sandbox: false, + }, + }); + this.notificationWindow.setIgnoreMouseEvents(true); + // this.notificationWindow.setVisibleOnAllWorkspaces(true, { + // visibleOnFullScreen: true, + // }); + this.notificationWindow.setAlwaysOnTop(true, "screen-saver", 1); + this.loadNotificationWindowURL(); + } + public static openAuthWindow() { if (this.mainWindow) { const authWindow = new BrowserWindow({ @@ -101,6 +197,8 @@ export class WindowManager { authWindow.removeMenu(); + if (!app.isPackaged) authWindow.webContents.openDevTools(); + const searchParams = new URLSearchParams({ lng: i18next.language, }); @@ -125,14 +223,14 @@ export class WindowManager { public static redirect(hash: string) { if (!this.mainWindow) this.createMainWindow(); - this.loadURL(hash); + this.loadMainWindowURL(hash); if (this.mainWindow?.isMinimized()) this.mainWindow.restore(); this.mainWindow?.focus(); } public static createSystemTray(language: string) { - let tray; + let tray: Tray; if (process.platform === "darwin") { const macIcon = nativeImage diff --git a/src/main/vite-env.d.ts b/src/main/vite-env.d.ts index 41f54e24..698bb7db 100644 --- a/src/main/vite-env.d.ts +++ b/src/main/vite-env.d.ts @@ -5,6 +5,7 @@ interface ImportMetaEnv { readonly MAIN_VITE_API_URL: string; readonly MAIN_VITE_AUTH_URL: string; readonly MAIN_VITE_SENTRY_DSN: string; + readonly MAIN_VITE_CHECKOUT_URL: string; } interface ImportMeta { diff --git a/src/main/workers/ludusavi.worker.ts b/src/main/workers/ludusavi.worker.ts new file mode 100644 index 00000000..855d20bf --- /dev/null +++ b/src/main/workers/ludusavi.worker.ts @@ -0,0 +1,65 @@ +import type { GameShop, LudusaviBackup, LudusaviFindResult } from "@types"; +import cp from "node:child_process"; + +import { workerData } from "node:worker_threads"; + +const { binaryPath } = workerData; + +export const findGames = ({ + shop, + objectId, +}: { + shop: GameShop; + objectId: string; +}) => { + const args = ["find", "--api"]; + + if (shop === "steam") { + args.push("--steam-id", objectId); + } + + const result = cp.execFileSync(binaryPath, args); + + const games = JSON.parse(result.toString("utf-8")) as LudusaviFindResult; + return Object.keys(games.games); +}; + +export const backupGame = ({ + title, + backupPath, + preview = false, + winePrefix, +}: { + title: string; + backupPath: string; + preview?: boolean; + winePrefix?: string; +}) => { + const args = ["backup", `"${title}"`, "--api", "--force"]; + + if (preview) args.push("--preview"); + if (backupPath) args.push("--path", backupPath); + if (winePrefix) args.push("--wine-prefix", winePrefix); + + const result = cp.execFileSync(binaryPath, args); + + return JSON.parse(result.toString("utf-8")) as LudusaviBackup; +}; + +export const restoreBackup = (backupPath: string) => { + const result = cp.execFileSync(binaryPath, [ + "restore", + "--path", + backupPath, + "--api", + "--force", + ]); + + return JSON.parse(result.toString("utf-8")) as LudusaviBackup; +}; + +export const generateConfig = () => { + const result = cp.execFileSync(binaryPath, ["schema", "config"]); + + return JSON.parse(result.toString("utf-8")) as LudusaviBackup; +}; diff --git a/src/main/workers/steam-games.worker.ts b/src/main/workers/steam-games.worker.ts index 9085082b..55792454 100644 --- a/src/main/workers/steam-games.worker.ts +++ b/src/main/workers/steam-games.worker.ts @@ -1,4 +1,4 @@ -import { SteamGame } from "@types"; +import type { SteamGame } from "@types"; import { slice } from "lodash-es"; import fs from "node:fs"; diff --git a/src/preload/index.ts b/src/preload/index.ts index 5b35958b..4ef62554 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -13,6 +13,8 @@ import type { UpdateProfileRequest, } from "@types"; import type { CatalogueCategory } from "@shared"; +import type { AxiosProgressEvent } from "axios"; +import { GameAchievement } from "@main/entity"; contextBridge.exposeInMainWorld("electron", { /* Torrenting */ @@ -37,18 +39,63 @@ contextBridge.exposeInMainWorld("electron", { searchGames: (query: string) => ipcRenderer.invoke("searchGames", query), getCatalogue: (category: CatalogueCategory) => ipcRenderer.invoke("getCatalogue", category), - getGameShopDetails: (objectID: string, shop: GameShop, language: string) => - ipcRenderer.invoke("getGameShopDetails", objectID, shop, language), + getGameShopDetails: (objectId: string, shop: GameShop, language: string) => + ipcRenderer.invoke("getGameShopDetails", objectId, shop, language), getRandomGame: () => ipcRenderer.invoke("getRandomGame"), - getHowLongToBeat: (objectID: string, shop: GameShop, title: string) => - ipcRenderer.invoke("getHowLongToBeat", objectID, shop, title), - getGames: (take?: number, prevCursor?: number) => - ipcRenderer.invoke("getGames", take, prevCursor), + getHowLongToBeat: (title: string) => + ipcRenderer.invoke("getHowLongToBeat", title), + getGames: (take?: number, skip?: number) => + ipcRenderer.invoke("getGames", take, skip), searchGameRepacks: (query: string) => ipcRenderer.invoke("searchGameRepacks", query), getGameStats: (objectId: string, shop: GameShop) => ipcRenderer.invoke("getGameStats", objectId, shop), getTrendingGames: () => ipcRenderer.invoke("getTrendingGames"), + onAchievementUnlocked: ( + cb: ( + objectId: string, + shop: GameShop, + achievements?: { displayName: string; iconUrl: string }[] + ) => void + ) => { + const listener = ( + _event: Electron.IpcRendererEvent, + objectId: string, + shop: GameShop, + achievements?: { displayName: string; iconUrl: string }[] + ) => cb(objectId, shop, achievements); + ipcRenderer.on("on-achievement-unlocked", listener); + return () => + ipcRenderer.removeListener("on-achievement-unlocked", listener); + }, + onCombinedAchievementsUnlocked: ( + cb: (gameCount: number, achievementsCount: number) => void + ) => { + const listener = ( + _event: Electron.IpcRendererEvent, + gameCount: number, + achievementCount: number + ) => cb(gameCount, achievementCount); + ipcRenderer.on("on-combined-achievements-unlocked", listener); + return () => + ipcRenderer.removeListener("on-combined-achievements-unlocked", listener); + }, + onUpdateAchievements: ( + objectId: string, + shop: GameShop, + cb: (achievements: GameAchievement[]) => void + ) => { + const listener = ( + _event: Electron.IpcRendererEvent, + achievements: GameAchievement[] + ) => cb(achievements); + ipcRenderer.on(`on-update-achievements-${objectId}-${shop}`, listener); + return () => + ipcRenderer.removeListener( + `on-update-achievements-${objectId}-${shop}`, + listener + ); + }, /* User preferences */ getUserPreferences: () => ipcRenderer.invoke("getUserPreferences"), @@ -64,12 +111,14 @@ contextBridge.exposeInMainWorld("electron", { ipcRenderer.invoke("deleteDownloadSource", id), /* Library */ - addGameToLibrary: (objectID: string, title: string, shop: GameShop) => - ipcRenderer.invoke("addGameToLibrary", objectID, title, shop), + addGameToLibrary: (objectId: string, title: string, shop: GameShop) => + ipcRenderer.invoke("addGameToLibrary", objectId, title, shop), createGameShortcut: (id: number) => ipcRenderer.invoke("createGameShortcut", id), updateExecutablePath: (id: number, executablePath: string) => ipcRenderer.invoke("updateExecutablePath", id, executablePath), + selectGameWinePrefix: (id: number, winePrefixPath: string) => + ipcRenderer.invoke("selectGameWinePrefix", id, winePrefixPath), verifyExecutablePathInUse: (executablePath: string) => ipcRenderer.invoke("verifyExecutablePathInUse", executablePath), getLibrary: () => ipcRenderer.invoke("getLibrary"), @@ -87,8 +136,8 @@ contextBridge.exposeInMainWorld("electron", { removeGame: (gameId: number) => ipcRenderer.invoke("removeGame", gameId), deleteGameFolder: (gameId: number) => ipcRenderer.invoke("deleteGameFolder", gameId), - getGameByObjectID: (objectID: string) => - ipcRenderer.invoke("getGameByObjectID", objectID), + getGameByObjectId: (objectId: string) => + ipcRenderer.invoke("getGameByObjectId", objectId), onGamesRunning: ( cb: ( gamesRunning: Pick[] @@ -110,14 +159,75 @@ contextBridge.exposeInMainWorld("electron", { getDiskFreeSpace: (path: string) => ipcRenderer.invoke("getDiskFreeSpace", path), + /* Cloud save */ + uploadSaveGame: ( + objectId: string, + shop: GameShop, + downloadOptionTitle: string | null + ) => + ipcRenderer.invoke("uploadSaveGame", objectId, shop, downloadOptionTitle), + downloadGameArtifact: ( + objectId: string, + shop: GameShop, + gameArtifactId: string + ) => + ipcRenderer.invoke("downloadGameArtifact", objectId, shop, gameArtifactId), + getGameArtifacts: (objectId: string, shop: GameShop) => + ipcRenderer.invoke("getGameArtifacts", objectId, shop), + getGameBackupPreview: (objectId: string, shop: GameShop) => + ipcRenderer.invoke("getGameBackupPreview", objectId, shop), + deleteGameArtifact: (gameArtifactId: string) => + ipcRenderer.invoke("deleteGameArtifact", gameArtifactId), + onUploadComplete: (objectId: string, shop: GameShop, cb: () => void) => { + const listener = (_event: Electron.IpcRendererEvent) => cb(); + ipcRenderer.on(`on-upload-complete-${objectId}-${shop}`, listener); + return () => + ipcRenderer.removeListener( + `on-upload-complete-${objectId}-${shop}`, + listener + ); + }, + onBackupDownloadProgress: ( + objectId: string, + shop: GameShop, + cb: (progress: AxiosProgressEvent) => void + ) => { + const listener = ( + _event: Electron.IpcRendererEvent, + progress: AxiosProgressEvent + ) => cb(progress); + ipcRenderer.on(`on-backup-download-progress-${objectId}-${shop}`, listener); + return () => + ipcRenderer.removeListener( + `on-backup-download-progress-${objectId}-${shop}`, + listener + ); + }, + onBackupDownloadComplete: ( + objectId: string, + shop: GameShop, + cb: () => void + ) => { + const listener = (_event: Electron.IpcRendererEvent) => cb(); + ipcRenderer.on(`on-backup-download-complete-${objectId}-${shop}`, listener); + return () => + ipcRenderer.removeListener( + `on-backup-download-complete-${objectId}-${shop}`, + listener + ); + }, + /* Misc */ ping: () => ipcRenderer.invoke("ping"), getVersion: () => ipcRenderer.invoke("getVersion"), getDefaultDownloadsPath: () => ipcRenderer.invoke("getDefaultDownloadsPath"), isPortableVersion: () => ipcRenderer.invoke("isPortableVersion"), openExternal: (src: string) => ipcRenderer.invoke("openExternal", src), + openCheckout: () => ipcRenderer.invoke("openCheckout"), showOpenDialog: (options: Electron.OpenDialogOptions) => ipcRenderer.invoke("showOpenDialog", options), + showItemInFolder: (path: string) => + ipcRenderer.invoke("showItemInFolder", path), platform: process.platform, /* Auto update */ @@ -162,6 +272,19 @@ contextBridge.exposeInMainWorld("electron", { getUserStats: (userId: string) => ipcRenderer.invoke("getUserStats", userId), reportUser: (userId: string, reason: string, description: string) => ipcRenderer.invoke("reportUser", userId, reason, description), + getComparedUnlockedAchievements: ( + objectId: string, + shop: GameShop, + userId: string + ) => + ipcRenderer.invoke( + "getComparedUnlockedAchievements", + objectId, + shop, + userId + ), + getUnlockedAchievements: (objectId: string, shop: GameShop) => + ipcRenderer.invoke("getUnlockedAchievements", objectId, shop), /* Auth */ signOut: () => ipcRenderer.invoke("signOut"), diff --git a/src/renderer/index.html b/src/renderer/index.html index e2eea62c..b53595ff 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -9,7 +9,7 @@ content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: local: *; media-src 'self' local: data: *;" /> - +
diff --git a/src/renderer/src/app.css.ts b/src/renderer/src/app.css.ts index 4e0cf7a0..a52d81f6 100644 --- a/src/renderer/src/app.css.ts +++ b/src/renderer/src/app.css.ts @@ -26,6 +26,10 @@ globalStyle("::-webkit-scrollbar-thumb", { borderRadius: "24px", }); +globalStyle("::-webkit-scrollbar-thumb:hover", { + backgroundColor: "rgba(255, 255, 255, 0.16)", +}); + globalStyle("html, body, #root, main", { height: "100%", }); @@ -35,7 +39,6 @@ globalStyle("body", { userSelect: "none", fontFamily: "Noto Sans, sans-serif", fontSize: vars.size.body, - background: vars.color.background, color: vars.color.body, margin: "0", }); diff --git a/src/renderer/src/app.tsx b/src/renderer/src/app.tsx index 37e63154..941fb75d 100644 --- a/src/renderer/src/app.tsx +++ b/src/renderer/src/app.tsx @@ -1,4 +1,4 @@ -import { useCallback, useContext, useEffect, useRef } from "react"; +import { useCallback, useContext, useEffect, useRef, useState } from "react"; import { Sidebar, BottomPanel, Header, Toast } from "@renderer/components"; @@ -28,6 +28,12 @@ import { useTranslation } from "react-i18next"; import { UserFriendModal } from "./pages/shared-modals/user-friend-modal"; import { downloadSourcesWorker } from "./workers"; import { repacksContext } from "./context"; +import { logger } from "./logger"; +import { SubscriptionTourModal } from "./pages/shared-modals/subscription-tour-modal"; + +interface TourModals { + subscriptionModal?: boolean; +} export interface AppProps { children: React.ReactNode; @@ -71,6 +77,9 @@ export function App() { const { showSuccessToast } = useToast(); + const [showSubscritionTourModal, setShowSubscritionTourModal] = + useState(false); + useEffect(() => { Promise.all([window.electron.getUserPreferences(), updateLibrary()]).then( ([preferences]) => { @@ -116,6 +125,16 @@ export function App() { }); }, [fetchUserDetails, syncFriendRequests, updateUserDetails, dispatch]); + useEffect(() => { + const tourModalsString = window.localStorage.getItem("tourModals") || "{}"; + + const tourModals = JSON.parse(tourModalsString) as TourModals; + + if (!tourModals.subscriptionModal) { + setShowSubscritionTourModal(true); + } + }, []); + const onSignIn = useCallback(() => { fetchUserDetails().then((response) => { if (response) { @@ -231,6 +250,8 @@ export function App() { } for (const downloadSource of downloadSources) { + logger.info("Migrating download source", downloadSource.url); + const channel = new BroadcastChannel( `download_sources:import:${downloadSource.url}` ); @@ -243,6 +264,10 @@ export function App() { channel.onmessage = () => { window.electron.deleteDownloadSource(downloadSource.id).then(() => { resolve(true); + logger.info( + "Deleted download source from SQLite", + downloadSource.url + ); }); indexRepacks(); @@ -255,6 +280,14 @@ export function App() { }); }, [indexRepacks]); + const handleCloseSubscriptionTourModal = () => { + setShowSubscritionTourModal(false); + window.localStorage.setItem( + "tourModals", + JSON.stringify({ subscriptionModal: true } as TourModals) + ); + }; + const handleToastClose = useCallback(() => { dispatch(closeToast()); }, [dispatch]); @@ -274,6 +307,13 @@ export function App() { onClose={handleToastClose} /> + {showSubscritionTourModal && ( + + )} + {userDetails && ( , + HTMLImageElement + >, + "src" + > { + size: number; + src?: string | null; +} + +export function Avatar({ size, alt, src, ...props }: AvatarProps) { + return ( +
+ {src ? ( + {alt} + ) : ( + + )} +
+ ); +} diff --git a/src/renderer/src/components/game-card/game-card.tsx b/src/renderer/src/components/game-card/game-card.tsx index 9d54bad8..869cb2d6 100644 --- a/src/renderer/src/components/game-card/game-card.tsx +++ b/src/renderer/src/components/game-card/game-card.tsx @@ -44,7 +44,7 @@ export function GameCard({ game, ...props }: GameCardProps) { const handleHover = useCallback(() => { if (!stats) { - window.electron.getGameStats(game.objectID, game.shop).then((stats) => { + window.electron.getGameStats(game.objectId, game.shop).then((stats) => { setStats(stats); }); } @@ -60,7 +60,12 @@ export function GameCard({ game, ...props }: GameCardProps) { onMouseEnter={handleHover} >
- {game.title} + {game.title}
diff --git a/src/renderer/src/components/header/auto-update-sub-header.tsx b/src/renderer/src/components/header/auto-update-sub-header.tsx index 5dcfe841..005cdfda 100644 --- a/src/renderer/src/components/header/auto-update-sub-header.tsx +++ b/src/renderer/src/components/header/auto-update-sub-header.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from "react"; import { SyncIcon } from "@primer/octicons-react"; import { Link } from "../link/link"; import * as styles from "./header.css"; -import { AppUpdaterEvent } from "@types"; +import type { AppUpdaterEvent } from "@types"; export const releasesPageUrl = "https://github.com/hydralauncher/hydra/releases/latest"; diff --git a/src/renderer/src/components/header/header.tsx b/src/renderer/src/components/header/header.tsx index 49f5231d..e0721df4 100644 --- a/src/renderer/src/components/header/header.tsx +++ b/src/renderer/src/components/header/header.tsx @@ -39,6 +39,7 @@ export function Header({ onSearch, onClear, search }: HeaderProps) { const title = useMemo(() => { if (location.pathname.startsWith("/game")) return headerTitle; + if (location.pathname.startsWith("/achievements")) return headerTitle; if (location.pathname.startsWith("/profile")) return headerTitle; if (location.pathname.startsWith("/search")) return t("search_results"); diff --git a/src/renderer/src/components/hero/hero.tsx b/src/renderer/src/components/hero/hero.tsx index 0e5a7849..9bc5514d 100644 --- a/src/renderer/src/components/hero/hero.tsx +++ b/src/renderer/src/components/hero/hero.tsx @@ -1,7 +1,7 @@ import { useNavigate } from "react-router-dom"; import * as styles from "./hero.css"; import { useEffect, useState } from "react"; -import { TrendingGame } from "@types"; +import type { TrendingGame } from "@types"; import { useTranslation } from "react-i18next"; import Skeleton from "react-loading-skeleton"; @@ -49,7 +49,12 @@ export function Hero() {
{game.logo && ( - {game.description} + {game.description} )}

{game.description}

diff --git a/src/renderer/src/components/index.ts b/src/renderer/src/components/index.ts index 52124238..65d07440 100644 --- a/src/renderer/src/components/index.ts +++ b/src/renderer/src/components/index.ts @@ -1,3 +1,4 @@ +export * from "./avatar/avatar"; export * from "./bottom-panel/bottom-panel"; export * from "./button/button"; export * from "./game-card/game-card"; @@ -12,3 +13,4 @@ export * from "./select-field/select-field"; export * from "./toast/toast"; export * from "./badge/badge"; export * from "./confirmation-modal/confirmation-modal"; +export * from "./suspense-wrapper/suspense-wrapper"; diff --git a/src/renderer/src/components/sidebar/sidebar-profile.css.ts b/src/renderer/src/components/sidebar/sidebar-profile.css.ts index f8e0e969..bed9ac93 100644 --- a/src/renderer/src/components/sidebar/sidebar-profile.css.ts +++ b/src/renderer/src/components/sidebar/sidebar-profile.css.ts @@ -31,19 +31,6 @@ export const profileButtonContent = style({ width: "100%", }); -export const profileAvatar = style({ - width: "35px", - height: "35px", - borderRadius: "4px", - display: "flex", - justifyContent: "center", - alignItems: "center", - backgroundColor: vars.color.background, - border: `solid 1px ${vars.color.border}`, - position: "relative", - objectFit: "cover", -}); - export const profileButtonInformation = style({ display: "flex", flexDirection: "column", diff --git a/src/renderer/src/components/sidebar/sidebar-profile.tsx b/src/renderer/src/components/sidebar/sidebar-profile.tsx index b241ef0e..bae3501a 100644 --- a/src/renderer/src/components/sidebar/sidebar-profile.tsx +++ b/src/renderer/src/components/sidebar/sidebar-profile.tsx @@ -1,19 +1,18 @@ import { useNavigate } from "react-router-dom"; -import { PeopleIcon, PersonIcon } from "@primer/octicons-react"; +import { PeopleIcon } from "@primer/octicons-react"; import * as styles from "./sidebar-profile.css"; import { useAppSelector, useUserDetails } from "@renderer/hooks"; -import { useEffect, useMemo, useRef } from "react"; +import { useEffect, useMemo } from "react"; import { useTranslation } from "react-i18next"; import { UserFriendModalTab } from "@renderer/pages/shared-modals/user-friend-modal"; import SteamLogo from "@renderer/assets/steam-logo.svg?react"; +import { Avatar } from "../avatar/avatar"; const LONG_POLLING_INTERVAL = 60_000; export function SidebarProfile() { const navigate = useNavigate(); - const pollingInterval = useRef(null); - const { t } = useTranslation("sidebar"); const { @@ -35,14 +34,12 @@ export function SidebarProfile() { }; useEffect(() => { - pollingInterval.current = setInterval(() => { + const pollingInterval = setInterval(() => { syncFriendRequests(); }, LONG_POLLING_INTERVAL); return () => { - if (pollingInterval.current) { - clearInterval(pollingInterval.current); - } + clearInterval(pollingInterval); }; }, [syncFriendRequests]); @@ -94,17 +91,11 @@ export function SidebarProfile() { onClick={handleProfileClick} >
-
- {userDetails?.profileImageUrl ? ( - {userDetails.displayName} - ) : ( - - )} -
+

diff --git a/src/renderer/src/components/sidebar/sidebar.tsx b/src/renderer/src/components/sidebar/sidebar.tsx index 383d2197..206fdc81 100644 --- a/src/renderer/src/components/sidebar/sidebar.tsx +++ b/src/renderer/src/components/sidebar/sidebar.tsx @@ -140,7 +140,10 @@ export function Sidebar() { event: React.MouseEvent, game: LibraryGame ) => { - const path = buildGameDetailsPath(game); + const path = buildGameDetailsPath({ + ...game, + objectId: game.objectID, + }); if (path !== location.pathname) { navigate(path); } @@ -222,6 +225,7 @@ export function Sidebar() { className={styles.gameIcon} src={game.iconUrl} alt={game.title} + loading="lazy" /> ) : ( diff --git a/src/renderer/src/components/suspense-wrapper/suspense-wrapper.tsx b/src/renderer/src/components/suspense-wrapper/suspense-wrapper.tsx new file mode 100644 index 00000000..d5888d33 --- /dev/null +++ b/src/renderer/src/components/suspense-wrapper/suspense-wrapper.tsx @@ -0,0 +1,13 @@ +import { Suspense } from "react"; + +export interface SuspenseWrapperProps { + Component: React.LazyExoticComponent<() => JSX.Element>; +} + +export function SuspenseWrapper({ Component }: SuspenseWrapperProps) { + return ( + + + + ); +} diff --git a/src/renderer/src/constants.ts b/src/renderer/src/constants.ts index 5835640f..1cea1d3a 100644 --- a/src/renderer/src/constants.ts +++ b/src/renderer/src/constants.ts @@ -1,6 +1,6 @@ import { Downloader } from "@shared"; -export const VERSION_CODENAME = "Leviticus"; +export const VERSION_CODENAME = "Skyscraper"; export const DOWNLOADER_NAME = { [Downloader.RealDebrid]: "Real-Debrid", diff --git a/src/renderer/src/context/cloud-sync/cloud-sync.context.tsx b/src/renderer/src/context/cloud-sync/cloud-sync.context.tsx new file mode 100644 index 00000000..5671ca56 --- /dev/null +++ b/src/renderer/src/context/cloud-sync/cloud-sync.context.tsx @@ -0,0 +1,207 @@ +import { useToast } from "@renderer/hooks"; +import { logger } from "@renderer/logger"; +import type { LudusaviBackup, GameArtifact, GameShop } from "@types"; +import React, { + createContext, + useCallback, + useEffect, + useMemo, + useState, +} from "react"; +import { useTranslation } from "react-i18next"; + +export enum CloudSyncState { + New, + Different, + Same, + Unknown, +} + +export interface CloudSyncContext { + backupPreview: LudusaviBackup | null; + artifacts: GameArtifact[]; + showCloudSyncModal: boolean; + showCloudSyncFilesModal: boolean; + backupState: CloudSyncState; + setShowCloudSyncModal: React.Dispatch>; + downloadGameArtifact: (gameArtifactId: string) => Promise; + uploadSaveGame: (downloadOptionTitle: string | null) => Promise; + deleteGameArtifact: (gameArtifactId: string) => Promise; + setShowCloudSyncFilesModal: React.Dispatch>; + getGameBackupPreview: () => Promise; + getGameArtifacts: () => Promise; + restoringBackup: boolean; + uploadingBackup: boolean; + loadingPreview: boolean; +} + +export const cloudSyncContext = createContext({ + backupPreview: null, + showCloudSyncModal: false, + backupState: CloudSyncState.Unknown, + setShowCloudSyncModal: () => {}, + downloadGameArtifact: async () => {}, + uploadSaveGame: async () => {}, + artifacts: [], + deleteGameArtifact: async () => {}, + showCloudSyncFilesModal: false, + setShowCloudSyncFilesModal: () => {}, + getGameBackupPreview: async () => {}, + getGameArtifacts: async () => {}, + restoringBackup: false, + uploadingBackup: false, + loadingPreview: false, +}); + +const { Provider } = cloudSyncContext; +export const { Consumer: CloudSyncContextConsumer } = cloudSyncContext; + +export interface CloudSyncContextProviderProps { + children: React.ReactNode; + objectId: string; + shop: GameShop; +} + +export function CloudSyncContextProvider({ + children, + objectId, + shop, +}: CloudSyncContextProviderProps) { + const { t } = useTranslation("game_details"); + + const [artifacts, setArtifacts] = useState([]); + const [showCloudSyncModal, setShowCloudSyncModal] = useState(false); + const [backupPreview, setBackupPreview] = useState( + null + ); + const [restoringBackup, setRestoringBackup] = useState(false); + const [uploadingBackup, setUploadingBackup] = useState(false); + const [showCloudSyncFilesModal, setShowCloudSyncFilesModal] = useState(false); + const [loadingPreview, setLoadingPreview] = useState(false); + + const { showSuccessToast } = useToast(); + + const downloadGameArtifact = useCallback( + async (gameArtifactId: string) => { + setRestoringBackup(true); + window.electron.downloadGameArtifact(objectId, shop, gameArtifactId); + }, + [objectId, shop] + ); + + const getGameArtifacts = useCallback(async () => { + const results = await window.electron.getGameArtifacts(objectId, shop); + setArtifacts(results); + }, [objectId, shop]); + + const getGameBackupPreview = useCallback(async () => { + setLoadingPreview(true); + + try { + const preview = await window.electron.getGameBackupPreview( + objectId, + shop + ); + + setBackupPreview(preview); + } catch (err) { + logger.error("Failed to get game backup preview", objectId, shop, err); + } finally { + setLoadingPreview(false); + } + }, [objectId, shop]); + + const uploadSaveGame = useCallback( + async (downloadOptionTitle: string | null) => { + setUploadingBackup(true); + window.electron.uploadSaveGame(objectId, shop, downloadOptionTitle); + }, + [objectId, shop] + ); + + useEffect(() => { + const removeUploadCompleteListener = window.electron.onUploadComplete( + objectId, + shop, + () => { + showSuccessToast(t("backup_uploaded")); + setUploadingBackup(false); + getGameArtifacts(); + getGameBackupPreview(); + } + ); + + const removeDownloadCompleteListener = + window.electron.onBackupDownloadComplete(objectId, shop, () => { + showSuccessToast(t("backup_restored")); + + setRestoringBackup(false); + getGameArtifacts(); + getGameBackupPreview(); + }); + + return () => { + removeUploadCompleteListener(); + removeDownloadCompleteListener(); + }; + }, [ + objectId, + shop, + showSuccessToast, + t, + getGameBackupPreview, + getGameArtifacts, + ]); + + const deleteGameArtifact = useCallback( + async (gameArtifactId: string) => { + return window.electron.deleteGameArtifact(gameArtifactId).then(() => { + getGameBackupPreview(); + getGameArtifacts(); + }); + }, + [getGameBackupPreview, getGameArtifacts] + ); + + useEffect(() => { + setBackupPreview(null); + setArtifacts([]); + setShowCloudSyncModal(false); + setRestoringBackup(false); + setUploadingBackup(false); + }, [objectId, shop]); + + const backupState = useMemo(() => { + if (!backupPreview) return CloudSyncState.Unknown; + if (backupPreview.overall.changedGames.new) return CloudSyncState.New; + if (backupPreview.overall.changedGames.different) + return CloudSyncState.Different; + if (backupPreview.overall.changedGames.same) return CloudSyncState.Same; + + return CloudSyncState.Unknown; + }, [backupPreview]); + + return ( + + {children} + + ); +} diff --git a/src/renderer/src/context/game-details/game-details.context.tsx b/src/renderer/src/context/game-details/game-details.context.tsx index 120728b1..77aaab5d 100644 --- a/src/renderer/src/context/game-details/game-details.context.tsx +++ b/src/renderer/src/context/game-details/game-details.context.tsx @@ -3,13 +3,19 @@ import { useCallback, useContext, useEffect, + useMemo, + useRef, useState, } from "react"; -import { useParams, useSearchParams } from "react-router-dom"; import { setHeaderTitle } from "@renderer/features"; import { getSteamLanguage } from "@renderer/helpers"; -import { useAppDispatch, useAppSelector, useDownload } from "@renderer/hooks"; +import { + useAppDispatch, + useAppSelector, + useDownload, + useUserDetails, +} from "@renderer/hooks"; import type { Game, @@ -17,6 +23,7 @@ import type { GameShop, GameStats, ShopDetails, + UserAchievement, } from "@types"; import { useTranslation } from "react-i18next"; @@ -32,18 +39,21 @@ export const gameDetailsContext = createContext({ gameTitle: "", isGameRunning: false, isLoading: false, - objectID: undefined, + objectId: undefined, gameColor: "", showRepacksModal: false, showGameOptionsModal: false, stats: null, + achievements: null, hasNSFWContentBlocked: false, + lastDownloadedOption: null, setGameColor: () => {}, selectGameExecutable: async () => null, updateGame: async () => {}, setShowGameOptionsModal: () => {}, setShowRepacksModal: () => {}, setHasNSFWContentBlocked: () => {}, + handleClickOpenCheckout: () => {}, }); const { Provider } = gameDetailsContext; @@ -51,16 +61,24 @@ export const { Consumer: GameDetailsContextConsumer } = gameDetailsContext; export interface GameDetailsContextProps { children: React.ReactNode; + objectId: string; + gameTitle: string; + shop: GameShop; } export function GameDetailsContextProvider({ children, + objectId, + gameTitle, + shop, }: GameDetailsContextProps) { - const { objectID, shop } = useParams(); - const [shopDetails, setShopDetails] = useState(null); + const [achievements, setAchievements] = useState( + null + ); const [game, setGame] = useState(null); const [hasNSFWContentBlocked, setHasNSFWContentBlocked] = useState(false); + const abortControllerRef = useRef(null); const [stats, setStats] = useState(null); @@ -72,10 +90,6 @@ export function GameDetailsContextProvider({ const [repacks, setRepacks] = useState([]); - const [searchParams] = useSearchParams(); - - const gameTitle = searchParams.get("title")!; - const { searchRepacks, isIndexingRepacks } = useContext(repacksContext); useEffect(() => { @@ -91,16 +105,22 @@ export function GameDetailsContextProvider({ const dispatch = useAppDispatch(); const { lastPacket } = useDownload(); + const { userDetails } = useUserDetails(); const userPreferences = useAppSelector( (state) => state.userPreferences.value ); + const handleClickOpenCheckout = () => { + // TODO: show modal before redirecting to checkout page + window.electron.openCheckout(); + }; + const updateGame = useCallback(async () => { return window.electron - .getGameByObjectID(objectID!) + .getGameByObjectId(objectId!) .then((result) => setGame(result)); - }, [setGame, objectID]); + }, [setGame, objectId]); const isGameDownloading = lastPacket?.game.id === game?.id; @@ -109,13 +129,19 @@ export function GameDetailsContextProvider({ }, [updateGame, isGameDownloading, lastPacket?.game.status]); useEffect(() => { + if (abortControllerRef.current) abortControllerRef.current.abort(); + const abortController = new AbortController(); + abortControllerRef.current = abortController; + window.electron .getGameShopDetails( - objectID!, + objectId!, shop as GameShop, getSteamLanguage(i18n.language) ) .then((result) => { + if (abortController.signal.aborted) return; + setShopDetails(result); if ( @@ -130,20 +156,40 @@ export function GameDetailsContextProvider({ setIsLoading(false); }); - window.electron.getGameStats(objectID!, shop as GameShop).then((result) => { + window.electron.getGameStats(objectId, shop as GameShop).then((result) => { + if (abortController.signal.aborted) return; setStats(result); }); + if (userDetails) { + window.electron + .getUnlockedAchievements(objectId, shop as GameShop) + .then((achievements) => { + if (abortController.signal.aborted) return; + setAchievements(achievements); + }) + .catch(() => {}); + } + updateGame(); - }, [updateGame, dispatch, gameTitle, objectID, shop, i18n.language]); + }, [ + updateGame, + dispatch, + gameTitle, + objectId, + shop, + i18n.language, + userDetails, + ]); useEffect(() => { setShopDetails(null); setGame(null); setIsLoading(true); setisGameRunning(false); + setAchievements(null); dispatch(setHeaderTitle(gameTitle)); - }, [objectID, gameTitle, dispatch]); + }, [objectId, gameTitle, dispatch]); useEffect(() => { const unsubscribe = window.electron.onGamesRunning((gamesIds) => { @@ -162,6 +208,34 @@ export function GameDetailsContextProvider({ }; }, [game?.id, isGameRunning, updateGame]); + const lastDownloadedOption = useMemo(() => { + if (game?.uri) { + const repack = repacks.find((repack) => + repack.uris.some((uri) => uri.includes(game.uri!)) + ); + + if (!repack) return null; + return repack; + } + + return null; + }, [game?.uri, repacks]); + + useEffect(() => { + const unsubscribe = window.electron.onUpdateAchievements( + objectId, + shop, + (achievements) => { + if (!userDetails) return; + setAchievements(achievements); + } + ); + + return () => { + unsubscribe(); + }; + }, [objectId, shop, userDetails]); + const getDownloadsPath = async () => { if (userPreferences?.downloadsPath) return userPreferences.downloadsPath; return window.electron.getDefaultDownloadsPath(); @@ -200,18 +274,21 @@ export function GameDetailsContextProvider({ gameTitle, isGameRunning, isLoading, - objectID, + objectId, gameColor, showGameOptionsModal, showRepacksModal, stats, + achievements, hasNSFWContentBlocked, + lastDownloadedOption, setHasNSFWContentBlocked, setGameColor, selectGameExecutable, updateGame, setShowRepacksModal, setShowGameOptionsModal, + handleClickOpenCheckout, }} > {children} diff --git a/src/renderer/src/context/game-details/game-details.context.types.ts b/src/renderer/src/context/game-details/game-details.context.types.ts index 7c3bd20b..842065cc 100644 --- a/src/renderer/src/context/game-details/game-details.context.types.ts +++ b/src/renderer/src/context/game-details/game-details.context.types.ts @@ -4,6 +4,7 @@ import type { GameShop, GameStats, ShopDetails, + UserAchievement, } from "@types"; export interface GameDetailsContext { @@ -14,16 +15,19 @@ export interface GameDetailsContext { gameTitle: string; isGameRunning: boolean; isLoading: boolean; - objectID: string | undefined; + objectId: string | undefined; gameColor: string; showRepacksModal: boolean; showGameOptionsModal: boolean; stats: GameStats | null; + achievements: UserAchievement[] | null; hasNSFWContentBlocked: boolean; + lastDownloadedOption: GameRepack | null; setGameColor: React.Dispatch>; selectGameExecutable: () => Promise; updateGame: () => Promise; setShowRepacksModal: React.Dispatch>; setShowGameOptionsModal: React.Dispatch>; setHasNSFWContentBlocked: React.Dispatch>; + handleClickOpenCheckout: () => void; } diff --git a/src/renderer/src/context/index.ts b/src/renderer/src/context/index.ts index 8d8b9223..948b90b2 100644 --- a/src/renderer/src/context/index.ts +++ b/src/renderer/src/context/index.ts @@ -2,3 +2,4 @@ export * from "./game-details/game-details.context"; export * from "./settings/settings.context"; export * from "./user-profile/user-profile.context"; export * from "./repacks/repacks.context"; +export * from "./cloud-sync/cloud-sync.context"; diff --git a/src/renderer/src/context/user-profile/user-profile.context.tsx b/src/renderer/src/context/user-profile/user-profile.context.tsx index 1eb0c47c..98a25a77 100644 --- a/src/renderer/src/context/user-profile/user-profile.context.tsx +++ b/src/renderer/src/context/user-profile/user-profile.context.tsx @@ -13,8 +13,9 @@ export interface UserProfileContext { /* Indicates if the current user is viewing their own profile */ isMe: boolean; userStats: UserStats | null; - getUserProfile: () => Promise; + setSelectedBackgroundImage: React.Dispatch>; + backgroundImage: string; } export const DEFAULT_USER_PROFILE_BACKGROUND = "#151515B3"; @@ -25,6 +26,8 @@ export const userProfileContext = createContext({ isMe: false, userStats: null, getUserProfile: async () => {}, + setSelectedBackgroundImage: () => {}, + backgroundImage: "", }); const { Provider } = userProfileContext; @@ -47,6 +50,9 @@ export function UserProfileContextProvider({ const [heroBackground, setHeroBackground] = useState( DEFAULT_USER_PROFILE_BACKGROUND ); + const [selectedBackgroundImage, setSelectedBackgroundImage] = useState(""); + + const isMe = userDetails?.id === userProfile?.id; const getHeroBackgroundFromImageUrl = async (imageUrl: string) => { const output = await average(imageUrl, { @@ -57,6 +63,14 @@ export function UserProfileContextProvider({ return `linear-gradient(135deg, ${darkenColor(output as string, 0.5)}, ${darkenColor(output as string, 0.6, 0.5)})`; }; + const getBackgroundImageUrl = () => { + if (selectedBackgroundImage && isMe) + return `local:${selectedBackgroundImage}`; + if (userProfile?.backgroundImageUrl) return userProfile.backgroundImageUrl; + + return ""; + }; + const { t } = useTranslation("user_profile"); const { showErrorToast } = useToast(); @@ -99,8 +113,10 @@ export function UserProfileContextProvider({ value={{ userProfile, heroBackground, - isMe: userDetails?.id === userProfile?.id, + isMe, getUserProfile, + setSelectedBackgroundImage, + backgroundImage: getBackgroundImageUrl(), userStats, }} > diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts index 2d1d8663..e6620f24 100644 --- a/src/renderer/src/declaration.d.ts +++ b/src/renderer/src/declaration.d.ts @@ -25,7 +25,13 @@ import type { UserStats, UserDetails, FriendRequestSync, + GameAchievement, + GameArtifact, + LudusaviBackup, + UserAchievement, + ComparedAchievements, } from "@types"; +import type { AxiosProgressEvent } from "axios"; import type { DiskSpace } from "check-disk-space"; declare global { @@ -48,32 +54,43 @@ declare global { searchGames: (query: string) => Promise; getCatalogue: (category: CatalogueCategory) => Promise; getGameShopDetails: ( - objectID: string, + objectId: string, shop: GameShop, language: string ) => Promise; getRandomGame: () => Promise; getHowLongToBeat: ( - objectID: string, - shop: GameShop, title: string ) => Promise; - getGames: ( - take?: number, - prevCursor?: number - ) => Promise<{ results: CatalogueEntry[]; cursor: number }>; + getGames: (take?: number, skip?: number) => Promise; searchGameRepacks: (query: string) => Promise; getGameStats: (objectId: string, shop: GameShop) => Promise; getTrendingGames: () => Promise; + onAchievementUnlocked: ( + cb: ( + objectId: string, + shop: GameShop, + achievements?: { displayName: string; iconUrl: string }[] + ) => void + ) => () => Electron.IpcRenderer; + onCombinedAchievementsUnlocked: ( + cb: (gameCount: number, achievementCount: number) => void + ) => () => Electron.IpcRenderer; + onUpdateAchievements: ( + objectId: string, + shop: GameShop, + cb: (achievements: GameAchievement[]) => void + ) => () => Electron.IpcRenderer; /* Library */ addGameToLibrary: ( - objectID: string, + objectId: string, title: string, shop: GameShop ) => Promise; createGameShortcut: (id: number) => Promise; updateExecutablePath: (id: number, executablePath: string) => Promise; + selectGameWinePrefix: (id: number, winePrefixPath: string) => Promise; verifyExecutablePathInUse: (executablePath: string) => Promise; getLibrary: () => Promise; openGameInstaller: (gameId: number) => Promise; @@ -84,7 +101,7 @@ declare global { removeGameFromLibrary: (gameId: number) => Promise; removeGame: (gameId: number) => Promise; deleteGameFolder: (gameId: number) => Promise; - getGameByObjectID: (objectID: string) => Promise; + getGameByObjectId: (objectId: string) => Promise; onGamesRunning: ( cb: ( gamesRunning: Pick[] @@ -107,8 +124,45 @@ declare global { /* Hardware */ getDiskFreeSpace: (path: string) => Promise; + /* Cloud save */ + uploadSaveGame: ( + objectId: string, + shop: GameShop, + downloadOptionTitle: string | null + ) => Promise; + downloadGameArtifact: ( + objectId: string, + shop: GameShop, + gameArtifactId: string + ) => Promise; + getGameArtifacts: ( + objectId: string, + shop: GameShop + ) => Promise; + getGameBackupPreview: ( + objectId: string, + shop: GameShop + ) => Promise; + deleteGameArtifact: (gameArtifactId: string) => Promise<{ ok: boolean }>; + onBackupDownloadComplete: ( + objectId: string, + shop: GameShop, + cb: () => void + ) => () => Electron.IpcRenderer; + onUploadComplete: ( + objectId: string, + shop: GameShop, + cb: () => void + ) => () => Electron.IpcRenderer; + onBackupDownloadProgress: ( + objectId: string, + shop: GameShop, + cb: (progress: AxiosProgressEvent) => void + ) => () => Electron.IpcRenderer; + /* Misc */ openExternal: (src: string) => Promise; + openCheckout: () => Promise; getVersion: () => Promise; ping: () => string; getDefaultDownloadsPath: () => Promise; @@ -116,6 +170,7 @@ declare global { showOpenDialog: ( options: Electron.OpenDialogOptions ) => Promise; + showItemInFolder: (path: string) => Promise; platform: NodeJS.Platform; /* Auto update */ @@ -148,6 +203,15 @@ declare global { reason: string, description: string ) => Promise; + getComparedUnlockedAchievements: ( + objectId: string, + shop: GameShop, + userId: string + ) => Promise; + getUnlockedAchievements: ( + objectId: string, + shop: GameShop + ) => Promise; /* Profile */ getMe: () => Promise; diff --git a/src/renderer/src/dexie.ts b/src/renderer/src/dexie.ts index 23f0bf83..2e3565ce 100644 --- a/src/renderer/src/dexie.ts +++ b/src/renderer/src/dexie.ts @@ -1,13 +1,27 @@ +import type { GameShop, HowLongToBeatCategory } from "@types"; import { Dexie } from "dexie"; +export interface HowLongToBeatEntry { + id?: number; + objectId: string; + categories: HowLongToBeatCategory[]; + shop: GameShop; + createdAt: Date; + updatedAt: Date; +} + export const db = new Dexie("Hydra"); -db.version(1).stores({ +db.version(4).stores({ repacks: `++id, title, uris, fileSize, uploadDate, downloadSourceId, repacker, createdAt, updatedAt`, downloadSources: `++id, url, name, etag, downloadCount, status, createdAt, updatedAt`, + howLongToBeatEntries: `++id, categories, [shop+objectId], createdAt, updatedAt`, }); export const downloadSourcesTable = db.table("downloadSources"); export const repacksTable = db.table("repacks"); +export const howLongToBeatEntriesTable = db.table( + "howLongToBeatEntries" +); db.open(); diff --git a/src/renderer/src/features/running-game-slice.ts b/src/renderer/src/features/running-game-slice.ts index b3fb0a9d..e1dd609f 100644 --- a/src/renderer/src/features/running-game-slice.ts +++ b/src/renderer/src/features/running-game-slice.ts @@ -1,5 +1,5 @@ import { PayloadAction, createSlice } from "@reduxjs/toolkit"; -import { GameRunning } from "@types"; +import type { GameRunning } from "@types"; export interface GameRunningState { gameRunning: GameRunning | null; diff --git a/src/renderer/src/helpers.ts b/src/renderer/src/helpers.ts index 3dea26d3..a241bf47 100644 --- a/src/renderer/src/helpers.ts +++ b/src/renderer/src/helpers.ts @@ -27,11 +27,25 @@ export const getSteamLanguage = (language: string) => { }; export const buildGameDetailsPath = ( - game: { shop: GameShop; objectID: string; title: string }, + game: { shop: GameShop; objectId: string; title: string }, params: Record = {} ) => { const searchParams = new URLSearchParams({ title: game.title, ...params }); - return `/game/${game.shop}/${game.objectID}?${searchParams.toString()}`; + return `/game/${game.shop}/${game.objectId}?${searchParams.toString()}`; +}; + +export const buildGameAchievementPath = ( + game: { shop: GameShop; objectId: string; title: string }, + user?: { userId: string } +) => { + const searchParams = new URLSearchParams({ + title: game.title, + shop: game.shop, + objectId: game.objectId, + userId: user?.userId || "", + }); + + return `/achievements/?${searchParams.toString()}`; }; export const darkenColor = (color: string, amount: number, alpha: number = 1) => diff --git a/src/renderer/src/hooks/use-date.ts b/src/renderer/src/hooks/use-date.ts index 01f55610..9486400c 100644 --- a/src/renderer/src/hooks/use-date.ts +++ b/src/renderer/src/hooks/use-date.ts @@ -1,4 +1,4 @@ -import { formatDistance, subMilliseconds } from "date-fns"; +import { format, formatDistance, subMilliseconds } from "date-fns"; import type { FormatDistanceOptions } from "date-fns"; import { ptBR, @@ -67,5 +67,18 @@ export function useDate() { return ""; } }, + + formatDateTime: (date: number | Date | string): string => { + const locale = getDateLocale(); + return format( + date, + locale == enUS ? "MM/dd/yyyy - HH:mm" : "dd/MM/yyyy HH:mm" + ); + }, + + formatDate: (date: number | Date | string): string => { + const locale = getDateLocale(); + return format(date, locale == enUS ? "MM/dd/yyyy" : "dd/MM/yyyy"); + }, }; } diff --git a/src/renderer/src/hooks/use-user-details.ts b/src/renderer/src/hooks/use-user-details.ts index 50e2fad9..5c06965c 100644 --- a/src/renderer/src/hooks/use-user-details.ts +++ b/src/renderer/src/hooks/use-user-details.ts @@ -1,4 +1,4 @@ -import { useCallback } from "react"; +import { useCallback, useMemo } from "react"; import { useAppDispatch, useAppSelector } from "./redux"; import { setProfileBackground, @@ -44,32 +44,9 @@ export function useUserDetails() { const updateUserDetails = useCallback( async (userDetails: UserDetails) => { dispatch(setUserDetails(userDetails)); - - if (userDetails.profileImageUrl) { - // TODO: Decide if we want to use this - // const profileBackground = await profileBackgroundFromProfileImage( - // userDetails.profileImageUrl - // ).catch((err) => { - // logger.error("profileBackgroundFromProfileImage", err); - // return `#151515B3`; - // }); - // dispatch(setProfileBackground(profileBackground)); - - window.localStorage.setItem( - "userDetails", - JSON.stringify({ ...userDetails, profileBackground }) - ); - } else { - const profileBackground = `#151515B3`; - dispatch(setProfileBackground(profileBackground)); - - window.localStorage.setItem( - "userDetails", - JSON.stringify({ ...userDetails, profileBackground }) - ); - } + window.localStorage.setItem("userDetails", JSON.stringify(userDetails)); }, - [dispatch, profileBackground] + [dispatch] ); const fetchUserDetails = useCallback(async () => { @@ -88,9 +65,10 @@ export function useUserDetails() { return updateUserDetails({ ...response, username: userDetails?.username || "", + subscription: userDetails?.subscription || null, }); }, - [updateUserDetails, userDetails?.username] + [updateUserDetails, userDetails?.username, userDetails?.subscription] ); const syncFriendRequests = useCallback(async () => { @@ -147,9 +125,18 @@ export function useUserDetails() { const blockUser = (userId: string) => window.electron.blockUser(userId); - const unblockUser = (userId: string) => { - return window.electron.unblockUser(userId); - }; + const unblockUser = (userId: string) => window.electron.unblockUser(userId); + + const hasActiveSubscription = useMemo(() => { + if (!userDetails?.subscription?.plan) { + return false; + } + + return ( + userDetails.subscription.expiresAt == null || + new Date(userDetails.subscription.expiresAt) > new Date() + ); + }, [userDetails]); return { userDetails, @@ -159,6 +146,7 @@ export function useUserDetails() { friendRequetsModalTab, isFriendsModalVisible, friendModalUserId, + hasActiveSubscription, showFriendsModal, hideFriendsModal, fetchUserDetails, diff --git a/src/renderer/src/logger.ts b/src/renderer/src/logger.ts new file mode 100644 index 00000000..052b4452 --- /dev/null +++ b/src/renderer/src/logger.ts @@ -0,0 +1,3 @@ +import log from "electron-log/renderer"; + +export const logger = log.scope("renderer"); diff --git a/src/renderer/src/main.tsx b/src/renderer/src/main.tsx index d845e028..11003295 100644 --- a/src/renderer/src/main.tsx +++ b/src/renderer/src/main.tsx @@ -15,22 +15,28 @@ import "@fontsource/noto-sans/700.css"; import "react-loading-skeleton/dist/skeleton.css"; import { App } from "./app"; -import { - Home, - Downloads, - GameDetails, - SearchResults, - Settings, - Catalogue, - Profile, -} from "@renderer/pages"; import { store } from "./store"; import resources from "@locales"; +import { AchievementNotification } from "./pages/achievements/notification/achievement-notification"; import "./workers"; import { RepacksContextProvider } from "./context"; +import { SuspenseWrapper } from "./components"; + +const Home = React.lazy(() => import("./pages/home/home")); +const GameDetails = React.lazy( + () => import("./pages/game-details/game-details") +); +const Downloads = React.lazy(() => import("./pages/downloads/downloads")); +const SearchResults = React.lazy(() => import("./pages/home/search-results")); +const Settings = React.lazy(() => import("./pages/settings/settings")); +const Catalogue = React.lazy(() => import("./pages/catalogue/catalogue")); +const Profile = React.lazy(() => import("./pages/profile/profile")); +const Achievements = React.lazy( + () => import("./pages/achievements/achievements") +); Sentry.init({}); @@ -61,14 +67,40 @@ ReactDOM.createRoot(document.getElementById("root")!).render( }> - - - - - - - + } /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + } + /> + diff --git a/src/renderer/src/pages/achievements/achievements-content.tsx b/src/renderer/src/pages/achievements/achievements-content.tsx new file mode 100644 index 00000000..72dfe83f --- /dev/null +++ b/src/renderer/src/pages/achievements/achievements-content.tsx @@ -0,0 +1,366 @@ +import { setHeaderTitle } from "@renderer/features"; +import { useAppDispatch, useDate, useUserDetails } from "@renderer/hooks"; +import { steamUrlBuilder } from "@shared"; +import { useContext, useEffect, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; +import * as styles from "./achievements.css"; +import { + buildGameDetailsPath, + formatDownloadProgress, +} from "@renderer/helpers"; +import { LockIcon, PersonIcon, TrophyIcon } from "@primer/octicons-react"; +import { SPACING_UNIT, vars } from "@renderer/theme.css"; +import { gameDetailsContext } from "@renderer/context"; +import type { ComparedAchievements, UserAchievement } from "@types"; +import { average } from "color.js"; +import Color from "color"; +import { Link } from "@renderer/components"; +import { ComparedAchievementList } from "./compared-achievement-list"; + +interface UserInfo { + id: string; + displayName: string; + profileImageUrl: string | null; + totalAchievementCount: number; + unlockedAchievementCount: number; +} + +interface AchievementsContentProps { + otherUser: UserInfo | null; + comparedAchievements: ComparedAchievements | null; +} + +interface AchievementListProps { + achievements: UserAchievement[]; +} + +interface AchievementSummaryProps { + user: UserInfo; + isComparison?: boolean; +} + +function AchievementSummary({ user, isComparison }: AchievementSummaryProps) { + const { t } = useTranslation("achievement"); + const { userDetails, hasActiveSubscription } = useUserDetails(); + const { handleClickOpenCheckout } = useContext(gameDetailsContext); + + const getProfileImage = ( + user: Pick + ) => { + return ( +

+ {user.profileImageUrl ? ( + {user.displayName} + ) : ( + + )} +
+ ); + }; + + if (isComparison && userDetails?.id == user.id && !hasActiveSubscription) { + return ( +
+
+ +

+ +

+
+
+ {getProfileImage(user)} +

{user.displayName}

+
+
+ ); + } + + return ( +
+ {getProfileImage(user)} +
+

{user.displayName}

+
+
+ + + {user.unlockedAchievementCount} / {user.totalAchievementCount} + +
+ + + {formatDownloadProgress( + user.unlockedAchievementCount / user.totalAchievementCount + )} + +
+ +
+
+ ); +} + +function AchievementList({ achievements }: AchievementListProps) { + const { t } = useTranslation("achievement"); + const { formatDateTime } = useDate(); + + return ( +
    + {achievements.map((achievement, index) => ( +
  • + {achievement.displayName} +
    +

    {achievement.displayName}

    +

    {achievement.description}

    +
    + {achievement.unlockTime && ( +
    + {t("unlocked_at")} +

    {formatDateTime(achievement.unlockTime)}

    +
    + )} +
  • + ))} +
+ ); +} + +export function AchievementsContent({ + otherUser, + comparedAchievements, +}: AchievementsContentProps) { + const heroRef = useRef(null); + const containerRef = useRef(null); + const [isHeaderStuck, setIsHeaderStuck] = useState(false); + + const { gameTitle, objectId, shop, achievements, gameColor, setGameColor } = + useContext(gameDetailsContext); + + const dispatch = useAppDispatch(); + + const { userDetails, hasActiveSubscription } = useUserDetails(); + useEffect(() => { + dispatch(setHeaderTitle(gameTitle)); + }, [dispatch, gameTitle]); + + const handleHeroLoad = async () => { + const output = await average(steamUrlBuilder.libraryHero(objectId!), { + amount: 1, + format: "hex", + }); + + const backgroundColor = output + ? (new Color(output).darken(0.7).toString() as string) + : ""; + + setGameColor(backgroundColor); + }; + + const onScroll: React.UIEventHandler = (event) => { + const heroHeight = heroRef.current?.clientHeight ?? styles.HERO_HEIGHT; + + const scrollY = (event.target as HTMLDivElement).scrollTop; + if (scrollY >= heroHeight && !isHeaderStuck) { + setIsHeaderStuck(true); + } + + if (scrollY <= heroHeight && isHeaderStuck) { + setIsHeaderStuck(false); + } + }; + + const getProfileImage = ( + user: Pick + ) => { + return ( +
+ {user.profileImageUrl ? ( + {user.displayName} + ) : ( + + )} +
+ ); + }; + + if (!objectId || !shop || !gameTitle || !userDetails) return null; + + return ( +
+ {gameTitle} + +
+
+
+
+ + {gameTitle} + +
+
+ +
+ achievement.unlocked) + .length, + }} + isComparison={otherUser !== null} + /> + + {otherUser && } +
+
+ + {otherUser && ( +
+
+
+ {hasActiveSubscription && ( +
+ {getProfileImage({ ...userDetails })} +
+ )} +
+ {getProfileImage(otherUser)} +
+
+
+ )} + + {otherUser ? ( + + ) : ( + + )} +
+
+ ); +} diff --git a/src/renderer/src/pages/achievements/achievements-skeleton.tsx b/src/renderer/src/pages/achievements/achievements-skeleton.tsx new file mode 100644 index 00000000..f9ae81ac --- /dev/null +++ b/src/renderer/src/pages/achievements/achievements-skeleton.tsx @@ -0,0 +1,13 @@ +import Skeleton from "react-loading-skeleton"; +import * as styles from "./achievements.css"; + +export function AchievementsSkeleton() { + return ( +
+
+ +
+
+
+ ); +} diff --git a/src/renderer/src/pages/achievements/achievements.css.ts b/src/renderer/src/pages/achievements/achievements.css.ts new file mode 100644 index 00000000..ba5e36ef --- /dev/null +++ b/src/renderer/src/pages/achievements/achievements.css.ts @@ -0,0 +1,222 @@ +import { SPACING_UNIT, vars } from "../../theme.css"; +import { style } from "@vanilla-extract/css"; +import { recipe } from "@vanilla-extract/recipes"; + +export const HERO_HEIGHT = 150; +const LOGO_HEIGHT = 100; +const LOGO_MAX_WIDTH = 200; + +export const wrapper = style({ + display: "flex", + flexDirection: "column", + overflow: "hidden", + width: "100%", + height: "100%", + transition: "all ease 0.3s", +}); + +export const hero = style({ + width: "100%", + height: `${HERO_HEIGHT}px`, + minHeight: `${HERO_HEIGHT}px`, + display: "flex", + flexDirection: "column", + position: "relative", + transition: "all ease 0.2s", + "@media": { + "(min-width: 1250px)": { + height: "350px", + minHeight: "350px", + }, + }, +}); + +export const heroImage = style({ + width: "100%", + height: `${HERO_HEIGHT}px`, + minHeight: `${HERO_HEIGHT}px`, + objectFit: "cover", + objectPosition: "top", + transition: "all ease 0.2s", + position: "absolute", + zIndex: "0", + filter: "blur(5px)", + "@media": { + "(min-width: 1250px)": { + objectPosition: "center", + height: "350px", + minHeight: "350px", + }, + }, +}); + +export const heroContent = style({ + padding: `${SPACING_UNIT * 2}px`, + width: "100%", + display: "flex", + justifyContent: "space-between", + alignItems: "center", +}); + +export const gameLogo = style({ + width: LOGO_MAX_WIDTH, + height: LOGO_HEIGHT, + objectFit: "contain", + transition: "all ease 0.2s", + ":hover": { + transform: "scale(1.05)", + }, +}); + +export const container = style({ + width: "100%", + height: "100%", + display: "flex", + flexDirection: "column", + overflow: "auto", + zIndex: "1", +}); + +export const tableHeader = recipe({ + base: { + width: "100%", + backgroundColor: vars.color.darkBackground, + transition: "all ease 0.2s", + borderBottom: `solid 1px ${vars.color.border}`, + position: "sticky", + top: "0", + zIndex: "1", + }, + variants: { + stuck: { + true: { + boxShadow: "0px 0px 15px 0px rgba(0, 0, 0, 0.8)", + }, + }, + }, +}); + +export const list = style({ + listStyle: "none", + margin: "0", + display: "flex", + flexDirection: "column", + gap: `${SPACING_UNIT * 2}px`, + padding: `${SPACING_UNIT * 2}px`, + width: "100%", + backgroundColor: vars.color.background, +}); + +export const listItem = style({ + transition: "all ease 0.1s", + color: vars.color.muted, + width: "100%", + overflow: "hidden", + borderRadius: "4px", + padding: `${SPACING_UNIT}px ${SPACING_UNIT}px`, + gap: `${SPACING_UNIT * 2}px`, + alignItems: "center", + textAlign: "left", + ":hover": { + backgroundColor: "rgba(255, 255, 255, 0.15)", + textDecoration: "none", + }, +}); + +export const listItemImage = recipe({ + base: { + width: "54px", + height: "54px", + borderRadius: "4px", + objectFit: "cover", + }, + variants: { + unlocked: { + false: { + filter: "grayscale(100%)", + }, + }, + }, +}); + +export const achievementsProgressBar = style({ + width: "100%", + height: "8px", + transition: "all ease 0.2s", + "::-webkit-progress-bar": { + backgroundColor: "rgba(255, 255, 255, 0.15)", + borderRadius: "4px", + }, + "::-webkit-progress-value": { + backgroundColor: vars.color.muted, + borderRadius: "4px", + }, +}); + +export const heroLogoBackdrop = style({ + width: "100%", + height: "100%", + position: "absolute", + display: "flex", + flexDirection: "column", + justifyContent: "flex-end", +}); + +export const heroImageSkeleton = style({ + height: "150px", +}); + +export const heroPanelSkeleton = style({ + width: "100%", + padding: `${SPACING_UNIT * 2}px ${SPACING_UNIT * 2}px`, + display: "flex", + alignItems: "center", + backgroundColor: vars.color.background, + height: "72px", + borderBottom: `solid 1px ${vars.color.border}`, +}); + +export const listItemSkeleton = style({ + width: "100%", + overflow: "hidden", + borderRadius: "4px", + padding: `${SPACING_UNIT}px ${SPACING_UNIT}px`, + gap: `${SPACING_UNIT * 2}px`, +}); + +export const profileAvatar = style({ + height: "54px", + width: "54px", + borderRadius: "4px", + display: "flex", + justifyContent: "center", + alignItems: "center", + backgroundColor: vars.color.background, + position: "relative", + objectFit: "cover", +}); + +export const profileAvatarSmall = style({ + height: "32px", + width: "32px", + borderRadius: "4px", + display: "flex", + justifyContent: "center", + alignItems: "center", + backgroundColor: vars.color.background, + position: "relative", + objectFit: "cover", +}); + +export const subscriptionRequiredButton = style({ + textDecoration: "none", + display: "flex", + justifyContent: "center", + width: "100%", + gap: `${SPACING_UNIT / 2}px`, + color: vars.color.body, + cursor: "pointer", + ":hover": { + textDecoration: "underline", + }, +}); diff --git a/src/renderer/src/pages/achievements/achievements.tsx b/src/renderer/src/pages/achievements/achievements.tsx new file mode 100644 index 00000000..605300ef --- /dev/null +++ b/src/renderer/src/pages/achievements/achievements.tsx @@ -0,0 +1,96 @@ +import { setHeaderTitle } from "@renderer/features"; +import { useAppDispatch, useUserDetails } from "@renderer/hooks"; +import type { ComparedAchievements, GameShop } from "@types"; +import { useEffect, useMemo, useState } from "react"; +import { useSearchParams } from "react-router-dom"; +import { vars } from "@renderer/theme.css"; +import { + GameDetailsContextConsumer, + GameDetailsContextProvider, +} from "@renderer/context"; +import { SkeletonTheme } from "react-loading-skeleton"; +import { AchievementsSkeleton } from "./achievements-skeleton"; +import { AchievementsContent } from "./achievements-content"; + +export default function Achievements() { + const [searchParams] = useSearchParams(); + const objectId = searchParams.get("objectId"); + const shop = searchParams.get("shop"); + const title = searchParams.get("title"); + const userId = searchParams.get("userId"); + + const { userDetails } = useUserDetails(); + + const [comparedAchievements, setComparedAchievements] = + useState(null); + + const dispatch = useAppDispatch(); + + useEffect(() => { + if (title) { + dispatch(setHeaderTitle(title)); + } + }, [dispatch, title]); + + useEffect(() => { + setComparedAchievements(null); + + if (userDetails?.id == userId) { + return; + } + + if (objectId && shop && userId) { + window.electron + .getComparedUnlockedAchievements(objectId, shop as GameShop, userId) + .then(setComparedAchievements); + } + }, [objectId, shop, userId]); + + const otherUserId = userDetails?.id === userId ? null : userId; + + const otherUser = useMemo(() => { + if (!otherUserId || !comparedAchievements) return null; + + return { + id: otherUserId, + displayName: comparedAchievements.target.displayName, + profileImageUrl: comparedAchievements.target.profileImageUrl, + totalAchievementCount: comparedAchievements.target.totalAchievementCount, + unlockedAchievementCount: + comparedAchievements.target.unlockedAchievementCount, + }; + }, [otherUserId, comparedAchievements]); + + return ( + + + {({ isLoading, achievements }) => { + const showSkeleton = + isLoading || + achievements === null || + (otherUserId && comparedAchievements === null); + + return ( + + {showSkeleton ? ( + + ) : ( + + )} + + ); + }} + + + ); +} diff --git a/src/renderer/src/pages/achievements/compared-achievement-list.tsx b/src/renderer/src/pages/achievements/compared-achievement-list.tsx new file mode 100644 index 00000000..21f11936 --- /dev/null +++ b/src/renderer/src/pages/achievements/compared-achievement-list.tsx @@ -0,0 +1,110 @@ +import type { ComparedAchievements } from "@types"; +import * as styles from "./achievements.css"; +import { CheckCircleIcon, LockIcon } from "@primer/octicons-react"; +import { useDate } from "@renderer/hooks"; +import { SPACING_UNIT } from "@renderer/theme.css"; + +export interface ComparedAchievementListProps { + achievements: ComparedAchievements; +} + +export function ComparedAchievementList({ + achievements, +}: ComparedAchievementListProps) { + const { formatDateTime } = useDate(); + + return ( +
    + {achievements.achievements.map((achievement, index) => ( +
  • +
    + {achievement.displayName} +
    +

    {achievement.displayName}

    +

    {achievement.description}

    +
    +
    + + {achievement.ownerStat ? ( + achievement.ownerStat.unlocked ? ( +
    + + + {formatDateTime(achievement.ownerStat.unlockTime!)} + +
    + ) : ( +
    + +
    + ) + ) : null} + + {achievement.targetStat.unlocked ? ( +
    + + + {formatDateTime(achievement.targetStat.unlockTime!)} + +
    + ) : ( +
    + +
    + )} +
  • + ))} +
+ ); +} diff --git a/src/renderer/src/pages/achievements/notification/achievement-notification.css.ts b/src/renderer/src/pages/achievements/notification/achievement-notification.css.ts new file mode 100644 index 00000000..ba9469bb --- /dev/null +++ b/src/renderer/src/pages/achievements/notification/achievement-notification.css.ts @@ -0,0 +1,44 @@ +import { recipe } from "@vanilla-extract/recipes"; +import { vars } from "../../../theme.css"; +import { keyframes, style } from "@vanilla-extract/css"; + +const animationIn = keyframes({ + "0%": { transform: `translateY(-240px)` }, + "100%": { transform: "translateY(0)" }, +}); + +const animationOut = keyframes({ + "0%": { transform: `translateY(0)` }, + "100%": { transform: "translateY(-240px)" }, +}); + +export const container = recipe({ + base: { + marginTop: "24px", + marginLeft: "24px", + animationDuration: "1.0s", + height: "60px", + display: "flex", + }, + variants: { + closing: { + true: { + animationName: animationOut, + transform: "translateY(-240px)", + }, + false: { + animationName: animationIn, + transform: "translateY(0)", + }, + }, + }, +}); + +export const content = style({ + display: "flex", + flexDirection: "row", + gap: "8px", + alignItems: "center", + background: vars.color.background, + paddingRight: "8px", +}); diff --git a/src/renderer/src/pages/achievements/notification/achievement-notification.tsx b/src/renderer/src/pages/achievements/notification/achievement-notification.tsx new file mode 100644 index 00000000..ec8e2d8a --- /dev/null +++ b/src/renderer/src/pages/achievements/notification/achievement-notification.tsx @@ -0,0 +1,142 @@ +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import achievementSound from "@renderer/assets/audio/achievement.wav"; +import { useTranslation } from "react-i18next"; +import * as styles from "./achievement-notification.css"; + +interface AchievementInfo { + displayName: string; + iconUrl: string; +} + +const NOTIFICATION_TIMEOUT = 4000; + +export function AchievementNotification() { + const { t } = useTranslation("achievement"); + + const [isClosing, setIsClosing] = useState(false); + const [isVisible, setIsVisible] = useState(false); + + const [achievements, setAchievements] = useState([]); + const [currentAchievement, setCurrentAchievement] = + useState(null); + + const achievementAnimation = useRef(-1); + const closingAnimation = useRef(-1); + const visibleAnimation = useRef(-1); + + const audio = useMemo(() => { + const audio = new Audio(achievementSound); + audio.volume = 0.2; + audio.preload = "auto"; + return audio; + }, []); + + useEffect(() => { + const unsubscribe = window.electron.onCombinedAchievementsUnlocked( + (gameCount, achievementCount) => { + if (gameCount === 0 || achievementCount === 0) return; + + setAchievements([ + { + displayName: t("new_achievements_unlocked", { + gameCount, + achievementCount, + }), + iconUrl: + "https://avatars.githubusercontent.com/u/164102380?s=400&u=01a13a7b4f0c642f7e547b8e1d70440ea06fa750&v=4", + }, + ]); + + audio.play(); + } + ); + + return () => { + unsubscribe(); + }; + }, [audio]); + + useEffect(() => { + const unsubscribe = window.electron.onAchievementUnlocked( + (_object, _shop, achievements) => { + if (!achievements || !achievements.length) return; + + setAchievements((ach) => ach.concat(achievements)); + + audio.play(); + } + ); + + return () => { + unsubscribe(); + }; + }, [audio]); + + const hasAchievementsPending = achievements.length > 0; + + const startAnimateClosing = useCallback(() => { + cancelAnimationFrame(closingAnimation.current); + cancelAnimationFrame(visibleAnimation.current); + cancelAnimationFrame(achievementAnimation.current); + + setIsClosing(true); + + const zero = performance.now(); + closingAnimation.current = requestAnimationFrame( + function animateClosing(time) { + if (time - zero <= 1000) { + closingAnimation.current = requestAnimationFrame(animateClosing); + } else { + setIsVisible(false); + } + } + ); + }, []); + + useEffect(() => { + if (hasAchievementsPending) { + setIsClosing(false); + setIsVisible(true); + + let zero = performance.now(); + cancelAnimationFrame(closingAnimation.current); + cancelAnimationFrame(visibleAnimation.current); + cancelAnimationFrame(achievementAnimation.current); + achievementAnimation.current = requestAnimationFrame( + function animateLock(time) { + if (time - zero > NOTIFICATION_TIMEOUT) { + zero = performance.now(); + setAchievements((ach) => ach.slice(1)); + } + achievementAnimation.current = requestAnimationFrame(animateLock); + } + ); + } else { + startAnimateClosing(); + } + }, [hasAchievementsPending]); + + useEffect(() => { + if (achievements.length) { + setCurrentAchievement(achievements[0]); + } + }, [achievements]); + + if (!isVisible || !currentAchievement) return null; + + return ( +
+
+ {currentAchievement.displayName} +
+

{t("achievement_unlocked")}

+

{currentAchievement.displayName}

+
+
+
+ ); +} diff --git a/src/renderer/src/pages/catalogue/catalogue.tsx b/src/renderer/src/pages/catalogue/catalogue.tsx index ee1f5395..ff8f5c00 100644 --- a/src/renderer/src/pages/catalogue/catalogue.tsx +++ b/src/renderer/src/pages/catalogue/catalogue.tsx @@ -14,7 +14,7 @@ import { buildGameDetailsPath } from "@renderer/helpers"; import { SPACING_UNIT, vars } from "@renderer/theme.css"; -export function Catalogue() { +export default function Catalogue() { const dispatch = useAppDispatch(); const { t } = useTranslation("catalogue"); @@ -24,12 +24,10 @@ export function Catalogue() { const contentRef = useRef(null); - const cursorRef = useRef(0); - const navigate = useNavigate(); const [searchParams] = useSearchParams(); - const cursor = Number(searchParams.get("cursor") ?? 0); + const skip = Number(searchParams.get("skip") ?? 0); const handleGameClick = (game: CatalogueEntry) => { dispatch(clearSearch()); @@ -42,11 +40,10 @@ export function Catalogue() { setSearchResults([]); window.electron - .getGames(24, cursor) - .then(({ results, cursor }) => { + .getGames(24, skip) + .then((results) => { return new Promise((resolve) => { setTimeout(() => { - cursorRef.current = cursor; setSearchResults(results); resolve(null); }, 500); @@ -55,11 +52,11 @@ export function Catalogue() { .finally(() => { setIsLoading(false); }); - }, [dispatch, cursor, searchParams]); + }, [dispatch, skip, searchParams]); const handleNextPage = () => { const params = new URLSearchParams({ - cursor: cursorRef.current.toString(), + skip: String(skip + 24), }); navigate(`/catalogue?${params.toString()}`); @@ -80,7 +77,7 @@ export function Catalogue() { diff --git a/src/renderer/src/pages/downloads/downloads.tsx b/src/renderer/src/pages/downloads/downloads.tsx index 5a9c228c..ed541745 100644 --- a/src/renderer/src/pages/downloads/downloads.tsx +++ b/src/renderer/src/pages/downloads/downloads.tsx @@ -7,11 +7,11 @@ import { BinaryNotFoundModal } from "../shared-modals/binary-not-found-modal"; import * as styles from "./downloads.css"; import { DeleteGameModal } from "./delete-game-modal"; import { DownloadGroup } from "./download-group"; -import { LibraryGame } from "@types"; +import type { LibraryGame } from "@types"; import { orderBy } from "lodash-es"; import { ArrowDownIcon } from "@primer/octicons-react"; -export function Downloads() { +export default function Downloads() { const { library, updateLibrary } = useLibrary(); const { t } = useTranslation("downloads"); diff --git a/src/renderer/src/pages/game-details/cloud-sync-files-modal/cloud-sync-files-modal.css.ts b/src/renderer/src/pages/game-details/cloud-sync-files-modal/cloud-sync-files-modal.css.ts new file mode 100644 index 00000000..f6a46a08 --- /dev/null +++ b/src/renderer/src/pages/game-details/cloud-sync-files-modal/cloud-sync-files-modal.css.ts @@ -0,0 +1,9 @@ +import { style } from "@vanilla-extract/css"; + +import { SPACING_UNIT } from "../../../theme.css"; + +export const mappingMethods = style({ + display: "grid", + gap: `${SPACING_UNIT}px`, + gridTemplateColumns: "repeat(2, 1fr)", +}); diff --git a/src/renderer/src/pages/game-details/cloud-sync-files-modal/cloud-sync-files-modal.tsx b/src/renderer/src/pages/game-details/cloud-sync-files-modal/cloud-sync-files-modal.tsx new file mode 100644 index 00000000..3bcba8a7 --- /dev/null +++ b/src/renderer/src/pages/game-details/cloud-sync-files-modal/cloud-sync-files-modal.tsx @@ -0,0 +1,143 @@ +import { Button, Modal, ModalProps } from "@renderer/components"; +import { useContext, useMemo, useState } from "react"; +import { cloudSyncContext } from "@renderer/context"; +import { useTranslation } from "react-i18next"; +import { CheckCircleFillIcon } from "@primer/octicons-react"; + +import * as styles from "./cloud-sync-files-modal.css"; +import { formatBytes } from "@shared"; +import { vars } from "@renderer/theme.css"; +// import { useToast } from "@renderer/hooks"; + +export interface CloudSyncFilesModalProps + extends Omit {} + +export enum FileMappingMethod { + Automatic = "AUTOMATIC", + Manual = "MANUAL", +} + +export function CloudSyncFilesModal({ + visible, + onClose, +}: CloudSyncFilesModalProps) { + const [selectedFileMappingMethod, setSelectedFileMappingMethod] = + useState(FileMappingMethod.Automatic); + const { backupPreview } = useContext(cloudSyncContext); + // const { gameTitle } = useContext(gameDetailsContext); + + const { t } = useTranslation("game_details"); + + // const { showSuccessToast } = useToast(); + + const files = useMemo(() => { + if (!backupPreview) { + return []; + } + + const [game] = Object.values(backupPreview.games); + if (!game) return []; + const entries = Object.entries(game.files); + + return entries.map(([key, value]) => { + return { path: key, ...value }; + }); + }, [backupPreview]); + + // const handleAddCustomPathClick = useCallback(async () => { + // const { filePaths } = await window.electron.showOpenDialog({ + // properties: ["openDirectory"], + // }); + + // if (filePaths && filePaths.length > 0) { + // const path = filePaths[0]; + // await window.electron.selectGameBackupDirectory(gameTitle, path); + // showSuccessToast("custom_backup_location_set"); + // getGameBackupPreview(); + // } + // }, [gameTitle, showSuccessToast, getGameBackupPreview]); + + return ( + +
+ {t("mapping_method_label")} + +
+ {Object.values(FileMappingMethod).map((mappingMethod) => ( + + ))} +
+
+ +
+ {/* + + {t("select_executable")} + + } + /> */} + +

{t("files_automatically_mapped")}

+ +
    + {files.map((file) => ( +
  • + +

    {formatBytes(file.bytes)}

    +
  • + ))} +
+
+
+ ); +} diff --git a/src/renderer/src/pages/game-details/cloud-sync-modal/cloud-sync-modal.css.ts b/src/renderer/src/pages/game-details/cloud-sync-modal/cloud-sync-modal.css.ts new file mode 100644 index 00000000..dc2d0031 --- /dev/null +++ b/src/renderer/src/pages/game-details/cloud-sync-modal/cloud-sync-modal.css.ts @@ -0,0 +1,65 @@ +import { keyframes, style } from "@vanilla-extract/css"; + +import { SPACING_UNIT, vars } from "../../../theme.css"; + +export const rotate = keyframes({ + "0%": { transform: "rotate(0deg)" }, + "100%": { + transform: "rotate(360deg)", + }, +}); + +export const artifacts = style({ + display: "flex", + gap: `${SPACING_UNIT}px`, + flexDirection: "column", + listStyle: "none", + margin: "0", + padding: "0", +}); + +export const artifactButton = style({ + display: "flex", + textAlign: "left", + flexDirection: "row", + alignItems: "center", + gap: `${SPACING_UNIT}px`, + color: vars.color.body, + padding: `${SPACING_UNIT * 2}px`, + backgroundColor: vars.color.darkBackground, + border: `1px solid ${vars.color.border}`, + borderRadius: "4px", + justifyContent: "space-between", +}); + +export const syncIcon = style({ + animationName: rotate, + animationDuration: "1s", + animationIterationCount: "infinite", + animationTimingFunction: "linear", +}); + +export const progress = style({ + width: "100%", + height: "5px", + "::-webkit-progress-bar": { + backgroundColor: vars.color.darkBackground, + }, + "::-webkit-progress-value": { + backgroundColor: vars.color.muted, + }, +}); + +export const manageFilesButton = style({ + margin: "0", + padding: "0", + alignSelf: "flex-start", + fontSize: 14, + cursor: "pointer", + textDecoration: "underline", + color: vars.color.body, + ":disabled": { + cursor: "not-allowed", + opacity: vars.opacity.disabled, + }, +}); diff --git a/src/renderer/src/pages/game-details/cloud-sync-modal/cloud-sync-modal.tsx b/src/renderer/src/pages/game-details/cloud-sync-modal/cloud-sync-modal.tsx new file mode 100644 index 00000000..325b64e5 --- /dev/null +++ b/src/renderer/src/pages/game-details/cloud-sync-modal/cloud-sync-modal.tsx @@ -0,0 +1,260 @@ +import { Button, Modal, ModalProps } from "@renderer/components"; +import { useContext, useEffect, useMemo, useState } from "react"; +import { cloudSyncContext, gameDetailsContext } from "@renderer/context"; + +import * as styles from "./cloud-sync-modal.css"; +import { formatBytes } from "@shared"; +import { format } from "date-fns"; +import { + ClockIcon, + DeviceDesktopIcon, + HistoryIcon, + InfoIcon, + SyncIcon, + TrashIcon, + UploadIcon, +} from "@primer/octicons-react"; +import { useToast } from "@renderer/hooks"; +import { useTranslation } from "react-i18next"; +import { AxiosProgressEvent } from "axios"; +import { formatDownloadProgress } from "@renderer/helpers"; +import { SPACING_UNIT } from "@renderer/theme.css"; + +export interface CloudSyncModalProps + extends Omit {} + +export function CloudSyncModal({ visible, onClose }: CloudSyncModalProps) { + const [deletingArtifact, setDeletingArtifact] = useState(false); + const [backupDownloadProgress, setBackupDownloadProgress] = + useState(null); + + const { t } = useTranslation("game_details"); + + const { + artifacts, + backupPreview, + uploadingBackup, + restoringBackup, + loadingPreview, + uploadSaveGame, + downloadGameArtifact, + deleteGameArtifact, + setShowCloudSyncFilesModal, + getGameBackupPreview, + } = useContext(cloudSyncContext); + + const { objectId, shop, gameTitle, lastDownloadedOption } = + useContext(gameDetailsContext); + + const { showSuccessToast, showErrorToast } = useToast(); + + const handleDeleteArtifactClick = async (gameArtifactId: string) => { + setDeletingArtifact(true); + + try { + await deleteGameArtifact(gameArtifactId); + + showSuccessToast(t("backup_deleted")); + } catch (err) { + showErrorToast("backup_deletion_failed"); + } finally { + setDeletingArtifact(false); + } + }; + + useEffect(() => { + const removeBackupDownloadProgressListener = + window.electron.onBackupDownloadProgress( + objectId!, + shop, + (progressEvent) => { + setBackupDownloadProgress(progressEvent); + } + ); + + return () => { + removeBackupDownloadProgressListener(); + }; + }, [backupPreview, objectId, shop]); + + const handleBackupInstallClick = async (artifactId: string) => { + setBackupDownloadProgress(null); + downloadGameArtifact(artifactId); + }; + + useEffect(() => { + getGameBackupPreview(); + }, [getGameBackupPreview]); + + const backupStateLabel = useMemo(() => { + if (uploadingBackup) { + return ( + + + {t("uploading_backup")} + + ); + } + + if (restoringBackup) { + return ( + + + {t("restoring_backup", { + progress: formatDownloadProgress( + backupDownloadProgress?.progress ?? 0 + ), + })} + + ); + } + + if (loadingPreview) { + return ( + + + {t("loading_save_preview")} + + ); + } + + if (artifacts.length >= 2) { + return t("max_number_of_artifacts_reached"); + } + + if (!backupPreview) { + return t("no_backup_preview"); + } + + return t("no_backups"); + }, [ + uploadingBackup, + backupDownloadProgress?.progress, + backupPreview, + restoringBackup, + loadingPreview, + artifacts, + t, + ]); + + const disableActions = uploadingBackup || restoringBackup || deletingArtifact; + + return ( + +
+
+

{gameTitle}

+

{backupStateLabel}

+ + +
+ + +
+ +
+
+

{t("backups")}

+ {artifacts.length} / 2 +
+
+ + {artifacts.length > 0 ? ( +
    + {artifacts.map((artifact, index) => ( +
  • +
    +
    +

    {t("backup_title", { number: index + 1 })}

    + {formatBytes(artifact.artifactLengthInBytes)} +
    + + + + {artifact.hostname} + + + + + {artifact.downloadOptionTitle ?? t("no_download_option_info")} + + + + + {format(artifact.createdAt, "dd/MM/yyyy HH:mm:ss")} + +
    + +
    + + +
    +
  • + ))} +
+ ) : ( +

{t("no_backups_created")}

+ )} +
+ ); +} diff --git a/src/renderer/src/pages/game-details/game-details-content.tsx b/src/renderer/src/pages/game-details/game-details-content.tsx index 2ba19246..909756df 100644 --- a/src/renderer/src/pages/game-details/game-details-content.tsx +++ b/src/renderer/src/pages/game-details/game-details-content.tsx @@ -1,4 +1,4 @@ -import { useContext, useEffect, useRef, useState } from "react"; +import { useContext, useEffect, useMemo, useRef, useState } from "react"; import { average } from "color.js"; import Color from "color"; @@ -9,8 +9,12 @@ import { Sidebar } from "./sidebar/sidebar"; import * as styles from "./game-details.css"; import { useTranslation } from "react-i18next"; -import { gameDetailsContext } from "@renderer/context"; +import { cloudSyncContext, gameDetailsContext } from "@renderer/context"; import { steamUrlBuilder } from "@shared"; +import Lottie from "lottie-react"; + +import cloudAnimation from "@renderer/assets/lottie/cloud.json"; +import { useUserDetails } from "@renderer/hooks"; const HERO_ANIMATION_THRESHOLD = 25; @@ -22,18 +26,43 @@ export function GameDetailsContent() { const { t } = useTranslation("game_details"); const { - objectID, + objectId, shopDetails, game, gameColor, setGameColor, hasNSFWContentBlocked, + handleClickOpenCheckout, } = useContext(gameDetailsContext); + const { userDetails, hasActiveSubscription } = useUserDetails(); + + const { setShowCloudSyncModal, getGameArtifacts } = + useContext(cloudSyncContext); + + const aboutTheGame = useMemo(() => { + const aboutTheGame = shopDetails?.about_the_game; + if (aboutTheGame) { + const document = new DOMParser().parseFromString( + aboutTheGame, + "text/html" + ); + + const $images = Array.from(document.querySelectorAll("img")); + $images.forEach(($image) => { + $image.loading = "lazy"; + }); + + return document.body.outerHTML; + } + + return t("no_shop_details"); + }, [shopDetails, t]); + const [backdropOpactiy, setBackdropOpacity] = useState(1); const handleHeroLoad = async () => { - const output = await average(steamUrlBuilder.libraryHero(objectID!), { + const output = await average(steamUrlBuilder.libraryHero(objectId!), { amount: 1, format: "hex", }); @@ -47,7 +76,7 @@ export function GameDetailsContent() { useEffect(() => { setBackdropOpacity(1); - }, [objectID]); + }, [objectId]); const onScroll: React.UIEventHandler = (event) => { const heroHeight = heroRef.current?.clientHeight ?? styles.HERO_HEIGHT; @@ -69,10 +98,28 @@ export function GameDetailsContent() { setBackdropOpacity(opacity); }; + const handleCloudSaveButtonClick = () => { + if (!userDetails) { + window.electron.openAuthWindow(); + return; + } + + if (!hasActiveSubscription) { + handleClickOpenCheckout(); + return; + } + + setShowCloudSyncModal(true); + }; + + useEffect(() => { + getGameArtifacts(); + }, [getGameArtifacts]); + return (
{game?.title}
{game?.title} + +
@@ -115,7 +187,7 @@ export function GameDetailsContent() {
diff --git a/src/renderer/src/pages/game-details/game-details-skeleton.tsx b/src/renderer/src/pages/game-details/game-details-skeleton.tsx index 23f0c6f1..24cfe2cb 100644 --- a/src/renderer/src/pages/game-details/game-details-skeleton.tsx +++ b/src/renderer/src/pages/game-details/game-details-skeleton.tsx @@ -43,23 +43,6 @@ export function GameDetailsSkeleton() {
- {/*
-

HowLongToBeat

-
-
    - {Array.from({ length: 3 }).map((_, index) => ( - - ))} -
*/} -
-

{t("requirements")}

-
- )} - + + setShowCloudSyncFilesModal(false)} + visible={showCloudSyncFilesModal} + /> + + )} + + + + {isLoading ? : } + + setShowRepacksModal(false)} + /> + + setHasNSFWContentBlocked(false)} + clickOutsideToClose={false} + /> + + {game && ( + { + setShowGameOptionsModal(false); + }} + /> + )} + + {fromRandomizer && ( + + )} + + ); }} diff --git a/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx b/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx index 323b3c8f..88eb7c63 100644 --- a/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx +++ b/src/renderer/src/pages/game-details/hero/hero-panel-actions.tsx @@ -18,7 +18,7 @@ export function HeroPanelActions() { game, repacks, isGameRunning, - objectID, + objectId, gameTitle, setShowGameOptionsModal, setShowRepacksModal, @@ -39,7 +39,7 @@ export function HeroPanelActions() { setToggleLibraryGameDisabled(true); try { - await window.electron.addGameToLibrary(objectID!, gameTitle, "steam"); + await window.electron.addGameToLibrary(objectId!, gameTitle, "steam"); updateLibrary(); updateGame(); diff --git a/src/renderer/src/pages/game-details/modals/game-options-modal.tsx b/src/renderer/src/pages/game-details/modals/game-options-modal.tsx index d1253318..64346d52 100644 --- a/src/renderer/src/pages/game-details/modals/game-options-modal.tsx +++ b/src/renderer/src/pages/game-details/modals/game-options-modal.tsx @@ -7,6 +7,7 @@ import { gameDetailsContext } from "@renderer/context"; import { DeleteGameModal } from "@renderer/pages/downloads/delete-game-modal"; import { useDownload, useToast } from "@renderer/hooks"; import { RemoveGameFromLibraryModal } from "./remove-from-library-modal"; +import { FileDirectoryIcon, FileIcon } from "@primer/octicons-react"; export interface GameOptionsModalProps { visible: boolean; @@ -94,6 +95,20 @@ export function GameOptionsModal({ await window.electron.openGameExecutablePath(game.id); }; + const handleChangeWinePrefixPath = async () => { + const { filePaths } = await window.electron.showOpenDialog({ + properties: ["openDirectory"], + }); + + if (filePaths && filePaths.length > 0) { + await window.electron.selectGameWinePrefix(game.id, filePaths[0]); + await updateGame(); + } + }; + + const shouldShowWinePrefixConfiguration = + window.electron.platform === "linux"; + return ( <> + {t("select_executable")} } @@ -155,12 +171,41 @@ export function GameOptionsModal({
)} + {shouldShowWinePrefixConfiguration && ( +
+
+

{t("wine_prefix")}

+

+ {t("wine_prefix_description")} +

+
+ + + {t("select_executable")} + + } + /> +
+ )} +

{t("downloads_secion_title")}

{t("downloads_section_description")}

+
)}
+

{t("danger_zone_section_title")}

{t("danger_zone_section_description")}

+
); diff --git a/src/renderer/src/pages/game-details/sidebar-section/sidebar-section.css.ts b/src/renderer/src/pages/game-details/sidebar-section/sidebar-section.css.ts new file mode 100644 index 00000000..cd9fdc8f --- /dev/null +++ b/src/renderer/src/pages/game-details/sidebar-section/sidebar-section.css.ts @@ -0,0 +1,37 @@ +import { recipe } from "@vanilla-extract/recipes"; +import { SPACING_UNIT, vars } from "../../../theme.css"; +import { style } from "@vanilla-extract/css"; + +export const sidebarSectionButton = style({ + height: "72px", + padding: `${SPACING_UNIT * 2}px ${SPACING_UNIT * 2}px`, + display: "flex", + alignItems: "center", + backgroundColor: vars.color.background, + color: vars.color.muted, + width: "100%", + cursor: "pointer", + transition: "all ease 0.2s", + gap: `${SPACING_UNIT}px`, + fontSize: "14px", + fontWeight: "bold", + ":hover": { + backgroundColor: "rgba(255, 255, 255, 0.05)", + }, + ":active": { + opacity: vars.opacity.active, + }, +}); + +export const chevron = recipe({ + base: { + transition: "transform ease 0.2s", + }, + variants: { + open: { + true: { + transform: "rotate(180deg)", + }, + }, + }, +}); diff --git a/src/renderer/src/pages/game-details/sidebar-section/sidebar-section.tsx b/src/renderer/src/pages/game-details/sidebar-section/sidebar-section.tsx new file mode 100644 index 00000000..da9d078f --- /dev/null +++ b/src/renderer/src/pages/game-details/sidebar-section/sidebar-section.tsx @@ -0,0 +1,39 @@ +import { ChevronDownIcon } from "@primer/octicons-react"; +import { useRef, useState } from "react"; + +import * as styles from "./sidebar-section.css"; + +export interface SidebarSectionProps { + title: string; + children: React.ReactNode; +} + +export function SidebarSection({ title, children }: SidebarSectionProps) { + const content = useRef(null); + const [isOpen, setIsOpen] = useState(true); + + return ( +
+ + +
+ {children} +
+
+ ); +} diff --git a/src/renderer/src/pages/game-details/sidebar/how-long-to-beat-section.tsx b/src/renderer/src/pages/game-details/sidebar/how-long-to-beat-section.tsx index ffd148e5..d63879f5 100644 --- a/src/renderer/src/pages/game-details/sidebar/how-long-to-beat-section.tsx +++ b/src/renderer/src/pages/game-details/sidebar/how-long-to-beat-section.tsx @@ -4,6 +4,7 @@ import type { HowLongToBeatCategory } from "@types"; import { vars } from "@renderer/theme.css"; import * as styles from "./sidebar.css"; +import { SidebarSection } from "../sidebar-section/sidebar-section"; const durationTranslation: Record = { Hours: "hours", @@ -30,41 +31,42 @@ export function HowLongToBeatSection({ return ( -
-

HowLongToBeat

-
- -
    - {howLongToBeatData - ? howLongToBeatData.map((category) => ( -
  • -

    +

      + {howLongToBeatData + ? howLongToBeatData.map((category) => ( +
    • - {category.title} -

      +

      + {category.title} +

      -

      - {getDuration(category.duration)} -

      +

      + {getDuration(category.duration)} +

      - {category.accuracy !== "00" && ( - - {t("accuracy", { accuracy: category.accuracy })} - - )} -
    • - )) - : Array.from({ length: 4 }).map((_, index) => ( - - ))} -
    + {category.accuracy !== "00" && ( + + {t("accuracy", { accuracy: category.accuracy })} + + )} +
  • + )) + : Array.from({ length: 4 }).map((_, index) => ( + + ))} +
+
); } diff --git a/src/renderer/src/pages/game-details/sidebar/sidebar.css.ts b/src/renderer/src/pages/game-details/sidebar/sidebar.css.ts index 783e4ffa..aa27cd42 100644 --- a/src/renderer/src/pages/game-details/sidebar/sidebar.css.ts +++ b/src/renderer/src/pages/game-details/sidebar/sidebar.css.ts @@ -1,9 +1,11 @@ import { globalStyle, style } from "@vanilla-extract/css"; import { SPACING_UNIT, vars } from "../../../theme.css"; +import { recipe } from "@vanilla-extract/recipes"; export const contentSidebar = style({ - borderLeft: `solid 1px ${vars.color.border};`, + borderLeft: `solid 1px ${vars.color.border}`, + backgroundColor: vars.color.darkBackground, width: "100%", height: "100%", "@media": { @@ -18,14 +20,6 @@ export const contentSidebar = style({ }, }); -export const contentSidebarTitle = style({ - height: "72px", - padding: `${SPACING_UNIT * 2}px ${SPACING_UNIT * 2}px`, - display: "flex", - alignItems: "center", - backgroundColor: vars.color.background, -}); - export const requirementButtonContainer = style({ width: "100%", display: "flex", @@ -55,7 +49,7 @@ export const requirementsDetailsSkeleton = style({ export const howLongToBeatCategoriesList = style({ margin: "0", - padding: "16px", + padding: `${SPACING_UNIT * 2}px`, display: "flex", flexDirection: "column", gap: "16px", @@ -65,7 +59,8 @@ export const howLongToBeatCategory = style({ display: "flex", flexDirection: "column", gap: "4px", - backgroundColor: vars.color.background, + background: + "linear-gradient(90deg, transparent 20%, rgb(255 255 255 / 2%) 100%)", borderRadius: "4px", padding: `8px 16px`, border: `solid 1px ${vars.color.border}`, @@ -86,6 +81,8 @@ export const statsSection = style({ gap: `${SPACING_UNIT * 2}px`, padding: `${SPACING_UNIT * 2}px`, justifyContent: "space-between", + transition: "max-height ease 0.5s", + overflow: "hidden", "@media": { "(min-width: 1024px)": { flexDirection: "column", @@ -114,3 +111,59 @@ globalStyle(`${requirementsDetails} a`, { display: "flex", color: vars.color.body, }); + +export const list = style({ + listStyle: "none", + margin: "0", + display: "flex", + flexDirection: "column", + gap: `${SPACING_UNIT * 2}px`, + padding: `${SPACING_UNIT * 2}px`, +}); + +export const listItem = style({ + display: "flex", + cursor: "pointer", + transition: "all ease 0.1s", + color: vars.color.muted, + width: "100%", + overflow: "hidden", + borderRadius: "4px", + padding: `${SPACING_UNIT}px ${SPACING_UNIT}px`, + gap: `${SPACING_UNIT * 2}px`, + alignItems: "center", + textAlign: "left", + ":hover": { + backgroundColor: "rgba(255, 255, 255, 0.15)", + textDecoration: "none", + }, +}); + +export const listItemImage = recipe({ + base: { + width: "54px", + height: "54px", + borderRadius: "4px", + objectFit: "cover", + }, + variants: { + unlocked: { + false: { + filter: "grayscale(100%)", + }, + }, + }, +}); + +export const subscriptionRequiredButton = style({ + textDecoration: "none", + display: "flex", + justifyContent: "center", + width: "100%", + gap: `${SPACING_UNIT / 2}px`, + color: vars.color.warning, + cursor: "pointer", + ":hover": { + textDecoration: "underline", + }, +}); diff --git a/src/renderer/src/pages/game-details/sidebar/sidebar.tsx b/src/renderer/src/pages/game-details/sidebar/sidebar.tsx index e56f0764..21a940c6 100644 --- a/src/renderer/src/pages/game-details/sidebar/sidebar.tsx +++ b/src/renderer/src/pages/game-details/sidebar/sidebar.tsx @@ -1,59 +1,234 @@ -import { useContext, useState } from "react"; -import type { HowLongToBeatCategory, SteamAppDetails } from "@types"; +import { useContext, useEffect, useState } from "react"; +import type { + HowLongToBeatCategory, + SteamAppDetails, + UserAchievement, +} from "@types"; import { useTranslation } from "react-i18next"; -import { Button } from "@renderer/components"; +import { Button, Link } from "@renderer/components"; import * as styles from "./sidebar.css"; import { gameDetailsContext } from "@renderer/context"; -import { useFormat } from "@renderer/hooks"; -import { DownloadIcon, PeopleIcon } from "@primer/octicons-react"; +import { useDate, useFormat, useUserDetails } from "@renderer/hooks"; +import { + CloudOfflineIcon, + DownloadIcon, + LockIcon, + PeopleIcon, +} from "@primer/octicons-react"; +import { HowLongToBeatSection } from "./how-long-to-beat-section"; +import { howLongToBeatEntriesTable } from "@renderer/dexie"; +import { SidebarSection } from "../sidebar-section/sidebar-section"; +import { buildGameAchievementPath } from "@renderer/helpers"; +import { SPACING_UNIT } from "@renderer/theme.css"; + +const fakeAchievements: UserAchievement[] = [ + { + displayName: "Timber!!", + name: "", + hidden: false, + description: "Chop down your first tree.", + icon: "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/105600/0fbb33098c9da39d1d4771d8209afface9c46e81.jpg", + icongray: + "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/105600/0fbb33098c9da39d1d4771d8209afface9c46e81.jpg", + unlocked: true, + unlockTime: Date.now(), + }, + { + displayName: "Supreme Helper Minion!", + name: "", + hidden: false, + icon: "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/105600/0a6ff6a36670c96ceb4d30cf6fd69d2fdf55f38e.jpg", + icongray: + "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/105600/0a6ff6a36670c96ceb4d30cf6fd69d2fdf55f38e.jpg", + unlocked: false, + unlockTime: null, + }, + { + displayName: "Feast of Midas", + name: "", + hidden: false, + icon: "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/105600/2d10311274fe7c92ab25cc29afdca86b019ad472.jpg", + icongray: + "https://cdn.akamai.steamstatic.com/steamcommunity/public/images/apps/105600/2d10311274fe7c92ab25cc29afdca86b019ad472.jpg", + unlocked: false, + unlockTime: null, + }, +]; export function Sidebar() { - const [_howLongToBeat, _setHowLongToBeat] = useState<{ + const [howLongToBeat, setHowLongToBeat] = useState<{ isLoading: boolean; data: HowLongToBeatCategory[] | null; }>({ isLoading: true, data: null }); + const { userDetails, hasActiveSubscription } = useUserDetails(); + const [activeRequirement, setActiveRequirement] = useState("minimum"); - const { gameTitle, shopDetails, stats } = useContext(gameDetailsContext); + const { + gameTitle, + shopDetails, + objectId, + shop, + stats, + achievements, + handleClickOpenCheckout, + } = useContext(gameDetailsContext); const { t } = useTranslation("game_details"); + const { formatDateTime } = useDate(); const { numberFormatter } = useFormat(); - // useEffect(() => { - // if (objectID) { - // setHowLongToBeat({ isLoading: true, data: null }); + useEffect(() => { + if (objectId) { + setHowLongToBeat({ isLoading: true, data: null }); - // window.electron - // .getHowLongToBeat(objectID, "steam", gameTitle) - // .then((howLongToBeat) => { - // setHowLongToBeat({ isLoading: false, data: howLongToBeat }); - // }) - // .catch(() => { - // setHowLongToBeat({ isLoading: false, data: null }); - // }); - // } - // }, [objectID, gameTitle]); + howLongToBeatEntriesTable + .where({ shop, objectId }) + .first() + .then(async (cachedHowLongToBeat) => { + if (cachedHowLongToBeat) { + setHowLongToBeat({ + isLoading: false, + data: cachedHowLongToBeat.categories, + }); + } else { + try { + const howLongToBeat = + await window.electron.getHowLongToBeat(gameTitle); + + if (howLongToBeat) { + howLongToBeatEntriesTable.add({ + objectId, + shop: "steam", + createdAt: new Date(), + updatedAt: new Date(), + categories: howLongToBeat, + }); + } + + setHowLongToBeat({ isLoading: false, data: howLongToBeat }); + } catch (err) { + setHowLongToBeat({ isLoading: false, data: null }); + } + } + }); + } + }, [objectId, shop, gameTitle]); return ( ); } diff --git a/src/renderer/src/pages/home/home.tsx b/src/renderer/src/pages/home/home.tsx index dccb98a3..61417b1f 100644 --- a/src/renderer/src/pages/home/home.tsx +++ b/src/renderer/src/pages/home/home.tsx @@ -16,7 +16,7 @@ import Lottie, { type LottieRefCurrentProps } from "lottie-react"; import { buildGameDetailsPath } from "@renderer/helpers"; import { CatalogueCategory } from "@shared"; -export function Home() { +export default function Home() { const { t } = useTranslation("home"); const navigate = useNavigate(); @@ -34,6 +34,7 @@ export function Home() { >({ [CatalogueCategory.Hot]: [], [CatalogueCategory.Weekly]: [], + [CatalogueCategory.Achievements]: [], }); const getCatalogue = useCallback((category: CatalogueCategory) => { @@ -186,7 +187,7 @@ export function Home() { )) : catalogue[currentCatalogueCategory].map((result) => ( navigate(buildGameDetailsPath(result))} /> diff --git a/src/renderer/src/pages/home/search-results.tsx b/src/renderer/src/pages/home/search-results.tsx index 7ab830f0..d86a362a 100644 --- a/src/renderer/src/pages/home/search-results.tsx +++ b/src/renderer/src/pages/home/search-results.tsx @@ -17,7 +17,7 @@ import { buildGameDetailsPath } from "@renderer/helpers"; import { vars } from "@renderer/theme.css"; -export function SearchResults() { +export default function SearchResults() { const dispatch = useAppDispatch(); const { t } = useTranslation("home"); @@ -115,7 +115,7 @@ export function SearchResults() { <> {searchResults.map((game) => ( handleGameClick(game)} /> diff --git a/src/renderer/src/pages/index.ts b/src/renderer/src/pages/index.ts deleted file mode 100644 index 5dc22c2d..00000000 --- a/src/renderer/src/pages/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./home/home"; -export * from "./game-details/game-details"; -export * from "./downloads/downloads"; -export * from "./home/search-results"; -export * from "./settings/settings"; -export * from "./catalogue/catalogue"; -export * from "./profile/profile"; diff --git a/src/renderer/src/pages/profile/edit-profile-modal/edit-profile-modal.css.ts b/src/renderer/src/pages/profile/edit-profile-modal/edit-profile-modal.css.ts index bd873a8a..8dd1df51 100644 --- a/src/renderer/src/pages/profile/edit-profile-modal/edit-profile-modal.css.ts +++ b/src/renderer/src/pages/profile/edit-profile-modal/edit-profile-modal.css.ts @@ -3,28 +3,18 @@ import { globalStyle, style } from "@vanilla-extract/css"; export const profileAvatarEditContainer = style({ alignSelf: "center", - width: "128px", - height: "128px", + // width: "132px", + // height: "132px", display: "flex", - borderRadius: "4px", + // borderRadius: "4px", color: vars.color.body, justifyContent: "center", alignItems: "center", backgroundColor: vars.color.background, position: "relative", - border: `solid 1px ${vars.color.border}`, - boxShadow: "0px 0px 5px 0px rgba(0, 0, 0, 0.7)", cursor: "pointer", }); -export const profileAvatar = style({ - height: "100%", - width: "100%", - objectFit: "cover", - borderRadius: "4px", - overflow: "hidden", -}); - export const profileAvatarEditOverlay = style({ position: "absolute", width: "100%", @@ -37,6 +27,7 @@ export const profileAvatarEditOverlay = style({ justifyContent: "center", transition: "all ease 0.2s", alignItems: "center", + borderRadius: "4px", opacity: "0", }); diff --git a/src/renderer/src/pages/profile/edit-profile-modal/edit-profile-modal.tsx b/src/renderer/src/pages/profile/edit-profile-modal/edit-profile-modal.tsx index cd43641a..cc3ed69f 100644 --- a/src/renderer/src/pages/profile/edit-profile-modal/edit-profile-modal.tsx +++ b/src/renderer/src/pages/profile/edit-profile-modal/edit-profile-modal.tsx @@ -2,15 +2,16 @@ import { useContext, useEffect } from "react"; import { Controller, useForm } from "react-hook-form"; import { Trans, useTranslation } from "react-i18next"; -import { DeviceCameraIcon, PersonIcon } from "@primer/octicons-react"; +import { DeviceCameraIcon } from "@primer/octicons-react"; import { + Avatar, Button, Link, Modal, ModalProps, TextField, } from "@renderer/components"; -import { useAppSelector, useToast, useUserDetails } from "@renderer/hooks"; +import { useToast, useUserDetails } from "@renderer/hooks"; import { SPACING_UNIT } from "@renderer/theme.css"; import { yupResolver } from "@hookform/resolvers/yup"; @@ -50,8 +51,8 @@ export function EditProfileModal( const { getUserProfile } = useContext(userProfileContext); - const { userDetails } = useAppSelector((state) => state.userDetails); - const { fetchUserDetails } = useUserDetails(); + const { userDetails, fetchUserDetails, hasActiveSubscription } = + useUserDetails(); useEffect(() => { if (userDetails) { @@ -111,14 +112,18 @@ export function EditProfileModal( if (filePaths && filePaths.length > 0) { const path = filePaths[0]; - const { imagePath } = await window.electron - .processProfileImage(path) - .catch(() => { - showErrorToast(t("image_process_failure")); - return { imagePath: null }; - }); + if (!hasActiveSubscription) { + const { imagePath } = await window.electron + .processProfileImage(path) + .catch(() => { + showErrorToast(t("image_process_failure")); + return { imagePath: null }; + }); - onChange(imagePath); + onChange(imagePath); + } else { + onChange(path); + } } }; @@ -138,15 +143,11 @@ export function EditProfileModal( className={styles.profileAvatarEditContainer} onClick={handleChangeProfileAvatar} > - {imageUrl ? ( - {userDetails?.displayName} - ) : ( - - )} +
diff --git a/src/renderer/src/pages/profile/profile-content/friends-box.tsx b/src/renderer/src/pages/profile/profile-content/friends-box.tsx index 151f9c80..82d4ff9d 100644 --- a/src/renderer/src/pages/profile/profile-content/friends-box.tsx +++ b/src/renderer/src/pages/profile/profile-content/friends-box.tsx @@ -4,8 +4,7 @@ import { useContext } from "react"; import { useTranslation } from "react-i18next"; import * as styles from "./profile-content.css"; -import { Link } from "@renderer/components"; -import { PersonIcon } from "@primer/octicons-react"; +import { Avatar, Link } from "@renderer/components"; export function FriendsBox() { const { userProfile, userStats } = useContext(userProfileContext); @@ -30,17 +29,11 @@ export function FriendsBox() { {userProfile?.friends.map((friend) => (
  • - {friend.profileImageUrl ? ( - {friend.displayName} - ) : ( -
    - -
    - )} + {friend.displayName} diff --git a/src/renderer/src/pages/profile/profile-content/profile-content.css.ts b/src/renderer/src/pages/profile/profile-content/profile-content.css.ts index 6e9c4679..00fe97e3 100644 --- a/src/renderer/src/pages/profile/profile-content/profile-content.css.ts +++ b/src/renderer/src/pages/profile/profile-content/profile-content.css.ts @@ -6,6 +6,7 @@ export const gameCover = style({ transition: "all ease 0.2s", boxShadow: "0 8px 10px -2px rgba(0, 0, 0, 0.5)", width: "100%", + position: "relative", ":before": { content: "", top: "0", @@ -14,7 +15,7 @@ export const gameCover = style({ height: "172%", position: "absolute", background: - "linear-gradient(35deg, rgba(0, 0, 0, 0.1) 0%, rgba(0, 0, 0, 0.07) 51.5%, rgba(255, 255, 255, 0.15) 54%, rgba(255, 255, 255, 0.15) 100%);", + "linear-gradient(35deg, rgba(0, 0, 0, 0.1) 0%, rgba(0, 0, 0, 0.07) 51.5%, rgba(255, 255, 255, 0.15) 54%, rgba(255, 255, 255, 0.15) 100%)", transition: "all ease 0.3s", transform: "translateY(-36%)", opacity: "0.5", @@ -188,3 +189,17 @@ export const defaultAvatarWrapper = style({ border: `solid 1px ${vars.color.border}`, borderRadius: "4px", }); + +export const achievementsProgressBar = style({ + width: "100%", + height: "4px", + transition: "all ease 0.2s", + "::-webkit-progress-bar": { + backgroundColor: "rgba(255, 255, 255, 0.15)", + borderRadius: "4px", + }, + "::-webkit-progress-value": { + backgroundColor: vars.color.muted, + borderRadius: "4px", + }, +}); diff --git a/src/renderer/src/pages/profile/profile-content/profile-content.tsx b/src/renderer/src/pages/profile/profile-content/profile-content.tsx index a885bddf..d6b55490 100644 --- a/src/renderer/src/pages/profile/profile-content/profile-content.tsx +++ b/src/renderer/src/pages/profile/profile-content/profile-content.tsx @@ -1,21 +1,26 @@ import { userProfileContext } from "@renderer/context"; -import { useContext, useEffect, useMemo } from "react"; +import { useCallback, useContext, useEffect, useMemo } from "react"; import { ProfileHero } from "../profile-hero/profile-hero"; import { useAppDispatch, useFormat } from "@renderer/hooks"; import { setHeaderTitle } from "@renderer/features"; import { steamUrlBuilder } from "@shared"; -import { SPACING_UNIT } from "@renderer/theme.css"; +import { SPACING_UNIT, vars } from "@renderer/theme.css"; import * as styles from "./profile-content.css"; -import { TelescopeIcon } from "@primer/octicons-react"; +import { ClockIcon, TelescopeIcon, TrophyIcon } from "@primer/octicons-react"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; import { LockedProfile } from "./locked-profile"; import { ReportProfile } from "../report-profile/report-profile"; import { FriendsBox } from "./friends-box"; import { RecentGamesBox } from "./recent-games-box"; -import { UserGame } from "@types"; -import { buildGameDetailsPath } from "@renderer/helpers"; +import type { UserGame } from "@types"; +import { + buildGameAchievementPath, + buildGameDetailsPath, + formatDownloadProgress, +} from "@renderer/helpers"; +import { MAX_MINUTES_TO_SHOW_IN_PLAYTIME } from "@renderer/constants"; export function ProfileContent() { const { userProfile, isMe, userStats } = useContext(userProfileContext); @@ -40,11 +45,38 @@ export function ProfileContent() { return userProfile?.relation?.status === "ACCEPTED"; }, [userProfile]); - const buildUserGameDetailsPath = (game: UserGame) => - buildGameDetailsPath({ - ...game, - objectID: game.objectId, - }); + const buildUserGameDetailsPath = (game: UserGame) => { + if (!userProfile?.hasActiveSubscription || game.achievementCount === 0) { + return buildGameDetailsPath({ + ...game, + objectId: game.objectId, + }); + } + + const userParams = userProfile + ? { + userId: userProfile.id, + } + : undefined; + + return buildGameAchievementPath({ ...game }, userParams); + }; + + const formatPlayTime = useCallback( + (playTimeInSeconds = 0) => { + const minutes = playTimeInSeconds / 60; + + if (minutes < MAX_MINUTES_TO_SHOW_IN_PLAYTIME) { + return t("amount_minutes", { + amount: minutes.toFixed(0), + }); + } + + const hours = minutes / 60; + return t("amount_hours", { amount: numberFormatter.format(hours) }); + }, + [numberFormatter, t] + ); const content = useMemo(() => { if (!userProfile) return null; @@ -98,6 +130,7 @@ export function ProfileContent() { borderRadius: 4, overflow: "hidden", position: "relative", + display: "flex", }} className={styles.game} > @@ -109,13 +142,96 @@ export function ProfileContent() { className={styles.gameCover} onClick={() => navigate(buildUserGameDetailsPath(game))} > +
    + + + {formatPlayTime(game.playTimeInSeconds)} + + + {userProfile.hasActiveSubscription && + game.achievementCount > 0 && ( +
    +
    +
    + + + {game.unlockedAchievementCount} /{" "} + {game.achievementCount} + +
    + + + {formatDownloadProgress( + game.unlockedAchievementCount / + game.achievementCount + )} + +
    + + +
    + )} +
    + {game.title} @@ -143,6 +259,7 @@ export function ProfileContent() { userStats, numberFormatter, t, + formatPlayTime, navigate, ]); diff --git a/src/renderer/src/pages/profile/profile-content/recent-games-box.tsx b/src/renderer/src/pages/profile/profile-content/recent-games-box.tsx index f6d3bc0d..f2e0249b 100644 --- a/src/renderer/src/pages/profile/profile-content/recent-games-box.tsx +++ b/src/renderer/src/pages/profile/profile-content/recent-games-box.tsx @@ -37,7 +37,7 @@ export function RecentGamesBox() { const buildUserGameDetailsPath = (game: UserGame) => buildGameDetailsPath({ ...game, - objectID: game.objectId, + objectId: game.objectId, }); if (!userProfile?.recentGames.length) return null; diff --git a/src/renderer/src/pages/profile/profile-hero/profile-hero.css.ts b/src/renderer/src/pages/profile/profile-hero/profile-hero.css.ts index 5ef6cc75..2080e445 100644 --- a/src/renderer/src/pages/profile/profile-hero/profile-hero.css.ts +++ b/src/renderer/src/pages/profile/profile-hero/profile-hero.css.ts @@ -4,6 +4,7 @@ import { style } from "@vanilla-extract/css"; export const profileContentBox = style({ display: "flex", flexDirection: "column", + position: "relative", }); export const profileAvatarButton = style({ @@ -15,12 +16,12 @@ export const profileAvatarButton = style({ justifyContent: "center", alignItems: "center", backgroundColor: vars.color.background, - overflow: "hidden", border: `solid 1px ${vars.color.border}`, boxShadow: "0px 0px 5px 0px rgba(0, 0, 0, 0.7)", cursor: "pointer", transition: "all ease 0.3s", color: vars.color.muted, + position: "relative", ":hover": { boxShadow: "0px 0px 10px 0px rgba(0, 0, 0, 0.7)", }, @@ -51,6 +52,7 @@ export const profileDisplayName = style({ display: "flex", alignItems: "center", position: "relative", + textShadow: "0 0 5px rgb(0 0 0 / 40%)", }); export const heroPanel = style({ @@ -61,7 +63,7 @@ export const heroPanel = style({ display: "flex", gap: `${SPACING_UNIT}px`, justifyContent: "space-between", - backdropFilter: `blur(10px)`, + backdropFilter: `blur(15px)`, borderTop: `solid 1px rgba(255, 255, 255, 0.1)`, boxShadow: "0px 0px 15px 0px rgba(0, 0, 0, 0.5)", backgroundColor: "rgba(0, 0, 0, 0.3)", @@ -69,7 +71,7 @@ export const heroPanel = style({ export const userInformation = style({ display: "flex", - padding: `${SPACING_UNIT * 4}px ${SPACING_UNIT * 3}px`, + padding: `${SPACING_UNIT * 7}px ${SPACING_UNIT * 3}px`, alignItems: "center", gap: `${SPACING_UNIT * 2}px`, }); diff --git a/src/renderer/src/pages/profile/profile-hero/profile-hero.tsx b/src/renderer/src/pages/profile/profile-hero/profile-hero.tsx index 9234f487..eac1b339 100644 --- a/src/renderer/src/pages/profile/profile-hero/profile-hero.tsx +++ b/src/renderer/src/pages/profile/profile-hero/profile-hero.tsx @@ -1,4 +1,4 @@ -import { SPACING_UNIT } from "@renderer/theme.css"; +import { SPACING_UNIT, vars } from "@renderer/theme.css"; import * as styles from "./profile-hero.css"; import { useCallback, useContext, useMemo, useState } from "react"; @@ -8,12 +8,11 @@ import { CheckCircleFillIcon, PencilIcon, PersonAddIcon, - PersonIcon, SignOutIcon, XCircleFillIcon, } from "@primer/octicons-react"; import { buildGameDetailsPath } from "@renderer/helpers"; -import { Button, Link } from "@renderer/components"; +import { Avatar, Button, Link } from "@renderer/components"; import { useTranslation } from "react-i18next"; import { useAppSelector, @@ -27,16 +26,20 @@ import { useNavigate } from "react-router-dom"; import type { FriendRequestAction } from "@types"; import { EditProfileModal } from "../edit-profile-modal/edit-profile-modal"; import Skeleton from "react-loading-skeleton"; +import { UploadBackgroundImageButton } from "../upload-background-image-button/upload-background-image-button"; type FriendAction = | FriendRequestAction | ("BLOCK" | "UNDO_FRIENDSHIP" | "SEND"); +const backgroundImageLayer = + "linear-gradient(135deg, rgb(0 0 0 / 40%), rgb(0 0 0 / 30%))"; + export function ProfileHero() { const [showEditProfileModal, setShowEditProfileModal] = useState(false); const [isPerformingAction, setIsPerformingAction] = useState(false); - const { isMe, heroBackground, getUserProfile, userProfile } = + const { isMe, getUserProfile, userProfile, heroBackground, backgroundImage } = useContext(userProfileContext); const { signOut, @@ -124,6 +127,7 @@ export function ProfileHero() { theme="outline" onClick={() => setShowEditProfileModal(true)} disabled={isPerformingAction} + style={{ borderColor: vars.color.body }} > {t("edit_profile")} @@ -148,6 +152,7 @@ export function ProfileHero() { theme="outline" onClick={() => handleFriendAction(userProfile.id, "SEND")} disabled={isPerformingAction} + style={{ borderColor: vars.color.body }} > {t("add_friend")} @@ -182,6 +187,7 @@ export function ProfileHero() { handleFriendAction(userProfile.id, "UNDO_FRIENDSHIP") } disabled={isPerformingAction} + style={{ borderColor: vars.color.body }} > {t("undo_friendship")} @@ -198,6 +204,7 @@ export function ProfileHero() { handleFriendAction(userProfile.relation!.BId, "CANCEL") } disabled={isPerformingAction} + style={{ borderColor: vars.color.body }} > {t("cancel_request")} @@ -212,11 +219,12 @@ export function ProfileHero() { handleFriendAction(userProfile.relation!.AId, "ACCEPTED") } disabled={isPerformingAction} + style={{ borderColor: vars.color.body }} > {t("accept_request")} + -
    - {userProfile ? ( -

    - {userProfile?.displayName} -

    - ) : ( - - )} +
    + {userProfile ? ( +

    + {userProfile?.displayName} +

    + ) : ( + + )} - {currentGame && ( -
    -
    - - {currentGame.title} - -
    + {currentGame && ( +
    +
    + + {currentGame.title} + +
    - - {t("playing_for", { - amount: formatDistance( - addSeconds( - new Date(), - -currentGame.sessionDurationInSeconds + + {t("playing_for", { + amount: formatDistance( + addSeconds( + new Date(), + -currentGame.sessionDurationInSeconds + ), + new Date() ), - new Date() - ), - })} - -
    - )} + })} + +
    + )} +
    + +
  • -
    +
    { + try { + const { filePaths } = await window.electron.showOpenDialog({ + properties: ["openFile"], + filters: [ + { + name: "Image", + extensions: ["jpg", "jpeg", "png", "gif", "webp"], + }, + ], + }); + + if (filePaths && filePaths.length > 0) { + const path = filePaths[0]; + + setSelectedBackgroundImage(path); + setIsUploadingBackgorundImage(true); + + await patchUser({ backgroundImageUrl: path }); + + showSuccessToast("Background image updated"); + await fetchUserDetails(); + } + } finally { + setIsUploadingBackgorundImage(false); + } + }; + + if (!isMe || !userDetails?.subscription) return null; + if (userDetails.subscription.plan.name !== "plus") return null; + + return ( + + ); +} diff --git a/src/renderer/src/pages/settings/add-download-source-modal.tsx b/src/renderer/src/pages/settings/add-download-source-modal.tsx index 5ec22827..5b05d5b8 100644 --- a/src/renderer/src/pages/settings/add-download-source-modal.tsx +++ b/src/renderer/src/pages/settings/add-download-source-modal.tsx @@ -9,7 +9,7 @@ import { useForm } from "react-hook-form"; import * as yup from "yup"; import { yupResolver } from "@hookform/resolvers/yup"; import { downloadSourcesTable } from "@renderer/dexie"; -import { DownloadSourceValidationResult } from "@types"; +import type { DownloadSourceValidationResult } from "@types"; import { downloadSourcesWorker } from "@renderer/workers"; interface AddDownloadSourceModalProps { diff --git a/src/renderer/src/pages/settings/settings-general.tsx b/src/renderer/src/pages/settings/settings-general.tsx index a363f55d..6737c4b7 100644 --- a/src/renderer/src/pages/settings/settings-general.tsx +++ b/src/renderer/src/pages/settings/settings-general.tsx @@ -30,6 +30,7 @@ export function SettingsGeneral() { downloadsPath: "", downloadNotificationsEnabled: false, repackUpdatesNotificationsEnabled: false, + achievementNotificationsEnabled: false, language: "", }); @@ -103,6 +104,8 @@ export function SettingsGeneral() { userPreferences.downloadNotificationsEnabled, repackUpdatesNotificationsEnabled: userPreferences.repackUpdatesNotificationsEnabled, + achievementNotificationsEnabled: + userPreferences.achievementNotificationsEnabled, language: language ?? "en", })); } @@ -155,6 +158,17 @@ export function SettingsGeneral() { }) } /> + + + handleChange({ + achievementNotificationsEnabled: + !form.achievementNotificationsEnabled, + }) + } + /> ); } diff --git a/src/renderer/src/pages/settings/settings.tsx b/src/renderer/src/pages/settings/settings.tsx index be7e9597..dffdfbae 100644 --- a/src/renderer/src/pages/settings/settings.tsx +++ b/src/renderer/src/pages/settings/settings.tsx @@ -15,7 +15,7 @@ import { SettingsPrivacy } from "./settings-privacy"; import { useUserDetails } from "@renderer/hooks"; import { useMemo } from "react"; -export function Settings() { +export default function Settings() { const { t } = useTranslation("settings"); const { userDetails } = useUserDetails(); diff --git a/src/renderer/src/pages/shared-modals/subscription-tour-modal.tsx b/src/renderer/src/pages/shared-modals/subscription-tour-modal.tsx new file mode 100644 index 00000000..49e5d13e --- /dev/null +++ b/src/renderer/src/pages/shared-modals/subscription-tour-modal.tsx @@ -0,0 +1,104 @@ +import { useTranslation } from "react-i18next"; +import { Button, Modal } from "../../components"; +import { SPACING_UNIT } from "../../theme.css"; + +export interface UserFriendsModalProps { + visible: boolean; + onClose: () => void; +} + +export const SubscriptionTourModal = ({ + visible, + onClose, +}: UserFriendsModalProps) => { + const { t } = useTranslation("tour"); + + const handleSubscribeClick = () => { + window.electron.openCheckout().finally(onClose); + }; + + return ( + +
    +
    +
    +

    Hydra Cloud

    +
      +
    • + {t("cloud_saving", { gameCount: 15 })} +
    • +
    • + {t("cloud_achievements")} +
    • +
    • + {t("show_and_compare_achievements")} +
    • +
    • + {t("animated_profile_picture")} +
    • +
    • + {t("premium_support")} +
    • +
    +
    + +
    +

    Hydra Cloud+

    +
      +
    • + {t("cloud_saving", { gameCount: 30 })} +
    • +
    • + {t("cloud_achievements")} +
    • +
    • + {t("show_and_compare_achievements")} +
    • +
    • + {t("animated_profile_banner")} +
    • +
    • + {t("animated_profile_picture")} +
    • +
    • + {t("premium_support")} +
    • +
    +
    +
    + +
    +
    + ); +}; diff --git a/src/renderer/src/pages/shared-modals/user-friend-modal/user-friend-item.tsx b/src/renderer/src/pages/shared-modals/user-friend-modal/user-friend-item.tsx index 3ca837fa..38f0dd25 100644 --- a/src/renderer/src/pages/shared-modals/user-friend-modal/user-friend-item.tsx +++ b/src/renderer/src/pages/shared-modals/user-friend-modal/user-friend-item.tsx @@ -1,11 +1,8 @@ -import { - CheckCircleIcon, - PersonIcon, - XCircleIcon, -} from "@primer/octicons-react"; +import { CheckCircleIcon, XCircleIcon } from "@primer/octicons-react"; import * as styles from "./user-friend-modal.css"; import { SPACING_UNIT } from "@renderer/theme.css"; import { useTranslation } from "react-i18next"; +import { Avatar } from "@renderer/components"; export type UserFriendItemProps = { userId: string; @@ -109,17 +106,8 @@ export const UserFriendItem = (props: UserFriendItemProps) => { return (
    -
    - {profileImageUrl ? ( - {displayName} - ) : ( - - )} -
    + +
    { className={styles.friendListButton} onClick={() => props.onClickItem(userId)} > -
    - {profileImageUrl ? ( - {displayName} - ) : ( - - )} -
    +
    { uris: string; } +const state = { + repacks: [] as SerializedGameRepack[], + index: null as flexSearch.Index | null, +}; + self.onmessage = async ( event: MessageEvent<[string, string] | "INDEX_REPACKS"> ) => { if (event.data === "INDEX_REPACKS") { + state.index = new flexSearch.Index(); + repacksTable .toCollection() .sortBy("uploadDate") @@ -26,7 +27,7 @@ self.onmessage = async ( for (let i = 0; i < state.repacks.length; i++) { const repack = state.repacks[i]; const formattedTitle = formatName(repack.title); - index.add(i, formattedTitle); + state.index!.add(i, formattedTitle); } self.postMessage("INDEXING_COMPLETE"); @@ -34,7 +35,7 @@ self.onmessage = async ( } else { const [requestId, query] = event.data; - const results = index.search(formatName(query)).map((index) => { + const results = state.index!.search(formatName(query)).map((index) => { const repack = state.repacks.at(index as number) as SerializedGameRepack; return { diff --git a/src/shared/char-map.ts b/src/shared/char-map.ts new file mode 100644 index 00000000..7f29509e --- /dev/null +++ b/src/shared/char-map.ts @@ -0,0 +1,461 @@ +export const charMap = { + À: "A", + Á: "A", + Â: "A", + Ã: "A", + Ä: "A", + Å: "A", + Ấ: "A", + Ắ: "A", + Ẳ: "A", + Ẵ: "A", + Ặ: "A", + Æ: "AE", + Ầ: "A", + Ằ: "A", + Ȃ: "A", + Ả: "A", + Ạ: "A", + Ẩ: "A", + Ẫ: "A", + Ậ: "A", + Ç: "C", + Ḉ: "C", + È: "E", + É: "E", + Ê: "E", + Ë: "E", + Ế: "E", + Ḗ: "E", + Ề: "E", + Ḕ: "E", + Ḝ: "E", + Ȇ: "E", + Ẻ: "E", + Ẽ: "E", + Ẹ: "E", + Ể: "E", + Ễ: "E", + Ệ: "E", + Ì: "I", + Í: "I", + Î: "I", + Ï: "I", + Ḯ: "I", + Ȋ: "I", + Ỉ: "I", + Ị: "I", + Ð: "D", + Ñ: "N", + Ò: "O", + Ó: "O", + Ô: "O", + Õ: "O", + Ö: "O", + Ø: "O", + Ố: "O", + Ṍ: "O", + Ṓ: "O", + Ȏ: "O", + Ỏ: "O", + Ọ: "O", + Ổ: "O", + Ỗ: "O", + Ộ: "O", + Ờ: "O", + Ở: "O", + Ỡ: "O", + Ớ: "O", + Ợ: "O", + Ù: "U", + Ú: "U", + Û: "U", + Ü: "U", + Ủ: "U", + Ụ: "U", + Ử: "U", + Ữ: "U", + Ự: "U", + Ý: "Y", + à: "a", + á: "a", + â: "a", + ã: "a", + ä: "a", + å: "a", + ấ: "a", + ắ: "a", + ẳ: "a", + ẵ: "a", + ặ: "a", + æ: "ae", + ầ: "a", + ằ: "a", + ȃ: "a", + ả: "a", + ạ: "a", + ẩ: "a", + ẫ: "a", + ậ: "a", + ç: "c", + ḉ: "c", + è: "e", + é: "e", + ê: "e", + ë: "e", + ế: "e", + ḗ: "e", + ề: "e", + ḕ: "e", + ḝ: "e", + ȇ: "e", + ẻ: "e", + ẽ: "e", + ẹ: "e", + ể: "e", + ễ: "e", + ệ: "e", + ì: "i", + í: "i", + î: "i", + ï: "i", + ḯ: "i", + ȋ: "i", + ỉ: "i", + ị: "i", + ð: "d", + ñ: "n", + ò: "o", + ó: "o", + ô: "o", + õ: "o", + ö: "o", + ø: "o", + ố: "o", + ṍ: "o", + ṓ: "o", + ȏ: "o", + ỏ: "o", + ọ: "o", + ổ: "o", + ỗ: "o", + ộ: "o", + ờ: "o", + ở: "o", + ỡ: "o", + ớ: "o", + ợ: "o", + ù: "u", + ú: "u", + û: "u", + ü: "u", + ủ: "u", + ụ: "u", + ử: "u", + ữ: "u", + ự: "u", + ý: "y", + ÿ: "y", + Ā: "A", + ā: "a", + Ă: "A", + ă: "a", + Ą: "A", + ą: "a", + Ć: "C", + ć: "c", + Ĉ: "C", + ĉ: "c", + Ċ: "C", + ċ: "c", + Č: "C", + č: "c", + C̆: "C", + c̆: "c", + Ď: "D", + ď: "d", + Đ: "D", + đ: "d", + Ē: "E", + ē: "e", + Ĕ: "E", + ĕ: "e", + Ė: "E", + ė: "e", + Ę: "E", + ę: "e", + Ě: "E", + ě: "e", + Ĝ: "G", + Ǵ: "G", + ĝ: "g", + ǵ: "g", + Ğ: "G", + ğ: "g", + Ġ: "G", + ġ: "g", + Ģ: "G", + ģ: "g", + Ĥ: "H", + ĥ: "h", + Ħ: "H", + ħ: "h", + Ḫ: "H", + ḫ: "h", + Ĩ: "I", + ĩ: "i", + Ī: "I", + ī: "i", + Ĭ: "I", + ĭ: "i", + Į: "I", + į: "i", + İ: "I", + ı: "i", + IJ: "IJ", + ij: "ij", + Ĵ: "J", + ĵ: "j", + Ķ: "K", + ķ: "k", + Ḱ: "K", + ḱ: "k", + K̆: "K", + k̆: "k", + Ĺ: "L", + ĺ: "l", + Ļ: "L", + ļ: "l", + Ľ: "L", + ľ: "l", + Ŀ: "L", + ŀ: "l", + Ł: "l", + ł: "l", + Ḿ: "M", + ḿ: "m", + M̆: "M", + m̆: "m", + Ń: "N", + ń: "n", + Ņ: "N", + ņ: "n", + Ň: "N", + ň: "n", + ʼn: "n", + N̆: "N", + n̆: "n", + Ō: "O", + ō: "o", + Ŏ: "O", + ŏ: "o", + Ő: "O", + ő: "o", + Œ: "OE", + œ: "oe", + P̆: "P", + p̆: "p", + Ŕ: "R", + ŕ: "r", + Ŗ: "R", + ŗ: "r", + Ř: "R", + ř: "r", + R̆: "R", + r̆: "r", + Ȓ: "R", + ȓ: "r", + Ś: "S", + ś: "s", + Ŝ: "S", + ŝ: "s", + Ş: "S", + Ș: "S", + ș: "s", + ş: "s", + Š: "S", + š: "s", + Ţ: "T", + ţ: "t", + ț: "t", + Ț: "T", + Ť: "T", + ť: "t", + Ŧ: "T", + ŧ: "t", + T̆: "T", + t̆: "t", + Ũ: "U", + ũ: "u", + Ū: "U", + ū: "u", + Ŭ: "U", + ŭ: "u", + Ů: "U", + ů: "u", + Ű: "U", + ű: "u", + Ų: "U", + ų: "u", + Ȗ: "U", + ȗ: "u", + V̆: "V", + v̆: "v", + Ŵ: "W", + ŵ: "w", + Ẃ: "W", + ẃ: "w", + X̆: "X", + x̆: "x", + Ŷ: "Y", + ŷ: "y", + Ÿ: "Y", + Y̆: "Y", + y̆: "y", + Ź: "Z", + ź: "z", + Ż: "Z", + ż: "z", + Ž: "Z", + ž: "z", + ſ: "s", + ƒ: "f", + Ơ: "O", + ơ: "o", + Ư: "U", + ư: "u", + Ǎ: "A", + ǎ: "a", + Ǐ: "I", + ǐ: "i", + Ǒ: "O", + ǒ: "o", + Ǔ: "U", + ǔ: "u", + Ǖ: "U", + ǖ: "u", + Ǘ: "U", + ǘ: "u", + Ǚ: "U", + ǚ: "u", + Ǜ: "U", + ǜ: "u", + Ứ: "U", + ứ: "u", + Ṹ: "U", + ṹ: "u", + Ǻ: "A", + ǻ: "a", + Ǽ: "AE", + ǽ: "ae", + Ǿ: "O", + ǿ: "o", + Þ: "TH", + þ: "th", + Ṕ: "P", + ṕ: "p", + Ṥ: "S", + ṥ: "s", + X́: "X", + x́: "x", + Ѓ: "Г", + ѓ: "г", + Ќ: "К", + ќ: "к", + A̋: "A", + a̋: "a", + E̋: "E", + e̋: "e", + I̋: "I", + i̋: "i", + Ǹ: "N", + ǹ: "n", + Ồ: "O", + ồ: "o", + Ṑ: "O", + ṑ: "o", + Ừ: "U", + ừ: "u", + Ẁ: "W", + ẁ: "w", + Ỳ: "Y", + ỳ: "y", + Ȁ: "A", + ȁ: "a", + Ȅ: "E", + ȅ: "e", + Ȉ: "I", + ȉ: "i", + Ȍ: "O", + ȍ: "o", + Ȑ: "R", + ȑ: "r", + Ȕ: "U", + ȕ: "u", + B̌: "B", + b̌: "b", + Č̣: "C", + č̣: "c", + Ê̌: "E", + ê̌: "e", + F̌: "F", + f̌: "f", + Ǧ: "G", + ǧ: "g", + Ȟ: "H", + ȟ: "h", + J̌: "J", + ǰ: "j", + Ǩ: "K", + ǩ: "k", + M̌: "M", + m̌: "m", + P̌: "P", + p̌: "p", + Q̌: "Q", + q̌: "q", + Ř̩: "R", + ř̩: "r", + Ṧ: "S", + ṧ: "s", + V̌: "V", + v̌: "v", + W̌: "W", + w̌: "w", + X̌: "X", + x̌: "x", + Y̌: "Y", + y̌: "y", + A̧: "A", + a̧: "a", + B̧: "B", + b̧: "b", + Ḑ: "D", + ḑ: "d", + Ȩ: "E", + ȩ: "e", + Ɛ̧: "E", + ɛ̧: "e", + Ḩ: "H", + ḩ: "h", + I̧: "I", + i̧: "i", + Ɨ̧: "I", + ɨ̧: "i", + M̧: "M", + m̧: "m", + O̧: "O", + o̧: "o", + Q̧: "Q", + q̧: "q", + U̧: "U", + u̧: "u", + X̧: "X", + x̧: "x", + Z̧: "Z", + z̧: "z", + й: "и", + Й: "И", + ё: "е", + Ё: "Е", +}; diff --git a/src/shared/constants.ts b/src/shared/constants.ts index 896d2ede..f0f6d2f0 100644 --- a/src/shared/constants.ts +++ b/src/shared/constants.ts @@ -14,6 +14,7 @@ export enum DownloadSourceStatus { export enum CatalogueCategory { Hot = "hot", Weekly = "weekly", + Achievements = "achievements", } export enum SteamContentDescriptor { @@ -23,3 +24,19 @@ export enum SteamContentDescriptor { FrequentNudityOrSexualContent = 4, GeneralMatureContent = 5, } + +export enum Cracker { + codex = "CODEX", + rune = "RUNE", + onlineFix = "OnlineFix", + goldberg = "Goldberg", + userstats = "user_stats", + rld = "RLD!", + empress = "EMPRESS", + skidrow = "SKIDROW", + creamAPI = "CreamAPI", + smartSteamEmu = "SmartSteamEmu", + _3dm = "3dm", + flt = "FLT", + rle = "RLE", +} diff --git a/src/shared/index.ts b/src/shared/index.ts index 556000f2..1f17ac56 100644 --- a/src/shared/index.ts +++ b/src/shared/index.ts @@ -1,3 +1,4 @@ +import { charMap } from "./char-map"; import { Downloader } from "./constants"; export * from "./constants"; @@ -9,6 +10,13 @@ export class UserNotLoggedInError extends Error { } } +export class SubscriptionRequiredError extends Error { + constructor() { + super("user does not have hydra cloud subscription"); + this.name = "UserWithoutCloudSubscriptionError"; + } +} + const FORMAT = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; export const formatBytes = (bytes: number): string => { @@ -51,6 +59,12 @@ export const replaceUnderscoreWithSpace = (name: string) => name.replace(/_/g, " "); export const formatName = pipe( + (str) => + str.replace( + new RegExp(Object.keys(charMap).join("|"), "g"), + (match) => charMap[match] + ), + (str) => str.toLowerCase(), removeReleaseYearFromName, removeSpecialEditionFromName, replaceUnderscoreWithSpace, @@ -91,14 +105,14 @@ export const getDownloadersForUris = (uris: string[]) => { }; export const steamUrlBuilder = { - library: (objectID: string) => - `https://steamcdn-a.akamaihd.net/steam/apps/${objectID}/header.jpg`, - libraryHero: (objectID: string) => - `https://steamcdn-a.akamaihd.net/steam/apps/${objectID}/library_hero.jpg`, - logo: (objectID: string) => - `https://cdn.cloudflare.steamstatic.com/steam/apps/${objectID}/logo.png`, - cover: (objectID: string) => - `https://cdn.cloudflare.steamstatic.com/steam/apps/${objectID}/library_600x900.jpg`, - icon: (objectID: string, clientIcon: string) => - `https://cdn.cloudflare.steamstatic.com/steamcommunity/public/images/apps/${objectID}/${clientIcon}.ico`, + library: (objectId: string) => + `https://steamcdn-a.akamaihd.net/steam/apps/${objectId}/header.jpg`, + libraryHero: (objectId: string) => + `https://steamcdn-a.akamaihd.net/steam/apps/${objectId}/library_hero.jpg`, + logo: (objectId: string) => + `https://cdn.cloudflare.steamstatic.com/steam/apps/${objectId}/logo.png`, + cover: (objectId: string) => + `https://cdn.cloudflare.steamstatic.com/steam/apps/${objectId}/library_600x900.jpg`, + icon: (objectId: string, clientIcon: string) => + `https://cdn.cloudflare.steamstatic.com/steamcommunity/public/images/apps/${objectId}/${clientIcon}.ico`, }; diff --git a/src/types/howlongtobeat.types.ts b/src/types/howlongtobeat.types.ts new file mode 100644 index 00000000..1ab7ee34 --- /dev/null +++ b/src/types/howlongtobeat.types.ts @@ -0,0 +1,14 @@ +export interface HowLongToBeatCategory { + title: string; + duration: string; + accuracy: string; +} + +export interface HowLongToBeatResult { + game_id: number; + game_name: string; +} + +export interface HowLongToBeatSearchResponse { + data: HowLongToBeatResult[]; +} diff --git a/src/types/index.ts b/src/types/index.ts index 762c611a..7f970d63 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,4 +1,4 @@ -import type { DownloadSourceStatus, Downloader } from "@shared"; +import type { Cracker, DownloadSourceStatus, Downloader } from "@shared"; import type { SteamAppDetails } from "./steam.types"; export type GameStatus = @@ -28,8 +28,48 @@ export interface GameRepack { updatedAt: Date; } +export interface AchievementData { + name: string; + displayName: string; + description?: string; + icon: string; + icongray: string; + hidden: boolean; +} + +export interface UserAchievement { + name: string; + hidden: boolean; + displayName: string; + description?: string; + unlocked: boolean; + unlockTime: number | null; + icon: string; + icongray: string; +} + +export interface RemoteUnlockedAchievement { + name: string; + hidden: boolean; + icon: string; + displayName: string; + description?: string; + unlockTime: number; +} + +export interface GameAchievement { + name: string; + hidden: boolean; + displayName: string; + description?: string; + unlocked: boolean; + unlockTime: number | null; + icon: string; + icongray: string; +} + export type ShopDetails = SteamAppDetails & { - objectID: string; + objectId: string; }; export interface TorrentFile { @@ -39,7 +79,7 @@ export interface TorrentFile { /* Used by the catalogue */ export interface CatalogueEntry { - objectID: string; + objectId: string; shop: GameShop; title: string; /* Epic Games covers cannot be guessed with objectID */ @@ -54,6 +94,8 @@ export interface UserGame { cover: string; playTimeInSeconds: number; lastTimePlayed: Date | null; + unlockedAchievementCount: number; + achievementCount: number; } export interface DownloadQueue { @@ -74,6 +116,7 @@ export interface Game { bytesDownloaded: number; playTimeInMilliseconds: number; downloader: Downloader; + winePrefixPath: string | null; executablePath: string | null; lastTimePlayed: Date | null; uri: string | null; @@ -113,20 +156,15 @@ export interface UserPreferences { language: string; downloadNotificationsEnabled: boolean; repackUpdatesNotificationsEnabled: boolean; + achievementNotificationsEnabled: boolean; realDebridApiToken: string | null; preferQuitInsteadOfHiding: boolean; runAtStartup: boolean; } -export interface HowLongToBeatCategory { - title: string; - duration: string; - accuracy: string; -} - export interface Steam250Game { title: string; - objectID: string; + objectId: string; } export interface SteamGame { @@ -142,7 +180,7 @@ export type AppUpdaterEvent = /* Events */ export interface StartGameDownloadPayload { repackId: number; - objectID: string; + objectId: string; title: string; shop: GameShop; uri: string; @@ -187,26 +225,38 @@ export interface UserRelation { updatedAt: string; } -export interface UserProfileCurrentGame extends Omit { +export interface UserProfileCurrentGame extends Omit { objectId: string; sessionDurationInSeconds: number; } export type ProfileVisibility = "PUBLIC" | "PRIVATE" | "FRIENDS"; +export type SubscriptionStatus = "active" | "pending" | "cancelled"; + +export interface Subscription { + id: string; + status: SubscriptionStatus; + plan: { id: string; name: string }; + expiresAt: string | null; +} + export interface UserDetails { id: string; username: string; displayName: string; profileImageUrl: string | null; + backgroundImageUrl: string | null; profileVisibility: ProfileVisibility; bio: string; + subscription: Subscription | null; } export interface UserProfile { id: string; displayName: string; profileImageUrl: string | null; + backgroundImageUrl: string | null; profileVisibility: ProfileVisibility; libraryGames: UserGame[]; recentGames: UserGame[]; @@ -215,12 +265,14 @@ export interface UserProfile { relation: UserRelation | null; currentGame: UserProfileCurrentGame | null; bio: string; + hasActiveSubscription: boolean; } export interface UpdateProfileRequest { displayName?: string; profileVisibility?: ProfileVisibility; profileImageUrl?: string | null; + backgroundImageUrl?: string | null; bio?: string; } @@ -266,5 +318,58 @@ export interface UserStats { friendsCount: number; } +export interface UnlockedAchievement { + name: string; + unlockTime: number; +} + +export interface AchievementFile { + type: Cracker; + filePath: string; +} + +export type GameAchievementFiles = { + [id: string]: AchievementFile[]; +}; + +export interface GameArtifact { + id: string; + artifactLengthInBytes: number; + downloadOptionTitle: string | null; + createdAt: string; + updatedAt: string; + hostname: string; + downloadCount: number; +} + +export interface ComparedAchievements { + owner: { + totalAchievementCount: number; + unlockedAchievementCount: number; + }; + target: { + displayName: string; + profileImageUrl: string; + totalAchievementCount: number; + unlockedAchievementCount: number; + }; + achievements: { + hidden: boolean; + icon: string; + displayName: string; + description: string; + ownerStat?: { + unlocked: boolean; + unlockTime: number; + }; + targetStat: { + unlocked: boolean; + unlockTime: number; + }; + }[]; +} + export * from "./steam.types"; export * from "./real-debrid.types"; +export * from "./ludusavi.types"; +export * from "./howlongtobeat.types"; diff --git a/src/types/ludusavi.types.ts b/src/types/ludusavi.types.ts new file mode 100644 index 00000000..55f3f506 --- /dev/null +++ b/src/types/ludusavi.types.ts @@ -0,0 +1,43 @@ +export interface LudusaviScanChange { + change: "New" | "Different" | "Removed" | "Same" | "Unknown"; + decision: "Processed" | "Cancelled" | "Ignore"; + bytes: number; +} + +export interface LudusaviGame extends LudusaviScanChange { + files: Record; +} + +export interface LudusaviBackup { + overall: { + totalGames: number; + totalBytes: number; + processedGames: number; + processedBytes: number; + changedGames: { + new: number; + different: number; + same: number; + }; + }; + games: Record; +} + +export interface LudusaviFindResult { + games: Record; +} + +export interface LudusaviConfig { + manifest: { + enable: boolean; + secondary: { + url: string; + enable: boolean; + }[]; + }; + customGames: { + name: string; + files: string[]; + registry: []; + }[]; +} diff --git a/torrent-client/torrent_downloader.py b/torrent-client/torrent_downloader.py index d59cd28b..b5280260 100644 --- a/torrent-client/torrent_downloader.py +++ b/torrent-client/torrent_downloader.py @@ -144,8 +144,8 @@ class TorrentDownloader: status = torrent_handle.status() info = torrent_handle.get_torrent_info() - - return { + + response = { 'folderName': info.name() if info else "", 'fileSize': info.total_size() if info else 0, 'gameId': self.downloading_game_id, @@ -156,3 +156,10 @@ class TorrentDownloader: 'status': status.state, 'bytesDownloaded': status.progress * info.total_size() if info else status.all_time_download, } + + if status.progress == 1: + torrent_handle.pause() + self.session.remove_torrent(torrent_handle) + self.downloading_game_id = -1 + + return response diff --git a/yarn.lock b/yarn.lock index 14651b4b..51391923 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41,6 +41,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== +"@babel/compat-data@^7.25.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== + "@babel/core@^7.18.5": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" @@ -83,6 +88,27 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/core@^7.24.7": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + "@babel/generator@^7.24.5": version "7.24.5" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz" @@ -103,6 +129,16 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" +"@babel/generator@^7.25.0", "@babel/generator@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== + dependencies: + "@babel/types" "^7.25.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/helper-compilation-targets@^7.23.6": version "7.23.6" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz" @@ -125,6 +161,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== + dependencies: + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" @@ -204,11 +251,26 @@ "@babel/helper-split-export-declaration" "^7.24.7" "@babel/helper-validator-identifier" "^7.24.7" +"@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" + "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5": version "7.24.5" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz" integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== +"@babel/helper-plugin-utils@^7.24.7": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + "@babel/helper-simple-access@^7.24.5": version "7.24.5" resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz" @@ -248,6 +310,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + "@babel/helper-validator-identifier@^7.24.5": version "7.24.5" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz" @@ -268,6 +335,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + "@babel/helpers@^7.24.5": version "7.24.5" resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz" @@ -285,6 +357,14 @@ "@babel/template" "^7.24.7" "@babel/types" "^7.24.7" +"@babel/helpers@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== + dependencies: + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + "@babel/highlight@^7.24.2": version "7.24.5" resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz" @@ -315,6 +395,13 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== +"@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" + "@babel/plugin-syntax-typescript@^7.23.3": version "7.24.1" resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz" @@ -322,12 +409,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.0" -"@babel/plugin-transform-arrow-functions@^7.23.3": - version "7.24.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz" - integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== +"@babel/plugin-transform-arrow-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" + integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-react-jsx-self@^7.23.3": version "7.24.5" @@ -368,6 +455,15 @@ "@babel/parser" "^7.24.7" "@babel/types" "^7.24.7" +"@babel/template@^7.25.0": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + "@babel/traverse@^7.24.5": version "7.24.5" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz" @@ -400,6 +496,19 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.25.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.24.5": version "7.24.5" resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz" @@ -418,6 +527,15 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== + dependencies: + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" + to-fast-properties "^2.0.0" + "@canvas/image-data@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.0.0.tgz" @@ -625,11 +743,12 @@ resolved "https://registry.npmjs.org/@electron-toolkit/utils/-/utils-3.0.0.tgz" integrity sha512-GaXHDhiT7KCvMJjXdp/QqpYinq69T/Pdl49Z1XLf8mKGf63dnsODMWyrmIjEQ0z/vG7dO8qF3fvmI6Eb2lUNZA== -"@electron/asar@^3.2.1": - version "3.2.10" - resolved "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz" - integrity sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw== +"@electron/asar@^3.2.7": + version "3.2.13" + resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.13.tgz#56565ea423ead184465adfa72663b2c70d9835f2" + integrity sha512-pY5z2qQSwbFzJsBdgfJIzXf5ElHTVMutC2dxh0FD60njknMu3n1NnTABOcQwbb5/v5soqE79m9UjaJryBf3epg== dependencies: + "@types/glob" "^7.1.0" commander "^5.0.0" glob "^7.1.6" minimatch "^3.0.4" @@ -649,19 +768,19 @@ optionalDependencies: global-agent "^3.0.0" -"@electron/notarize@2.2.1": - version "2.2.1" - resolved "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz" - integrity sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg== +"@electron/notarize@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.5.0.tgz#d4d25356adfa29df4a76bd64a8bd347237cd251e" + integrity sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A== dependencies: debug "^4.1.1" fs-extra "^9.0.1" promise-retry "^2.0.1" -"@electron/osx-sign@1.0.5": - version "1.0.5" - resolved "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz" - integrity sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww== +"@electron/osx-sign@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@electron/osx-sign/-/osx-sign-1.3.1.tgz#faf7eeca7ca004a6be541dc4cf7a1bd59ec59b1c" + integrity sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw== dependencies: compare-version "^0.1.2" debug "^4.3.4" @@ -670,18 +789,38 @@ minimist "^1.2.6" plist "^3.0.5" -"@electron/universal@1.5.1": - version "1.5.1" - resolved "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz" - integrity sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw== +"@electron/rebuild@3.6.1": + version "3.6.1" + resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.6.1.tgz#59e8e36c3f6e6b94a699425dfb61f0394c3dd4df" + integrity sha512-f6596ZHpEq/YskUd8emYvOUne89ij8mQgjYFA5ru25QwbrRO+t1SImofdDv7kKOuWCmVOuU5tvfkbgGxIl3E/w== dependencies: - "@electron/asar" "^3.2.1" - "@malept/cross-spawn-promise" "^1.1.0" + "@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" + node-gyp "^9.0.0" + ora "^5.1.0" + read-binary-file-arch "^1.0.6" + semver "^7.3.5" + tar "^6.0.5" + yargs "^17.0.1" + +"@electron/universal@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-2.0.1.tgz#7b070ab355e02957388f3dbd68e2c3cd08c448ae" + integrity sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA== + dependencies: + "@electron/asar" "^3.2.7" + "@malept/cross-spawn-promise" "^2.0.0" debug "^4.3.1" - dir-compare "^3.0.0" - fs-extra "^9.0.1" - minimatch "^3.0.4" - plist "^3.0.4" + dir-compare "^4.2.0" + fs-extra "^11.1.1" + minimatch "^9.0.3" + plist "^3.1.0" "@emotion/hash@^0.9.0": version "0.9.1" @@ -693,230 +832,230 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== -"@esbuild/aix-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" - integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== "@esbuild/android-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== -"@esbuild/android-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" - integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== "@esbuild/android-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== -"@esbuild/android-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" - integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== "@esbuild/android-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== -"@esbuild/android-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" - integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== "@esbuild/darwin-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== -"@esbuild/darwin-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" - integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== "@esbuild/darwin-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== -"@esbuild/darwin-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" - integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== "@esbuild/freebsd-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== -"@esbuild/freebsd-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" - integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== "@esbuild/freebsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== -"@esbuild/freebsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" - integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== "@esbuild/linux-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== -"@esbuild/linux-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" - integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== "@esbuild/linux-arm@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== -"@esbuild/linux-arm@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" - integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== "@esbuild/linux-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== -"@esbuild/linux-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" - integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== "@esbuild/linux-loong64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== -"@esbuild/linux-loong64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" - integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== "@esbuild/linux-mips64el@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== -"@esbuild/linux-mips64el@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" - integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== "@esbuild/linux-ppc64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== -"@esbuild/linux-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" - integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== "@esbuild/linux-riscv64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== -"@esbuild/linux-riscv64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" - integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== "@esbuild/linux-s390x@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== -"@esbuild/linux-s390x@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" - integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== "@esbuild/linux-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== -"@esbuild/linux-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" - integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== "@esbuild/netbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== -"@esbuild/netbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" - integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== "@esbuild/openbsd-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== -"@esbuild/openbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" - integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== "@esbuild/sunos-x64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== -"@esbuild/sunos-x64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" - integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== "@esbuild/win32-arm64@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== -"@esbuild/win32-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" - integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== "@esbuild/win32-ia32@0.19.12": version "0.19.12" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== -"@esbuild/win32-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" - integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== "@esbuild/win32-x64@0.19.12": version "0.19.12" resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz" integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== -"@esbuild/win32-x64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz" - integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -945,27 +1084,32 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== "@fontsource/noto-sans@^5.0.22": version "5.0.22" resolved "https://registry.yarnpkg.com/@fontsource/noto-sans/-/noto-sans-5.0.22.tgz#2c5249347ba84fef16e71a58e0ec01b460174093" integrity sha512-PwjvKPGFbgpwfKjWZj1zeUvd7ExUW2AqHE9PF9ysAJ2gOuzIHWE6mEVIlchYif7WC2pQhn+g0w6xooCObVi+4A== +"@gar/promisify@^1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" + integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== + "@hookform/resolvers@^3.9.0": version "3.9.0" resolved "https://registry.yarnpkg.com/@hookform/resolvers/-/resolvers-3.9.0.tgz#cf540ac21c6c0cd24a40cf53d8e6d64391fb753d" integrity sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg== -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -974,9 +1118,9 @@ resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": +"@humanwhocodes/object-schema@^2.0.3": version "2.0.3" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@isaacs/cliui@^8.0.2": @@ -991,9 +1135,16 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" -"@jimp/bmp@^0.22.10": +"@isaacs/fs-minipass@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz#2d59ae3ab4b38fb4270bfa23d30f8e2e86c7fe32" + integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== + dependencies: + minipass "^7.0.4" + +"@jimp/bmp@^0.22.12": version "0.22.12" - resolved "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.22.12.tgz" + resolved "https://registry.yarnpkg.com/@jimp/bmp/-/bmp-0.22.12.tgz#0316044dc7b1a90274aef266d50349347fb864d4" integrity sha512-aeI64HD0npropd+AR76MCcvvRaa+Qck6loCOS03CkkxGHN5/r336qTM5HPUdHKMDOGzqknuVPA8+kK1t03z12g== dependencies: "@jimp/utils" "^0.22.12" @@ -1030,6 +1181,11 @@ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" @@ -1046,10 +1202,10 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@malept/cross-spawn-promise@^1.1.0": - 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== +"@malept/cross-spawn-promise@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz#d0772de1aa680a0bfb9ba2f32b4c828c7857cb9d" + integrity sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg== dependencies: cross-spawn "^7.0.1" @@ -1063,6 +1219,108 @@ lodash "^4.17.15" tmp-promise "^3.0.2" +"@napi-rs/nice-android-arm-eabi@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.0.1.tgz#9a0cba12706ff56500df127d6f4caf28ddb94936" + integrity sha512-5qpvOu5IGwDo7MEKVqqyAxF90I6aLj4n07OzpARdgDRfz8UbBztTByBp0RC59r3J1Ij8uzYi6jI7r5Lws7nn6w== + +"@napi-rs/nice-android-arm64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.0.1.tgz#32fc32e9649bd759d2a39ad745e95766f6759d2f" + integrity sha512-GqvXL0P8fZ+mQqG1g0o4AO9hJjQaeYG84FRfZaYjyJtZZZcMjXW5TwkL8Y8UApheJgyE13TQ4YNUssQaTgTyvA== + +"@napi-rs/nice-darwin-arm64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.0.1.tgz#d3c44c51b94b25a82d45803e2255891e833e787b" + integrity sha512-91k3HEqUl2fsrz/sKkuEkscj6EAj3/eZNCLqzD2AA0TtVbkQi8nqxZCZDMkfklULmxLkMxuUdKe7RvG/T6s2AA== + +"@napi-rs/nice-darwin-x64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.0.1.tgz#f1b1365a8370c6a6957e90085a9b4873d0e6a957" + integrity sha512-jXnMleYSIR/+TAN/p5u+NkCA7yidgswx5ftqzXdD5wgy/hNR92oerTXHc0jrlBisbd7DpzoaGY4cFD7Sm5GlgQ== + +"@napi-rs/nice-freebsd-x64@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.0.1.tgz#4280f081efbe0b46c5165fdaea8b286e55a8f89e" + integrity sha512-j+iJ/ezONXRQsVIB/FJfwjeQXX7A2tf3gEXs4WUGFrJjpe/z2KB7sOv6zpkm08PofF36C9S7wTNuzHZ/Iiccfw== + +"@napi-rs/nice-linux-arm-gnueabihf@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.0.1.tgz#07aec23a9467ed35eb7602af5e63d42c5d7bd473" + integrity sha512-G8RgJ8FYXYkkSGQwywAUh84m946UTn6l03/vmEXBYNJxQJcD+I3B3k5jmjFG/OPiU8DfvxutOP8bi+F89MCV7Q== + +"@napi-rs/nice-linux-arm64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.0.1.tgz#038a77134cc6df3c48059d5a5e199d6f50fb9a90" + integrity sha512-IMDak59/W5JSab1oZvmNbrms3mHqcreaCeClUjwlwDr0m3BoR09ZiN8cKFBzuSlXgRdZ4PNqCYNeGQv7YMTjuA== + +"@napi-rs/nice-linux-arm64-musl@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.0.1.tgz#715d0906582ba0cff025109f42e5b84ea68c2bcc" + integrity sha512-wG8fa2VKuWM4CfjOjjRX9YLIbysSVV1S3Kgm2Fnc67ap/soHBeYZa6AGMeR5BJAylYRjnoVOzV19Cmkco3QEPw== + +"@napi-rs/nice-linux-ppc64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.0.1.tgz#ac1c8f781c67b0559fa7a1cd4ae3ca2299dc3d06" + integrity sha512-lxQ9WrBf0IlNTCA9oS2jg/iAjQyTI6JHzABV664LLrLA/SIdD+I1i3Mjf7TsnoUbgopBcCuDztVLfJ0q9ubf6Q== + +"@napi-rs/nice-linux-riscv64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.0.1.tgz#b0a430549acfd3920ffd28ce544e2fe17833d263" + integrity sha512-3xs69dO8WSWBb13KBVex+yvxmUeEsdWexxibqskzoKaWx9AIqkMbWmE2npkazJoopPKX2ULKd8Fm9veEn0g4Ig== + +"@napi-rs/nice-linux-s390x-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.0.1.tgz#5b95caf411ad72a965885217db378c4d09733e97" + integrity sha512-lMFI3i9rlW7hgToyAzTaEybQYGbQHDrpRkg+1gJWEpH0PLAQoZ8jiY0IzakLfNWnVda1eTYYlxxFYzW8Rqczkg== + +"@napi-rs/nice-linux-x64-gnu@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.0.1.tgz#a98cdef517549f8c17a83f0236a69418a90e77b7" + integrity sha512-XQAJs7DRN2GpLN6Fb+ZdGFeYZDdGl2Fn3TmFlqEL5JorgWKrQGRUrpGKbgZ25UeZPILuTKJ+OowG2avN8mThBA== + +"@napi-rs/nice-linux-x64-musl@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.0.1.tgz#5e26843eafa940138aed437c870cca751c8a8957" + integrity sha512-/rodHpRSgiI9o1faq9SZOp/o2QkKQg7T+DK0R5AkbnI/YxvAIEHf2cngjYzLMQSQgUhxym+LFr+UGZx4vK4QdQ== + +"@napi-rs/nice-win32-arm64-msvc@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.0.1.tgz#bd62617d02f04aa30ab1e9081363856715f84cd8" + integrity sha512-rEcz9vZymaCB3OqEXoHnp9YViLct8ugF+6uO5McifTedjq4QMQs3DHz35xBEGhH3gJWEsXMUbzazkz5KNM5YUg== + +"@napi-rs/nice-win32-ia32-msvc@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.0.1.tgz#b8b7aad552a24836027473d9b9f16edaeabecf18" + integrity sha512-t7eBAyPUrWL8su3gDxw9xxxqNwZzAqKo0Szv3IjVQd1GpXXVkb6vBBQUuxfIYaXMzZLwlxRQ7uzM2vdUE9ULGw== + +"@napi-rs/nice-win32-x64-msvc@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.0.1.tgz#37d8718b8f722f49067713e9f1e85540c9a3dd09" + integrity sha512-JlF+uDcatt3St2ntBG8H02F1mM45i5SF9W+bIKiReVE6wiy3o16oBP/yxt+RZ+N6LbCImJXJ6bXNO2kn9AXicg== + +"@napi-rs/nice@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@napi-rs/nice/-/nice-1.0.1.tgz#483d3ff31e5661829a1efb4825591a135c3bfa7d" + integrity sha512-zM0mVWSXE0a0h9aKACLwKmD6nHcRiKrPpCfvaKqG1CqDEyjEawId0ocXxVzPMCAm6kkWr2P025msfxXEnt8UGQ== + optionalDependencies: + "@napi-rs/nice-android-arm-eabi" "1.0.1" + "@napi-rs/nice-android-arm64" "1.0.1" + "@napi-rs/nice-darwin-arm64" "1.0.1" + "@napi-rs/nice-darwin-x64" "1.0.1" + "@napi-rs/nice-freebsd-x64" "1.0.1" + "@napi-rs/nice-linux-arm-gnueabihf" "1.0.1" + "@napi-rs/nice-linux-arm64-gnu" "1.0.1" + "@napi-rs/nice-linux-arm64-musl" "1.0.1" + "@napi-rs/nice-linux-ppc64-gnu" "1.0.1" + "@napi-rs/nice-linux-riscv64-gnu" "1.0.1" + "@napi-rs/nice-linux-s390x-gnu" "1.0.1" + "@napi-rs/nice-linux-x64-gnu" "1.0.1" + "@napi-rs/nice-linux-x64-musl" "1.0.1" + "@napi-rs/nice-win32-arm64-msvc" "1.0.1" + "@napi-rs/nice-win32-ia32-msvc" "1.0.1" + "@napi-rs/nice-win32-x64-msvc" "1.0.1" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -1084,6 +1342,22 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/fs@^2.1.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" + integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== + dependencies: + "@gar/promisify" "^1.1.3" + semver "^7.3.5" + +"@npmcli/move-file@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" + integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== + dependencies: + mkdirp "^1.0.4" + rimraf "^3.0.2" + "@opentelemetry/api-logs@0.51.1": version "0.51.1" resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.51.1.tgz#ded1874c04516c2b8cb24828eef3d6c3d1f75343" @@ -1396,10 +1670,10 @@ redux-thunk "^3.1.0" reselect "^5.1.0" -"@remix-run/router@1.16.1": - version "1.16.1" - resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz" - integrity sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig== +"@remix-run/router@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.19.2.tgz#0c896535473291cb41f152c180bedd5680a3b273" + integrity sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA== "@rollup/pluginutils@^5.0.5": version "5.1.0" @@ -1410,85 +1684,90 @@ estree-walker "^2.0.2" picomatch "^2.3.1" -"@rollup/rollup-android-arm-eabi@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz#1a32112822660ee104c5dd3a7c595e26100d4c2d" - integrity sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ== +"@rollup/rollup-android-arm-eabi@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.23.0.tgz#17c381804b84fecee9dd8588e93d9b2a4544ea42" + integrity sha512-8OR+Ok3SGEMsAZispLx8jruuXw0HVF16k+ub2eNXKHDmdxL4cf9NlNpAzhlOhNyXzKDEJuFeq0nZm+XlNb1IFw== -"@rollup/rollup-android-arm64@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz#5aeef206d65ff4db423f3a93f71af91b28662c5b" - integrity sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw== +"@rollup/rollup-android-arm64@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.23.0.tgz#0594aab393e7b13c4cd7f21bb72d953c128cdae4" + integrity sha512-rEFtX1nP8gqmLmPZsXRMoLVNB5JBwOzIAk/XAcEPuKrPa2nPJ+DuGGpfQUR0XjRm8KjHfTZLpWbKXkA5BoFL3w== -"@rollup/rollup-darwin-arm64@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz#6b66aaf003c70454c292cd5f0236ebdc6ffbdf1a" - integrity sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw== +"@rollup/rollup-darwin-arm64@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.23.0.tgz#1bc123d4e69920d026f0ffc791bc3c4e04a33b60" + integrity sha512-ZbqlMkJRMMPeapfaU4drYHns7Q5MIxjM/QeOO62qQZGPh9XWziap+NF9fsqPHT0KzEL6HaPspC7sOwpgyA3J9g== -"@rollup/rollup-darwin-x64@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz#f64fc51ed12b19f883131ccbcea59fc68cbd6c0b" - integrity sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ== +"@rollup/rollup-darwin-x64@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.23.0.tgz#272b6787d8a356ac8460738c03b0281af75ed73e" + integrity sha512-PfmgQp78xx5rBCgn2oYPQ1rQTtOaQCna0kRaBlc5w7RlA3TDGGo7m3XaptgitUZ54US9915i7KeVPHoy3/W8tA== -"@rollup/rollup-linux-arm-gnueabihf@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz#1a7641111be67c10111f7122d1e375d1226cbf14" - integrity sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A== +"@rollup/rollup-linux-arm-gnueabihf@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.23.0.tgz#c35a35414d11c028db1e11b158b3947d1fa3abb0" + integrity sha512-WAeZfAAPus56eQgBioezXRRzArAjWJGjNo/M+BHZygUcs9EePIuGI1Wfc6U/Ki+tMW17FFGvhCfYnfcKPh18SA== -"@rollup/rollup-linux-arm-musleabihf@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz#c93fd632923e0fee25aacd2ae414288d0b7455bb" - integrity sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg== +"@rollup/rollup-linux-arm-musleabihf@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.23.0.tgz#f490e10393558d37c8bc71e71fcab919f2a5bec6" + integrity sha512-v7PGcp1O5XKZxKX8phTXtmJDVpE20Ub1eF6w9iMmI3qrrPak6yR9/5eeq7ziLMrMTjppkkskXyxnmm00HdtXjA== -"@rollup/rollup-linux-arm64-gnu@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz#fa531425dd21d058a630947527b4612d9d0b4a4a" - integrity sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A== +"@rollup/rollup-linux-arm64-gnu@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.23.0.tgz#1b685e1c219494e39f7441cd6b15fe4779ceda77" + integrity sha512-nAbWsDZ9UkU6xQiXEyXBNHAKbzSAi95H3gTStJq9UGiS1v+YVXwRHcQOQEF/3CHuhX5BVhShKoeOf6Q/1M+Zhg== -"@rollup/rollup-linux-arm64-musl@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz#8acc16f095ceea5854caf7b07e73f7d1802ac5af" - integrity sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA== +"@rollup/rollup-linux-arm64-musl@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.23.0.tgz#a6cf6cdb340abde851b055e6d8785308ef4ace1a" + integrity sha512-5QT/Di5FbGNPaVw8hHO1wETunwkPuZBIu6W+5GNArlKHD9fkMHy7vS8zGHJk38oObXfWdsuLMogD4sBySLJ54g== -"@rollup/rollup-linux-powerpc64le-gnu@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz#94e69a8499b5cf368911b83a44bb230782aeb571" - integrity sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ== +"@rollup/rollup-linux-powerpc64le-gnu@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.23.0.tgz#2ce0518e709a8a4c0ae563ae0dd4526bc8b14df8" + integrity sha512-Sefl6vPyn5axzCsO13r1sHLcmPuiSOrKIImnq34CBurntcJ+lkQgAaTt/9JkgGmaZJ+OkaHmAJl4Bfd0DmdtOQ== -"@rollup/rollup-linux-riscv64-gnu@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz#7ef1c781c7e59e85a6ce261cc95d7f1e0b56db0f" - integrity sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg== +"@rollup/rollup-linux-riscv64-gnu@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.23.0.tgz#008bbfc76beae9651b989a36a0308fbb90ce9fcd" + integrity sha512-o4QI2KU/QbP7ZExMse6ULotdV3oJUYMrdx3rBZCgUF3ur3gJPfe8Fuasn6tia16c5kZBBw0aTmaUygad6VB/hQ== -"@rollup/rollup-linux-s390x-gnu@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz#f15775841c3232fca9b78cd25a7a0512c694b354" - integrity sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g== +"@rollup/rollup-linux-s390x-gnu@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.23.0.tgz#dac114e4eda8d6c5d6b46abd7f1638c6e5846f75" + integrity sha512-+bxqx+V/D4FGrpXzPGKp/SEZIZ8cIW3K7wOtcJAoCrmXvzRtmdUhYNbgd+RztLzfDEfA2WtKj5F4tcbNPuqgeg== -"@rollup/rollup-linux-x64-gnu@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz#b521d271798d037ad70c9f85dd97d25f8a52e811" - integrity sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ== +"@rollup/rollup-linux-x64-gnu@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.23.0.tgz#5d813f8fa79830e13ebeb69433cc786c5522da87" + integrity sha512-I/eXsdVoCKtSgK9OwyQKPAfricWKUMNCwJKtatRYMmDo5N859tbO3UsBw5kT3dU1n6ZcM1JDzPRSGhAUkxfLxw== -"@rollup/rollup-linux-x64-musl@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz#9254019cc4baac35800991315d133cc9fd1bf385" - integrity sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q== +"@rollup/rollup-linux-x64-musl@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.23.0.tgz#cca8bf6f96467494c4cb8bba996752d3c7b20714" + integrity sha512-4ZoDZy5ShLbbe1KPSafbFh1vbl0asTVfkABC7eWqIs01+66ncM82YJxV2VtV3YVJTqq2P8HMx3DCoRSWB/N3rw== -"@rollup/rollup-win32-arm64-msvc@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz#27f65a89f6f52ee9426ec11e3571038e4671790f" - integrity sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA== +"@rollup/rollup-win32-arm64-msvc@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.23.0.tgz#9e09307dd0656a63db9ef86a6004679f56d9ddcf" + integrity sha512-+5Ky8dhft4STaOEbZu3/NU4QIyYssKO+r1cD3FzuusA0vO5gso15on7qGzKdNXnc1gOrsgCqZjRw1w+zL4y4hQ== -"@rollup/rollup-win32-ia32-msvc@4.17.2": - version "4.17.2" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz#a2fbf8246ed0bb014f078ca34ae6b377a90cb411" - integrity sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ== +"@rollup/rollup-win32-ia32-msvc@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.23.0.tgz#ebd6a789dd59c1a4e94ab055de0c37ab4ae43618" + integrity sha512-0SPJk4cPZQhq9qA1UhIRumSE3+JJIBBjtlGl5PNC///BoaByckNZd53rOYD0glpTkYFBQSt7AkMeLVPfx65+BQ== -"@rollup/rollup-win32-x64-msvc@4.17.2": - version "4.17.2" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz" - integrity sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w== +"@rollup/rollup-win32-x64-msvc@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.23.0.tgz#54e3562ebd264ef5839f8091618310c40d43d8a9" + integrity sha512-lqCK5GQC8fNo0+JvTSxcG7YB1UKYp8yrNLhsArlvPWN+16ovSZgoehlVHg6X0sSWPUkpjRBR5TuR12ZugowZ4g== + +"@sec-ant/readable-stream@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz#60de891bb126abfdc5410fdc6166aca065f10a0c" + integrity sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg== "@sentry-internal/browser-utils@8.9.2": version "8.9.2" @@ -2041,7 +2320,12 @@ dependencies: "@types/ms" "*" -"@types/estree@1.0.5", "@types/estree@^1.0.0": +"@types/estree@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +"@types/estree@^1.0.0": version "1.0.5" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -2066,6 +2350,11 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/folder-hash@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/folder-hash/-/folder-hash-4.0.4.tgz#c3262d58a01b756ee2aae3694707fad1ef676a9f" + integrity sha512-c+PwHm51Dw3fXM8SDK+93PO3oXdk4XNouCCvV67lj4aijRkZz5g67myk+9wqWWnyv3go6q96hT6ywcd3XtoZiQ== + "@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.11": version "9.0.13" resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz" @@ -2073,6 +2362,14 @@ dependencies: "@types/node" "*" +"@types/glob@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + "@types/http-assert@*": version "1.5.5" resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.5.tgz#dfb1063eb7c240ee3d3fe213dac5671cfb6a8dbf" @@ -2187,6 +2484,11 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + "@types/ms@*": version "0.7.34" resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz" @@ -2539,6 +2841,11 @@ JSONStream@^1.3.5: jsonparse "^1.2.0" through ">=2.2.7 <3" +abbrev@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" @@ -2583,7 +2890,7 @@ acorn@^8.8.1, acorn@^8.8.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== -agent-base@6: +agent-base@6, agent-base@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== @@ -2597,6 +2904,21 @@ agent-base@^7.0.2, agent-base@^7.1.0: dependencies: debug "^4.3.4" +agentkeepalive@^4.2.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv-keywords@^3.4.1: version "3.5.2" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" @@ -2664,39 +2986,44 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -app-builder-bin@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz" - integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== +app-builder-bin@5.0.0-alpha.10: + version "5.0.0-alpha.10" + resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.10.tgz#cf12e593b6b847fb9d04027fa755c6c6610d778b" + integrity sha512-Ev4jj3D7Bo+O0GPD2NMvJl+PGiBAfS7pUGawntBNpCbxtpncfUixqFj9z9Jme7V7s3LBGqsWZZP54fxBX3JKJw== -app-builder-lib@24.13.3: - version "24.13.3" - resolved "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz" - integrity sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig== +app-builder-lib@25.1.8: + version "25.1.8" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-25.1.8.tgz#ae376039c5f269c7d562af494a087e5bc6310f1b" + integrity sha512-pCqe7dfsQFBABC1jeKZXQWhGcCPF3rPCXDdfqVKjIeWBcXzyC1iOWZdfFhGl+S9MyE/k//DFmC6FzuGAUudNDg== dependencies: "@develar/schema-utils" "~2.6.5" - "@electron/notarize" "2.2.1" - "@electron/osx-sign" "1.0.5" - "@electron/universal" "1.5.1" + "@electron/notarize" "2.5.0" + "@electron/osx-sign" "1.3.1" + "@electron/rebuild" "3.6.1" + "@electron/universal" "2.0.1" "@malept/flatpak-bundler" "^0.4.0" "@types/fs-extra" "9.0.13" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "24.13.1" - builder-util-runtime "9.2.4" + builder-util "25.1.7" + builder-util-runtime "9.2.10" chromium-pickle-js "^0.2.0" + config-file-ts "0.2.8-rc1" debug "^4.3.4" + dotenv "^16.4.5" + dotenv-expand "^11.0.6" ejs "^3.1.8" - electron-publish "24.13.1" + electron-publish "25.1.7" form-data "^4.0.0" fs-extra "^10.1.0" hosted-git-info "^4.1.0" is-ci "^3.0.0" isbinaryfile "^5.0.0" js-yaml "^4.1.0" + json5 "^2.2.3" lazy-val "^1.0.5" - minimatch "^5.1.1" - read-config-file "6.3.2" + minimatch "^10.0.0" + resedit "^1.7.0" sanitize-filename "^1.6.3" semver "^7.3.8" tar "^6.1.12" @@ -2712,6 +3039,19 @@ applescript@^1.0.0: resolved "https://registry.npmjs.org/applescript/-/applescript-1.0.0.tgz" integrity sha512-yvtNHdWvtbYEiIazXAdp/NY+BBb65/DAseqlNiJQjOx9DynuzOYDbVLBJvuc0ve0VL9x6B3OHF6eH52y9hCBtQ== +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -2719,19 +3059,19 @@ arg@^4.1.0: argparse@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== +aria-query@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: - dequal "^2.0.3" + deep-equal "^2.0.5" -array-buffer-byte-length@^1.0.1: +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: call-bind "^1.0.5" @@ -2739,12 +3079,12 @@ array-buffer-byte-length@^1.0.1: array-ify@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.1.6, array-includes@^3.1.7: +array-includes@^3.1.6, array-includes@^3.1.8: version "3.1.8" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: call-bind "^1.0.7" @@ -2756,12 +3096,12 @@ array-includes@^3.1.6, array-includes@^3.1.7: array-union@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.findlast@^1.2.4: +array.prototype.findlast@^1.2.5: version "1.2.5" - resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== dependencies: call-bind "^1.0.7" @@ -2773,7 +3113,7 @@ array.prototype.findlast@^1.2.4: array.prototype.flat@^1.3.1: version "1.3.2" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" @@ -2783,7 +3123,7 @@ array.prototype.flat@^1.3.1: array.prototype.flatmap@^1.3.2: version "1.3.2" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" @@ -2791,30 +3131,20 @@ array.prototype.flatmap@^1.3.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.toreversed@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz" - integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== - dependencies: - call-bind "^1.0.5" + call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" + es-abstract "^1.23.3" + es-errors "^1.3.0" es-shim-unscopables "^1.0.2" arraybuffer.prototype.slice@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== dependencies: array-buffer-byte-length "^1.0.1" @@ -2833,7 +3163,7 @@ assert-plus@^1.0.0: ast-types-flow@^0.0.8: version "0.0.8" - resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== astral-regex@^2.0.0: @@ -2843,27 +3173,27 @@ astral-regex@^2.0.0: async-exit-hook@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== async@^3.2.3: - version "3.2.5" - resolved "https://registry.npmjs.org/async/-/async-3.2.5.tgz" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== auto-launch@^5.0.6: version "5.0.6" - resolved "https://registry.npmjs.org/auto-launch/-/auto-launch-5.0.6.tgz" + resolved "https://registry.yarnpkg.com/auto-launch/-/auto-launch-5.0.6.tgz#ccc238ddc07b2fa84e96a1bc2fd11b581a20cb2d" integrity sha512-OgxiAm4q9EBf9EeXdPBiVNENaWE3jUZofwrhAkWjHDYGezu1k3FRZHU8V2FBxGuSJOHzKmTJEd0G7L7/0xDGFA== dependencies: applescript "^1.0.0" @@ -2874,15 +3204,15 @@ auto-launch@^5.0.6: available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== +axe-core@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.10.0.tgz#d9e56ab0147278272739a000880196cdfe113b59" + integrity sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g== axios@^1.7.7: version "1.7.7" @@ -2893,44 +3223,42 @@ axios@^1.7.7: form-data "^4.0.0" proxy-from-env "^1.1.0" -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" +axobject-query@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee" + integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-arraybuffer@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bencode@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/bencode/-/bencode-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/bencode/-/bencode-4.0.0.tgz#36ca0bc366290dad002215fc52fc74edf4eb0625" integrity sha512-AERXw18df0pF3ziGOCyUjqKZBVNH8HV3lBxnx5w0qtgMIk4a1wb9BkcCQbkp9Zstfrn/dzRwl7MmUHHocX3sRQ== dependencies: uint8-util "^2.2.2" bep53-range@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/bep53-range/-/bep53-range-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/bep53-range/-/bep53-range-2.0.0.tgz#a1770475661b4b814c4359e4b66f7cbd88de2b10" integrity sha512-sMm2sV5PRs0YOVk0LTKtjuIprVzxgTQUsrGX/7Yph2Rm4FO2Fqqtq7hNjsOB5xezM4v4+5rljCgK++UeQJZguA== -better-sqlite3@^11.2.1: - version "11.2.1" - resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.2.1.tgz#3c6b8a8e2e12444d380e811796b59c8aba012e03" - integrity sha512-Xbt1d68wQnUuFIEVsbt6V+RG30zwgbtCGQ4QOcXVrOH0FE4eHk64FWZ9NUfRHS4/x1PXqwz/+KOrnXD7f0WieA== +better-sqlite3@^11.3.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.3.0.tgz#f10b32ddff665c33176d148e707bd1e57dfd0284" + integrity sha512-iHt9j8NPYF3oKCNOO5ZI4JwThjt3Z6J6XrcwG85VNMVzv1ByqrHWv5VILEbCMFWDsoHhXvQ7oC8vgRXFAKgl9w== dependencies: bindings "^1.5.0" prebuild-install "^7.1.1" @@ -2942,14 +3270,14 @@ binary-extensions@^2.0.0: bindings@^1.5.0: version "1.5.0" - resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: file-uri-to-path "1.0.0" -bl@^4.0.3: +bl@^4.0.3, bl@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" @@ -2958,29 +3286,29 @@ bl@^4.0.3: bluebird-lst@^1.0.9: version "1.0.9" - resolved "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz" + resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c" integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw== dependencies: bluebird "^3.5.5" bluebird@^3.5.5: version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bmp-js@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233" integrity sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw== boolean@^3.0.1: version "3.2.0" - resolved "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -2988,58 +3316,46 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -braces@~3.0.2: +braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" -browserslist@^4.22.2: - version "4.23.0" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== +browserslist@^4.22.2, browserslist@^4.23.1: + version "4.24.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4" + integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A== dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" + caniuse-lite "^1.0.30001663" + electron-to-chromium "^1.5.28" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" buffer-crc32@~0.2.3: version "0.2.13" - resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== buffer-equal-constant-time@1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== -buffer-equal@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz" - integrity sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg== - buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer@^5.1.0, buffer@^5.5.0: version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -3047,44 +3363,36 @@ buffer@^5.1.0, buffer@^5.5.0: buffer@^6.0.3: version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" ieee754 "^1.2.1" -builder-util-runtime@9.2.3: - version "9.2.3" - resolved "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz" - integrity sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw== +builder-util-runtime@9.2.10: + version "9.2.10" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.10.tgz#a0f7d9e214158402e78b74a745c8d9f870c604bc" + integrity sha512-6p/gfG1RJSQeIbz8TK5aPNkoztgY1q5TgmGFMAXcY8itsGW6Y2ld1ALsZ5UJn8rog7hKF3zHx5iQbNQ8uLcRlw== dependencies: debug "^4.3.4" sax "^1.2.4" -builder-util-runtime@9.2.4: - version "9.2.4" - resolved "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz" - integrity sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA== - dependencies: - debug "^4.3.4" - sax "^1.2.4" - -builder-util@24.13.1: - version "24.13.1" - resolved "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz" - integrity sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA== +builder-util@25.1.7: + version "25.1.7" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-25.1.7.tgz#a07b404f0cb1a635aa165902be65297d58932ff8" + integrity sha512-7jPjzBwEGRbwNcep0gGNpLXG9P94VA3CPAZQCzxkFXiV2GMQKlziMbY//rXPI7WKfhsvGgFXjTcXdBEwgXw9ww== dependencies: "7zip-bin" "~5.2.0" "@types/debug" "^4.1.6" - app-builder-bin "4.0.0" + app-builder-bin "5.0.0-alpha.10" bluebird-lst "^1.0.9" - builder-util-runtime "9.2.4" + builder-util-runtime "9.2.10" chalk "^4.1.2" cross-spawn "^7.0.3" debug "^4.3.4" fs-extra "^10.1.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" is-ci "^3.0.0" js-yaml "^4.1.0" source-map-support "^0.5.19" @@ -3093,17 +3401,41 @@ builder-util@24.13.1: cac@^6.7.14: version "6.7.14" - resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== +cacache@^16.1.0: + version "16.1.3" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" + integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== + dependencies: + "@npmcli/fs" "^2.1.0" + "@npmcli/move-file" "^2.0.0" + chownr "^2.0.0" + fs-minipass "^2.1.0" + glob "^8.0.1" + infer-owner "^1.0.4" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + mkdirp "^1.0.4" + p-map "^4.0.0" + promise-inflight "^1.0.1" + rimraf "^3.0.2" + ssri "^9.0.0" + tar "^6.1.11" + unique-filename "^2.0.0" + cacheable-lookup@^5.0.3: version "5.0.4" - resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== cacheable-request@^7.0.2: version "7.0.4" - resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== dependencies: clone-response "^1.0.2" @@ -3116,7 +3448,7 @@ cacheable-request@^7.0.2: call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: es-define-property "^1.0.0" @@ -3127,31 +3459,31 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001587: - version "1.0.30001620" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz" - integrity sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew== +caniuse-lite@^1.0.30001663: + version "1.0.30001664" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz#d588d75c9682d3301956b05a3749652a80677df4" + integrity sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g== chalk@^2.4.2: version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -3159,12 +3491,12 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.2: chalk@^5.3.0: version "5.3.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== check-disk-space@^3.4.0: version "3.4.0" - resolved "https://registry.npmjs.org/check-disk-space/-/check-disk-space-3.4.0.tgz" + resolved "https://registry.yarnpkg.com/check-disk-space/-/check-disk-space-3.4.0.tgz#eb8e69eee7a378fd12e35281b8123a8b4c4a8ff7" integrity sha512-drVkSqfwA+TvuEhFipiR1OC9boEGZL5RrWvVsOthdcvQNXyCCuKkEiTOTXZ7qxSf/GLwq4GvzfrQD/Wz325hgw== chokidar@^3.5.3: @@ -3184,37 +3516,54 @@ chokidar@^3.5.3: chownr@^1.1.1: version "1.1.4" - resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chownr@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +chownr@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz#9855e64ecd240a9cc4267ce8a4aa5d24a1da15e4" + integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== + chromium-pickle-js@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" integrity sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw== ci-info@^3.2.0: version "3.9.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.2.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c" - integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q== + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== classnames@^2.5.1: version "2.5.1" - resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + cli-highlight@^2.1.11: version "2.1.11" - resolved "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz" + resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== dependencies: chalk "^4.0.0" @@ -3224,6 +3573,11 @@ cli-highlight@^2.1.11: parse5-htmlparser2-tree-adapter "^6.0.0" yargs "^16.0.0" +cli-spinners@^2.5.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" @@ -3234,7 +3588,7 @@ cli-truncate@^2.1.0: cliui@^7.0.2: version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -3243,7 +3597,7 @@ cliui@^7.0.2: cliui@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" @@ -3252,51 +3606,61 @@ cliui@^8.0.1: clone-response@^1.0.2: version "1.0.3" - resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== dependencies: mimic-response "^1.0.0" +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== color-string@^1.9.0: version "1.9.1" - resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + color.js@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/color.js/-/color.js-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/color.js/-/color.js-1.2.0.tgz#18d9f55545111730d25ccf18ea8b6933c71440d7" integrity sha512-0ajlNgWWOR7EK9N6l2h0YKsZPzMCLQG5bheCoTGpGfhkR8tB5eQNItdua1oFHDTeq9JKgSzQJqo+Gp3V/xW+Lw== color@^4.2.3: version "4.2.3" - resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== dependencies: color-convert "^2.0.1" @@ -3309,7 +3673,7 @@ colorette@2.0.19: combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" @@ -3321,12 +3685,12 @@ commander@^10.0.0: commander@^5.0.0: version "5.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== compare-func@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" @@ -3334,44 +3698,49 @@ compare-func@^2.0.0: compare-version@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== confbox@^0.1.7: version "0.1.7" - resolved "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.7.tgz#ccfc0a2bcae36a84838e83a3b7f770fb17d6c579" integrity sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA== -config-file-ts@^0.2.4: - version "0.2.6" - resolved "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz" - integrity sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w== +config-file-ts@0.2.8-rc1: + version "0.2.8-rc1" + resolved "https://registry.yarnpkg.com/config-file-ts/-/config-file-ts-0.2.8-rc1.tgz#fb7fc6ccb2e313f69dbeb78f1db0b00038049de0" + integrity sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg== dependencies: - glob "^10.3.10" - typescript "^5.3.3" + glob "^10.3.12" + typescript "^5.4.3" + +console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== conventional-changelog-angular@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz#5eec8edbff15aa9b1680a8dcfbd53e2d7eb2ba7a" integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== dependencies: compare-func "^2.0.0" conventional-changelog-conventionalcommits@^7.0.2: version "7.0.2" - resolved "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz" + resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz#aa5da0f1b2543094889e8cf7616ebe1a8f5c70d5" integrity sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w== dependencies: compare-func "^2.0.0" conventional-commits-parser@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz#57f3594b81ad54d40c1b4280f04554df28627d9a" integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== dependencies: JSONStream "^1.3.5" @@ -3381,7 +3750,7 @@ conventional-commits-parser@^5.0.0: convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== core-util-is@1.0.2: @@ -3391,14 +3760,14 @@ core-util-is@1.0.2: cosmiconfig-typescript-loader@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA== dependencies: jiti "^1.19.1" cosmiconfig@^8.1.3: version "8.3.6" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== dependencies: import-fresh "^3.3.0" @@ -3408,7 +3777,7 @@ cosmiconfig@^8.1.3: cosmiconfig@^9.0.0: version "9.0.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== dependencies: env-paths "^2.2.1" @@ -3425,7 +3794,7 @@ crc@^3.8.0: create-desktop-shortcuts@^1.11.0: version "1.11.0" - resolved "https://registry.npmjs.org/create-desktop-shortcuts/-/create-desktop-shortcuts-1.11.0.tgz" + resolved "https://registry.yarnpkg.com/create-desktop-shortcuts/-/create-desktop-shortcuts-1.11.0.tgz#8eed89329e9bce70dece46d02a80573fe1f2536d" integrity sha512-nmVtPVqNyMuAyMpDnd7l++hb2laqCWZXnHQaFhqGT1YEi2Ve3unu6QyuyIpGxAwIscNHcG1Ehnl+lFw6ygB2nQ== dependencies: which "2.0.2" @@ -3437,7 +3806,7 @@ create-require@^1.1.0: cross-fetch-ponyfill@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/cross-fetch-ponyfill/-/cross-fetch-ponyfill-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/cross-fetch-ponyfill/-/cross-fetch-ponyfill-1.0.3.tgz#5c5524e3bd3374e71d5016c2327e416369a57527" integrity sha512-uOBkDhUAGAbx/FEzNKkOfx3w57H8xReBBXoZvUnOKTI0FW0Xvrj3GrYv2iZXUqlffC1LMGfQzhmBM/ke+6eTDA== dependencies: abort-controller "^3.0.0" @@ -3445,7 +3814,7 @@ cross-fetch-ponyfill@^1.0.3: cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -3454,44 +3823,44 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: css-what@^6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== cssstyle@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz" - integrity sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ== + version "4.1.0" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.1.0.tgz#161faee382af1bafadb6d3867a92a19bcb4aea70" + integrity sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA== dependencies: - rrweb-cssom "^0.6.0" + rrweb-cssom "^0.7.1" csstype@^3.0.2, csstype@^3.0.7: version "3.1.3" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== damerau-levenshtein@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== dargs@^8.0.0: version "8.1.0" - resolved "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-8.1.0.tgz#a34859ea509cbce45485e5aa356fef70bfcc7272" integrity sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw== data-uri-to-buffer@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== data-urls@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde" integrity sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg== dependencies: whatwg-mimetype "^4.0.0" @@ -3499,7 +3868,7 @@ data-urls@^5.0.0: data-view-buffer@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== dependencies: call-bind "^1.0.6" @@ -3508,7 +3877,7 @@ data-view-buffer@^1.0.1: data-view-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== dependencies: call-bind "^1.0.7" @@ -3517,7 +3886,7 @@ data-view-byte-length@^1.0.1: data-view-byte-offset@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== dependencies: call-bind "^1.0.6" @@ -3526,29 +3895,36 @@ data-view-byte-offset@^1.0.0: date-fns@^3.6.0: version "3.6.0" - resolved "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.6.0.tgz#f20ca4fe94f8b754951b24240676e8618c0206bf" integrity sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww== dayjs@^1.11.9: - version "1.11.11" - resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.11.tgz" - integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== -debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +debug@4.3.4: version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" decimal.js@^10.4.3: version "10.4.3" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" + resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== decode-bmp@^0.2.0: version "0.2.1" - resolved "https://registry.npmjs.org/decode-bmp/-/decode-bmp-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/decode-bmp/-/decode-bmp-0.2.1.tgz#cec3e0197ec3b6c60f02220f50e8757030ff2427" integrity sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA== dependencies: "@canvas/image-data" "^1.0.0" @@ -3556,7 +3932,7 @@ decode-bmp@^0.2.0: decode-ico@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/decode-ico/-/decode-ico-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/decode-ico/-/decode-ico-0.4.1.tgz#e0f7373081532c7b8495bd51fb225d354e14de25" integrity sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA== dependencies: "@canvas/image-data" "^1.0.0" @@ -3565,53 +3941,84 @@ decode-ico@^0.4.1: decompress-response@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: mimic-response "^3.1.0" dedent@^1.5.1, dedent@^1.5.3: version "1.5.3" - resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deep-object-diff@^1.1.9: version "1.1.9" - resolved "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz" + resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.9.tgz#6df7ef035ad6a0caa44479c536ed7b02570f4595" integrity sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA== deepmerge@4.3.1, deepmerge@^4.2.2: version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + defer-to-connect@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" es-errors "^1.3.0" gopd "^1.0.1" -define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: define-data-property "^1.0.1" @@ -3620,22 +4027,22 @@ define-properties@^1.2.0, define-properties@^1.2.1: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== -detect-libc@^2.0.0: +detect-libc@^2.0.0, detect-libc@^2.0.1: version "2.0.3" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== detect-node@^2.0.4: version "2.1.0" - resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== dexie@^4.0.8: @@ -3648,29 +4055,29 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -dir-compare@^3.0.0: - version "3.3.0" - resolved "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz" - integrity sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg== +dir-compare@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-4.2.0.tgz#d1d4999c14fbf55281071fdae4293b3b9ce86f19" + integrity sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ== dependencies: - buffer-equal "^1.0.0" - minimatch "^3.0.4" + minimatch "^3.0.5" + p-limit "^3.1.0 " dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" -dmg-builder@24.13.3: - version "24.13.3" - resolved "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz" - integrity sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ== +dmg-builder@25.1.8: + version "25.1.8" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-25.1.8.tgz#41f3b725edd896156e891016a44129e1bd580430" + integrity sha512-NoXo6Liy2heSklTI5OIZbCgXC1RzrDQsZkeEwXhdOro3FT1VBOvbubvscdPnjVuQ4AMwwv61oaH96AbiYg9EnQ== dependencies: - app-builder-lib "24.13.3" - builder-util "24.13.1" - builder-util-runtime "9.2.4" + app-builder-lib "25.1.8" + builder-util "25.1.7" + builder-util-runtime "9.2.10" fs-extra "^10.1.0" iconv-lite "^0.6.2" js-yaml "^4.1.0" @@ -3693,21 +4100,21 @@ dmg-license@^1.0.11: doctrine@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" dot-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== dependencies: no-case "^3.0.4" @@ -3715,115 +4122,111 @@ dot-case@^3.0.4: dot-prop@^5.1.0: version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" -dotenv-expand@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz" - integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== +dotenv-expand@^11.0.6: + version "11.0.6" + resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-11.0.6.tgz#f2c840fd924d7c77a94eff98f153331d876882d3" + integrity sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g== + dependencies: + dotenv "^16.4.4" -dotenv@^16.0.3, dotenv@^16.3.1: +dotenv@^16.0.3, dotenv@^16.3.1, dotenv@^16.4.4, dotenv@^16.4.5: version "16.4.5" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== -dotenv@^9.0.2: - version "9.0.2" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz" - integrity sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg== - eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ecdsa-sig-formatter@1.0.11: version "1.0.11" - resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== dependencies: safe-buffer "^5.0.1" ejs@^3.1.8: version "3.1.10" - resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== dependencies: jake "^10.8.5" -electron-builder@^24.9.1: - version "24.13.3" - resolved "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz" - integrity sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg== +electron-builder@^25.1.8: + version "25.1.8" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-25.1.8.tgz#b0e310f1600787610bb84c3f39bc7aadb2548486" + integrity sha512-poRgAtUHHOnlzZnc9PK4nzG53xh74wj2Jy7jkTrqZ0MWPoHGh1M2+C//hGeYdA+4K8w4yiVCNYoLXF7ySj2Wig== dependencies: - app-builder-lib "24.13.3" - builder-util "24.13.1" - builder-util-runtime "9.2.4" + app-builder-lib "25.1.8" + builder-util "25.1.7" + builder-util-runtime "9.2.10" chalk "^4.1.2" - dmg-builder "24.13.3" + dmg-builder "25.1.8" fs-extra "^10.1.0" is-ci "^3.0.0" lazy-val "^1.0.5" - read-config-file "6.3.2" simple-update-notifier "2.0.0" yargs "^17.6.2" -electron-log@^5.1.4: - version "5.1.4" - resolved "https://registry.npmjs.org/electron-log/-/electron-log-5.1.4.tgz" - integrity sha512-P0RSXnwT3z+e89Z5uAcZDeN85/QjIgv764a93kqCi+wh2Jm22CCbc3AGDt4S8rsxAHWHB4Q0PGsQl3fw1AN0kQ== +electron-log@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/electron-log/-/electron-log-5.2.0.tgz#505716926dfcf9cb3e74f42b1003be6d865bcb88" + integrity sha512-VjLkvaLmbP3AOGOh5Fob9M8bFU0mmeSAb5G2EoTBx+kQLf2XA/0byzjsVGBTHhikbT+m1AB27NEQUv9wX9nM8w== -electron-publish@24.13.1: - version "24.13.1" - resolved "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz" - integrity sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A== +electron-publish@25.1.7: + version "25.1.7" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-25.1.7.tgz#14e50c2a3fafdc1c454eadbbc47ead89a48bb554" + integrity sha512-+jbTkR9m39eDBMP4gfbqglDd6UvBC7RLh5Y0MhFSsc6UkGHj9Vj9TWobxevHYMMqmoujL11ZLjfPpMX+Pt6YEg== dependencies: "@types/fs-extra" "^9.0.11" - builder-util "24.13.1" - builder-util-runtime "9.2.4" + builder-util "25.1.7" + builder-util-runtime "9.2.10" chalk "^4.1.2" fs-extra "^10.1.0" lazy-val "^1.0.5" mime "^2.5.2" -electron-to-chromium@^1.4.668: - version "1.4.773" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.773.tgz" - integrity sha512-87eHF+h3PlCRwbxVEAw9KtK3v7lWfc/sUDr0W76955AdYTG4bV/k0zrl585Qnj/skRMH2qOSiE+kqMeOQ+LOpw== +electron-to-chromium@^1.5.28: + version "1.5.30" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.30.tgz#5b264b489cfe0c3dd71097c164d795444834e7c7" + integrity sha512-sXI35EBN4lYxzc/pIGorlymYNzDBOqkSlVRe6MkgBsW/hW1tpC/HDJ2fjG7XnjakzfLEuvdmux0Mjs6jHq4UOA== -electron-updater@^6.1.8: - version "6.1.8" - resolved "https://registry.npmjs.org/electron-updater/-/electron-updater-6.1.8.tgz" - integrity sha512-hhOTfaFAd6wRHAfUaBhnAOYc+ymSGCWJLtFkw4xJqOvtpHmIdNHnXDV9m1MHC+A6q08Abx4Ykgyz/R5DGKNAMQ== +electron-updater@^6.3.9: + version "6.3.9" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-6.3.9.tgz#e1e7f155624c58e6f3760f376c3a584028165ec4" + integrity sha512-2PJNONi+iBidkoC5D1nzT9XqsE8Q1X28Fn6xRQhO3YX8qRRyJ3mkV4F1aQsuRnYPqq6Hw+E51y27W75WgDoofw== dependencies: - builder-util-runtime "9.2.3" + builder-util-runtime "9.2.10" 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.3.8" + semver "^7.6.3" tiny-typed-emitter "^2.1.0" electron-vite@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/electron-vite/-/electron-vite-2.2.0.tgz" - integrity sha512-WvE8KlZTiay9uWqBRvnYuxg2JqIicaNqaz9qFvsZkIae2/FmqZC5jctziyduCuuwVxqJG0Sjh8RlTwSn8xcCoQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/electron-vite/-/electron-vite-2.3.0.tgz#58de48f9423980d860d2648e59fdbf0f8cd74b8c" + integrity sha512-lsN2FymgJlp4k6MrcsphGqZQ9fKRdJKasoaiwIrAewN1tapYI/KINLdfEL7n10LuF0pPSNf/IqjzZbB5VINctg== dependencies: - "@babel/core" "^7.23.5" - "@babel/plugin-transform-arrow-functions" "^7.23.3" + "@babel/core" "^7.24.7" + "@babel/plugin-transform-arrow-functions" "^7.24.7" cac "^6.7.14" - esbuild "^0.19.8" - magic-string "^0.30.5" - picocolors "^1.0.0" + esbuild "^0.21.5" + magic-string "^0.30.10" + picocolors "^1.0.1" electron@^30.3.0: - version "30.3.1" - resolved "https://registry.yarnpkg.com/electron/-/electron-30.3.1.tgz#fe27ca2a4739bec832b2edd6f46140ab46bf53a0" - integrity sha512-Ai/OZ7VlbFAVYMn9J5lyvtr+ZWyEbXDVd5wBLb5EVrp4352SRmMAmN5chcIe3n9mjzcgehV9n4Hwy15CJW+YbA== + version "30.5.1" + resolved "https://registry.yarnpkg.com/electron/-/electron-30.5.1.tgz#9f6060ce5b869c3803cbf8064305e9c3056c0744" + integrity sha512-AhL7+mZ8Lg14iaNfoYTkXQ2qee8mmsQyllKdqxlpv/zrKgfxz6jNVtcRRbQtLxtF8yzcImWdfTQROpYiPumdbw== dependencies: "@electron/get" "^2.0.0" "@types/node" "^20.9.0" @@ -3831,46 +4234,53 @@ electron@^30.3.0: emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" entities@^4.4.0: version "4.5.0" - resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== env-paths@^2.2.0, env-paths@^2.2.1: version "2.2.1" - resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== err-code@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== error-ex@^1.3.1: version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: +es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== dependencies: array-buffer-byte-length "^1.0.1" @@ -3922,19 +4332,34 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23 es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: get-intrinsic "^1.2.4" -es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-iterator-helpers@^1.0.19: version "1.0.19" - resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== dependencies: call-bind "^1.0.7" @@ -3954,14 +4379,14 @@ es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: es-object-atoms@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== dependencies: get-intrinsic "^1.2.4" @@ -3970,14 +4395,14 @@ es-set-tostringtag@^2.0.3: es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== dependencies: is-callable "^1.1.4" @@ -3986,12 +4411,41 @@ es-to-primitive@^1.2.1: es6-error@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -esbuild@^0.19.8, "esbuild@npm:esbuild@~0.17.6 || ~0.18.0 || ~0.19.0": +esbuild@^0.21.3, esbuild@^0.21.5: + version "0.21.5" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +"esbuild@npm:esbuild@~0.17.6 || ~0.18.0 || ~0.19.0": version "0.19.12" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== optionalDependencies: "@esbuild/aix-ppc64" "0.19.12" @@ -4018,117 +4472,88 @@ esbuild@^0.19.8, "esbuild@npm:esbuild@~0.17.6 || ~0.18.0 || ~0.19.0": "@esbuild/win32-ia32" "0.19.12" "@esbuild/win32-x64" "0.19.12" -esbuild@^0.20.1: - version "0.20.2" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz" - integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== - optionalDependencies: - "@esbuild/aix-ppc64" "0.20.2" - "@esbuild/android-arm" "0.20.2" - "@esbuild/android-arm64" "0.20.2" - "@esbuild/android-x64" "0.20.2" - "@esbuild/darwin-arm64" "0.20.2" - "@esbuild/darwin-x64" "0.20.2" - "@esbuild/freebsd-arm64" "0.20.2" - "@esbuild/freebsd-x64" "0.20.2" - "@esbuild/linux-arm" "0.20.2" - "@esbuild/linux-arm64" "0.20.2" - "@esbuild/linux-ia32" "0.20.2" - "@esbuild/linux-loong64" "0.20.2" - "@esbuild/linux-mips64el" "0.20.2" - "@esbuild/linux-ppc64" "0.20.2" - "@esbuild/linux-riscv64" "0.20.2" - "@esbuild/linux-s390x" "0.20.2" - "@esbuild/linux-x64" "0.20.2" - "@esbuild/netbsd-x64" "0.20.2" - "@esbuild/openbsd-x64" "0.20.2" - "@esbuild/sunos-x64" "0.20.2" - "@esbuild/win32-arm64" "0.20.2" - "@esbuild/win32-ia32" "0.20.2" - "@esbuild/win32-x64" "0.20.2" - -escalade@^3.1.1, escalade@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-config-prettier@^9.1.0: version "9.1.0" - resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== eslint-plugin-jsx-a11y@^6.8.0: - version "6.8.0" - resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + version "6.10.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz#36fb9dead91cafd085ddbe3829602fb10ef28339" + integrity sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg== dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" + aria-query "~5.1.3" + array-includes "^3.1.8" array.prototype.flatmap "^1.3.2" ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.1" + axe-core "^4.10.0" + axobject-query "^4.1.0" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.15" - hasown "^2.0.0" + es-iterator-helpers "^1.0.19" + hasown "^2.0.2" jsx-ast-utils "^3.3.5" language-tags "^1.0.9" minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" + object.fromentries "^2.0.8" + safe-regex-test "^1.0.3" + string.prototype.includes "^2.0.0" eslint-plugin-prettier@^5.0.1: - version "5.1.3" - resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz" - integrity sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw== + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz#d1c8f972d8f60e414c25465c163d16f209411f95" + integrity sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw== dependencies: prettier-linter-helpers "^1.0.0" - synckit "^0.8.6" + synckit "^0.9.1" eslint-plugin-react-hooks@^4.6.0: version "4.6.2" - resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz#c829eb06c0e6f484b3fbb85a97e57784f328c596" integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.33.2: - version "7.34.1" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz" - integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== + version "7.37.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz#56493d7d69174d0d828bc83afeffe96903fdadbd" + integrity sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg== dependencies: - array-includes "^3.1.7" - array.prototype.findlast "^1.2.4" + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" - array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" + array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" - es-iterator-helpers "^1.0.17" + es-iterator-helpers "^1.0.19" estraverse "^5.3.0" + hasown "^2.0.2" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - object.hasown "^1.1.3" - object.values "^1.1.7" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.values "^1.2.0" prop-types "^15.8.1" resolve "^2.0.0-next.5" semver "^6.3.1" - string.prototype.matchall "^4.0.10" + string.prototype.matchall "^4.0.11" + string.prototype.repeat "^1.0.0" eslint-scope@^7.2.2: version "7.2.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" @@ -4136,19 +4561,19 @@ eslint-scope@^7.2.2: eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.56.0: - version "8.57.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -4190,7 +4615,7 @@ esm@^3.2.25: espree@^9.6.0, espree@^9.6.1: version "9.6.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" @@ -4198,37 +4623,37 @@ espree@^9.6.0, espree@^9.6.1: eslint-visitor-keys "^3.4.1" esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eval@0.1.8: version "0.1.8" - resolved "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz" + resolved "https://registry.yarnpkg.com/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== dependencies: "@types/node" "*" @@ -4236,12 +4661,12 @@ eval@0.1.8: event-target-shim@^5.0.0: version "5.0.1" - resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== execa@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" + resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== dependencies: cross-spawn "^7.0.3" @@ -4256,12 +4681,17 @@ execa@^8.0.1: expand-template@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + extract-zip@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== dependencies: debug "^4.1.1" @@ -4277,17 +4707,17 @@ extsprintf@^1.2.0: fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: version "1.3.0" - resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.9: version "3.3.2" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -4298,79 +4728,65 @@ fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.17.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" fd-slicer@~1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== dependencies: pend "~1.2.0" fetch-blob@^3.1.2, fetch-blob@^3.1.4: version "3.2.0" - resolved "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== dependencies: node-domexception "^1.0.0" web-streams-polyfill "^3.0.3" -fetch-cookie@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-3.0.1.tgz" - integrity sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q== - dependencies: - set-cookie-parser "^2.4.8" - tough-cookie "^4.0.0" - file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" -file-type@^18.7.0: - version "18.7.0" - resolved "https://registry.npmjs.org/file-type/-/file-type-18.7.0.tgz" - integrity sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw== +file-type@^19.0.0: + version "19.5.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-19.5.0.tgz#c13c5eca9c1c7270f6d5fbff70331b3c976f92b5" + integrity sha512-dMuq6WWnP6BpQY0zYJNpTtQWgeCImSMG0BTIzUBXvxbwc1HWP/E7AE4UWU9XSCOPGJuOHda0HpDnwM2FW+d90A== dependencies: - readable-web-to-node-stream "^3.0.2" - strtok3 "^7.0.0" - token-types "^5.0.1" + get-stream "^9.0.1" + strtok3 "^8.1.0" + token-types "^6.0.0" + uint8array-extras "^1.3.0" file-uri-to-path@1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== filelist@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== dependencies: minimatch "^5.0.1" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" @@ -4380,7 +4796,7 @@ fill-range@^7.1.1: find-up@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -4388,7 +4804,7 @@ find-up@^5.0.0: find-up@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-7.0.0.tgz#e8dec1455f74f78d888ad65bf7ca13dd2b4e66fb" integrity sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g== dependencies: locate-path "^7.2.0" @@ -4397,7 +4813,7 @@ find-up@^7.0.0: flat-cache@^3.0.4: version "3.2.0" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" @@ -4406,37 +4822,37 @@ flat-cache@^3.0.4: flatted@^3.2.9: version "3.3.1" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== flexsearch@^0.7.43: version "0.7.43" - resolved "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.43.tgz" + resolved "https://registry.yarnpkg.com/flexsearch/-/flexsearch-0.7.43.tgz#34f89b36278a466ce379c5bf6fb341965ed3f16c" integrity sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg== follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== dependencies: is-callable "^1.1.3" foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + version "3.3.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" form-data@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -4445,28 +4861,37 @@ form-data@^4.0.0: formdata-polyfill@^4.0.10: version "4.0.10" - resolved "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== dependencies: fetch-blob "^3.1.2" fs-constants@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fs-extra@^10.0.0, fs-extra@^10.1.0: version "10.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.1.1: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.1.0: version "8.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: graceful-fs "^4.2.0" @@ -4475,7 +4900,7 @@ fs-extra@^8.1.0: fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -4483,16 +4908,16 @@ fs-extra@^9.0.0, fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0: +fs-minipass@^2.0.0, fs-minipass@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2, fsevents@~2.3.3: @@ -4502,12 +4927,12 @@ fsevents@~2.3.2, fsevents@~2.3.3: function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: +function.prototype.name@^1.1.6: version "1.1.6" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" @@ -4517,22 +4942,36 @@ function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: functions-have-names@^1.2.3: version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: es-errors "^1.3.0" @@ -4548,24 +4987,32 @@ get-package-type@^0.1.0: get-stdin@^9.0.0: version "9.0.0" - resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== get-stream@^5.1.0: version "5.2.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" get-stream@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== +get-stream@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-9.0.1.tgz#95157d21df8eb90d1647102b63039b1df60ebd27" + integrity sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA== + dependencies: + "@sec-ant/readable-stream" "^0.4.1" + is-stream "^4.0.1" + get-symbol-description@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: call-bind "^1.0.5" @@ -4579,7 +5026,7 @@ getopts@2.3.0: git-raw-commits@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-4.0.0.tgz#b212fd2bff9726d27c1283a1157e829490593285" integrity sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ== dependencies: dargs "^8.0.0" @@ -4588,19 +5035,19 @@ git-raw-commits@^4.0.0: github-from-package@0.0.0: version "0.0.0" - resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" @@ -4616,9 +5063,21 @@ glob@^10.3.10: minipass "^7.0.4" path-scurry "^1.11.0" -glob@^7.1.3, glob@^7.1.6: +glob@^10.3.12, glob@^10.3.7: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -4628,6 +5087,17 @@ glob@^7.1.3, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.1: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + glob@^9.3.2: version "9.3.5" resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" @@ -4640,7 +5110,7 @@ glob@^9.3.2: global-agent@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6" integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== dependencies: boolean "^3.0.1" @@ -4652,26 +5122,26 @@ global-agent@^3.0.0: global-directory@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== dependencies: ini "4.1.1" globals@^11.1.0: version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: version "13.24.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globalthis@^1.0.1, globalthis@^1.0.3: version "1.0.4" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== dependencies: define-properties "^1.2.1" @@ -4679,7 +5149,7 @@ globalthis@^1.0.1, globalthis@^1.0.3: globby@^11.1.0: version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -4691,14 +5161,14 @@ globby@^11.1.0: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" -got@^11.8.5: +got@^11.7.0, got@^11.8.5: version "11.8.6" - resolved "https://registry.npmjs.org/got/-/got-11.8.6.tgz" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== dependencies: "@sindresorhus/is" "^4.0.0" @@ -4713,105 +5183,110 @@ got@^11.8.5: p-cancelable "^2.0.0" responselike "^2.0.0" -graceful-fs@^4.1.6, graceful-fs@^4.2.0: +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.6: version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-proto@^1.0.1, has-proto@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" highlight.js@^10.7.1: version "10.7.3" - resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== hosted-git-info@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: lru-cache "^6.0.0" html-encoding-sniffer@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz#696df529a7cfd82446369dc5193e590a3735b448" integrity sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ== dependencies: whatwg-encoding "^3.1.1" html-parse-stringify@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== dependencies: void-elements "3.1.0" -http-cache-semantics@^4.0.0: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0: version "4.1.1" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: "@tootallnate/once" "2" agent-base "6" debug "4" -http-proxy-agent@^7.0.0: +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.2: version "7.0.2" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: agent-base "^7.1.0" @@ -4819,60 +5294,67 @@ http-proxy-agent@^7.0.0: http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" - resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== dependencies: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: +https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" debug "4" -https-proxy-agent@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz" - integrity sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg== +https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== dependencies: agent-base "^7.0.2" debug "4" human-signals@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + husky@^9.0.11: - version "9.0.11" - resolved "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz" - integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== + version "9.1.6" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.6.tgz#e23aa996b6203ab33534bdc82306b0cf2cb07d6c" + integrity sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A== i18next-browser-languagedetector@^7.2.1: version "7.2.1" - resolved "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz" + resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz#1968196d437b4c8db847410c7c33554f6c448f6f" integrity sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw== dependencies: "@babel/runtime" "^7.23.2" i18next@^23.11.2: - version "23.11.4" - resolved "https://registry.npmjs.org/i18next/-/i18next-23.11.4.tgz" - integrity sha512-CCUjtd5TfaCl+mLUzAA0uPSN+AVn4fP/kWCYt/hocPUwusTpMVczdrRyOBUwk6N05iH40qiKx6q1DoNJtBIwdg== + version "23.15.1" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.15.1.tgz#c50de337bf12ca5195e697cc0fbe5f32304871d9" + integrity sha512-wB4abZ3uK7EWodYisHl/asf8UYEhrI/vj/8aoSsrj/ZDxj4/UXPOa1KvFt1Fq5hkUHquNqwFlDprmjZ8iySgYA== dependencies: "@babel/runtime" "^7.23.2" -icojs@^0.19.3: - version "0.19.3" - resolved "https://registry.npmjs.org/icojs/-/icojs-0.19.3.tgz" - integrity sha512-Q6syRxwoEACLRl7uTiee72038vDbq4gF6ot7JFsXmxj0WtkgGQiUxCdEJtwxd8nfADr9mPmGtpmbORJursaOsQ== +icojs@^0.19.4: + version "0.19.4" + resolved "https://registry.yarnpkg.com/icojs/-/icojs-0.19.4.tgz#fdbc9e61a0945ed1d331beb358d67f72cf7d78dc" + integrity sha512-86oNepPk2jAmbb96BPeucZI7HoSBobFlXDhhjIbwRb3wkQpvdBO5HO9KtMUNzMFT3qqQZsjLsfW+L0/9Rl9VqA== dependencies: - "@jimp/bmp" "^0.22.10" + "@jimp/bmp" "^0.22.12" decode-ico "^0.4.1" - file-type "^18.7.0" + file-type "^19.0.0" jpeg-js "^0.4.4" pngjs "^7.0.0" to-data-view "^2.0.0" @@ -4887,29 +5369,29 @@ iconv-corefoundation@^1.1.7: iconv-lite@0.6.3, iconv-lite@^0.6.2: version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.2.0, ignore@^5.2.4: - version "5.3.1" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== immer@^10.0.3: version "10.1.1" - resolved "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz" + resolved "https://registry.yarnpkg.com/immer/-/immer-10.1.1.tgz#206f344ea372d8ea176891545ee53ccc062db7bc" integrity sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw== import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -4946,9 +5428,9 @@ import-in-the-middle@1.8.0: module-details-from-path "^1.0.3" import-in-the-middle@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.8.1.tgz#8b51c2cc631b64e53e958d7048d2d9463ce628f8" - integrity sha512-yhRwoHtiLGvmSozNOALgjRPFI6uYsds60EoMqqnXyyv+JOIW/BrrLejuTGBt+bq0T5tLzOHrN0T7xYTm4Qt/ng== + version "1.11.2" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.11.2.tgz#dd848e72b63ca6cd7c34df8b8d97fc9baee6174f" + integrity sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA== dependencies: acorn "^8.8.2" acorn-import-attributes "^1.9.5" @@ -4957,17 +5439,27 @@ import-in-the-middle@^1.8.1: import-meta-resolve@^4.0.0: version "4.1.0" - resolved "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +infer-owner@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -4975,22 +5467,22 @@ inflight@^1.0.4: inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== ini@~1.3.0: version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -internal-slot@^1.0.7: +internal-slot@^1.0.4, internal-slot@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: es-errors "^1.3.0" @@ -5002,9 +5494,25 @@ interpret@^2.2.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== -is-array-buffer@^3.0.4: +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" @@ -5012,24 +5520,24 @@ is-array-buffer@^3.0.4: is-arrayish@^0.2.1: version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-async-function@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== dependencies: has-tostringtag "^1.0.0" is-bigint@^1.0.1: version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== dependencies: has-bigints "^1.0.1" @@ -5043,7 +5551,7 @@ is-binary-path@~2.1.0: is-boolean-object@^1.1.0: version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: call-bind "^1.0.2" @@ -5051,173 +5559,193 @@ is-boolean-object@^1.1.0: is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: ci-info "^3.2.0" is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-data-view@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== dependencies: is-typed-array "^1.1.13" is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== dependencies: has-tostringtag "^1.0.0" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-finalizationregistry@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== dependencies: call-bind "^1.0.2" is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-function@^1.0.10: version "1.0.10" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== dependencies: has-tostringtag "^1.0.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" -is-map@^2.0.3: +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== is-negative-zero@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-potential-custom-element-name@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-regex@^1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-set@^2.0.3: +is-set@^2.0.2, is-set@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: call-bind "^1.0.7" is-stream@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== +is-stream@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-4.0.1.tgz#375cf891e16d2e4baec250b85926cffc14720d9b" + integrity sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: has-symbols "^1.0.2" is-text-path@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-2.0.0.tgz#b2484e2b720a633feb2e85b67dc193ff72c75636" integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== dependencies: text-extensions "^2.0.0" is-typed-array@^1.1.13: version "1.1.13" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: which-typed-array "^1.1.14" +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-weakmap@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== is-weakref@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: call-bind "^1.0.2" is-weakset@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== dependencies: call-bind "^1.0.7" @@ -5225,27 +5753,27 @@ is-weakset@^2.0.3: isarray@^2.0.5: version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isbinaryfile@^4.0.8: version "4.0.10" - resolved "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== isbinaryfile@^5.0.0: version "5.0.2" - resolved "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.2.tgz" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-5.0.2.tgz#fe6e4dfe2e34e947ffa240c113444876ba393ae0" integrity sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== iterator.prototype@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== dependencies: define-properties "^1.2.1" @@ -5256,17 +5784,26 @@ iterator.prototype@^1.1.2: jackspeak@^2.3.6: version "2.3.6" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + jake@^10.8.5: - version "10.9.1" - resolved "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz" - integrity sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w== + version "10.9.2" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== dependencies: async "^3.2.3" chalk "^4.0.2" @@ -5275,108 +5812,113 @@ jake@^10.8.5: javascript-stringify@^2.0.1: version "2.1.0" - resolved "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== jiti@^1.19.1: - version "1.21.0" - resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== jpeg-js@^0.4.4: version "0.4.4" - resolved "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz" + resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.4.tgz#a9f1c6f1f9f0fa80cdb3484ed9635054d28936aa" integrity sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg== "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + jsdom@^24.0.0: - version "24.0.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz" - integrity sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A== + version "24.1.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-24.1.3.tgz#88e4a07cb9dd21067514a619e9f17b090a394a9f" + integrity sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ== dependencies: cssstyle "^4.0.1" data-urls "^5.0.0" decimal.js "^10.4.3" form-data "^4.0.0" html-encoding-sniffer "^4.0.0" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.2" + http-proxy-agent "^7.0.2" + https-proxy-agent "^7.0.5" is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.7" + nwsapi "^2.2.12" parse5 "^7.1.2" - rrweb-cssom "^0.6.0" + rrweb-cssom "^0.7.1" saxes "^6.0.0" symbol-tree "^3.2.4" - tough-cookie "^4.1.3" + tough-cookie "^4.1.4" w3c-xmlserializer "^5.0.0" webidl-conversions "^7.0.0" whatwg-encoding "^3.1.1" whatwg-mimetype "^4.0.0" whatwg-url "^14.0.0" - ws "^8.16.0" + ws "^8.18.0" xml-name-validator "^5.0.0" jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-parse-even-better-errors@^2.3.0: version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json-stringify-safe@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^2.2.0, json5@^2.2.3: +json5@^2.2.3: version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -5385,12 +5927,12 @@ jsonfile@^6.0.1: jsonparse@^1.2.0: version "1.3.1" - resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== jsonwebtoken@^9.0.2: version "9.0.2" - resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== dependencies: jws "^3.2.2" @@ -5406,7 +5948,7 @@ jsonwebtoken@^9.0.2: "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" - resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: array-includes "^3.1.6" @@ -5416,7 +5958,7 @@ jsonwebtoken@^9.0.2: jwa@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== dependencies: buffer-equal-constant-time "1.0.1" @@ -5425,7 +5967,7 @@ jwa@^1.4.1: jws@^3.2.2: version "3.2.2" - resolved "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== dependencies: jwa "^1.4.1" @@ -5433,7 +5975,7 @@ jws@^3.2.2: keyv@^4.0.0, keyv@^4.5.3: version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -5459,25 +6001,25 @@ knex@^3.1.0: tildify "2.0.0" language-subtag-registry@^0.3.20: - version "0.3.22" - resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + version "0.3.23" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== language-tags@^1.0.9: version "1.0.9" - resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== dependencies: language-subtag-registry "^0.3.20" -lazy-val@^1.0.4, lazy-val@^1.0.5: +lazy-val@^1.0.5: version "1.0.5" - resolved "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.5.tgz#6cf3b9f5bc31cee7ee3e369c0832b7583dcd923d" integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q== levn@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -5485,173 +6027,186 @@ levn@^0.4.1: lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" locate-path@^7.2.0: version "7.2.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== dependencies: p-locate "^6.0.0" lodash-es@^4.17.21: version "4.17.21" - resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash.camelcase@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash.clonedeep@^4.5.0: version "4.5.0" - resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== lodash.escaperegexp@^4.1.2: version "4.1.2" - resolved "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw== lodash.includes@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== lodash.isboolean@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== lodash.isequal@^4.5.0: version "4.5.0" - resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== lodash.isinteger@^4.0.4: version "4.0.4" - resolved "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== lodash.isnumber@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== lodash.isplainobject@^4.0.6: version "4.0.6" - resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== lodash.isstring@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== lodash.kebabcase@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.mergewith@^4.6.2: version "4.6.2" - resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== lodash.once@^4.0.0: version "4.1.1" - resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== lodash.snakecase@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== lodash.startcase@^4.4.0: version "4.4.0" - resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz#9436e34ed26093ed7ffae1936144350915d9add8" integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== lodash.uniq@^4.5.0: version "4.5.0" - resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash.upperfirst@^4.3.1: version "4.3.1" - resolved "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz" + resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" lottie-react@^2.4.0: version "2.4.0" - resolved "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.0.tgz" + resolved "https://registry.yarnpkg.com/lottie-react/-/lottie-react-2.4.0.tgz#f7249eee2b1deee70457a2d142194fdf2456e4bd" integrity sha512-pDJGj+AQlnlyHvOHFK7vLdsDcvbuqvwPZdMlJ360wrzGFurXeKPr8SiRCjLf3LrNYKANQtSsh5dz9UYQHuqx4w== dependencies: lottie-web "^5.10.2" lottie-web@^5.10.2: version "5.12.2" - resolved "https://registry.npmjs.org/lottie-web/-/lottie-web-5.12.2.tgz" + resolved "https://registry.yarnpkg.com/lottie-web/-/lottie-web-5.12.2.tgz#579ca9fe6d3fd9e352571edd3c0be162492f68e5" integrity sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg== lower-case@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== dependencies: tslib "^2.0.3" lowercase-keys@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== lru-cache@^10.2.0: - version "10.2.2" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz" - integrity sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" +lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + magic-string@0.30.8: version "0.30.8" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613" @@ -5659,16 +6214,16 @@ magic-string@0.30.8: dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" -magic-string@^0.30.5: - version "0.30.10" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz" - integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== +magic-string@^0.30.10: + version "0.30.11" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" + integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== dependencies: - "@jridgewell/sourcemap-codec" "^1.4.15" + "@jridgewell/sourcemap-codec" "^1.5.0" magnet-uri@^7.0.5: version "7.0.5" - resolved "https://registry.npmjs.org/magnet-uri/-/magnet-uri-7.0.5.tgz" + resolved "https://registry.yarnpkg.com/magnet-uri/-/magnet-uri-7.0.5.tgz#7b5143fd5527f3f612959eeeae264d6f4aeff37b" integrity sha512-Ke+dDiYHK1Rq/ZyGUAgk7NIkoypivxolTj/A0qr60ypP0FjeP+NTUNEhr965HsRan0zGxKEBK73+SsjRyJWkXg== dependencies: "@thaunknown/thirty-two" "^1.0.3" @@ -5680,92 +6235,126 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +make-fetch-happen@^10.0.3: + version "10.2.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" + integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^16.1.0" + http-cache-semantics "^4.1.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^3.1.6" + minipass-collect "^1.0.2" + minipass-fetch "^2.0.3" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^9.0.0" + matcher@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== dependencies: escape-string-regexp "^4.0.0" media-query-parser@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/media-query-parser/-/media-query-parser-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/media-query-parser/-/media-query-parser-2.0.2.tgz#ff79e56cee92615a304a1c2fa4f2bd056c0a1d29" integrity sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w== dependencies: "@babel/runtime" "^7.12.5" meow@^12.0.1: version "12.1.1" - resolved "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz" + resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mime@^2.5.2: version "2.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + mimic-fn@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== mimic-response@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== mimic-response@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== minimatch@9.0.3: version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: brace-expansion "^2.0.1" +minimatch@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" + integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1, minimatch@^5.1.1: +minimatch@^5.0.1: version "5.1.6" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" @@ -5777,21 +6366,60 @@ minimatch@^8.0.2: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.1: - version "9.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== +minimatch@^9.0.1, minimatch@^9.0.3, minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass@^3.0.0: +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" + integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== + dependencies: + minipass "^3.1.6" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0, minipass@^3.1.1, minipass@^3.1.6: version "3.3.6" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: yallist "^4.0.0" @@ -5803,57 +6431,70 @@ minipass@^4.2.4: minipass@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: - version "7.1.1" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz" - integrity sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -minizlib@^2.1.1: +minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" yallist "^4.0.0" +minizlib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.0.1.tgz#46d5329d1eb3c83924eff1d3b858ca0a31581012" + integrity sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg== + dependencies: + minipass "^7.0.4" + rimraf "^5.0.5" + mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" - resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== mkdirp@^0.5.1: version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -mkdirp@^1.0.3: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mkdirp@^2.1.3: version "2.1.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.6.tgz#964fbcb12b2d8c5d6fbc62a963ac95a273e2cc19" integrity sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A== -mlly@^1.4.2, mlly@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/mlly/-/mlly-1.7.0.tgz" - integrity sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ== +mkdirp@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + +mlly@^1.4.2, mlly@^1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.1.tgz#e0336429bb0731b6a8e887b438cbdae522c8f32f" + integrity sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA== dependencies: acorn "^8.11.3" pathe "^1.1.2" - pkg-types "^1.1.0" + pkg-types "^1.1.1" ufo "^1.5.3" modern-ahocorasick@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/modern-ahocorasick/-/modern-ahocorasick-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/modern-ahocorasick/-/modern-ahocorasick-1.0.1.tgz#dec373444f51b5458ac05216a8ec376e126dd283" integrity sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA== module-details-from-path@^1.0.3: @@ -5863,17 +6504,17 @@ module-details-from-path@^1.0.3: ms@2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: +ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== mz@^2.4.0: version "2.7.0" - resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" @@ -5882,39 +6523,36 @@ mz@^2.4.0: nanoid@^3.3.7: version "3.3.7" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== napi-build-utils@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -nice-napi@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nice-napi/-/nice-napi-1.0.2.tgz#dc0ab5a1eac20ce548802fc5686eaa6bc654927b" - integrity sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA== - dependencies: - node-addon-api "^3.0.0" - node-gyp-build "^4.2.2" +negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== no-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== dependencies: lower-case "^2.0.2" tslib "^2.0.3" -node-abi@^3.3.0: - version "3.62.0" - resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.62.0.tgz" - integrity sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g== +node-abi@^3.3.0, node-abi@^3.45.0: + version "3.68.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.68.0.tgz#8f37fb02ecf4f43ebe694090dcb52e0c4cc4ba25" + integrity sha512-7vbj10trelExNjFSBm5kTvZXXa7pZyKWx9RCKIyqe6I9Ev3IzGpQoqBP3a+cOdxY+pWj6VkP28n/2wWysBHD/A== dependencies: semver "^7.3.5" @@ -5923,14 +6561,16 @@ node-addon-api@^1.6.3: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== -node-addon-api@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" - integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== +node-api-version@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.2.0.tgz#5177441da2b1046a4d4547ab9e0972eed7b1ac1d" + integrity sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg== + dependencies: + semver "^7.3.5" node-domexception@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== node-fetch@^2.6.7: @@ -5942,22 +6582,41 @@ node-fetch@^2.6.7: node-fetch@^3.3.0: version "3.3.2" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== dependencies: data-uri-to-buffer "^4.0.0" fetch-blob "^3.1.4" formdata-polyfill "^4.0.10" -node-gyp-build@^4.2.2: - version "4.8.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz#976d3ad905e71b76086f4f0b0d3637fe79b6cda5" - integrity sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw== +node-gyp@^9.0.0: + version "9.4.1" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" + integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^10.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== + +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -5966,39 +6625,57 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: normalize-url@^6.0.1: version "6.1.0" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== npm-run-path@^5.1.0: version "5.3.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== dependencies: path-key "^4.0.0" -nwsapi@^2.2.7: - version "2.2.10" - resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz" - integrity sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ== +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +nwsapi@^2.2.12: + version "2.2.13" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.13.tgz#e56b4e98960e7a040e5474536587e599c4ff4655" + integrity sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ== object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.4, object.assign@^4.1.5: version "4.1.5" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: call-bind "^1.0.5" @@ -6006,18 +6683,18 @@ object.assign@^4.1.4, object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.7: +object.entries@^1.1.8: version "1.1.8" - resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== dependencies: call-bind "^1.0.7" define-properties "^1.2.1" es-object-atoms "^1.0.0" -object.fromentries@^2.0.7: +object.fromentries@^2.0.8: version "2.0.8" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: call-bind "^1.0.7" @@ -6025,18 +6702,9 @@ object.fromentries@^2.0.7: es-abstract "^1.23.2" es-object-atoms "^1.0.0" -object.hasown@^1.1.3: - version "1.1.4" - resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz" - integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== - dependencies: - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.values@^1.1.6, object.values@^1.1.7: +object.values@^1.1.6, object.values@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: call-bind "^1.0.7" @@ -6050,14 +6718,21 @@ obuf@~1.1.2: once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + onetime@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: mimic-fn "^4.0.0" @@ -6073,7 +6748,7 @@ opentelemetry-instrumentation-fetch-node@1.2.0: optionator@^0.9.3: version "0.9.4" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -6083,49 +6758,76 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" +ora@^5.1.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + p-cancelable@^2.0.0: version "2.1.1" - resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== -p-limit@^3.0.2: +p-limit@^3.0.2, "p-limit@^3.1.0 ": version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-limit@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== dependencies: yocto-queue "^1.0.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-locate@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== dependencies: p-limit "^4.0.0" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-json@^5.2.0: version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" @@ -6133,75 +6835,75 @@ parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-torrent@^11.0.16: - version "11.0.16" - resolved "https://registry.npmjs.org/parse-torrent/-/parse-torrent-11.0.16.tgz" - integrity sha512-5GoOdmW0HpiB78aQpBz8/5V3V1LjBRDNiL7DOs33pKeCLOzFnfMrsRD6CYmaUBT5Vi/dXE0hfePsjDGJSMF48w== +parse-torrent@^11.0.17: + version "11.0.17" + resolved "https://registry.yarnpkg.com/parse-torrent/-/parse-torrent-11.0.17.tgz#60614845b28e24b869a60adce492d37c2b1a3133" + integrity sha512-bkfEtrqIMT4+bSWs+m7+Ktd7LSJsDefA9qfJQ3UFwOeBqipiQ+347guu79zX++nRwMnrdvRecLmgaRcdiYjE4w== dependencies: bencode "^4.0.0" cross-fetch-ponyfill "^1.0.3" get-stdin "^9.0.0" magnet-uri "^7.0.5" queue-microtask "^1.2.3" - uint8-util "^2.2.4" + uint8-util "^2.2.5" parse5-htmlparser2-tree-adapter@^6.0.0: version "6.0.1" - resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== dependencies: parse5 "^6.0.1" parse5@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== parse5@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== parse5@^7.0.0, parse5@^7.1.2: version "7.1.2" - resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-exists@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-key@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-scurry@^1.11.0, path-scurry@^1.6.1: +path-scurry@^1.11.0, path-scurry@^1.11.1, path-scurry@^1.6.1: version "1.11.1" - resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" @@ -6209,22 +6911,27 @@ path-scurry@^1.11.0, path-scurry@^1.6.1: path-type@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathe@^1.1.1, pathe@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== -peek-readable@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz" - integrity sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A== +pe-library@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/pe-library/-/pe-library-0.4.1.tgz#e269be0340dcb13aa6949d743da7d658c3e2fbea" + integrity sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw== + +peek-readable@^5.1.4: + version "5.2.0" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.2.0.tgz#7458f18126217c154938c32a185f5d05f3df3710" + integrity sha512-U94a+eXHzct7vAd19GH3UQ2dH4Satbng0MyYTMaQatL0pvYYL5CTPR25HBhKtecl+4bfu1/i3vC6k0hydO5Vcw== pend@~1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== pg-connection-string@2.6.2: @@ -6243,9 +6950,9 @@ pg-numeric@1.0.2: integrity sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw== pg-protocol@*: - version "1.6.1" - resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.1.tgz#21333e6d83b01faaebfe7a33a7ad6bfd9ed38cb3" - integrity sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg== + version "1.7.0" + resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.7.0.tgz#ec037c87c20515372692edac8b63cf4405448a93" + integrity sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ== pg-types@^2.2.0: version "2.2.0" @@ -6271,35 +6978,35 @@ pg-types@^4.0.1: postgres-interval "^3.0.0" postgres-range "^1.1.1" -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== piscina@^4.5.1: - version "4.5.1" - resolved "https://registry.npmjs.org/piscina/-/piscina-4.5.1.tgz" - integrity sha512-DVhySLPfqAW+uRH9dF0bjA2xEWr5ANLAzkYXx5adSLMFnwssSIVJYhg0FlvgYsnT/khILQJ3WkjqbAlBvt+maw== + version "4.7.0" + resolved "https://registry.yarnpkg.com/piscina/-/piscina-4.7.0.tgz#68936fc77128db00541366531330138e366dc851" + integrity sha512-b8hvkpp9zS0zsfa939b/jXbe64Z2gZv0Ha7FYPNUiDIB1y2AtxcOZdfP8xN8HFjUaqQiT9gRlfjAsoL8vdJ1Iw== optionalDependencies: - nice-napi "^1.0.2" + "@napi-rs/nice" "^1.0.1" -pkg-types@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz" - integrity sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ== +pkg-types@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.2.0.tgz#d0268e894e93acff11a6279de147e83354ebd42d" + integrity sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA== dependencies: confbox "^0.1.7" - mlly "^1.7.0" + mlly "^1.7.1" pathe "^1.1.2" -plist@^3.0.4, plist@^3.0.5: +plist@^3.0.4, plist@^3.0.5, plist@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== dependencies: "@xmldom/xmldom" "^0.8.8" @@ -6308,22 +7015,22 @@ plist@^3.0.4, plist@^3.0.5: pngjs@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-7.0.0.tgz#a8b7446020ebbc6ac739db6c5415a65d17090e26" integrity sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow== possible-typed-array-names@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== -postcss@^8.4.38: - version "8.4.38" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== +postcss@^8.4.43: + version "8.4.47" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365" + integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== dependencies: nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" + picocolors "^1.1.0" + source-map-js "^1.2.1" postgres-array@~2.0.0: version "2.0.0" @@ -6376,7 +7083,7 @@ postgres-range@^1.1.1: prebuild-install@^7.1.1: version "7.1.2" - resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== dependencies: detect-libc "^2.0.0" @@ -6394,29 +7101,34 @@ prebuild-install@^7.1.1: prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" prettier@^3.2.4: - version "3.2.5" - resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== + version "3.3.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" + integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== progress@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + promise-retry@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== dependencies: err-code "^2.0.2" @@ -6424,7 +7136,7 @@ promise-retry@^2.0.1: prop-types@^15.8.1: version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: loose-envify "^1.4.0" @@ -6438,45 +7150,45 @@ property-expr@^2.0.5: proxy-from-env@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== psl@^1.1.33: version "1.9.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== querystringify@^2.1.1: version "2.2.0" - resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== quick-lru@^5.1.1: version "5.1.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== rc@^1.2.7: version "1.2.8" - resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -6486,7 +7198,7 @@ rc@^1.2.7: react-dom@^18.2.0: version "18.3.1" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" @@ -6498,26 +7210,26 @@ react-hook-form@^7.53.0: integrity sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ== react-i18next@^14.1.0: - version "14.1.1" - resolved "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.1.tgz" - integrity sha512-QSiKw+ihzJ/CIeIYWrarCmXJUySHDwQr5y8uaNIkbxoGRm/5DukkxZs+RPla79IKyyDPzC/DRlgQCABHtrQuQQ== + version "14.1.3" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-14.1.3.tgz#85525c4294ef870ddd3f5d184e793cae362f47cb" + integrity sha512-wZnpfunU6UIAiJ+bxwOiTmBOAaB14ha97MjOEnLGac2RJ+h/maIYXZuTHlmyqQVX1UVHmU1YDTQ5vxLmwfXTjw== dependencies: "@babel/runtime" "^7.23.9" html-parse-stringify "^3.0.1" react-is@^16.13.1: version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-loading-skeleton@^3.4.0: - version "3.4.0" - resolved "https://registry.npmjs.org/react-loading-skeleton/-/react-loading-skeleton-3.4.0.tgz" - integrity sha512-1oJEBc9+wn7BbkQQk7YodlYEIjgeR+GrRjD+QXkVjwZN7LGIcAFHrx4NhT7UHGBxNY1+zax3c+Fo6XQM4R7CgA== + version "3.5.0" + resolved "https://registry.yarnpkg.com/react-loading-skeleton/-/react-loading-skeleton-3.5.0.tgz#da2090355b4dedcad5c53cb3f0ed364e3a76d6ca" + integrity sha512-gxxSyLbrEAdXTKgfbpBEFZCO/P153DnqSCQau2+o6lNy1jgMRr2MmRmOzMmyrwSaSYLRB8g7b0waYPmUjz7IhQ== react-redux@^9.1.1: version "9.1.2" - resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-9.1.2.tgz#deba38c64c3403e9abd0c3fbeab69ffd9d8a7e4b" integrity sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w== dependencies: "@types/use-sync-external-store" "^0.0.3" @@ -6525,59 +7237,47 @@ react-redux@^9.1.1: react-refresh@^0.14.0: version "0.14.2" - resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== react-router-dom@^6.22.3: - version "6.23.1" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz" - integrity sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ== + version "6.26.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.26.2.tgz#a6e3b0cbd6bfd508e42b9342099d015a0ac59680" + integrity sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ== dependencies: - "@remix-run/router" "1.16.1" - react-router "6.23.1" + "@remix-run/router" "1.19.2" + react-router "6.26.2" -react-router@6.23.1: - version "6.23.1" - resolved "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz" - integrity sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ== +react-router@6.26.2: + version "6.26.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.26.2.tgz#2f0a68999168954431cdc29dd36cec3b6fa44a7e" + integrity sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A== dependencies: - "@remix-run/router" "1.16.1" + "@remix-run/router" "1.19.2" react@^18.2.0: version "18.3.1" - resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" -read-config-file@6.3.2: - version "6.3.2" - resolved "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz" - integrity sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q== +read-binary-file-arch@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz#959c4637daa932280a9b911b1a6766a7e44288fc" + integrity sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg== dependencies: - config-file-ts "^0.2.4" - dotenv "^9.0.2" - dotenv-expand "^5.1.0" - js-yaml "^4.1.0" - json5 "^2.2.0" - lazy-val "^1.0.4" + debug "^4.3.4" readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-web-to-node-stream@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz" - integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== - dependencies: - readable-stream "^3.6.0" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -6594,22 +7294,22 @@ rechoir@^0.8.0: redux-thunk@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3" integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw== redux@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/redux/-/redux-5.0.1.tgz#97fa26881ce5746500125585d5642c77b6e9447b" integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w== reflect-metadata@^0.2.1: version "0.2.2" - resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== reflect.getprototypeof@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== dependencies: call-bind "^1.0.7" @@ -6622,17 +7322,17 @@ reflect.getprototypeof@^1.0.4: regenerator-runtime@^0.13.3: version "0.13.11" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== -regexp.prototype.flags@^1.5.2: +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: version "1.5.2" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: call-bind "^1.0.6" @@ -6642,54 +7342,61 @@ regexp.prototype.flags@^1.5.2: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-in-the-middle@^7.1.1: - version "7.3.0" - resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz#ce64a1083647dc07b3273b348357efac8a9945c9" - integrity sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw== + version "7.4.0" + resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.4.0.tgz#606977820d4b5f9be75e5a108ce34cfed25b3bb4" + integrity sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ== dependencies: - debug "^4.1.1" + debug "^4.3.5" module-details-from-path "^1.0.3" - resolve "^1.22.1" + resolve "^1.22.8" "require-like@>= 0.1.1": version "0.1.2" - resolved "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +resedit@^1.7.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/resedit/-/resedit-1.7.1.tgz#150c101000210968730141ae2eb504ca0aead165" + integrity sha512-/FJ6/gKAXbcHtivannhecWsa43kGVFK3aHHv9Jm3x0eFiM31MoGihkAOWbm3UsvjYLRVw0zTkfARy2dI96JL1Q== + dependencies: + pe-library "^0.4.1" + reselect@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/reselect/-/reselect-5.1.0.tgz" - integrity sha512-aw7jcGLDpSgNDyWBQLv2cedml85qd95/iszJjN988zX1t7AVRJi19d9kto5+W7oCfQ94gyo40dVbT6g2k4/kXg== + version "5.1.1" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-5.1.1.tgz#c766b1eb5d558291e5e550298adb0becc24bb72e" + integrity sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w== resolve-alpn@^1.0.0: version "1.2.1" - resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve@^1.20.0, resolve@^1.22.1: +resolve@^1.20.0, resolve@^1.22.8: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -6700,7 +7407,7 @@ resolve@^1.20.0, resolve@^1.22.1: resolve@^2.0.0-next.5: version "2.0.0-next.5" - resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: is-core-module "^2.13.0" @@ -6709,31 +7416,46 @@ resolve@^2.0.0-next.5: responselike@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== dependencies: lowercase-keys "^2.0.0" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + retry@^0.12.0: version "0.12.0" - resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== reusify@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" +rimraf@^5.0.5: + version "5.0.10" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" + integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== + dependencies: + glob "^10.3.7" + roarr@^2.15.3: version "2.15.4" - resolved "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz" + resolved "https://registry.yarnpkg.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd" integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== dependencies: boolean "^3.0.1" @@ -6743,46 +7465,46 @@ roarr@^2.15.3: semver-compare "^1.0.0" sprintf-js "^1.1.2" -rollup@^4.13.0: - version "4.17.2" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz" - integrity sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ== +rollup@^4.20.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.23.0.tgz#6eed667340a6e95407eebbbb65de1138fbce1a79" + integrity sha512-vXB4IT9/KLDrS2WRXmY22sVB2wTsTwkpxjB8Q3mnakTENcYw3FRmfdYDy/acNmls+lHmDazgrRjK/yQ6hQAtwA== dependencies: - "@types/estree" "1.0.5" + "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.17.2" - "@rollup/rollup-android-arm64" "4.17.2" - "@rollup/rollup-darwin-arm64" "4.17.2" - "@rollup/rollup-darwin-x64" "4.17.2" - "@rollup/rollup-linux-arm-gnueabihf" "4.17.2" - "@rollup/rollup-linux-arm-musleabihf" "4.17.2" - "@rollup/rollup-linux-arm64-gnu" "4.17.2" - "@rollup/rollup-linux-arm64-musl" "4.17.2" - "@rollup/rollup-linux-powerpc64le-gnu" "4.17.2" - "@rollup/rollup-linux-riscv64-gnu" "4.17.2" - "@rollup/rollup-linux-s390x-gnu" "4.17.2" - "@rollup/rollup-linux-x64-gnu" "4.17.2" - "@rollup/rollup-linux-x64-musl" "4.17.2" - "@rollup/rollup-win32-arm64-msvc" "4.17.2" - "@rollup/rollup-win32-ia32-msvc" "4.17.2" - "@rollup/rollup-win32-x64-msvc" "4.17.2" + "@rollup/rollup-android-arm-eabi" "4.23.0" + "@rollup/rollup-android-arm64" "4.23.0" + "@rollup/rollup-darwin-arm64" "4.23.0" + "@rollup/rollup-darwin-x64" "4.23.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.23.0" + "@rollup/rollup-linux-arm-musleabihf" "4.23.0" + "@rollup/rollup-linux-arm64-gnu" "4.23.0" + "@rollup/rollup-linux-arm64-musl" "4.23.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.23.0" + "@rollup/rollup-linux-riscv64-gnu" "4.23.0" + "@rollup/rollup-linux-s390x-gnu" "4.23.0" + "@rollup/rollup-linux-x64-gnu" "4.23.0" + "@rollup/rollup-linux-x64-musl" "4.23.0" + "@rollup/rollup-win32-arm64-msvc" "4.23.0" + "@rollup/rollup-win32-ia32-msvc" "4.23.0" + "@rollup/rollup-win32-x64-msvc" "4.23.0" fsevents "~2.3.2" -rrweb-cssom@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz" - integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== +rrweb-cssom@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz#c73451a484b86dd7cfb1e0b2898df4b703183e4b" + integrity sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg== run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" safe-array-concat@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: call-bind "^1.0.7" @@ -6792,12 +7514,12 @@ safe-array-concat@^1.1.2: safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex-test@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: call-bind "^1.0.6" @@ -6806,65 +7528,65 @@ safe-regex-test@^1.0.3: "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sanitize-filename@^1.6.3: version "1.6.3" - resolved "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.3.tgz#755ebd752045931977e30b2025d340d7c9090378" integrity sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg== dependencies: truncate-utf8-bytes "^1.0.0" sax@^1.2.4: - version "1.3.0" - resolved "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz" - integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== saxes@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz" + resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== dependencies: xmlchars "^2.2.0" scheduler@^0.23.2: version "0.23.2" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" semver-compare@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== semver@^6.2.0, semver@^6.3.1: version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.5, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: - version "7.6.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== +semver@^7.3.2, semver@^7.3.5, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== serialize-error@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18" integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== dependencies: type-fest "^0.13.1" -set-cookie-parser@^2.4.8: - version "2.6.0" - resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz" - integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== set-function-length@^1.2.1: version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -6876,7 +7598,7 @@ set-function-length@^1.2.1: set-function-name@^2.0.1, set-function-name@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: define-data-property "^1.1.4" @@ -6886,7 +7608,7 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: sha.js@^2.4.11: version "2.4.11" - resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" @@ -6894,14 +7616,14 @@ sha.js@^2.4.11: shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shimmer@^1.2.1: @@ -6911,7 +7633,7 @@ shimmer@^1.2.1: side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: call-bind "^1.0.7" @@ -6919,19 +7641,24 @@ side-channel@^1.0.4, side-channel@^1.0.6: get-intrinsic "^1.2.4" object-inspect "^1.13.1" +signal-exit@^3.0.2, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== simple-concat@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^4.0.0: version "4.0.1" - resolved "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== dependencies: decompress-response "^6.0.0" @@ -6940,21 +7667,21 @@ simple-get@^4.0.0: simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== dependencies: is-arrayish "^0.3.1" simple-update-notifier@2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== dependencies: semver "^7.5.3" slash@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^3.0.0: @@ -6966,27 +7693,44 @@ slice-ansi@^3.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -smart-buffer@^4.0.2: +smart-buffer@^4.0.2, smart-buffer@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== snake-case@^3.0.4: version "3.0.4" - resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== dependencies: dot-case "^3.0.4" tslib "^2.0.3" -source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks@^2.6.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-support@^0.5.19: version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -6994,36 +7738,50 @@ source-map-support@^0.5.19: source-map@^0.6.0: version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== split2@^4.0.0: version "4.2.0" - resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== -sprintf-js@^1.1.2: +sprintf-js@^1.1.2, sprintf-js@^1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== +ssri@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" + integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== + dependencies: + minipass "^3.1.1" + stat-mode@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465" integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg== +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -7032,16 +7790,24 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.matchall@^4.0.10: +string.prototype.includes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz#8986d57aee66d5460c144620a6d873778ad7289f" + integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.matchall@^4.0.11: version "4.0.11" - resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== dependencies: call-bind "^1.0.7" @@ -7057,9 +7823,17 @@ string.prototype.matchall@^4.0.10: set-function-name "^2.0.2" side-channel "^1.0.6" +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + string.prototype.trim@^1.2.9: version "1.2.9" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: call-bind "^1.0.7" @@ -7069,7 +7843,7 @@ string.prototype.trim@^1.2.9: string.prototype.trimend@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: call-bind "^1.0.7" @@ -7078,7 +7852,7 @@ string.prototype.trimend@^1.0.8: string.prototype.trimstart@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: call-bind "^1.0.7" @@ -7087,54 +7861,54 @@ string.prototype.trimstart@^1.0.8: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-final-newline@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strtok3@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz" - integrity sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ== +strtok3@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-8.1.0.tgz#9234a6f42ee03bf8569c7ae0788d5fd4e67e095b" + integrity sha512-ExzDvHYPj6F6QkSNe/JxSlBxTh3OrI6wrAIz53ulxo1c4hBJ1bT9C/JrAthEKHWG9riVH3Xzg7B03Oxty6S2Lw== dependencies: "@tokenizer/token" "^0.3.0" - peek-readable "^5.0.0" + peek-readable "^5.1.4" sudo-prompt@^9.2.1: version "9.2.1" @@ -7143,51 +7917,51 @@ sudo-prompt@^9.2.1: sumchecker@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== dependencies: debug "^4.1.0" supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svg-parser@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== symbol-tree@^3.2.4: version "3.2.4" - resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -synckit@^0.8.6: - version "0.8.8" - resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz" - integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== +synckit@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.1.tgz#febbfbb6649979450131f64735aa3f6c14575c88" + integrity sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A== dependencies: "@pkgr/core" "^0.1.0" tslib "^2.6.2" tar-fs@^2.0.0: version "2.1.1" - resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== dependencies: chownr "^1.1.1" @@ -7197,7 +7971,7 @@ tar-fs@^2.0.0: tar-stream@^2.1.4: version "2.2.0" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: bl "^4.0.3" @@ -7206,9 +7980,9 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^6.1.12: +tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2: version "6.2.1" - resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a" integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" @@ -7218,6 +7992,18 @@ tar@^6.1.12: mkdirp "^1.0.3" yallist "^4.0.0" +tar@^7.4.3: + version "7.4.3" + resolved "https://registry.yarnpkg.com/tar/-/tar-7.4.3.tgz#88bbe9286a3fcd900e94592cda7a22b192e80571" + integrity sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw== + dependencies: + "@isaacs/fs-minipass" "^4.0.0" + chownr "^3.0.0" + minipass "^7.1.2" + minizlib "^3.0.1" + mkdirp "^3.0.1" + yallist "^5.0.0" + tarn@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" @@ -7225,7 +8011,7 @@ tarn@^3.0.2: temp-file@^3.4.0: version "3.4.0" - resolved "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz" + resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7" integrity sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg== dependencies: async-exit-hook "^2.0.1" @@ -7233,31 +8019,31 @@ temp-file@^3.4.0: text-extensions@^2.0.0: version "2.4.0" - resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz" + resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-2.4.0.tgz#a1cfcc50cf34da41bfd047cc744f804d1680ea34" integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== text-table@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thenify-all@^1.0.0: version "1.6.0" - resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" - resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" "through@>=2.2.7 <3": version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tildify@2.0.0: @@ -7272,47 +8058,47 @@ tiny-case@^1.0.3: tiny-typed-emitter@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz" + resolved "https://registry.yarnpkg.com/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz#b3b027fdd389ff81a152c8e847ee2f5be9fad7b5" integrity sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA== tmp-promise@^3.0.2: version "3.0.3" - resolved "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== dependencies: tmp "^0.2.0" tmp@^0.2.0: version "0.2.3" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== to-data-view@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz" + resolved "https://registry.yarnpkg.com/to-data-view/-/to-data-view-1.1.0.tgz#08d6492b0b8deb9b29bdf1f61c23eadfa8994d00" integrity sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ== to-data-view@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/to-data-view/-/to-data-view-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/to-data-view/-/to-data-view-2.0.0.tgz#4cc3f5c9eb59514a7436fc54c587c3c34c9b1d60" integrity sha512-RGEM5KqlPHr+WVTPmGNAXNeFEmsBnlkxXaIfEpUYV0AST2Z5W1EGq9L/MENFrMMmL2WQr1wjkmZy/M92eKhjYA== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" -token-types@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz" - integrity sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg== +token-types@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-6.0.0.tgz#1ab26be1ef9c434853500c071acfe5c8dd6544a3" + integrity sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA== dependencies: "@tokenizer/token" "^0.3.0" ieee754 "^1.2.1" @@ -7322,9 +8108,9 @@ toposort@^2.0.2: resolved "https://registry.yarnpkg.com/toposort/-/toposort-2.0.2.tgz#ae21768175d1559d48bef35420b2f4962f09c330" integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== -tough-cookie@^4.0.0, tough-cookie@^4.1.3: +tough-cookie@^4.1.4: version "4.1.4" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== dependencies: psl "^1.1.33" @@ -7334,7 +8120,7 @@ tough-cookie@^4.0.0, tough-cookie@^4.1.3: tr46@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.0.0.tgz#3b46d583613ec7283020d79019f1335723801cec" integrity sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g== dependencies: punycode "^2.3.1" @@ -7346,14 +8132,14 @@ tr46@~0.0.3: truncate-utf8-bytes@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" integrity sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ== dependencies: utf8-byte-length "^1.0.1" ts-api-utils@^1.0.1: version "1.3.0" - resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== ts-node@^10.9.2: @@ -7376,32 +8162,32 @@ ts-node@^10.9.2: yn "3.1.1" tslib@^2.0.3, tslib@^2.5.0, tslib@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-fest@^0.13.1: version "0.13.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^2.19.0: @@ -7411,7 +8197,7 @@ type-fest@^2.19.0: typed-array-buffer@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: call-bind "^1.0.7" @@ -7420,7 +8206,7 @@ typed-array-buffer@^1.0.2: typed-array-byte-length@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: call-bind "^1.0.7" @@ -7431,7 +8217,7 @@ typed-array-byte-length@^1.0.1: typed-array-byte-offset@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== dependencies: available-typed-arrays "^1.0.7" @@ -7443,7 +8229,7 @@ typed-array-byte-offset@^1.0.2: typed-array-length@^1.0.6: version "1.0.6" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: call-bind "^1.0.7" @@ -7455,7 +8241,7 @@ typed-array-length@^1.0.6: typeorm@^0.3.20: version "0.3.20" - resolved "https://registry.npmjs.org/typeorm/-/typeorm-0.3.20.tgz" + resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.20.tgz#4b61d737c6fed4e9f63006f88d58a5e54816b7ab" integrity sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q== dependencies: "@sqltools/formatter" "^1.2.5" @@ -7474,26 +8260,31 @@ typeorm@^0.3.20: uuid "^9.0.0" yargs "^17.6.2" -typescript@^5.3.3: - version "5.4.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== +typescript@^5.3.3, typescript@^5.4.3: + version "5.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.2.tgz#d1de67b6bef77c41823f822df8f0b3bcff60a5a0" + integrity sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw== ufo@^1.5.3: - version "1.5.3" - resolved "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz" - integrity sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw== + version "1.5.4" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" + integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== -uint8-util@^2.1.9, uint8-util@^2.2.2, uint8-util@^2.2.4: +uint8-util@^2.1.9, uint8-util@^2.2.2, uint8-util@^2.2.5: version "2.2.5" - resolved "https://registry.npmjs.org/uint8-util/-/uint8-util-2.2.5.tgz" + resolved "https://registry.yarnpkg.com/uint8-util/-/uint8-util-2.2.5.tgz#f1a8ff800e4e10a3ac1c82ee3667c99245123896" integrity sha512-/QxVQD7CttWpVUKVPz9znO+3Dd4BdTSnFQ7pv/4drVhC9m4BaL2LFHTkJn6EsYoxT79VDq/2Gg8L0H22PrzyMw== dependencies: base64-arraybuffer "^1.0.2" +uint8array-extras@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/uint8array-extras/-/uint8array-extras-1.4.0.tgz#e42a678a6dd335ec2d21661333ed42f44ae7cc74" + integrity sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ== + unbox-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== dependencies: call-bind "^1.0.2" @@ -7503,27 +8294,41 @@ unbox-primitive@^1.0.2: undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== unicorn-magic@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4" integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== +unique-filename@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" + integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== + dependencies: + unique-slug "^3.0.0" + +unique-slug@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" + integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== + dependencies: + imurmurhash "^0.1.4" + universalify@^0.1.0: version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: version "2.0.1" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unplugin@1.0.1: @@ -7538,27 +8343,27 @@ unplugin@1.0.1: untildify@^3.0.2: version "3.0.3" - resolved "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" integrity sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA== -update-browserslist-db@^1.0.13: - version "1.0.16" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz" - integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== +update-browserslist-db@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.2" - picocolors "^1.0.1" + escalade "^3.2.0" + picocolors "^1.1.0" uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-parse@^1.5.3: version "1.5.10" - resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" @@ -7566,29 +8371,29 @@ url-parse@^1.5.3: use-sync-external-store@^1.0.0: version "1.2.2" - resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" integrity sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== user-agents@^1.1.193: - version "1.1.206" - resolved "https://registry.npmjs.org/user-agents/-/user-agents-1.1.206.tgz" - integrity sha512-q2y6pii5pJcjw9aPxrm3NM6EthrE4iT8dXBI6imlERT3RovbpfNVjPPePqyIVUJoAdg/HnwIwoORpNgydAsMXQ== + version "1.1.325" + resolved "https://registry.yarnpkg.com/user-agents/-/user-agents-1.1.325.tgz#12c3602d6b0175468f45564b3c684c390c3be57e" + integrity sha512-BmVDscJOZsBBztMPHg+wf65QwbT+N3C46YEsuW8BmcxRxwKh2AbdSaKEjzoC7rDlyuECXEUXO+C2eW3QAhbl2A== dependencies: lodash.clonedeep "^4.5.0" utf8-byte-length@^1.0.1: version "1.0.5" - resolved "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz#f9f63910d15536ee2b2d5dd4665389715eac5c1e" integrity sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA== util-deprecate@^1.0.1: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^9.0.0: version "9.0.1" - resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== v8-compile-cache-lib@^3.0.1: @@ -7607,7 +8412,7 @@ verror@^1.10.0: vite-node@^1.2.0: version "1.6.0" - resolved "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/vite-node/-/vite-node-1.6.0.tgz#2c7e61129bfecc759478fa592754fd9704aaba7f" integrity sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw== dependencies: cac "^6.7.14" @@ -7618,7 +8423,7 @@ vite-node@^1.2.0: vite-plugin-svgr@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.2.0.tgz" + resolved "https://registry.yarnpkg.com/vite-plugin-svgr/-/vite-plugin-svgr-4.2.0.tgz#9f3bf5206b0ec510287e56d16f1915e729bb4e6b" integrity sha512-SC7+FfVtNQk7So0XMjrrtLAbEC8qjFPifyD7+fs/E6aaNdVde6umlVVh0QuwDLdOMu7vp5RiGFsB70nj5yo0XA== dependencies: "@rollup/pluginutils" "^5.0.5" @@ -7626,31 +8431,38 @@ vite-plugin-svgr@^4.2.0: "@svgr/plugin-jsx" "^8.1.0" vite@^5.0.0, vite@^5.0.11, vite@^5.0.12: - version "5.2.11" - resolved "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz" - integrity sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ== + version "5.4.8" + resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.8.tgz#af548ce1c211b2785478d3ba3e8da51e39a287e8" + integrity sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ== dependencies: - esbuild "^0.20.1" - postcss "^8.4.38" - rollup "^4.13.0" + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" optionalDependencies: fsevents "~2.3.3" void-elements@3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== w3c-xmlserializer@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz#f925ba26855158594d907313cedd1476c5967f6c" integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== dependencies: xml-name-validator "^5.0.0" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + web-streams-polyfill@^3.0.3: version "3.3.3" - resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== webidl-conversions@^3.0.0: @@ -7660,7 +8472,7 @@ webidl-conversions@^3.0.0: webidl-conversions@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== webpack-sources@^3.2.3: @@ -7675,19 +8487,19 @@ webpack-virtual-modules@^0.5.0: whatwg-encoding@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5" integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== dependencies: iconv-lite "0.6.3" whatwg-mimetype@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a" integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== whatwg-url@^14.0.0: version "14.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.0.0.tgz#00baaa7fd198744910c4b1ef68378f2200e4ceb6" integrity sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw== dependencies: tr46 "^5.0.0" @@ -7703,7 +8515,7 @@ whatwg-url@^5.0.0: which-boxed-primitive@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: is-bigint "^1.0.1" @@ -7713,12 +8525,12 @@ which-boxed-primitive@^1.0.2: is-symbol "^1.0.3" which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3" + integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w== dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" is-async-function "^2.0.0" is-date-object "^1.0.5" is-finalizationregistry "^1.0.2" @@ -7727,12 +8539,12 @@ which-builtin-type@^1.1.3: is-weakref "^1.0.2" isarray "^2.0.5" which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" + which-collection "^1.0.2" + which-typed-array "^1.1.15" -which-collection@^1.0.1: +which-collection@^1.0.1, which-collection@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== dependencies: is-map "^2.0.3" @@ -7740,9 +8552,9 @@ which-collection@^1.0.1: is-weakmap "^2.0.2" is-weakset "^2.0.3" -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15: version "1.1.15" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: available-typed-arrays "^1.0.7" @@ -7753,24 +8565,31 @@ which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: which@2.0.2, which@^2.0.1, which@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + winreg@1.2.4: version "1.2.4" - resolved "https://registry.npmjs.org/winreg/-/winreg-1.2.4.tgz" + resolved "https://registry.yarnpkg.com/winreg/-/winreg-1.2.4.tgz#ba065629b7a925130e15779108cf540990e98d1b" integrity sha512-IHpzORub7kYlb8A43Iig3reOvlcBJGX9gZ0WycHhghHtA65X0LYnMRuJs+aH1abVnMJztQkvQNlltnbPi5aGIA== word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -7779,7 +8598,7 @@ word-wrap@^1.2.5: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -7788,7 +8607,7 @@ wrap-ansi@^7.0.0: wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -7797,27 +8616,27 @@ wrap-ansi@^8.1.0: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^8.16.0: - version "8.17.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz" - integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== +ws@^8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== xml-name-validator@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673" integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1: version "15.1.1" - resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== xmlchars@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== xtend@^4.0.0: @@ -7827,37 +8646,42 @@ xtend@^4.0.0: y18n@^5.0.5: version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yallist@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533" + integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== + yaml@^2.4.1: - version "2.4.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz" - integrity sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA== + version "2.5.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130" + integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q== yargs-parser@^20.2.2: version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-parser@^21.1.1: version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^16.0.0: version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -7868,9 +8692,9 @@ yargs@^16.0.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.0.0, yargs@^17.6.2: +yargs@^17.0.0, yargs@^17.0.1, yargs@^17.6.2: version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" @@ -7883,7 +8707,7 @@ yargs@^17.0.0, yargs@^17.6.2: yauzl@^2.10.0: version "2.10.0" - resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: buffer-crc32 "~0.2.3" @@ -7896,13 +8720,13 @@ yn@3.1.1: yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yocto-queue@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" - integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + version "1.1.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110" + integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== yup@^1.4.0: version "1.4.0" @@ -7916,5 +8740,5 @@ yup@^1.4.0: zod@^3.23.8: version "3.23.8" - resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==