diff --git a/binaries/7zr.exe b/binaries/7zr.exe
new file mode 100644
index 00000000..0ce4b2c9
Binary files /dev/null and b/binaries/7zr.exe differ
diff --git a/binaries/7zz b/binaries/7zz
new file mode 100644
index 00000000..2cde7d8d
Binary files /dev/null and b/binaries/7zz differ
diff --git a/binaries/7zzs b/binaries/7zzs
new file mode 100644
index 00000000..69524c55
Binary files /dev/null and b/binaries/7zzs differ
diff --git a/electron-builder.yml b/electron-builder.yml
index 5ce6107b..9de44591 100644
--- a/electron-builder.yml
+++ b/electron-builder.yml
@@ -20,6 +20,8 @@ asarUnpack:
- resources/**
win:
executableName: Hydra
+ extraResources:
+ - from: binaries/7zr.exe
target:
- nsis
- portable
@@ -35,6 +37,8 @@ portable:
artifactName: ${name}-${version}-portable.${ext}
mac:
entitlementsInherit: build/entitlements.mac.plist
+ extraResources:
+ - from: binaries/7zz
extendInfo:
- NSCameraUsageDescription: Application requests access to the device's camera.
- NSMicrophoneUsageDescription: Application requests access to the device's microphone.
@@ -44,6 +48,8 @@ mac:
dmg:
artifactName: ${name}-${version}.${ext}
linux:
+ extraResources:
+ - from: binaries/7zzs
target:
- AppImage
- snap
diff --git a/electron.vite.config.ts b/electron.vite.config.ts
index e2af60ce..08bd00f9 100644
--- a/electron.vite.config.ts
+++ b/electron.vite.config.ts
@@ -16,9 +16,6 @@ export default defineConfig(({ mode }) => {
main: {
build: {
sourcemap: true,
- rollupOptions: {
- external: ["better-sqlite3"],
- },
},
resolve: {
alias: {
diff --git a/package.json b/package.json
index 71cc0ea6..3b8093c4 100644
--- a/package.json
+++ b/package.json
@@ -28,8 +28,7 @@
"build:win": "electron-vite build && electron-builder --win",
"build:mac": "electron-vite build && electron-builder --mac",
"build:linux": "electron-vite build && electron-builder --linux",
- "prepare": "husky",
- "knex:migrate:make": "knex --knexfile src/main/knexfile.ts migrate:make --esm"
+ "prepare": "husky"
},
"dependencies": {
"@electron-toolkit/preload": "^3.0.0",
@@ -45,7 +44,6 @@
"auto-launch": "^5.0.6",
"axios": "^1.7.9",
"axios-cookiejar-support": "^5.0.5",
- "better-sqlite3": "^11.7.0",
"classic-level": "^2.0.0",
"classnames": "^2.5.1",
"color": "^4.2.3",
@@ -62,7 +60,6 @@
"jsdom": "^24.0.0",
"jsonwebtoken": "^9.0.2",
"kill-port": "^2.0.1",
- "knex": "^3.1.0",
"lodash-es": "^4.17.21",
"parse-torrent": "^11.0.17",
"piscina": "^4.7.0",
diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json
index e4341a00..2944ca00 100644
--- a/src/locales/en/translation.json
+++ b/src/locales/en/translation.json
@@ -230,7 +230,8 @@
"seeding": "Seeding",
"stop_seeding": "Stop seeding",
"resume_seeding": "Resume seeding",
- "options": "Manage"
+ "options": "Manage",
+ "extracting": "Extracting files…"
},
"settings": {
"downloads_path": "Downloads path",
@@ -344,7 +345,8 @@
"error_importing_theme": "Error importing theme",
"theme_imported": "Theme imported successfully",
"enable_friend_request_notifications": "When a friend request is received",
- "enable_auto_install": "Download updates automatically"
+ "enable_auto_install": "Download updates automatically",
+ "automatically_extract_downloaded_files": "Automatically extract downloaded files"
},
"notifications": {
"download_complete": "Download complete",
@@ -357,7 +359,9 @@
"notification_achievement_unlocked_title": "Achievement unlocked for {{game}}",
"notification_achievement_unlocked_body": "{{achievement}} and other {{count}} were unlocked",
"new_friend_request_description": "You have received a new friend request",
- "new_friend_request_title": "New friend request"
+ "new_friend_request_title": "New friend request",
+ "extraction_complete": "Extraction complete",
+ "game_extracted": "{{title}} extracted successfully"
},
"system_tray": {
"open": "Open Hydra",
diff --git a/src/locales/pt-BR/translation.json b/src/locales/pt-BR/translation.json
index ff87ed13..a56a4f55 100644
--- a/src/locales/pt-BR/translation.json
+++ b/src/locales/pt-BR/translation.json
@@ -182,7 +182,8 @@
"download_error_not_cached_in_real_debrid": "Este download não está disponível no Real-Debrid e a verificação do status do download não está disponível.",
"download_error_not_cached_in_torbox": "Este download não está disponível no Torbox e a verificação do status do download não está disponível.",
"game_removed_from_favorites": "Jogo removido dos favoritos",
- "game_added_to_favorites": "Jogo adicionado aos favoritos"
+ "game_added_to_favorites": "Jogo adicionado aos favoritos",
+ "automatically_extract_downloaded_files": "Extrair automaticamente os arquivos baixados"
},
"activation": {
"title": "Ativação",
@@ -219,7 +220,8 @@
"seeding": "Semeando",
"stop_seeding": "Parar de semear",
"resume_seeding": "Semear",
- "options": "Gerenciar"
+ "options": "Gerenciar",
+ "extracting": "Extraindo arquivos…"
},
"settings": {
"downloads_path": "Diretório dos downloads",
@@ -342,7 +344,9 @@
"new_update_available": "Versão {{version}} disponível",
"restart_to_install_update": "Reinicie o Hydra para instalar a nova versão",
"new_friend_request_title": "Novo pedido de amizade",
- "new_friend_request_description": "Você recebeu um novo pedido de amizade"
+ "new_friend_request_description": "Você recebeu um novo pedido de amizade",
+ "extraction_complete": "Extração concluída",
+ "game_extracted": "{{title}} extraído com sucesso"
},
"system_tray": {
"open": "Abrir Hydra",
diff --git a/src/main/events/cloud-save/upload-save-game.ts b/src/main/events/cloud-save/upload-save-game.ts
index 2674e35a..891941a0 100644
--- a/src/main/events/cloud-save/upload-save-game.ts
+++ b/src/main/events/cloud-save/upload-save-game.ts
@@ -1,8 +1,8 @@
import { CloudSync } from "@main/services";
import { registerEvent } from "../register-event";
import type { GameShop } from "@types";
-import { t } from "i18next";
-import { format } from "date-fns";
+import i18next, { t } from "i18next";
+import { formatDate } from "date-fns";
const uploadSaveGame = async (
_event: Electron.IpcMainInvokeEvent,
@@ -10,13 +10,15 @@ const uploadSaveGame = async (
shop: GameShop,
downloadOptionTitle: string | null
) => {
+ const { language } = i18next;
+
return CloudSync.uploadSaveGame(
objectId,
shop,
downloadOptionTitle,
t("backup_from", {
ns: "game_details",
- date: format(new Date(), "dd/MM/yyyy"),
+ date: formatDate(new Date(), language),
})
);
};
diff --git a/src/main/events/download-sources/create-download-source.ts b/src/main/events/download-sources/create-download-sources.ts
similarity index 61%
rename from src/main/events/download-sources/create-download-source.ts
rename to src/main/events/download-sources/create-download-sources.ts
index bf5d3c18..cf1f8f51 100644
--- a/src/main/events/download-sources/create-download-source.ts
+++ b/src/main/events/download-sources/create-download-sources.ts
@@ -1,13 +1,13 @@
import { HydraApi } from "@main/services";
import { registerEvent } from "../register-event";
-const createDownloadSource = async (
+const createDownloadSources = async (
_event: Electron.IpcMainInvokeEvent,
- url: string
+ urls: string[]
) => {
await HydraApi.post("/profile/download-sources", {
- url,
+ urls,
});
};
-registerEvent("createDownloadSource", createDownloadSource);
+registerEvent("createDownloadSources", createDownloadSources);
diff --git a/src/main/events/index.ts b/src/main/events/index.ts
index d49ddc71..bb3399e0 100644
--- a/src/main/events/index.ts
+++ b/src/main/events/index.ts
@@ -90,7 +90,7 @@ import "./themes/get-custom-theme-by-id";
import "./themes/get-active-custom-theme";
import "./themes/close-editor-window";
import "./themes/toggle-custom-theme";
-import "./download-sources/create-download-source";
+import "./download-sources/create-download-sources";
import "./download-sources/remove-download-source";
import "./download-sources/get-download-sources";
import { isPortableVersion } from "@main/helpers";
diff --git a/src/main/events/torrenting/start-game-download.ts b/src/main/events/torrenting/start-game-download.ts
index 8b5f1918..59f117d3 100644
--- a/src/main/events/torrenting/start-game-download.ts
+++ b/src/main/events/torrenting/start-game-download.ts
@@ -12,7 +12,15 @@ const startGameDownload = async (
_event: Electron.IpcMainInvokeEvent,
payload: StartGameDownloadPayload
) => {
- const { objectId, title, shop, downloadPath, downloader, uri } = payload;
+ const {
+ objectId,
+ title,
+ shop,
+ downloadPath,
+ downloader,
+ uri,
+ automaticallyExtract,
+ } = payload;
const gameKey = levelKeys.game(shop, objectId);
@@ -74,6 +82,8 @@ const startGameDownload = async (
shouldSeed: false,
timestamp: Date.now(),
queued: true,
+ extracting: false,
+ automaticallyExtract,
};
try {
diff --git a/src/main/events/user-preferences/update-user-preferences.ts b/src/main/events/user-preferences/update-user-preferences.ts
index 09f39d2d..7a481837 100644
--- a/src/main/events/user-preferences/update-user-preferences.ts
+++ b/src/main/events/user-preferences/update-user-preferences.ts
@@ -23,10 +23,6 @@ const updateUserPreferences = async (
patchUserProfile({ language: preferences.language }).catch(() => {});
}
- if (!preferences.downloadsPath) {
- preferences.downloadsPath = null;
- }
-
await db.put(
levelKeys.userPreferences,
{
diff --git a/src/main/knex-client.ts b/src/main/knex-client.ts
deleted file mode 100644
index 57982332..00000000
--- a/src/main/knex-client.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import knex from "knex";
-import { databasePath } from "./constants";
-import { app } from "electron";
-
-export const knexClient = knex({
- debug: !app.isPackaged,
- client: "better-sqlite3",
- connection: {
- filename: databasePath,
- },
-});
diff --git a/src/main/knexfile.ts b/src/main/knexfile.ts
deleted file mode 100644
index df7972a9..00000000
--- a/src/main/knexfile.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-const config = {
- development: {
- migrations: {
- extension: "ts",
- stub: "migrations/migration.stub",
- },
- },
-};
-
-export default config;
diff --git a/src/main/level/sublevels/keys.ts b/src/main/level/sublevels/keys.ts
index 6559e460..12143917 100644
--- a/src/main/level/sublevels/keys.ts
+++ b/src/main/level/sublevels/keys.ts
@@ -13,6 +13,5 @@ export const levelKeys = {
downloads: "downloads",
userPreferences: "userPreferences",
language: "language",
- sqliteMigrationDone: "sqliteMigrationDone",
screenState: "screenState",
};
diff --git a/src/main/main.ts b/src/main/main.ts
index 84bd7732..c9a8e3a8 100644
--- a/src/main/main.ts
+++ b/src/main/main.ts
@@ -1,4 +1,4 @@
-import { DownloadManager, logger, Ludusavi, startMainLoop } from "./services";
+import { DownloadManager, Ludusavi, startMainLoop } from "./services";
import { RealDebridClient } from "./services/download/real-debrid";
import { HydraApi } from "./services/hydra-api";
import { uploadGamesBatch } from "./services/library-sync";
@@ -6,26 +6,17 @@ import { Aria2 } from "./services/aria2";
import { downloadsSublevel } from "./level/sublevels/downloads";
import { sortBy } from "lodash-es";
import { Downloader } from "@shared";
-import {
- gameAchievementsSublevel,
- gamesSublevel,
- levelKeys,
- db,
-} from "./level";
-import { Auth, User, type UserPreferences } from "@types";
-import { knexClient } from "./knex-client";
+import { levelKeys, db } from "./level";
+import type { UserPreferences } from "@types";
import { TorBoxClient } from "./services/download/torbox";
export const loadState = async () => {
- const userPreferences = await migrateFromSqlite().then(async () => {
- await db.put(levelKeys.sqliteMigrationDone, true, {
+ const userPreferences = await db.get(
+ levelKeys.userPreferences,
+ {
valueEncoding: "json",
- });
-
- return db.get(levelKeys.userPreferences, {
- valueEncoding: "json",
- });
- });
+ }
+ );
await import("./events");
@@ -52,6 +43,15 @@ export const loadState = async () => {
return sortBy(games, "timestamp", "DESC");
});
+ downloads.forEach((download) => {
+ if (download.extracting) {
+ downloadsSublevel.put(levelKeys.game(download.shop, download.objectId), {
+ ...download,
+ extracting: false,
+ });
+ }
+ });
+
const [nextItemOnQueue] = downloads.filter((game) => game.queued);
const downloadsToSeed = downloads.filter(
@@ -66,137 +66,3 @@ export const loadState = async () => {
startMainLoop();
};
-
-const migrateFromSqlite = async () => {
- const sqliteMigrationDone = await db.get(levelKeys.sqliteMigrationDone);
-
- if (sqliteMigrationDone) {
- return;
- }
-
- const migrateGames = knexClient("game")
- .select("*")
- .then((games) => {
- return gamesSublevel.batch(
- games.map((game) => ({
- type: "put",
- key: levelKeys.game(game.shop, game.objectID),
- value: {
- objectId: game.objectID,
- shop: game.shop,
- title: game.title,
- iconUrl: game.iconUrl,
- playTimeInMilliseconds: game.playTimeInMilliseconds,
- lastTimePlayed: game.lastTimePlayed,
- remoteId: game.remoteId,
- winePrefixPath: game.winePrefixPath,
- launchOptions: game.launchOptions,
- executablePath: game.executablePath,
- isDeleted: game.isDeleted === 1,
- },
- }))
- );
- })
- .then(() => {
- logger.info("Games migrated successfully");
- });
-
- const migrateUserPreferences = knexClient("user_preferences")
- .select("*")
- .then(async (userPreferences) => {
- if (userPreferences.length > 0) {
- const { realDebridApiToken, ...rest } = userPreferences[0];
-
- await db.put(
- levelKeys.userPreferences,
- {
- ...rest,
- realDebridApiToken,
- preferQuitInsteadOfHiding: rest.preferQuitInsteadOfHiding === 1,
- runAtStartup: rest.runAtStartup === 1,
- startMinimized: rest.startMinimized === 1,
- disableNsfwAlert: rest.disableNsfwAlert === 1,
- seedAfterDownloadComplete: rest.seedAfterDownloadComplete === 1,
- showHiddenAchievementsDescription:
- rest.showHiddenAchievementsDescription === 1,
- downloadNotificationsEnabled:
- rest.downloadNotificationsEnabled === 1,
- repackUpdatesNotificationsEnabled:
- rest.repackUpdatesNotificationsEnabled === 1,
- achievementNotificationsEnabled:
- rest.achievementNotificationsEnabled === 1,
- },
- { valueEncoding: "json" }
- );
-
- if (rest.language) {
- await db.put(levelKeys.language, rest.language, {
- valueEncoding: "utf-8",
- });
- }
- }
- })
- .then(() => {
- logger.info("User preferences migrated successfully");
- });
-
- const migrateAchievements = knexClient("game_achievement")
- .select("*")
- .then((achievements) => {
- return gameAchievementsSublevel.batch(
- achievements.map((achievement) => ({
- type: "put",
- key: levelKeys.game(achievement.shop, achievement.objectId),
- value: {
- achievements: JSON.parse(achievement.achievements),
- unlockedAchievements: JSON.parse(achievement.unlockedAchievements),
- },
- }))
- );
- })
- .then(() => {
- logger.info("Achievements migrated successfully");
- });
-
- const migrateUser = knexClient("user_auth")
- .select("*")
- .then(async (users) => {
- if (users.length > 0) {
- await db.put(
- levelKeys.user,
- {
- id: users[0].userId,
- displayName: users[0].displayName,
- profileImageUrl: users[0].profileImageUrl,
- backgroundImageUrl: users[0].backgroundImageUrl,
- subscription: users[0].subscription,
- },
- {
- valueEncoding: "json",
- }
- );
-
- await db.put(
- levelKeys.auth,
- {
- accessToken: users[0].accessToken,
- refreshToken: users[0].refreshToken,
- tokenExpirationTimestamp: users[0].tokenExpirationTimestamp,
- },
- {
- valueEncoding: "json",
- }
- );
- }
- })
- .then(() => {
- logger.info("User data migrated successfully");
- });
-
- return Promise.allSettled([
- migrateGames,
- migrateUserPreferences,
- migrateAchievements,
- migrateUser,
- ]);
-};
diff --git a/src/main/services/7zip.ts b/src/main/services/7zip.ts
new file mode 100644
index 00000000..f086ac25
--- /dev/null
+++ b/src/main/services/7zip.ts
@@ -0,0 +1,38 @@
+import { app } from "electron";
+import cp from "node:child_process";
+import path from "node:path";
+
+export const binaryName = {
+ linux: "7zzs",
+ darwin: "7zz",
+ win32: "7zr.exe",
+};
+
+export class _7Zip {
+ private static readonly binaryPath = app.isPackaged
+ ? path.join(process.resourcesPath, binaryName[process.platform])
+ : path.join(
+ __dirname,
+ "..",
+ "..",
+ "binaries",
+ binaryName[process.platform]
+ );
+
+ public static extractFile(
+ filePath: string,
+ outputPath: string,
+ cb: () => void
+ ) {
+ const child = cp.spawn(this.binaryPath, [
+ "x",
+ filePath,
+ "-o" + outputPath,
+ "-y",
+ ]);
+
+ child.on("exit", () => {
+ cb();
+ });
+ }
+}
diff --git a/src/main/services/aria2.ts b/src/main/services/aria2.ts
index b7aa539c..98fd0e13 100644
--- a/src/main/services/aria2.ts
+++ b/src/main/services/aria2.ts
@@ -2,18 +2,15 @@ import path from "node:path";
import cp from "node:child_process";
import { app } from "electron";
-export const startAria2 = () => {};
-
export class Aria2 {
private static process: cp.ChildProcess | null = null;
+ private static readonly binaryPath = app.isPackaged
+ ? path.join(process.resourcesPath, "aria2", "aria2c")
+ : path.join(__dirname, "..", "..", "aria2", "aria2c");
public static spawn() {
- const binaryPath = app.isPackaged
- ? path.join(process.resourcesPath, "aria2", "aria2c")
- : path.join(__dirname, "..", "..", "aria2", "aria2c");
-
this.process = cp.spawn(
- binaryPath,
+ this.binaryPath,
[
"--enable-rpc",
"--rpc-listen-all",
diff --git a/src/main/services/download/download-manager.ts b/src/main/services/download/download-manager.ts
index 860cf5cf..99176654 100644
--- a/src/main/services/download/download-manager.ts
+++ b/src/main/services/download/download-manager.ts
@@ -1,6 +1,9 @@
import { Downloader, DownloadError } from "@shared";
import { WindowManager } from "../window-manager";
-import { publishDownloadCompleteNotification } from "../notifications";
+import {
+ publishDownloadCompleteNotification,
+ publishExtractionCompleteNotification,
+} from "../notifications";
import type { Download, DownloadProgress, UserPreferences } from "@types";
import {
GofileApi,
@@ -22,9 +25,11 @@ import { logger } from "../logger";
import { db, downloadsSublevel, gamesSublevel, levelKeys } from "@main/level";
import { sortBy } from "lodash-es";
import { TorBoxClient } from "./torbox";
+import { _7Zip } from "../7zip";
export class DownloadManager {
private static downloadingGameId: string | null = null;
+ private static readonly extensionsToExtract = [".rar", ".zip", ".7z"];
public static async startRPC(
download?: Download,
@@ -150,13 +155,47 @@ export class DownloadManager {
queued: false,
});
} else {
+ const shouldExtract =
+ download.downloader !== Downloader.Torrent &&
+ this.extensionsToExtract.some((ext) =>
+ download.folderName?.endsWith(ext)
+ ) &&
+ download.automaticallyExtract;
+
downloadsSublevel.put(gameId, {
...download,
status: "complete",
shouldSeed: false,
queued: false,
+ extracting: shouldExtract,
});
+ if (shouldExtract) {
+ _7Zip.extractFile(
+ path.join(download.downloadPath, download.folderName!),
+ path.join(
+ download.downloadPath,
+ path.parse(download.folderName!).name
+ ),
+ async () => {
+ const download = await downloadsSublevel.get(gameId);
+
+ downloadsSublevel.put(gameId, {
+ ...download!,
+ extracting: false,
+ });
+
+ WindowManager.mainWindow?.webContents.send(
+ "on-extraction-complete",
+ game.shop,
+ game.objectId
+ );
+
+ publishExtractionCompleteNotification(game);
+ }
+ );
+ }
+
this.cancelDownload(gameId);
}
diff --git a/src/main/services/index.ts b/src/main/services/index.ts
index f53dae31..50dac560 100644
--- a/src/main/services/index.ts
+++ b/src/main/services/index.ts
@@ -8,3 +8,4 @@ export * from "./main-loop";
export * from "./hydra-api";
export * from "./ludusavi";
export * from "./cloud-sync";
+export * from "./7zip";
diff --git a/src/main/services/notifications/index.ts b/src/main/services/notifications/index.ts
index 6ddb3200..79f200fe 100644
--- a/src/main/services/notifications/index.ts
+++ b/src/main/services/notifications/index.ts
@@ -128,6 +128,17 @@ export const publishCombinedNewAchievementNotification = async (
}
};
+export const publishExtractionCompleteNotification = async (game: Game) => {
+ new Notification({
+ title: t("extraction_complete", { ns: "notifications" }),
+ body: t("game_extracted", {
+ ns: "notifications",
+ title: game.title,
+ }),
+ icon: trayIcon,
+ }).show();
+};
+
export const publishNewAchievementNotification = async (info: {
achievements: { displayName: string; iconUrl: string }[];
unlockedAchievementCount: number;
diff --git a/src/main/services/process-watcher.ts b/src/main/services/process-watcher.ts
index f7e30742..de0e88da 100644
--- a/src/main/services/process-watcher.ts
+++ b/src/main/services/process-watcher.ts
@@ -6,9 +6,9 @@ import axios from "axios";
import { exec } from "child_process";
import { ProcessPayload } from "./download/types";
import { gamesSublevel, levelKeys } from "@main/level";
-import { t } from "i18next";
+import i18next, { t } from "i18next";
import { CloudSync } from "./cloud-sync";
-import { format } from "date-fns";
+import { formatDate } from "date-fns";
const commands = {
findWineDir: `lsof -c wine 2>/dev/null | grep '/drive_c/windows$' | head -n 1 | awk '{for(i=9;i<=NF;i++) printf "%s ", $i; print ""}'`,
@@ -229,6 +229,8 @@ function onOpenGame(game: Game) {
if (game.remoteId) {
updateGamePlaytime(game, 0, new Date()).catch(() => {});
+ const { language } = i18next;
+
if (game.automaticCloudSync) {
CloudSync.uploadSaveGame(
game.objectId,
@@ -236,7 +238,7 @@ function onOpenGame(game: Game) {
null,
t("automatic_backup_from", {
ns: "game_details",
- date: format(new Date(), "dd/MM/yyyy"),
+ date: formatDate(new Date(), language),
})
);
}
@@ -296,6 +298,8 @@ const onCloseGame = (game: Game) => {
)!;
gamesPlaytime.delete(levelKeys.game(game.shop, game.objectId));
+ const { language } = i18next;
+
if (game.remoteId) {
updateGamePlaytime(
game,
@@ -310,7 +314,7 @@ const onCloseGame = (game: Game) => {
null,
t("automatic_backup_from", {
ns: "game_details",
- date: format(new Date(), "dd/MM/yyyy"),
+ date: formatDate(new Date(), language),
})
);
}
diff --git a/src/preload/index.ts b/src/preload/index.ts
index 3ce2902c..ebe9dc04 100644
--- a/src/preload/index.ts
+++ b/src/preload/index.ts
@@ -100,8 +100,8 @@ contextBridge.exposeInMainWorld("electron", {
/* Download sources */
putDownloadSource: (objectIds: string[]) =>
ipcRenderer.invoke("putDownloadSource", objectIds),
- createDownloadSource: (url: string) =>
- ipcRenderer.invoke("createDownloadSource", url),
+ createDownloadSources: (urls: string[]) =>
+ ipcRenderer.invoke("createDownloadSources", urls),
removeDownloadSource: (url: string, removeAll?: boolean) =>
ipcRenderer.invoke("removeDownloadSource", url, removeAll),
getDownloadSources: () => ipcRenderer.invoke("getDownloadSources"),
@@ -200,6 +200,15 @@ contextBridge.exposeInMainWorld("electron", {
return () =>
ipcRenderer.removeListener("on-achievement-unlocked", listener);
},
+ onExtractionComplete: (cb: (shop: GameShop, objectId: string) => void) => {
+ const listener = (
+ _event: Electron.IpcRendererEvent,
+ shop: GameShop,
+ objectId: string
+ ) => cb(shop, objectId);
+ ipcRenderer.on("on-extraction-complete", listener);
+ return () => ipcRenderer.removeListener("on-extraction-complete", listener);
+ },
/* Hardware */
getDiskFreeSpace: (path: string) =>
diff --git a/src/renderer/src/app.tsx b/src/renderer/src/app.tsx
index 67311ded..b1867279 100644
--- a/src/renderer/src/app.tsx
+++ b/src/renderer/src/app.tsx
@@ -143,6 +143,10 @@ export function App() {
const existingDownloadSources: DownloadSource[] =
await downloadSourcesTable.toArray();
+ window.electron.createDownloadSources(
+ existingDownloadSources.map((source) => source.url)
+ );
+
await Promise.allSettled(
downloadSources.map(async (source) => {
return new Promise((resolve) => {
diff --git a/src/renderer/src/declaration.d.ts b/src/renderer/src/declaration.d.ts
index 7ebebfaa..87afa16d 100644
--- a/src/renderer/src/declaration.d.ts
+++ b/src/renderer/src/declaration.d.ts
@@ -160,12 +160,15 @@ declare global {
authenticateRealDebrid: (apiToken: string) => Promise;
authenticateTorBox: (apiToken: string) => Promise;
onAchievementUnlocked: (cb: () => void) => () => Electron.IpcRenderer;
+ onExtractionComplete: (
+ cb: (shop: GameShop, objectId: string) => void
+ ) => () => Electron.IpcRenderer;
/* Download sources */
putDownloadSource: (
objectIds: string[]
) => Promise<{ fingerprint: string }>;
- createDownloadSource: (url: string) => Promise;
+ createDownloadSources: (urls: string[]) => Promise;
removeDownloadSource: (url: string, removeAll?: boolean) => Promise;
getDownloadSources: () => Promise<
Pick[]
diff --git a/src/renderer/src/hooks/use-date.ts b/src/renderer/src/hooks/use-date.ts
index 9a5172d3..e0b3322a 100644
--- a/src/renderer/src/hooks/use-date.ts
+++ b/src/renderer/src/hooks/use-date.ts
@@ -1,19 +1,7 @@
+import { formatDate, getDateLocale } from "@shared";
import { format, formatDistance, subMilliseconds } from "date-fns";
import type { FormatDistanceOptions } from "date-fns";
-import {
- ptBR,
- enUS,
- es,
- fr,
- pl,
- hu,
- tr,
- ru,
- it,
- be,
- zhCN,
- da,
-} from "date-fns/locale";
+import { enUS } from "date-fns/locale";
import { useTranslation } from "react-i18next";
export function useDate() {
@@ -21,22 +9,6 @@ export function useDate() {
const { language } = i18n;
- const getDateLocale = () => {
- if (language.startsWith("pt")) return ptBR;
- if (language.startsWith("es")) return es;
- if (language.startsWith("fr")) return fr;
- if (language.startsWith("hu")) return hu;
- if (language.startsWith("pl")) return pl;
- if (language.startsWith("tr")) return tr;
- if (language.startsWith("ru")) return ru;
- if (language.startsWith("it")) return it;
- if (language.startsWith("be")) return be;
- if (language.startsWith("zh")) return zhCN;
- if (language.startsWith("da")) return da;
-
- return enUS;
- };
-
return {
formatDistance: (
date: string | number | Date,
@@ -46,7 +18,7 @@ export function useDate() {
try {
return formatDistance(date, baseDate, {
...options,
- locale: getDateLocale(),
+ locale: getDateLocale(language),
});
} catch (err) {
return "";
@@ -61,7 +33,7 @@ export function useDate() {
try {
return formatDistance(subMilliseconds(new Date(), millis), baseDate, {
...options,
- locale: getDateLocale(),
+ locale: getDateLocale(language),
});
} catch (err) {
return "";
@@ -69,18 +41,13 @@ export function useDate() {
},
formatDateTime: (date: number | Date | string): string => {
- const locale = getDateLocale();
+ const locale = getDateLocale(language);
return format(
date,
locale == enUS ? "MM/dd/yyyy - HH:mm" : "dd/MM/yyyy HH:mm"
);
},
- formatDate: (date: number | Date | string): string => {
- if (isNaN(new Date(date).getDate())) return "N/A";
-
- const locale = getDateLocale();
- return format(date, locale == enUS ? "MM/dd/yyyy" : "dd/MM/yyyy");
- },
+ formatDate: (date: number | Date | string) => formatDate(date, language),
};
}
diff --git a/src/renderer/src/pages/catalogue/pagination.tsx b/src/renderer/src/pages/catalogue/pagination.tsx
index 3a7356d6..dfae6164 100644
--- a/src/renderer/src/pages/catalogue/pagination.tsx
+++ b/src/renderer/src/pages/catalogue/pagination.tsx
@@ -18,14 +18,11 @@ export function Pagination({
if (totalPages <= 1) return null;
- // Number of visible pages
const visiblePages = 3;
- // Calculate the start and end of the visible range
- let startPage = Math.max(1, page - 1); // Shift range slightly back
+ let startPage = Math.max(1, page - 1);
let endPage = startPage + visiblePages - 1;
- // Adjust the range if we're near the start or end
if (endPage > totalPages) {
endPage = totalPages;
startPage = Math.max(1, endPage - visiblePages + 1);
@@ -33,7 +30,6 @@ export function Pagination({
return (
- {/* Previous Button */}
diff --git a/src/renderer/src/pages/game-details/game-details.tsx b/src/renderer/src/pages/game-details/game-details.tsx
index 81965ff0..b966e6e7 100644
--- a/src/renderer/src/pages/game-details/game-details.tsx
+++ b/src/renderer/src/pages/game-details/game-details.tsx
@@ -98,7 +98,8 @@ export default function GameDetails() {
const handleStartDownload = async (
repack: GameRepack,
downloader: Downloader,
- downloadPath: string
+ downloadPath: string,
+ automaticallyExtract: boolean
) => {
const response = await startDownload({
repackId: repack.id,
@@ -108,6 +109,7 @@ export default function GameDetails() {
shop,
downloadPath,
uri: selectRepackUri(repack, downloader),
+ automaticallyExtract: automaticallyExtract,
});
if (response.ok) {
diff --git a/src/renderer/src/pages/game-details/modals/download-settings-modal.tsx b/src/renderer/src/pages/game-details/modals/download-settings-modal.tsx
index f41c3216..63abeb2e 100644
--- a/src/renderer/src/pages/game-details/modals/download-settings-modal.tsx
+++ b/src/renderer/src/pages/game-details/modals/download-settings-modal.tsx
@@ -1,6 +1,12 @@
import { useCallback, useEffect, useMemo, useState } from "react";
import { Trans, useTranslation } from "react-i18next";
-import { Button, Link, Modal, TextField } from "@renderer/components";
+import {
+ Button,
+ CheckboxField,
+ Link,
+ Modal,
+ TextField,
+} from "@renderer/components";
import { CheckCircleFillIcon, DownloadIcon } from "@primer/octicons-react";
import { Downloader, formatBytes, getDownloadersForUris } from "@shared";
import type { GameRepack } from "@types";
@@ -14,7 +20,8 @@ export interface DownloadSettingsModalProps {
startDownload: (
repack: GameRepack,
downloader: Downloader,
- downloadPath: string
+ downloadPath: string,
+ automaticallyExtract: boolean
) => Promise<{ ok: boolean; error?: string }>;
repack: GameRepack | null;
}
@@ -32,6 +39,8 @@ export function DownloadSettingsModal({
const [diskFreeSpace, setDiskFreeSpace] = useState(null);
const [selectedPath, setSelectedPath] = useState("");
const [downloadStarting, setDownloadStarting] = useState(false);
+ const [automaticExtractionEnabled, setAutomaticExtractionEnabled] =
+ useState(true);
const [selectedDownloader, setSelectedDownloader] =
useState(null);
const [hasWritePermission, setHasWritePermission] = useState(
@@ -72,6 +81,21 @@ export function DownloadSettingsModal({
return getDownloadersForUris(repack?.uris ?? []);
}, [repack?.uris]);
+ const getDefaultDownloader = useCallback(
+ (availableDownloaders: Downloader[]) => {
+ if (availableDownloaders.includes(Downloader.TorBox)) {
+ return Downloader.TorBox;
+ }
+
+ if (availableDownloaders.includes(Downloader.RealDebrid)) {
+ return Downloader.RealDebrid;
+ }
+
+ return availableDownloaders[0];
+ },
+ []
+ );
+
useEffect(() => {
if (userPreferences?.downloadsPath) {
setSelectedPath(userPreferences.downloadsPath);
@@ -89,13 +113,9 @@ export function DownloadSettingsModal({
return true;
});
- /* Gives preference to TorBox */
- const selectedDownloader = filteredDownloaders.includes(Downloader.TorBox)
- ? Downloader.TorBox
- : filteredDownloaders[0];
-
- setSelectedDownloader(selectedDownloader ?? null);
+ setSelectedDownloader(getDefaultDownloader(filteredDownloaders));
}, [
+ getDefaultDownloader,
userPreferences?.downloadsPath,
downloaders,
userPreferences?.realDebridApiToken,
@@ -122,7 +142,8 @@ export function DownloadSettingsModal({
const response = await startDownload(
repack,
selectedDownloader!,
- selectedPath
+ selectedPath,
+ automaticExtractionEnabled
);
if (response.ok) {
@@ -217,6 +238,16 @@ export function DownloadSettingsModal({
+ {selectedDownloader !== Downloader.Torrent && (
+
+ setAutomaticExtractionEnabled(!automaticExtractionEnabled)
+ }
+ />
+ )}
+
Promise<{ ok: boolean; error?: string }>;
onClose: () => void;
}
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 075203a4..fee1c5e3 100644
--- a/src/renderer/src/pages/settings/add-download-source-modal.tsx
+++ b/src/renderer/src/pages/settings/add-download-source-modal.tsx
@@ -120,7 +120,7 @@ export function AddDownloadSourceModal({
downloadSourcesWorker.postMessage(["IMPORT_DOWNLOAD_SOURCE", url]);
channel.onmessage = () => {
- window.electron.createDownloadSource(url);
+ window.electron.createDownloadSources([url]);
setIsLoading(false);
putDownloadSource();
diff --git a/src/renderer/src/pages/settings/settings-general.tsx b/src/renderer/src/pages/settings/settings-general.tsx
index 53019ab9..e2cf2971 100644
--- a/src/renderer/src/pages/settings/settings-general.tsx
+++ b/src/renderer/src/pages/settings/settings-general.tsx
@@ -139,9 +139,9 @@ export function SettingsGeneral() {
}))}
/>
-
+
{t("notifications")}
-
+
`https://cdn.cloudflare.steamstatic.com/steamcommunity/public/images/apps/${objectId}/${clientIcon}.ico`,
};
+
+export const getDateLocale = (language: string) => {
+ if (language.startsWith("pt")) return ptBR;
+ if (language.startsWith("es")) return es;
+ if (language.startsWith("fr")) return fr;
+ if (language.startsWith("hu")) return hu;
+ if (language.startsWith("pl")) return pl;
+ if (language.startsWith("tr")) return tr;
+ if (language.startsWith("ru")) return ru;
+ if (language.startsWith("it")) return it;
+ if (language.startsWith("be")) return be;
+ if (language.startsWith("zh")) return zhCN;
+ if (language.startsWith("da")) return da;
+
+ return enUS;
+};
+
+export const formatDate = (
+ date: number | Date | string,
+ language: string
+): string => {
+ if (isNaN(new Date(date).getDate())) return "N/A";
+
+ const locale = getDateLocale(language);
+ return format(date, locale == enUS ? "MM/dd/yyyy" : "dd/MM/yyyy");
+};
diff --git a/src/types/download.types.ts b/src/types/download.types.ts
index 8b7f2091..6bc15fe0 100644
--- a/src/types/download.types.ts
+++ b/src/types/download.types.ts
@@ -7,7 +7,8 @@ export type DownloadStatus =
| "error"
| "complete"
| "seeding"
- | "removed";
+ | "removed"
+ | "extracting";
export interface DownloadProgress {
downloadSpeed: number;
diff --git a/src/types/index.ts b/src/types/index.ts
index 3c2b856d..8cef6f96 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -91,6 +91,7 @@ export interface StartGameDownloadPayload {
uri: string;
downloadPath: string;
downloader: Downloader;
+ automaticallyExtract: boolean;
}
export interface UserFriend {
diff --git a/src/types/level.types.ts b/src/types/level.types.ts
index 82fb0b9d..f98842a2 100644
--- a/src/types/level.types.ts
+++ b/src/types/level.types.ts
@@ -60,6 +60,8 @@ export interface Download {
status: DownloadStatus | null;
queued: boolean;
timestamp: number;
+ extracting: boolean;
+ automaticallyExtract: boolean;
}
export interface GameAchievement {
diff --git a/yarn.lock b/yarn.lock
index e0253463..de40a7c0 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3961,27 +3961,12 @@ bep53-range@^2.0.0:
resolved "https://registry.yarnpkg.com/bep53-range/-/bep53-range-2.0.0.tgz#a1770475661b4b814c4359e4b66f7cbd88de2b10"
integrity sha512-sMm2sV5PRs0YOVk0LTKtjuIprVzxgTQUsrGX/7Yph2Rm4FO2Fqqtq7hNjsOB5xezM4v4+5rljCgK++UeQJZguA==
-better-sqlite3@^11.7.0:
- version "11.7.0"
- resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.7.0.tgz#3eaa0f54f9e57d0a100d980e42320f8b9a4cd676"
- integrity sha512-mXpa5jnIKKHeoGzBrUJrc65cXFKcILGZpU3FXR0pradUEm9MA7UZz02qfEejaMcm9iXrSOCenwwYMJ/tZ1y5Ig==
- dependencies:
- bindings "^1.5.0"
- prebuild-install "^7.1.1"
-
binary-extensions@^2.0.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
-bindings@^1.5.0:
- version "1.5.0"
- 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.1.0:
+bl@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
@@ -4269,11 +4254,6 @@ chokidar@^3.5.3:
optionalDependencies:
fsevents "~2.3.2"
-chownr@^1.1.1:
- version "1.1.4"
- 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.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
@@ -4405,11 +4385,6 @@ color@^4.2.3:
color-convert "^2.0.1"
color-string "^1.9.0"
-colorette@2.0.19:
- version "2.0.19"
- resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
- integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
-
colorjs.io@^0.5.0:
version "0.5.2"
resolved "https://registry.yarnpkg.com/colorjs.io/-/colorjs.io-0.5.2.tgz#63b20139b007591ebc3359932bef84628eb3fcef"
@@ -4422,11 +4397,6 @@ combined-stream@^1.0.8:
dependencies:
delayed-stream "~1.0.0"
-commander@^10.0.0:
- version "10.0.1"
- resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
- integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
-
commander@^5.0.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
@@ -4661,13 +4631,6 @@ debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, d
dependencies:
ms "^2.1.3"
-debug@4.3.4:
- version "4.3.4"
- 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.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
@@ -4680,11 +4643,6 @@ decompress-response@^6.0.0:
dependencies:
mimic-response "^3.1.0"
-deep-extend@^0.6.0:
- version "0.6.0"
- 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.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
@@ -4730,7 +4688,7 @@ delegates@^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.1:
+detect-libc@^2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700"
integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==
@@ -4985,7 +4943,7 @@ encoding@^0.1.13:
dependencies:
iconv-lite "^0.6.2"
-end-of-stream@^1.1.0, end-of-stream@^1.4.1:
+end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -5439,11 +5397,6 @@ eslint@^8.56.0:
strip-ansi "^6.0.1"
text-table "^0.2.0"
-esm@^3.2.25:
- version "3.2.25"
- resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10"
- integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==
-
espree@^9.6.0, espree@^9.6.1:
version "9.6.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
@@ -5487,11 +5440,6 @@ event-target-shim@^5.0.0:
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==
-expand-template@^2.0.3:
- version "2.0.3"
- 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"
@@ -5590,11 +5538,6 @@ file-type@^19.6.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.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.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5"
@@ -5676,11 +5619,6 @@ formdata-polyfill@^4.0.10:
dependencies:
fetch-blob "^3.1.2"
-fs-constants@^1.0.0:
- version "1.0.0"
- 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.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
@@ -5839,11 +5777,6 @@ get-nonce@^1.0.0:
resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3"
integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==
-get-package-type@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
- integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
-
get-proto@^1.0.0, get-proto@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
@@ -5895,11 +5828,6 @@ get-them-args@1.3.2:
resolved "https://registry.yarnpkg.com/get-them-args/-/get-them-args-1.3.2.tgz#74a20ba8a4abece5ae199ad03f2bcc68fdfc9ba5"
integrity sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==
-getopts@2.3.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4"
- integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==
-
git-raw-commits@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-4.0.0.tgz#b212fd2bff9726d27c1283a1157e829490593285"
@@ -5909,11 +5837,6 @@ git-raw-commits@^4.0.0:
meow "^12.0.1"
split2 "^4.0.0"
-github-from-package@0.0.0:
- version "0.0.0"
- 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.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@@ -6314,11 +6237,6 @@ ini@4.1.1:
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.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
- integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
-
internal-slot@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802"
@@ -6337,11 +6255,6 @@ internal-slot@^1.1.0:
hasown "^2.0.2"
side-channel "^1.1.0"
-interpret@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
- integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
-
invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
@@ -6935,26 +6848,6 @@ kill-port@^2.0.1:
get-them-args "1.3.2"
shell-exec "1.0.2"
-knex@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/knex/-/knex-3.1.0.tgz#b6ddd5b5ad26a6315234a5b09ec38dc4a370bd8c"
- integrity sha512-GLoII6hR0c4ti243gMs5/1Rb3B+AjwMOfjYm97pu0FOQa7JH56hgBxYf5WK2525ceSbBY1cjeZ9yk99GPMB6Kw==
- dependencies:
- colorette "2.0.19"
- commander "^10.0.0"
- debug "4.3.4"
- escalade "^3.1.1"
- esm "^3.2.25"
- get-package-type "^0.1.0"
- getopts "2.3.0"
- interpret "^2.2.0"
- lodash "^4.17.21"
- pg-connection-string "2.6.2"
- rechoir "^0.8.0"
- resolve-from "^5.0.0"
- tarn "^3.0.2"
- tildify "2.0.0"
-
language-subtag-registry@^0.3.20:
version "0.3.23"
resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7"
@@ -7107,7 +7000,7 @@ lodash.upperfirst@^4.3.1:
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:
+lodash@^4.17.15:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -7320,7 +7213,7 @@ minimatch@^9.0.3, minimatch@^9.0.4:
dependencies:
brace-expansion "^2.0.1"
-minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6, minimist@^1.2.8:
+minimist@^1.2.6, minimist@^1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
@@ -7402,11 +7295,6 @@ minizlib@^3.0.1:
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.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.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
@@ -7429,11 +7317,6 @@ module-error@^1.0.1:
resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86"
integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==
-ms@2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
ms@^2.0.0, ms@^2.1.1, ms@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
@@ -7449,11 +7332,6 @@ nanoid@^3.3.7:
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.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
- integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
-
napi-macros@^2.2.2:
version "2.2.2"
resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044"
@@ -7477,7 +7355,7 @@ no-case@^3.0.4:
lower-case "^2.0.2"
tslib "^2.0.3"
-node-abi@^3.3.0, node-abi@^3.45.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==
@@ -7845,11 +7723,6 @@ pend@~1.2.0:
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:
- version "2.6.2"
- resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475"
- integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==
-
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"
@@ -7890,24 +7763,6 @@ postcss@^8.4.43:
picocolors "^1.1.0"
source-map-js "^1.2.1"
-prebuild-install@^7.1.1:
- version "7.1.2"
- 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"
- expand-template "^2.0.3"
- github-from-package "0.0.0"
- minimist "^1.2.3"
- mkdirp-classic "^0.5.3"
- napi-build-utils "^1.0.1"
- node-abi "^3.3.0"
- pump "^3.0.0"
- rc "^1.2.7"
- simple-get "^4.0.0"
- tar-fs "^2.0.0"
- tunnel-agent "^0.6.0"
-
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -8023,16 +7878,6 @@ rc-virtual-list@^3.16.1:
rc-resize-observer "^1.0.0"
rc-util "^5.36.0"
-rc@^1.2.7:
- version "1.2.8"
- resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
- integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
- dependencies:
- deep-extend "^0.6.0"
- ini "~1.3.0"
- minimist "^1.2.0"
- strip-json-comments "~2.0.1"
-
react-dom@^18.2.0:
version "18.3.1"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4"
@@ -8147,7 +7992,7 @@ read-binary-file-arch@^1.0.6:
dependencies:
debug "^4.3.4"
-readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
+readable-stream@^3.4.0, readable-stream@^3.6.0:
version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
@@ -8163,13 +8008,6 @@ readdirp@~3.6.0:
dependencies:
picomatch "^2.2.1"
-rechoir@^0.8.0:
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22"
- integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==
- dependencies:
- resolve "^1.20.0"
-
redux-thunk@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-3.1.0.tgz#94aa6e04977c30e14e892eae84978c1af6058ff3"
@@ -8266,15 +8104,6 @@ resolve-from@^5.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-resolve@^1.20.0:
- version "1.22.8"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
- integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
- dependencies:
- is-core-module "^2.13.0"
- path-parse "^1.0.7"
- supports-preserve-symlinks-flag "^1.0.0"
-
resolve@^2.0.0-next.5:
version "2.0.0-next.5"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c"
@@ -8731,20 +8560,6 @@ signal-exit@^4.0.1:
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.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.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
- integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
- dependencies:
- decompress-response "^6.0.0"
- once "^1.3.1"
- simple-concat "^1.0.0"
-
simple-swizzle@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
@@ -9000,11 +8815,6 @@ strip-json-comments@^3.1.1:
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.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
- integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
-
strnum@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db"
@@ -9074,27 +8884,6 @@ synckit@^0.9.1:
"@pkgr/core" "^0.1.0"
tslib "^2.6.2"
-tar-fs@^2.0.0:
- version "2.1.1"
- 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"
- mkdirp-classic "^0.5.2"
- pump "^3.0.0"
- tar-stream "^2.1.4"
-
-tar-stream@^2.1.4:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
- integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
- dependencies:
- bl "^4.0.3"
- end-of-stream "^1.4.1"
- fs-constants "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^3.1.1"
-
tar@^6.0.5, tar@^6.1.11, tar@^6.1.12, tar@^6.1.2:
version "6.2.1"
resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
@@ -9119,11 +8908,6 @@ tar@^7.4.3:
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"
- integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==
-
temp-file@^3.4.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/temp-file/-/temp-file-3.4.0.tgz#766ea28911c683996c248ef1a20eea04d51652c7"
@@ -9147,11 +8931,6 @@ text-table@^0.2.0:
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
-tildify@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a"
- integrity sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==
-
tiny-case@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/tiny-case/-/tiny-case-1.0.3.tgz#d980d66bc72b5d5a9ca86fb7c9ffdb9c898ddd03"
@@ -9286,13 +9065,6 @@ tslib@^2.0.3, tslib@^2.6.2:
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.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.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"