From c6e4ba4789b79cf6ceb87739405c40ab8cb062d9 Mon Sep 17 00:00:00 2001
From: lilezek
Date: Mon, 29 Apr 2024 20:44:14 +0200
Subject: [PATCH 01/30] feat: add the dependencies for real debrid
---
package.json | 4 +++
yarn.lock | 69 +++++++++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 70 insertions(+), 3 deletions(-)
diff --git a/package.json b/package.json
index b8396713..64021f00 100644
--- a/package.json
+++ b/package.json
@@ -72,6 +72,7 @@
"@reduxjs/toolkit": "^2.2.2",
"@sentry/electron": "^4.22.0",
"@sentry/react": "^7.110.1",
+ "@types/node-fetch": "^2.6.11",
"@vanilla-extract/css": "^1.14.1",
"@vanilla-extract/recipes": "^0.5.2",
"axios": "^1.6.8",
@@ -80,6 +81,7 @@
"color": "^4.2.3",
"color.js": "^1.2.0",
"date-fns": "^3.5.0",
+ "electron-dl-manager": "^3.0.0",
"electron-squirrel-startup": "^1.0.0",
"flexsearch": "^0.7.43",
"got-scraping": "^4.0.5",
@@ -88,6 +90,8 @@
"jsdom": "^24.0.0",
"lodash": "^4.17.21",
"lottie-react": "^2.4.0",
+ "node-fetch": "^2.6.1",
+ "node-unrar-js": "^2.0.2",
"parse-torrent": "9.1.5",
"ps-list": "^8.1.1",
"react": "^18.2.0",
diff --git a/yarn.lock b/yarn.lock
index 78c336e0..b4bac2e8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2877,6 +2877,14 @@
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
+"@types/node-fetch@^2.6.11":
+ version "2.6.11"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24"
+ integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==
+ dependencies:
+ "@types/node" "*"
+ form-data "^4.0.0"
+
"@types/node-forge@^1.3.0":
version "1.3.11"
resolved "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz"
@@ -4974,6 +4982,14 @@ ee-first@1.1.1:
resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+electron-dl-manager@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/electron-dl-manager/-/electron-dl-manager-3.0.0.tgz#1b6ef6ee59f45733a5f13e8e916cb8189a21f8c8"
+ integrity sha512-DRyic9aY/6mSg7MvokrFWWY+NLYOnZcKGarujcBE4snobWND0hvV79s9b91kbo7+PLlANroK+jc/NDVliMSfbQ==
+ dependencies:
+ ext-name "^5.0.0"
+ unused-filename "^3.0.1"
+
electron-installer-common@^0.10.2:
version "0.10.3"
resolved "https://registry.yarnpkg.com/electron-installer-common/-/electron-installer-common-0.10.3.tgz#40f9db644ca60eb28673d545b67ee0113aef4444"
@@ -5768,6 +5784,21 @@ express@^4.17.1, express@^4.17.3:
utils-merge "1.0.1"
vary "~1.1.2"
+ext-list@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37"
+ integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==
+ dependencies:
+ mime-db "^1.28.0"
+
+ext-name@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6"
+ integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==
+ dependencies:
+ ext-list "^2.0.0"
+ sort-keys-length "^1.0.0"
+
ext@^1.7.0:
version "1.7.0"
resolved "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz"
@@ -7041,6 +7072,11 @@ is-path-inside@^3.0.3:
resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+is-plain-obj@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+ integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==
+
is-plain-obj@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz"
@@ -7756,7 +7792,7 @@ micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4:
braces "^3.0.2"
picomatch "^2.3.1"
-mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
+mime-db@1.52.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0:
version "1.52.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
@@ -8064,9 +8100,9 @@ node-dir@^0.1.17:
dependencies:
minimatch "^3.0.2"
-node-fetch@^2.6.7:
+node-fetch@^2.6.1, node-fetch@^2.6.7:
version "2.7.0"
- resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
dependencies:
whatwg-url "^5.0.0"
@@ -8121,6 +8157,11 @@ node-releases@^2.0.14:
resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz"
integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
+node-unrar-js@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-unrar-js/-/node-unrar-js-2.0.2.tgz#03ef602052497263b9aed8ff1e7afb315024f9ec"
+ integrity sha512-hLNmoJzqaKJnod8yiTVGe9hnlNRHotUi0CreSv/8HtfRi/3JnRC8DvsmKfeGGguRjTEulhZK6zXX5PXoVuDZ2w==
+
nopt@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz"
@@ -9724,6 +9765,20 @@ socks@^2.6.2:
ip-address "^9.0.5"
smart-buffer "^4.2.0"
+sort-keys-length@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188"
+ integrity sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==
+ dependencies:
+ sort-keys "^1.0.0"
+
+sort-keys@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+ integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==
+ dependencies:
+ is-plain-obj "^1.0.0"
+
source-map-js@^1.0.1, 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"
@@ -10536,6 +10591,14 @@ unplugin@1.0.1:
webpack-sources "^3.2.3"
webpack-virtual-modules "^0.5.0"
+unused-filename@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/unused-filename/-/unused-filename-3.0.1.tgz#41b0600f8909e39cbdbbcf2467591bd3dd83fa7b"
+ integrity sha512-UbMRaEaT+/3mGh40GBRnF2++1VqFG1w0Kjzd5q/uQjagKn5pkCS8goJTgYDpQ6e0tB2GywamMJy1BzbSrMcIWw==
+ dependencies:
+ escape-string-regexp "^4.0.0"
+ path-exists "^4.0.0"
+
update-browserslist-db@^1.0.13:
version "1.0.13"
resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz"
From 6fa4c178a77b8e2b8127264c05e51fd4dac87033 Mon Sep 17 00:00:00 2001
From: lilezek
Date: Mon, 29 Apr 2024 20:50:10 +0200
Subject: [PATCH 02/30] refactor: moved the game status to a global file
(accessible to the render part) and used it in game entity
---
src/globals.ts | 10 ++++++++++
src/main/constants.ts | 9 ---------
src/main/entity/game.entity.ts | 3 ++-
src/main/events/library/get-library.ts | 2 +-
src/main/events/torrenting/cancel-game-download.ts | 2 +-
src/main/events/torrenting/delete-game-folder.ts | 2 +-
src/main/events/torrenting/pause-game-download.ts | 2 +-
.../events/torrenting/remove-game-from-download.ts | 2 +-
src/main/events/torrenting/resume-game-download.ts | 2 +-
src/main/events/torrenting/start-game-download.ts | 2 +-
src/main/index.ts | 3 ++-
src/types/index.ts | 4 +++-
tsconfig.json | 3 ++-
13 files changed, 26 insertions(+), 20 deletions(-)
create mode 100644 src/globals.ts
diff --git a/src/globals.ts b/src/globals.ts
new file mode 100644
index 00000000..e4675aa7
--- /dev/null
+++ b/src/globals.ts
@@ -0,0 +1,10 @@
+export enum GameStatus {
+ Seeding = "seeding",
+ Downloading = "downloading",
+ Paused = "paused",
+ CheckingFiles = "checking_files",
+ DownloadingMetadata = "downloading_metadata",
+ Cancelled = "cancelled",
+ Finished = "finished",
+ Decompressing = "decompressing",
+}
\ No newline at end of file
diff --git a/src/main/constants.ts b/src/main/constants.ts
index 43d9d44e..1a87c27b 100644
--- a/src/main/constants.ts
+++ b/src/main/constants.ts
@@ -34,15 +34,6 @@ export const months = [
"Dec",
];
-export enum GameStatus {
- Seeding = "seeding",
- Downloading = "downloading",
- Paused = "paused",
- CheckingFiles = "checking_files",
- DownloadingMetadata = "downloading_metadata",
- Cancelled = "cancelled",
-}
-
export const defaultDownloadsPath = path.join(os.homedir(), "downloads");
export const databasePath = path.join(
diff --git a/src/main/entity/game.entity.ts b/src/main/entity/game.entity.ts
index 811ecf74..8798a15d 100644
--- a/src/main/entity/game.entity.ts
+++ b/src/main/entity/game.entity.ts
@@ -9,6 +9,7 @@ import {
} from "typeorm";
import type { GameShop } from "@types";
import { Repack } from "./repack.entity";
+import { GameStatus } from "@globals";
@Entity("game")
export class Game {
@@ -40,7 +41,7 @@ export class Game {
shop: GameShop;
@Column("text", { nullable: true })
- status: string;
+ status: GameStatus | "";
@Column("float", { default: 0 })
progress: number;
diff --git a/src/main/events/library/get-library.ts b/src/main/events/library/get-library.ts
index c86d1902..047d848b 100644
--- a/src/main/events/library/get-library.ts
+++ b/src/main/events/library/get-library.ts
@@ -1,9 +1,9 @@
import { gameRepository } from "@main/repository";
-import { GameStatus } from "@main/constants";
import { searchRepacks } from "../helpers/search-games";
import { registerEvent } from "../register-event";
import sortBy from "lodash/sortBy";
+import { GameStatus } from "@globals";
const getLibrary = async (_event: Electron.IpcMainInvokeEvent) =>
gameRepository
diff --git a/src/main/events/torrenting/cancel-game-download.ts b/src/main/events/torrenting/cancel-game-download.ts
index a1a2e6b7..bcd4fdab 100644
--- a/src/main/events/torrenting/cancel-game-download.ts
+++ b/src/main/events/torrenting/cancel-game-download.ts
@@ -1,10 +1,10 @@
-import { GameStatus } from "@main/constants";
import { gameRepository } from "@main/repository";
import { registerEvent } from "../register-event";
import { WindowManager, writePipe } from "@main/services";
import { In } from "typeorm";
+import { GameStatus } from "@globals";
const cancelGameDownload = async (
_event: Electron.IpcMainInvokeEvent,
diff --git a/src/main/events/torrenting/delete-game-folder.ts b/src/main/events/torrenting/delete-game-folder.ts
index c8821415..e913a23a 100644
--- a/src/main/events/torrenting/delete-game-folder.ts
+++ b/src/main/events/torrenting/delete-game-folder.ts
@@ -1,7 +1,7 @@
import path from "node:path";
import fs from "node:fs";
-import { GameStatus } from "@main/constants";
+import { GameStatus } from "@globals";
import { gameRepository } from "@main/repository";
import { getDownloadsPath } from "../helpers/get-downloads-path";
diff --git a/src/main/events/torrenting/pause-game-download.ts b/src/main/events/torrenting/pause-game-download.ts
index d89f2f72..e1da552a 100644
--- a/src/main/events/torrenting/pause-game-download.ts
+++ b/src/main/events/torrenting/pause-game-download.ts
@@ -1,9 +1,9 @@
import { WindowManager, writePipe } from "@main/services";
import { registerEvent } from "../register-event";
-import { GameStatus } from "../../constants";
import { gameRepository } from "../../repository";
import { In } from "typeorm";
+import { GameStatus } from "@globals";
const pauseGameDownload = async (
_event: Electron.IpcMainInvokeEvent,
diff --git a/src/main/events/torrenting/remove-game-from-download.ts b/src/main/events/torrenting/remove-game-from-download.ts
index 47c1ebe6..2ca608ef 100644
--- a/src/main/events/torrenting/remove-game-from-download.ts
+++ b/src/main/events/torrenting/remove-game-from-download.ts
@@ -1,4 +1,4 @@
-import { GameStatus } from "@main/constants";
+import { GameStatus } from "@globals";
import { gameRepository } from "@main/repository";
import { registerEvent } from "../register-event";
diff --git a/src/main/events/torrenting/resume-game-download.ts b/src/main/events/torrenting/resume-game-download.ts
index c1e2e798..9d96ab18 100644
--- a/src/main/events/torrenting/resume-game-download.ts
+++ b/src/main/events/torrenting/resume-game-download.ts
@@ -1,9 +1,9 @@
import { registerEvent } from "../register-event";
-import { GameStatus } from "../../constants";
import { gameRepository } from "../../repository";
import { getDownloadsPath } from "../helpers/get-downloads-path";
import { In } from "typeorm";
import { writePipe } from "@main/services";
+import { GameStatus } from "@globals";
const resumeGameDownload = async (
_event: Electron.IpcMainInvokeEvent,
diff --git a/src/main/events/torrenting/start-game-download.ts b/src/main/events/torrenting/start-game-download.ts
index 1bdb1a6b..a5853208 100644
--- a/src/main/events/torrenting/start-game-download.ts
+++ b/src/main/events/torrenting/start-game-download.ts
@@ -1,12 +1,12 @@
import { getSteamGameIconUrl, writePipe } from "@main/services";
import { gameRepository, repackRepository } from "@main/repository";
-import { GameStatus } from "@main/constants";
import { registerEvent } from "../register-event";
import type { GameShop } from "@types";
import { getImageBase64 } from "@main/helpers";
import { In } from "typeorm";
+import { GameStatus } from "@globals";
const startGameDownload = async (
_event: Electron.IpcMainInvokeEvent,
diff --git a/src/main/index.ts b/src/main/index.ts
index 5637bbd3..1657540d 100644
--- a/src/main/index.ts
+++ b/src/main/index.ts
@@ -1,5 +1,5 @@
import { stateManager } from "./state-manager";
-import { GameStatus, repackers } from "./constants";
+import { repackers } from "./constants";
import {
getNewGOGGames,
getNewRepacksFromCPG,
@@ -22,6 +22,7 @@ import { Repack } from "./entity";
import { Notification } from "electron";
import { t } from "i18next";
import { In } from "typeorm";
+import { GameStatus } from "@globals";
startProcessWatcher();
diff --git a/src/types/index.ts b/src/types/index.ts
index 768f110b..d9070451 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -1,3 +1,5 @@
+import { GameStatus } from "@globals";
+
export type GameShop = "steam" | "epic";
export type CatalogueCategory = "recently_added" | "trending";
@@ -75,7 +77,7 @@ export interface Game extends Omit {
id: number;
title: string;
iconUrl: string;
- status: string;
+ status: GameStatus | "";
folderName: string;
downloadPath: string | null;
repacks: GameRepack[];
diff --git a/tsconfig.json b/tsconfig.json
index ee7e5c2b..aeb1de53 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -19,7 +19,8 @@
"@main/*": ["src/main/*"],
"@renderer/*": ["src/renderer/*"],
"@types": ["src/types/index.ts"],
- "@locales": ["src/locales/index.ts"]
+ "@locales": ["src/locales/index.ts"],
+ "@globals": ["src/globals.ts"]
}
},
"include": ["src/**/*"]
From 3ef2f87412a93fcf54fe133614deb9f98a0ba7c9 Mon Sep 17 00:00:00 2001
From: lilezek
Date: Mon, 29 Apr 2024 20:52:53 +0200
Subject: [PATCH 03/30] feat: added fields in entities to support rar
decompression progress, and real debrid api token settings
---
src/main/entity/game.entity.ts | 9 +++++++++
src/main/entity/user-preferences.entity.ts | 4 ++++
src/renderer/hooks/use-download.ts | 14 +++++++++-----
src/renderer/pages/settings/settings.tsx | 10 ++++++++++
src/types/index.ts | 2 ++
5 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/src/main/entity/game.entity.ts b/src/main/entity/game.entity.ts
index 8798a15d..60daeb64 100644
--- a/src/main/entity/game.entity.ts
+++ b/src/main/entity/game.entity.ts
@@ -34,6 +34,9 @@ export class Game {
@Column("text", { nullable: true })
executablePath: string | null;
+ @Column("text", { nullable: true })
+ rarPath: string | null;
+
@Column("int", { default: 0 })
playTimeInMilliseconds: number;
@@ -43,12 +46,18 @@ export class Game {
@Column("text", { nullable: true })
status: GameStatus | "";
+ /**
+ * Progress is a float between 0 and 1
+ */
@Column("float", { default: 0 })
progress: number;
@Column("float", { default: 0 })
fileVerificationProgress: number;
+ @Column("float", { default: 0 })
+ decompressionProgress: number;
+
@Column("int", { default: 0 })
bytesDownloaded: number;
diff --git a/src/main/entity/user-preferences.entity.ts b/src/main/entity/user-preferences.entity.ts
index 40f1a26a..8cb06aa5 100644
--- a/src/main/entity/user-preferences.entity.ts
+++ b/src/main/entity/user-preferences.entity.ts
@@ -17,6 +17,9 @@ export class UserPreferences {
@Column("text", { default: "en" })
language: string;
+ @Column("text", { nullable: true })
+ realDebridApiToken: string | null;
+
@Column("boolean", { default: false })
downloadNotificationsEnabled: boolean;
@@ -32,3 +35,4 @@ export class UserPreferences {
@UpdateDateColumn()
updatedAt: Date;
}
+
diff --git a/src/renderer/hooks/use-download.ts b/src/renderer/hooks/use-download.ts
index 0c649229..861a0591 100644
--- a/src/renderer/hooks/use-download.ts
+++ b/src/renderer/hooks/use-download.ts
@@ -12,6 +12,7 @@ import {
import type { GameShop, TorrentProgress } from "@types";
import { useDate } from "./use-date";
import { formatBytes } from "@renderer/utils";
+import { GameStatus } from "@globals";
export function useDownload() {
const { updateLibrary } = useLibrary();
@@ -63,9 +64,10 @@ export function useDownload() {
updateLibrary();
});
- const isVerifying = ["downloading_metadata", "checking_files"].includes(
- lastPacket?.game.status
- );
+ const isVerifying =
+ GameStatus.DownloadingMetadata == lastPacket?.game.status ||
+ GameStatus.CheckingFiles == lastPacket?.game.status ||
+ GameStatus.Decompressing == lastPacket?.game.status;
const getETA = () => {
if (isVerifying || !isFinite(lastPacket?.timeRemaining)) {
@@ -84,8 +86,10 @@ export function useDownload() {
};
const getProgress = () => {
- if (lastPacket?.game.status === "checking_files") {
+ if (lastPacket?.game.status === GameStatus.CheckingFiles) {
return formatDownloadProgress(lastPacket?.game.fileVerificationProgress);
+ } else if (lastPacket?.game.status === GameStatus.Decompressing) {
+ return formatDownloadProgress(lastPacket?.game.decompressionProgress);
}
return formatDownloadProgress(lastPacket?.game.progress);
@@ -98,7 +102,7 @@ export function useDownload() {
dispatch(setGameDeleting(gameId));
return window.electron.deleteGameFolder(gameId);
})
- .catch(() => {})
+ .catch(() => { })
.finally(() => {
updateLibrary();
dispatch(removeGameFromDeleting(gameId));
diff --git a/src/renderer/pages/settings/settings.tsx b/src/renderer/pages/settings/settings.tsx
index 47bd604b..23451b35 100644
--- a/src/renderer/pages/settings/settings.tsx
+++ b/src/renderer/pages/settings/settings.tsx
@@ -11,6 +11,7 @@ export function Settings() {
downloadNotificationsEnabled: false,
repackUpdatesNotificationsEnabled: false,
telemetryEnabled: false,
+ realDebridApiToken: null,
});
const { t } = useTranslation("settings");
@@ -27,6 +28,7 @@ export function Settings() {
repackUpdatesNotificationsEnabled:
userPreferences?.repackUpdatesNotificationsEnabled,
telemetryEnabled: userPreferences?.telemetryEnabled,
+ realDebridApiToken: userPreferences.realDebridApiToken,
});
});
}, []);
@@ -107,6 +109,14 @@ export function Settings() {
updateUserPreferences("telemetryEnabled", !form.telemetryEnabled)
}
/>
+
+ {
+ updateUserPreferences("realDebridApiToken", event.target.value);
+ }}
+ />
);
diff --git a/src/types/index.ts b/src/types/index.ts
index d9070451..a8071a6f 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -84,6 +84,7 @@ export interface Game extends Omit {
repack: GameRepack;
progress: number;
fileVerificationProgress: number;
+ decompressionProgress: number;
bytesDownloaded: number;
playTimeInMilliseconds: number;
executablePath: string | null;
@@ -107,6 +108,7 @@ export interface UserPreferences {
downloadNotificationsEnabled: boolean;
repackUpdatesNotificationsEnabled: boolean;
telemetryEnabled: boolean;
+ realDebridApiToken: string | null;
}
export interface HowLongToBeatCategory {
From 76a64fca4a982b80acb2e9ff6c8cb399ba568597 Mon Sep 17 00:00:00 2001
From: lilezek
Date: Mon, 29 Apr 2024 20:53:58 +0200
Subject: [PATCH 04/30] feat: added support to unrar files
---
src/main/services/unrar.ts | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
create mode 100644 src/main/services/unrar.ts
diff --git a/src/main/services/unrar.ts b/src/main/services/unrar.ts
new file mode 100644
index 00000000..b7c35393
--- /dev/null
+++ b/src/main/services/unrar.ts
@@ -0,0 +1,25 @@
+import { Extractor, createExtractorFromFile } from 'node-unrar-js';
+import fs from 'node:fs';
+
+const wasmBinary = fs.readFileSync(require.resolve('node-unrar-js/esm/js/unrar.wasm'));
+
+export class Unrar {
+ private constructor(private extractor: Extractor) { }
+
+ static async fromFilePath(filePath: string, targetFolder: string) {
+ console.log(filePath, targetFolder);
+ const extractor = await createExtractorFromFile({
+ filepath: filePath,
+ targetPath: targetFolder,
+ wasmBinary,
+ });
+ return new Unrar(extractor);
+ }
+
+ extract() {
+ const files = this.extractor.extract().files;
+ for (const file of files) {
+ console.log("File:", file.fileHeader.name);
+ }
+ }
+}
From 6bb22655e850208d6dbf5aab81724c3e22125cbc Mon Sep 17 00:00:00 2001
From: lilezek
Date: Mon, 29 Apr 2024 20:54:27 +0200
Subject: [PATCH 05/30] feat: added support to add magnets and download from
real debrid
---
.../services/donwloaders/real-debrid.d.ts | 65 +++++++++++++++++++
src/main/services/donwloaders/real-debrid.ts | 55 ++++++++++++++++
2 files changed, 120 insertions(+)
create mode 100644 src/main/services/donwloaders/real-debrid.d.ts
create mode 100644 src/main/services/donwloaders/real-debrid.ts
diff --git a/src/main/services/donwloaders/real-debrid.d.ts b/src/main/services/donwloaders/real-debrid.d.ts
new file mode 100644
index 00000000..4ee5228a
--- /dev/null
+++ b/src/main/services/donwloaders/real-debrid.d.ts
@@ -0,0 +1,65 @@
+interface RealDebridUnrestrictLink {
+ id: string;
+ filename: string;
+ mimeType: string;
+ filesize: number;
+ link: string;
+ host: string;
+ host_icon: string;
+ chunks: number;
+ crc: number;
+ download: string;
+ streamable: number;
+}
+
+interface RealDebridAddMagnet {
+ "id": string,
+ // URL of the created ressource
+ "uri": string
+}
+
+interface RealDebridTorrentInfo {
+ "id": string,
+ "filename": string,
+ "original_filename": string, // Original name of the torrent
+ "hash": string, // SHA1 Hash of the torrent
+ "bytes": number, // Size of selected files only
+ "original_bytes": number, // Total size of the torrent
+ "host": string, // Host main domain
+ "split": number, // Split size of links
+ "progress": number, // Possible values: 0 to 100
+ "status": "downloaded", // Current status of the torrent: magnet_error, magnet_conversion, waiting_files_selection, queued, downloading, downloaded, error, virus, compressing, uploading, dead
+ "added": string, // jsonDate
+ "files": [
+ {
+ "id": number,
+ "path": string, // Path to the file inside the torrent, starting with "/"
+ "bytes": number,
+ "selected": number // 0 or 1
+ },
+ {
+ "id": number,
+ "path": string, // Path to the file inside the torrent, starting with "/"
+ "bytes": number,
+ "selected": number // 0 or 1
+ }
+ ],
+ "links": [
+ "string" // Host URL
+ ],
+ "ended": string, // !! Only present when finished, jsonDate
+ "speed": number, // !! Only present in "downloading", "compressing", "uploading" status
+ "seeders": number // !! Only present in "downloading", "magnet_conversion" status
+}
+
+declare module 'real-debrid-api' {
+ interface Torrent {
+ addMagnet(magnet: string): Promise;
+ info(id: string): Promise;
+ }
+
+ export default class {
+ constructor(token: string);
+ torrents: Torrent;
+ }
+}
\ No newline at end of file
diff --git a/src/main/services/donwloaders/real-debrid.ts b/src/main/services/donwloaders/real-debrid.ts
new file mode 100644
index 00000000..0ab290d0
--- /dev/null
+++ b/src/main/services/donwloaders/real-debrid.ts
@@ -0,0 +1,55 @@
+///
+import { userPreferencesRepository } from "@main/repository";
+import fetch from "node-fetch";
+
+const base = "https://api.real-debrid.com/rest/1.0";
+
+export class RealDebridClient {
+ static async addMagnet(magnet: string) {
+ const response = await fetch(`${base}/torrents/addMagnet`, {
+ method: "POST",
+ headers: {
+ "Authorization": `Bearer ${await this.getApiToken()}`,
+ },
+ body: `magnet=${encodeURIComponent(magnet)}`
+ });
+
+ return response.json() as Promise;
+ }
+
+ static async getInfo(id: string) {
+ const response = await fetch(`${base}/torrents/info/${id}`, {
+ headers: {
+ "Authorization": `Bearer ${await this.getApiToken()}`
+ }
+ });
+
+ return response.json() as Promise;
+ }
+
+ static async selectAllFiles(id: string) {
+ const response = await fetch(`${base}/torrents/selectFiles/${id}`, {
+ method: "POST",
+ headers: {
+ "Authorization": `Bearer ${await this.getApiToken()}`,
+ },
+ body: "files=all"
+ });
+ }
+
+ static async unrestrictLink(link: string) {
+ const response = await fetch(`${base}/unrestrict/link`, {
+ method: "POST",
+ headers: {
+ "Authorization": `Bearer ${await this.getApiToken()}`,
+ },
+ body: `link=${link}`
+ });
+
+ return response.json() as Promise;
+ }
+
+ static getApiToken() {
+ return userPreferencesRepository.findOne({ where: { id: 1 } }).then(userPreferences => userPreferences.realDebridApiToken);
+ }
+}
\ No newline at end of file
From 666b1afcb62a3a4d6b324919539b5a3e5a1b2e54 Mon Sep 17 00:00:00 2001
From: lilezek
Date: Mon, 29 Apr 2024 20:57:04 +0200
Subject: [PATCH 06/30] feat: added a Downloader helper to choose between real
debrid and torrent when downloading
---
.../events/torrenting/cancel-game-download.ts | 5 +-
.../events/torrenting/pause-game-download.ts | 5 +-
.../events/torrenting/resume-game-download.ts | 11 +-
.../events/torrenting/start-game-download.ts | 17 +-
src/main/index.ts | 10 +-
src/main/services/donwloaders/downloader.ts | 147 ++++++++++++++++++
.../services/donwloaders/http-downloader.ts | 89 +++++++++++
.../{ => donwloaders}/torrent-client.ts | 65 ++------
src/main/services/index.ts | 2 +-
9 files changed, 268 insertions(+), 83 deletions(-)
create mode 100644 src/main/services/donwloaders/downloader.ts
create mode 100644 src/main/services/donwloaders/http-downloader.ts
rename src/main/services/{ => donwloaders}/torrent-client.ts (62%)
diff --git a/src/main/events/torrenting/cancel-game-download.ts b/src/main/events/torrenting/cancel-game-download.ts
index bcd4fdab..32aa79ae 100644
--- a/src/main/events/torrenting/cancel-game-download.ts
+++ b/src/main/events/torrenting/cancel-game-download.ts
@@ -1,9 +1,10 @@
import { gameRepository } from "@main/repository";
import { registerEvent } from "../register-event";
-import { WindowManager, writePipe } from "@main/services";
+import { WindowManager } from "@main/services";
import { In } from "typeorm";
+import { Downloader } from "@main/services/donwloaders/downloader";
import { GameStatus } from "@globals";
const cancelGameDownload = async (
@@ -41,7 +42,7 @@ const cancelGameDownload = async (
game.status !== GameStatus.Paused &&
game.status !== GameStatus.Seeding
) {
- writePipe.write({ action: "cancel" });
+ Downloader.cancelDownload();
if (result.affected) WindowManager.mainWindow.setProgressBar(-1);
}
});
diff --git a/src/main/events/torrenting/pause-game-download.ts b/src/main/events/torrenting/pause-game-download.ts
index e1da552a..6e728ede 100644
--- a/src/main/events/torrenting/pause-game-download.ts
+++ b/src/main/events/torrenting/pause-game-download.ts
@@ -1,8 +1,9 @@
-import { WindowManager, writePipe } from "@main/services";
+import { WindowManager } from "@main/services";
import { registerEvent } from "../register-event";
import { gameRepository } from "../../repository";
import { In } from "typeorm";
+import { Downloader } from "@main/services/donwloaders/downloader";
import { GameStatus } from "@globals";
const pauseGameDownload = async (
@@ -23,7 +24,7 @@ const pauseGameDownload = async (
)
.then((result) => {
if (result.affected) {
- writePipe.write({ action: "pause" });
+ Downloader.pauseDownload();
WindowManager.mainWindow.setProgressBar(-1);
}
});
diff --git a/src/main/events/torrenting/resume-game-download.ts b/src/main/events/torrenting/resume-game-download.ts
index 9d96ab18..a394c84a 100644
--- a/src/main/events/torrenting/resume-game-download.ts
+++ b/src/main/events/torrenting/resume-game-download.ts
@@ -2,7 +2,7 @@ import { registerEvent } from "../register-event";
import { gameRepository } from "../../repository";
import { getDownloadsPath } from "../helpers/get-downloads-path";
import { In } from "typeorm";
-import { writePipe } from "@main/services";
+import { Downloader } from "@main/services/donwloaders/downloader";
import { GameStatus } from "@globals";
const resumeGameDownload = async (
@@ -18,17 +18,12 @@ const resumeGameDownload = async (
if (!game) return;
- writePipe.write({ action: "pause" });
+ Downloader.resumeDownload();
if (game.status === GameStatus.Paused) {
const downloadsPath = game.downloadPath ?? (await getDownloadsPath());
- writePipe.write({
- action: "start",
- game_id: gameId,
- magnet: game.repack.magnet,
- save_path: downloadsPath,
- });
+ Downloader.downloadGame(game, game.repack);
await gameRepository.update(
{
diff --git a/src/main/events/torrenting/start-game-download.ts b/src/main/events/torrenting/start-game-download.ts
index a5853208..f6125c8a 100644
--- a/src/main/events/torrenting/start-game-download.ts
+++ b/src/main/events/torrenting/start-game-download.ts
@@ -6,6 +6,7 @@ import { registerEvent } from "../register-event";
import type { GameShop } from "@types";
import { getImageBase64 } from "@main/helpers";
import { In } from "typeorm";
+import { Downloader } from "@main/services/donwloaders/downloader";
import { GameStatus } from "@globals";
const startGameDownload = async (
@@ -35,7 +36,7 @@ const startGameDownload = async (
return;
}
- writePipe.write({ action: "pause" });
+ Downloader.pauseDownload();
await gameRepository.update(
{
@@ -61,12 +62,7 @@ const startGameDownload = async (
}
);
- writePipe.write({
- action: "start",
- game_id: game.id,
- magnet: repack.magnet,
- save_path: downloadPath,
- });
+ Downloader.downloadGame(game, repack);
game.status = GameStatus.DownloadingMetadata;
@@ -84,12 +80,7 @@ const startGameDownload = async (
repack: { id: repackId },
});
- writePipe.write({
- action: "start",
- game_id: createdGame.id,
- magnet: repack.magnet,
- save_path: downloadPath,
- });
+ Downloader.downloadGame(createdGame, repack);
const { repack: _, ...rest } = createdGame;
diff --git a/src/main/index.ts b/src/main/index.ts
index 1657540d..cc89a58e 100644
--- a/src/main/index.ts
+++ b/src/main/index.ts
@@ -17,11 +17,12 @@ import {
steamGameRepository,
userPreferencesRepository,
} from "./repository";
-import { TorrentClient } from "./services/torrent-client";
+import { TorrentClient } from "./services/donwloaders/torrent-client";
import { Repack } from "./entity";
import { Notification } from "electron";
import { t } from "i18next";
import { In } from "typeorm";
+import { Downloader } from "./services/donwloaders/downloader";
import { GameStatus } from "@globals";
startProcessWatcher();
@@ -41,12 +42,7 @@ Promise.all([writePipe.createPipe(), readPipe.createPipe()]).then(async () => {
});
if (game) {
- writePipe.write({
- action: "start",
- game_id: game.id,
- magnet: game.repack.magnet,
- save_path: game.downloadPath,
- });
+ Downloader.downloadGame(game, game.repack);
}
readPipe.socket.on("data", (data) => {
diff --git a/src/main/services/donwloaders/downloader.ts b/src/main/services/donwloaders/downloader.ts
new file mode 100644
index 00000000..9c3f1a72
--- /dev/null
+++ b/src/main/services/donwloaders/downloader.ts
@@ -0,0 +1,147 @@
+import { Game, Repack } from "@main/entity";
+import { writePipe } from "../fifo";
+import { gameRepository, userPreferencesRepository } from "@main/repository";
+import { RealDebridClient } from "./real-debrid";
+import { QueryDeepPartialEntity } from "typeorm/query-builder/QueryPartialEntity";
+import { t } from "i18next";
+import { Notification } from "electron";
+import { WindowManager } from "../window-manager";
+import { TorrentUpdate } from "./torrent-client";
+import { HTTPDownloader } from "./http-downloader";
+import { Unrar } from "../unrar";
+import { GameStatus } from "@globals";
+
+interface DownloadStatus {
+ numPeers: number;
+ numSeeds: number;
+ downloadSpeed: number;
+ timeRemaining: number;
+}
+
+export class Downloader {
+ private static lastHttpDownloader: HTTPDownloader | null = null;
+
+ static async usesRealDebrid() {
+ const userPreferences = await userPreferencesRepository.findOne({ where: { id: 1 } });
+ return userPreferences.realDebridApiToken !== null;
+ }
+
+ static async cancelDownload() {
+ if (!await this.usesRealDebrid()) {
+ writePipe.write({ action: "cancel" });
+ } else {
+ if (this.lastHttpDownloader) {
+ this.lastHttpDownloader.cancel();
+ }
+ }
+ }
+
+ static async pauseDownload() {
+ if (!await this.usesRealDebrid()) {
+ writePipe.write({ action: "pause" });
+ } else {
+ if (this.lastHttpDownloader) {
+ this.lastHttpDownloader.pause();
+ }
+ }
+ }
+
+ static async resumeDownload() {
+ if (!await this.usesRealDebrid()) {
+ writePipe.write({ action: "pause" });
+ } else {
+ if (this.lastHttpDownloader) {
+ this.lastHttpDownloader.resume();
+ }
+ }
+ }
+
+ static async downloadGame(game: Game, repack: Repack) {
+ if (!await this.usesRealDebrid()) {
+ writePipe.write({
+ action: "start",
+ game_id: game.id,
+ magnet: repack.magnet,
+ save_path: game.downloadPath,
+ });
+ } else {
+ try {
+ const torrent = await RealDebridClient.addMagnet(repack.magnet);
+ if (torrent && torrent.id) {
+ await RealDebridClient.selectAllFiles(torrent.id);
+ const { links } = await RealDebridClient.getInfo(torrent.id);
+ const { download } = await RealDebridClient.unrestrictLink(links[0]);
+ this.lastHttpDownloader = new HTTPDownloader();
+ this.lastHttpDownloader.download(download, game.downloadPath, game.id);
+ }
+ } catch (e) {
+ console.error(e);
+ }
+ }
+ }
+
+ static async updateGameProgress(gameId: number, gameUpdate: QueryDeepPartialEntity, downloadStatus: DownloadStatus) {
+ await gameRepository.update({ id: gameId }, gameUpdate);
+
+ const game = await gameRepository.findOne({
+ where: { id: gameId },
+ relations: { repack: true },
+ });
+
+ if (gameUpdate.progress === 1 && gameUpdate.status !== GameStatus.Decompressing) {
+ const userPreferences = await userPreferencesRepository.findOne({
+ where: { id: 1 },
+ });
+
+ if (userPreferences?.downloadNotificationsEnabled) {
+ new Notification({
+ title: t("download_complete", {
+ ns: "notifications",
+ lng: userPreferences.language,
+ }),
+ body: t("game_ready_to_install", {
+ ns: "notifications",
+ lng: userPreferences.language,
+ title: game.title,
+ }),
+ }).show();
+ }
+ }
+
+ if (gameUpdate.decompressionProgress === 0 && gameUpdate.status === GameStatus.Decompressing) {
+ const unrar = await Unrar.fromFilePath(game.rarPath, game.downloadPath);
+ unrar.extract();
+ this.updateGameProgress(gameId, {
+ decompressionProgress: 1,
+ status: GameStatus.Finished,
+ }, downloadStatus);
+ }
+
+ if (WindowManager.mainWindow) {
+ const progress = this.getGameProgress(game);
+ WindowManager.mainWindow.setProgressBar(progress === 1 ? -1 : progress);
+
+ WindowManager.mainWindow.webContents.send(
+ "on-download-progress",
+ JSON.parse(JSON.stringify({
+ ...{
+ progress: gameUpdate.progress,
+ bytesDownloaded: gameUpdate.bytesDownloaded,
+ fileSize: gameUpdate.fileSize,
+ gameId,
+ numPeers: downloadStatus.numPeers,
+ numSeeds: downloadStatus.numSeeds,
+ downloadSpeed: downloadStatus.downloadSpeed,
+ timeRemaining: downloadStatus.timeRemaining,
+ } as TorrentUpdate, game
+ }))
+ );
+ }
+ }
+
+ static getGameProgress(game: Game) {
+ if (game.status === GameStatus.CheckingFiles) return game.fileVerificationProgress;
+ if (game.status === GameStatus.Decompressing) return game.decompressionProgress;
+ return game.progress;
+ }
+}
\ No newline at end of file
diff --git a/src/main/services/donwloaders/http-downloader.ts b/src/main/services/donwloaders/http-downloader.ts
new file mode 100644
index 00000000..aec963e0
--- /dev/null
+++ b/src/main/services/donwloaders/http-downloader.ts
@@ -0,0 +1,89 @@
+import { Game } from '@main/entity';
+import { ElectronDownloadManager } from 'electron-dl-manager';
+import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity';
+import { WindowManager } from '../window-manager';
+import { Downloader } from './downloader';
+import { GameStatus } from '@globals';
+
+export class HTTPDownloader {
+ private downloadManager: ElectronDownloadManager;
+ private downloadId: string | null = null;
+
+ constructor() {
+ this.downloadManager = new ElectronDownloadManager();
+ }
+
+ async download(url: string, destination: string, gameId: number) {
+ const window = WindowManager.mainWindow;
+
+ this.downloadId = await this.downloadManager.download({
+ url,
+ window: window,
+ callbacks: {
+ onDownloadStarted: async (ev) => {
+ const updatePayload: QueryDeepPartialEntity = {
+ status: GameStatus.Downloading,
+ progress: 0,
+ bytesDownloaded: 0,
+ fileSize: ev.item.getTotalBytes(),
+ rarPath: `${destination}/.rd/${ev.resolvedFilename}`,
+ };
+ const downloadStatus = {
+ numPeers: 0,
+ numSeeds: 0,
+ downloadSpeed: 0,
+ timeRemaining: Number.POSITIVE_INFINITY,
+ };
+ await Downloader.updateGameProgress(gameId, updatePayload, downloadStatus);
+ },
+ onDownloadCompleted: async (ev) => {
+ const updatePayload: QueryDeepPartialEntity = {
+ progress: 1,
+ decompressionProgress: 0,
+ bytesDownloaded: ev.item.getReceivedBytes(),
+ status: GameStatus.Decompressing,
+ };
+ const downloadStatus = {
+ numPeers: 1,
+ numSeeds: 1,
+ downloadSpeed: 0,
+ timeRemaining: 0,
+ };
+ await Downloader.updateGameProgress(gameId, updatePayload, downloadStatus);
+ },
+ onDownloadProgress: async (ev) => {
+ const updatePayload: QueryDeepPartialEntity = {
+ progress: ev.percentCompleted / 100,
+ bytesDownloaded: ev.item.getReceivedBytes(),
+ };
+ const downloadStatus = {
+ numPeers: 1,
+ numSeeds: 1,
+ downloadSpeed: ev.downloadRateBytesPerSecond,
+ timeRemaining: ev.estimatedTimeRemainingSeconds,
+ };
+ await Downloader.updateGameProgress(gameId, updatePayload, downloadStatus);
+ }
+ },
+ directory: `${destination}/.rd/`,
+ });
+ }
+
+ pause() {
+ if (this.downloadId) {
+ this.downloadManager.pauseDownload(this.downloadId);
+ }
+ }
+
+ cancel() {
+ if (this.downloadId) {
+ this.downloadManager.cancelDownload(this.downloadId);
+ }
+ }
+
+ resume() {
+ if (this.downloadId) {
+ this.downloadManager.resumeDownload(this.downloadId);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/services/torrent-client.ts b/src/main/services/donwloaders/torrent-client.ts
similarity index 62%
rename from src/main/services/torrent-client.ts
rename to src/main/services/donwloaders/torrent-client.ts
index fa1cd59d..8e48bbbd 100644
--- a/src/main/services/torrent-client.ts
+++ b/src/main/services/donwloaders/torrent-client.ts
@@ -2,13 +2,12 @@ import path from "node:path";
import cp from "node:child_process";
import fs from "node:fs";
import * as Sentry from "@sentry/electron/main";
-import { Notification, app, dialog } from "electron";
+import { app, dialog } from "electron";
import type { QueryDeepPartialEntity } from "typeorm/query-builder/QueryPartialEntity";
import { Game } from "@main/entity";
-import { gameRepository, userPreferencesRepository } from "@main/repository";
-import { t } from "i18next";
-import { WindowManager } from "./window-manager";
+import { Downloader } from "./downloader";
+import { GameStatus } from "@globals";
const binaryNameByPlatform: Partial> = {
darwin: "hydra-download-manager",
@@ -75,6 +74,7 @@ export class TorrentClient {
__dirname,
"..",
"..",
+ "..",
"torrent-client",
"main.py"
);
@@ -85,20 +85,15 @@ export class TorrentClient {
}
private static getTorrentStateName(state: TorrentState) {
- if (state === TorrentState.CheckingFiles) return "checking_files";
- if (state === TorrentState.Downloading) return "downloading";
+ if (state === TorrentState.CheckingFiles) return GameStatus.CheckingFiles;
+ if (state === TorrentState.Downloading) return GameStatus.Downloading;
if (state === TorrentState.DownloadingMetadata)
- return "downloading_metadata";
- if (state === TorrentState.Finished) return "finished";
- if (state === TorrentState.Seeding) return "seeding";
+ return GameStatus.DownloadingMetadata;
+ if (state === TorrentState.Finished) return GameStatus.Finished;
+ if (state === TorrentState.Seeding) return GameStatus.Seeding;
return "";
}
- private static getGameProgress(game: Game) {
- if (game.status === "checking_files") return game.fileVerificationProgress;
- return game.progress;
- }
-
public static async onSocketData(data: Buffer) {
const message = Buffer.from(data).toString("utf-8");
@@ -127,44 +122,14 @@ export class TorrentClient {
updatePayload.progress = payload.progress;
}
- await gameRepository.update({ id: payload.gameId }, updatePayload);
-
- const game = await gameRepository.findOne({
- where: { id: payload.gameId },
- relations: { repack: true },
+ Downloader.updateGameProgress(payload.gameId, updatePayload, {
+ numPeers: payload.numPeers,
+ numSeeds: payload.numSeeds,
+ downloadSpeed: payload.downloadSpeed,
+ timeRemaining: payload.timeRemaining,
});
-
- if (game.progress === 1) {
- const userPreferences = await userPreferencesRepository.findOne({
- where: { id: 1 },
- });
-
- if (userPreferences?.downloadNotificationsEnabled) {
- new Notification({
- title: t("download_complete", {
- ns: "notifications",
- lng: userPreferences.language,
- }),
- body: t("game_ready_to_install", {
- ns: "notifications",
- lng: userPreferences.language,
- title: game.title,
- }),
- }).show();
- }
- }
-
- if (WindowManager.mainWindow) {
- const progress = this.getGameProgress(game);
- WindowManager.mainWindow.setProgressBar(progress === 1 ? -1 : progress);
-
- WindowManager.mainWindow.webContents.send(
- "on-download-progress",
- JSON.parse(JSON.stringify({ ...payload, game }))
- );
- }
} catch (err) {
Sentry.captureException(err);
}
}
-}
+}
\ No newline at end of file
diff --git a/src/main/services/index.ts b/src/main/services/index.ts
index 2544c6f4..215cd016 100644
--- a/src/main/services/index.ts
+++ b/src/main/services/index.ts
@@ -6,6 +6,6 @@ export * from "./steam-grid";
export * from "./update-resolver";
export * from "./window-manager";
export * from "./fifo";
-export * from "./torrent-client";
+export * from "./donwloaders/torrent-client";
export * from "./how-long-to-beat";
export * from "./process-watcher";
From f1d2a8844281ef99f75dfb06b73d544fe7e63951 Mon Sep 17 00:00:00 2001
From: lilezek
Date: Tue, 30 Apr 2024 09:29:29 +0200
Subject: [PATCH 07/30] feat: added helper functions to the game status to keep
it simple to read.
---
src/globals.ts | 16 ++++++++++++++++
.../events/torrenting/cancel-game-download.ts | 2 ++
.../components/bottom-panel/bottom-panel.tsx | 5 +++--
src/renderer/components/sidebar/sidebar.tsx | 13 +++++--------
src/renderer/hooks/use-download.ts | 5 +----
src/renderer/pages/downloads/downloads.tsx | 19 ++++++++++---------
.../pages/game-details/hero-panel-actions.tsx | 9 +++++----
.../pages/game-details/hero-panel.tsx | 7 ++++---
8 files changed, 46 insertions(+), 30 deletions(-)
diff --git a/src/globals.ts b/src/globals.ts
index e4675aa7..b240172a 100644
--- a/src/globals.ts
+++ b/src/globals.ts
@@ -7,4 +7,20 @@ export enum GameStatus {
Cancelled = "cancelled",
Finished = "finished",
Decompressing = "decompressing",
+}
+
+export namespace GameStatus {
+ export const isDownloading = (status: GameStatus | "") =>
+ status === GameStatus.Downloading ||
+ status === GameStatus.DownloadingMetadata ||
+ status === GameStatus.CheckingFiles;
+
+ export const isVerifying = (status: GameStatus | "") =>
+ GameStatus.DownloadingMetadata == status ||
+ GameStatus.CheckingFiles == status ||
+ GameStatus.Decompressing == status;
+
+ export const isReady = (status: GameStatus | "") =>
+ status === GameStatus.Finished ||
+ status === GameStatus.Seeding;
}
\ No newline at end of file
diff --git a/src/main/events/torrenting/cancel-game-download.ts b/src/main/events/torrenting/cancel-game-download.ts
index 32aa79ae..af8ae89f 100644
--- a/src/main/events/torrenting/cancel-game-download.ts
+++ b/src/main/events/torrenting/cancel-game-download.ts
@@ -20,6 +20,8 @@ const cancelGameDownload = async (
GameStatus.CheckingFiles,
GameStatus.Paused,
GameStatus.Seeding,
+ GameStatus.Finished,
+ GameStatus.Decompressing,
]),
},
});
diff --git a/src/renderer/components/bottom-panel/bottom-panel.tsx b/src/renderer/components/bottom-panel/bottom-panel.tsx
index c870823e..46e278ca 100644
--- a/src/renderer/components/bottom-panel/bottom-panel.tsx
+++ b/src/renderer/components/bottom-panel/bottom-panel.tsx
@@ -7,6 +7,7 @@ import { vars } from "@renderer/theme.css";
import { useEffect, useMemo, useState } from "react";
import { useNavigate } from "react-router-dom";
import { VERSION_CODENAME } from "@renderer/constants";
+import { GameStatus } from "@globals";
export function BottomPanel() {
const { t } = useTranslation("bottom_panel");
@@ -23,10 +24,10 @@ export function BottomPanel() {
const status = useMemo(() => {
if (isDownloading) {
- if (game.status === "downloading_metadata")
+ if (game.status === GameStatus.DownloadingMetadata)
return t("downloading_metadata", { title: game.title });
- if (game.status === "checking_files")
+ if (game.status === GameStatus.CheckingFiles)
return t("checking_files", {
title: game.title,
percentage: progress,
diff --git a/src/renderer/components/sidebar/sidebar.tsx b/src/renderer/components/sidebar/sidebar.tsx
index 2d853553..cd4aff92 100644
--- a/src/renderer/components/sidebar/sidebar.tsx
+++ b/src/renderer/components/sidebar/sidebar.tsx
@@ -14,6 +14,7 @@ import { MarkGithubIcon } from "@primer/octicons-react";
import DiscordLogo from "@renderer/assets/discord-icon.svg";
import XLogo from "@renderer/assets/x-icon.svg";
import * as styles from "./sidebar.css";
+import { GameStatus } from "@globals";
const socials = [
{
@@ -57,9 +58,7 @@ export function Sidebar() {
}, [gameDownloading?.id, updateLibrary]);
const isDownloading = library.some((game) =>
- ["downloading", "checking_files", "downloading_metadata"].includes(
- game.status
- )
+ GameStatus.isDownloading(game.status)
);
const sidebarRef = useRef(null);
@@ -118,12 +117,10 @@ export function Sidebar() {
}, [isResizing]);
const getGameTitle = (game: Game) => {
- if (game.status === "paused") return t("paused", { title: game.title });
+ if (game.status === GameStatus.Paused) return t("paused", { title: game.title });
if (gameDownloading?.id === game.id) {
- const isVerifying = ["downloading_metadata", "checking_files"].includes(
- gameDownloading?.status
- );
+ const isVerifying = GameStatus.isVerifying(gameDownloading.status);
if (isVerifying)
return t(gameDownloading.status, {
@@ -203,7 +200,7 @@ export function Sidebar() {
className={styles.menuItem({
active:
location.pathname === `/game/${game.shop}/${game.objectID}`,
- muted: game.status === "cancelled",
+ muted: game.status === GameStatus.Cancelled,
})}
>
- {gameDownloading?.status !== "downloading" ? (
+ {gameDownloading?.status !== GameStatus.Downloading ? (
<>
{t(gameDownloading?.status)}
{eta && {t("eta", { eta })}}
@@ -112,7 +113,7 @@ export function HeroPanel({
);
}
- if (game?.status === "paused") {
+ if (game?.status === GameStatus.Paused) {
return (
<>
@@ -127,7 +128,7 @@ export function HeroPanel({
);
}
- if (game?.status === "seeding" || (game && !game.status)) {
+ if (GameStatus.isReady(game?.status) || (game && !game.status)) {
if (!game.lastTimePlayed) {
return
{t("not_played_yet", { title: game.title })}
;
}
From a6d515c49fab53cc701ab3e7aaa303fd298e07ef Mon Sep 17 00:00:00 2001
From: lilezek
Date: Tue, 30 Apr 2024 09:44:35 +0200
Subject: [PATCH 08/30] fix: some spanish translations were wrong.
---
src/locales/es/translation.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/locales/es/translation.json b/src/locales/es/translation.json
index d28fccc4..c8501138 100644
--- a/src/locales/es/translation.json
+++ b/src/locales/es/translation.json
@@ -66,11 +66,11 @@
"remove_from_library": "Eliminar de la biblioteca",
"no_downloads": "No hay descargas disponibles",
"next_suggestion": "Siguiente sugerencia",
- "play_time": "Jugado por {{cantidad}}",
+ "play_time": "Jugado {{amount}}",
"install": "Instalar",
"play": "Jugar",
"not_played_yet": "Aún no has jugado a {{title}}",
- "close": "Cerca",
+ "close": "Cerrar",
"deleting": "Eliminando instalador…",
"playing_now": "Jugando ahora",
"last_time_played": "Jugado por última vez {{period}}"
From 9aff88c7684a9506e86d760c7fcc67a3dd861838 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 30 Apr 2024 08:33:05 +0000
Subject: [PATCH 09/30] docs(contributor): contrib-readme-action has updated
readme
---
README.md | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index ea6256e6..c5ab2b52 100644
--- a/README.md
+++ b/README.md
@@ -105,6 +105,13 @@ yarn make
Null
+
+
+
+
+ Null
+
+ |
@@ -118,15 +125,15 @@ yarn make
Fhilipe Coelho
- |
+
+
Magrid
- |
-
+
From c8fe98417189d81983603fe35f37b7def92b403e Mon Sep 17 00:00:00 2001
From: lilezek
Date: Tue, 30 Apr 2024 11:07:39 +0200
Subject: [PATCH 10/30] fix: drop some merge leftovers
---
src/main/index.ts | 23 ++---------------------
1 file changed, 2 insertions(+), 21 deletions(-)
diff --git a/src/main/index.ts b/src/main/index.ts
index d9aa1a43..b2a1b227 100644
--- a/src/main/index.ts
+++ b/src/main/index.ts
@@ -66,25 +66,6 @@ app.whenReady().then(() => {
});
});
-const track1337xUsers = async (existingRepacks: Repack[]) => {
- for (const repacker of repackers) {
- await getNewRepacksFromUser(
- repacker,
- existingRepacks.filter((repack) => repack.repacker === repacker)
- );
- }
-};
-
-const checkForNewRepacks = async () => {
- const userPreferences = await userPreferencesRepository.findOne({
- where: { id: 1 },
- });
-
- WindowManager.createMainWindow();
- WindowManager.createSystemTray(userPreferences?.language || "en");
- });
-});
-
app.on("browser-window-created", (_, window) => {
optimizer.watchWindowShortcuts(window);
});
@@ -100,7 +81,7 @@ app.on("second-instance", (_event, commandLine) => {
WindowManager.createMainWindow();
}
- const [, path] = commandLine.pop().split("://");
+ const [, path] = commandLine.pop()!.split("://");
if (path) WindowManager.redirect(path);
});
@@ -125,4 +106,4 @@ app.on("activate", () => {
});
// In this file you can include the rest of your app's specific main process
-// code. You can also put them in separate files and import them here.
+// code. You can also put them in separate files and import them here.
\ No newline at end of file
From 6d36db544627c5bd68895485e3f216cdb4691ece Mon Sep 17 00:00:00 2001
From: lilezek
Date: Tue, 30 Apr 2024 11:09:29 +0200
Subject: [PATCH 11/30] fix: added the @globals back and removed some merge
leftovers
---
src/globals.ts | 6 +-
src/main/main.ts | 15 +-
.../services/donwloaders/torrent-client.ts | 2 +-
src/main/services/unrar.ts | 1 -
src/types/index.ts | 2 +-
tsconfig.node.json | 5 +-
tsconfig.web.json | 6 +-
yarn.lock | 865 +++++++++++-------
8 files changed, 535 insertions(+), 367 deletions(-)
diff --git a/src/globals.ts b/src/globals.ts
index b240172a..2625e7f7 100644
--- a/src/globals.ts
+++ b/src/globals.ts
@@ -10,17 +10,17 @@ export enum GameStatus {
}
export namespace GameStatus {
- export const isDownloading = (status: GameStatus | "") =>
+ export const isDownloading = (status: GameStatus | null) =>
status === GameStatus.Downloading ||
status === GameStatus.DownloadingMetadata ||
status === GameStatus.CheckingFiles;
- export const isVerifying = (status: GameStatus | "") =>
+ export const isVerifying = (status: GameStatus | null) =>
GameStatus.DownloadingMetadata == status ||
GameStatus.CheckingFiles == status ||
GameStatus.Decompressing == status;
- export const isReady = (status: GameStatus | "") =>
+ export const isReady = (status: GameStatus | null) =>
status === GameStatus.Finished ||
status === GameStatus.Seeding;
}
\ No newline at end of file
diff --git a/src/main/main.ts b/src/main/main.ts
index c95be117..be5a82b5 100644
--- a/src/main/main.ts
+++ b/src/main/main.ts
@@ -1,5 +1,5 @@
import { stateManager } from "./state-manager";
-import { GameStatus, repackers } from "./constants";
+import { repackers } from "./constants";
import {
getNewGOGGames,
getNewRepacksFromCPG,
@@ -17,11 +17,13 @@ import {
steamGameRepository,
userPreferencesRepository,
} from "./repository";
-import { TorrentClient } from "./services/torrent-client";
+import { TorrentClient } from "./services/donwloaders/torrent-client";
import { Repack } from "./entity";
import { Notification } from "electron";
import { t } from "i18next";
import { In } from "typeorm";
+import { Downloader } from "./services/donwloaders/downloader";
+import { GameStatus } from "@globals";
startProcessWatcher();
@@ -40,12 +42,7 @@ Promise.all([writePipe.createPipe(), readPipe.createPipe()]).then(async () => {
});
if (game) {
- writePipe.write({
- action: "start",
- game_id: game.id,
- magnet: game.repack.magnet,
- save_path: game.downloadPath,
- });
+ Downloader.downloadGame(game, game.repack);
}
readPipe.socket?.on("data", (data) => {
@@ -126,4 +123,4 @@ const loadState = async () => {
import("./events");
};
-loadState().then(() => checkForNewRepacks());
+loadState().then(() => checkForNewRepacks());
\ No newline at end of file
diff --git a/src/main/services/donwloaders/torrent-client.ts b/src/main/services/donwloaders/torrent-client.ts
index d76564d0..ed4e16dc 100644
--- a/src/main/services/donwloaders/torrent-client.ts
+++ b/src/main/services/donwloaders/torrent-client.ts
@@ -90,7 +90,7 @@ export class TorrentClient {
return GameStatus.DownloadingMetadata;
if (state === TorrentState.Finished) return GameStatus.Finished;
if (state === TorrentState.Seeding) return GameStatus.Seeding;
- return "";
+ return null;
}
public static async onSocketData(data: Buffer) {
diff --git a/src/main/services/unrar.ts b/src/main/services/unrar.ts
index b7c35393..9410de23 100644
--- a/src/main/services/unrar.ts
+++ b/src/main/services/unrar.ts
@@ -7,7 +7,6 @@ export class Unrar {
private constructor(private extractor: Extractor) { }
static async fromFilePath(filePath: string, targetFolder: string) {
- console.log(filePath, targetFolder);
const extractor = await createExtractorFromFile({
filepath: filePath,
targetPath: targetFolder,
diff --git a/src/types/index.ts b/src/types/index.ts
index ec0b75fc..050514e9 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -77,7 +77,7 @@ export interface Game extends Omit {
id: number;
title: string;
iconUrl: string;
- status: GameStatus | "";
+ status: GameStatus | null;
folderName: string;
downloadPath: string | null;
repacks: GameRepack[];
diff --git a/tsconfig.node.json b/tsconfig.node.json
index bf88559d..9346eaeb 100644
--- a/tsconfig.node.json
+++ b/tsconfig.node.json
@@ -1,6 +1,6 @@
{
"extends": "@electron-toolkit/tsconfig/tsconfig.node.json",
- "include": ["electron.vite.config.*", "src/main/**/*", "src/preload/**/*", "src/locales/index.ts"],
+ "include": ["electron.vite.config.*", "src/main/**/*", "src/preload/**/*", "src/locales/index.ts", "src/globals.ts"],
"compilerOptions": {
"module": "ESNext",
"composite": true,
@@ -14,7 +14,8 @@
"@renderer/*": ["src/renderer/*"],
"@types": ["src/types/index.ts"],
"@locales": ["src/locales/index.ts"],
- "@resources": ["src/resources/index.ts"]
+ "@resources": ["src/resources/index.ts"],
+ "@globals": ["src/globals.ts"]
}
}
}
\ No newline at end of file
diff --git a/tsconfig.web.json b/tsconfig.web.json
index a888cf67..6b053f61 100644
--- a/tsconfig.web.json
+++ b/tsconfig.web.json
@@ -5,7 +5,8 @@
"src/renderer/src/**/*",
"src/renderer/src/**/*.tsx",
"src/preload/*.d.ts",
- "src/locales/index.ts"
+ "src/locales/index.ts",
+ "src/globals.ts"
],
"compilerOptions": {
"composite": true,
@@ -16,7 +17,8 @@
"src/renderer/src/*"
],
"@types": ["src/types/index.ts"],
- "@locales": ["src/locales/index.ts"]
+ "@locales": ["src/locales/index.ts"],
+ "@globals": ["src/globals.ts"]
}
}
}
diff --git a/yarn.lock b/yarn.lock
index b650daf9..90d99bdc 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,11 @@
# yarn lockfile v1
+"7zip-bin@~5.2.0":
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz"
+ integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==
+
"@ampproject/remapping@^2.2.0":
version "2.3.0"
resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz"
@@ -23,7 +28,7 @@
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz"
integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==
-"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.18.5", "@babel/core@^7.21.3", "@babel/core@^7.23.5", "@babel/core@^7.23.9":
+"@babel/core@^7.18.5", "@babel/core@^7.21.3", "@babel/core@^7.23.5", "@babel/core@^7.23.9":
version "7.24.4"
resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz"
integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==
@@ -230,7 +235,7 @@
"@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
-"@colors/colors@^1.6.0", "@colors/colors@1.6.0":
+"@colors/colors@1.6.0", "@colors/colors@^1.6.0":
version "1.6.0"
resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz"
integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==
@@ -346,6 +351,56 @@
resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz"
integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==
+"@esbuild/aix-ppc64@0.19.12":
+ version "0.19.12"
+ 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/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-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-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/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-x64@0.19.12":
version "0.19.12"
resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz"
@@ -356,6 +411,176 @@
resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz"
integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==
+"@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-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/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-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-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-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-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-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-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-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-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/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/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/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/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-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-x64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae"
+ integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==
+
+"@esbuild/win32-x64@0.20.2":
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc"
+ integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==
+
"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
version "4.4.0"
resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz"
@@ -486,7 +711,7 @@
"@nodelib/fs.stat" "2.0.5"
run-parallel "^1.1.9"
-"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
version "2.0.5"
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
@@ -538,11 +763,86 @@
estree-walker "^2.0.2"
picomatch "^2.3.1"
+"@rollup/rollup-android-arm-eabi@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.0.tgz#bc8d14ba7673d901a0d5b4b5061dd4f843ab1797"
+ integrity sha512-nNvLvC2fjC+3+bHYN9uaGF3gcyy7RHGZhtl8TB/kINj9hiOQza8kWJGZh47GRPMrqeseO8U+Z8ElDMCZlWBdHA==
+
+"@rollup/rollup-android-arm64@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.0.tgz#be0cac9af51c9c9b4b064f335fb9886b95b1df8a"
+ integrity sha512-+kjt6dvxnyTIAo7oHeYseYhDyZ7xRKTNl/FoQI96PHkJVxoChldJnne/LzYqpqidoK1/0kX0/q+5rrYqjpth6w==
+
+"@rollup/rollup-darwin-arm64@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.0.tgz#6e829f61560dbae75f0ba94bf345d9608150703e"
+ integrity sha512-Oj6Tp0unMpGTBjvNwbSRv3DopMNLu+mjBzhKTt2zLbDJ/45fB1pltr/rqrO4bE95LzuYwhYn127pop+x/pzf5w==
+
"@rollup/rollup-darwin-x64@4.17.0":
version "4.17.0"
resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.0.tgz"
integrity sha512-3nJx0T+yptxMd+v93rBRxSPTAVCv8szu/fGZDJiKX7kvRe9sENj2ggXjCH/KK1xZEmJOhaNo0c9sGMgGdfkvEw==
+"@rollup/rollup-linux-arm-gnueabihf@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.0.tgz#186c3aa4a9f6db70a4d1b8b6f75b98f1dc1d004d"
+ integrity sha512-Vb2e8p9b2lxxgqyOlBHmp6hJMu/HSU6g//6Tbr7x5V1DlPCHWLOm37nSIVK314f+IHzORyAQSqL7+9tELxX3zQ==
+
+"@rollup/rollup-linux-arm-musleabihf@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.0.tgz#9824aaa641d9fc12c66866a2c5d03847d43fea3a"
+ integrity sha512-Md60KsmC5ZIaRq/bYYDloklgU+XLEZwS2EXXVcSpiUw+13/ZASvSWQ/P92rQ9YDCL6EIoXxuQ829JkReqdYbGg==
+
+"@rollup/rollup-linux-arm64-gnu@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.0.tgz#a6c51266ec41df8431ccb3a5d9c09339264d86b8"
+ integrity sha512-zL5rBFtJ+2EGnMRm2TqKjdjgFqlotSU+ZJEN37nV+fiD3I6Gy0dUh3jBWN0wSlcXVDEJYW7YBe+/2j0N9unb2w==
+
+"@rollup/rollup-linux-arm64-musl@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.0.tgz#c862f69b1b979bae65545c55f005ca227b695778"
+ integrity sha512-s2xAyNkJqUdtRVgNK4NK4P9QttS538JuX/kfVQOdZDI5FIKVAUVdLW7qhGfmaySJ1EvN/Bnj9oPm5go9u8navg==
+
+"@rollup/rollup-linux-powerpc64le-gnu@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.0.tgz#ce19c505ef6ce2c83df74b42824d95d38069cc2b"
+ integrity sha512-7F99yzVT67B7IUNMjLD9QCFDCyHkyCJMS1dywZrGgVFJao4VJ9szrIEgH67cR+bXQgEaY01ur/WSL6B0jtcLyA==
+
+"@rollup/rollup-linux-riscv64-gnu@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.0.tgz#0f9719bec216cf2769ac9f420211190b2f55c8fa"
+ integrity sha512-leFtyiXisfa3Sg9pgZJwRKITWnrQfhtqDjCamnZhkZuIsk1FXmYwKoTkp6lsCgimIcneFFkHKp/yGLxDesga4g==
+
+"@rollup/rollup-linux-s390x-gnu@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.0.tgz#89cd27358ceb2351ae92b263df2ed0523f90b926"
+ integrity sha512-FtOgui6qMJ4jbSXTxElsy/60LEe/3U0rXkkz2G5CJ9rbHPAvjMvI+3qF0A0fwLQ5hW+/ZC6PbnS2KfRW9JkgDQ==
+
+"@rollup/rollup-linux-x64-gnu@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.0.tgz#854122ced306100a0f1bfe9085dce98360554efa"
+ integrity sha512-v6eiam/1w3HUfU/ZjzIDodencqgrSqzlNuNtiwH7PFJHYSo1ezL0/UIzmS2lpSJF1ORNaplXeKHYmmdt81vV2g==
+
+"@rollup/rollup-linux-x64-musl@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.0.tgz#6a96d08c563cb9b90ce806ebcb218518872ec408"
+ integrity sha512-OUhkSdpM5ofVlVU2k4CwVubYwiwu1a4jYWPpubzN7Vzao73GoPBowHcCfaRSFRz1SszJ3HIsk3dZYk4kzbqjgw==
+
+"@rollup/rollup-win32-arm64-msvc@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.0.tgz#a0403ef24fe50d28b7c18dcf97d88d882950bbd8"
+ integrity sha512-uL7UYO/MNJPGL/yflybI+HI+n6+4vlfZmQZOCb4I+z/zy1wisHT3exh7oNQsnL6Eso0EUTEfgQ/PaGzzXf6XyQ==
+
+"@rollup/rollup-win32-ia32-msvc@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.0.tgz#b9a2dd65241a78a434592b917430702b3c360fc1"
+ integrity sha512-4WnSgaUiUmXILwFqREdOcqvSj6GD/7FrvSjhaDjmwakX9w4Z2F8JwiSP1AZZbuRkPqzi444UI5FPv33VKOWYFQ==
+
+"@rollup/rollup-win32-x64-msvc@4.17.0":
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.0.tgz#3b8ec9d6a7eccca80dd1f16fe444abe128a2ec08"
+ integrity sha512-ve+D8t1prRSRnF2S3pyDtTXDlvW1Pngbz76tjgYFQW1jxVSysmQCZfPoDAo4WP+Ano8zeYp85LsArZBI12HfwQ==
+
"@sentry-internal/feedback@7.112.0":
version "7.112.0"
resolved "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-7.112.0.tgz"
@@ -651,6 +951,36 @@
resolved "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.31.0.tgz"
integrity sha512-VM5liyxMnm4K2g0WsrRPXRCMLhaT09C7gK5Fz/CxKYh9sbMZB7KA4hV/3klkyuyw1+ECF1J66cefhNkFZepUig==
+"@sentry/cli-linux-arm64@2.31.0":
+ version "2.31.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.31.0.tgz#38604d2d1e7c2e50d48610d38523e371d2104cd7"
+ integrity sha512-eENJTmXoFX3uNr8xRW7Bua2Sw3V1tylQfdtS85pNjZPdbm3U8wYQSWu2VoZkK2ASOoC+17YC8jTQxq62KWnSeQ==
+
+"@sentry/cli-linux-arm@2.31.0":
+ version "2.31.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-linux-arm/-/cli-linux-arm-2.31.0.tgz#6e802a279011703d39e4b31de7b950c522a73261"
+ integrity sha512-AZoCN3waXEfXGCd3YSrikcX/y63oQe0Tiyapkeoifq/0QhI+2MOOrAQb60gthsXwb0UDK/XeFi3PaxyUCphzxA==
+
+"@sentry/cli-linux-i686@2.31.0":
+ version "2.31.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-linux-i686/-/cli-linux-i686-2.31.0.tgz#d4586a18145f43b37324231e0f19f8f23793fc58"
+ integrity sha512-cQUFb3brhLaNSIoNzjU/YASnTM1I3TDJP9XXzH0eLK9sSopCcDcc6OrYEYvdjJXZKzFv5sbc9UNMsIDbh4+rYg==
+
+"@sentry/cli-linux-x64@2.31.0":
+ version "2.31.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-linux-x64/-/cli-linux-x64-2.31.0.tgz#f89fd87b47a5eb10c292846f3a1a754cf97105fe"
+ integrity sha512-z1zTNg91nZJRdcGHC/bCU1KwIaifV0MLJteip9KrFDprzhJk1HtMxFOS0+OZ5/UH21CjAFmg9Pj6IAGqm3BYjA==
+
+"@sentry/cli-win32-i686@2.31.0":
+ version "2.31.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-win32-i686/-/cli-win32-i686-2.31.0.tgz#cb3dbb539c8f8bcac4b1f95ab45a87b5143997ee"
+ integrity sha512-+K7fdk57aUd4CmYrQfDGYPzVyxsTnVro6IPb5QSSLpP03dL7ko5208epu4m2SyN/MkFvscy9Di3n3DTvIfDU2w==
+
+"@sentry/cli-win32-x64@2.31.0":
+ version "2.31.0"
+ resolved "https://registry.yarnpkg.com/@sentry/cli-win32-x64/-/cli-win32-x64-2.31.0.tgz#8ac3fa4ae0634911af4f4a497d58d2adce0f303a"
+ integrity sha512-w5cvpZ6VVlhlyleY8TYHmrP7g48vKHnoVt5xFccfxT+HqQI/AxodvzgVvBTM2kB/sh/kHwexp6bJGWCdkGftww==
+
"@sentry/cli@^2.22.3":
version "2.31.0"
resolved "https://registry.npmjs.org/@sentry/cli/-/cli-2.31.0.tgz"
@@ -798,12 +1128,7 @@
resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz"
integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==
-"@sindresorhus/is@^5.2.0":
- version "5.6.0"
- resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz"
- integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==
-
-"@sindresorhus/is@^5.3.0":
+"@sindresorhus/is@^5.2.0", "@sindresorhus/is@^5.3.0":
version "5.6.0"
resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz"
integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==
@@ -867,7 +1192,7 @@
"@svgr/babel-plugin-transform-react-native-svg" "8.1.0"
"@svgr/babel-plugin-transform-svg-component" "8.0.0"
-"@svgr/core@*", "@svgr/core@^8.1.0":
+"@svgr/core@^8.1.0":
version "8.1.0"
resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz"
integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==
@@ -896,12 +1221,57 @@
"@svgr/hast-util-to-babel-ast" "8.0.0"
svg-parser "^2.0.4"
+"@swc/core-darwin-arm64@1.4.17":
+ version "1.4.17"
+ resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.17.tgz#e62fa7f247bdd1c0c50a3f99722da4dd098c7c67"
+ integrity sha512-HVl+W4LezoqHBAYg2JCqR+s9ife9yPfgWSj37iIawLWzOmuuJ7jVdIB7Ee2B75bEisSEKyxRlTl6Y1Oq3owBgw==
+
"@swc/core-darwin-x64@1.4.17":
version "1.4.17"
resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.17.tgz"
integrity sha512-WYRO9Fdzq4S/he8zjW5I95G1zcvyd9yyD3Tgi4/ic84P5XDlSMpBDpBLbr/dCPjmSg7aUXxNQqKqGkl6dQxYlA==
-"@swc/core@^1.0.0", "@swc/core@^1.4.16":
+"@swc/core-linux-arm-gnueabihf@1.4.17":
+ version "1.4.17"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.17.tgz#7145b3ada5cf9b748eaacbc9a7c7037ba0fb26bb"
+ integrity sha512-cgbvpWOvtMH0XFjvwppUCR+Y+nf6QPaGu6AQ5hqCP+5Lv2zO5PG0RfasC4zBIjF53xgwEaaWmGP5/361P30X8Q==
+
+"@swc/core-linux-arm64-gnu@1.4.17":
+ version "1.4.17"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.17.tgz#5c0833ef132af17bd3cbdf2253f35b57c0cf62bb"
+ integrity sha512-l7zHgaIY24cF9dyQ/FOWbmZDsEj2a9gRFbmgx2u19e3FzOPuOnaopFj0fRYXXKCmtdx+anD750iBIYnTR+pq/Q==
+
+"@swc/core-linux-arm64-musl@1.4.17":
+ version "1.4.17"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.17.tgz#5bfe81eb23c905f04b669a7d2b060a147a263483"
+ integrity sha512-qhH4gr9gAlVk8MBtzXbzTP3BJyqbAfUOATGkyUtohh85fPXQYuzVlbExix3FZXTwFHNidGHY8C+ocscI7uDaYw==
+
+"@swc/core-linux-x64-gnu@1.4.17":
+ version "1.4.17"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.17.tgz#a0c19bc9635e86ebd1c7f8e9e026503d1a1bf83d"
+ integrity sha512-vRDFATL1oN5oZMImkwbgSHEkp8xG1ofEASBypze01W1Tqto8t+yo6gsp69wzCZBlxldsvPpvFZW55Jq0Rn+UnA==
+
+"@swc/core-linux-x64-musl@1.4.17":
+ version "1.4.17"
+ resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.17.tgz#2179b9536235a3b02a46997ddb1c178dfadf1667"
+ integrity sha512-zQNPXAXn3nmPqv54JVEN8k2JMEcMTQ6veVuU0p5O+A7KscJq+AGle/7ZQXzpXSfUCXlLMX4wvd+rwfGhh3J4cw==
+
+"@swc/core-win32-arm64-msvc@1.4.17":
+ version "1.4.17"
+ resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.17.tgz#3004a431c836c6b16b4660ea2425dde467a8ee36"
+ integrity sha512-z86n7EhOwyzxwm+DLE5NoLkxCTme2lq7QZlDjbQyfCxOt6isWz8rkW5QowTX8w9Rdmk34ncrjSLvnHOeLY17+w==
+
+"@swc/core-win32-ia32-msvc@1.4.17":
+ version "1.4.17"
+ resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.17.tgz#59155485d5307fb2a267e5acb215e0f440b6f48f"
+ integrity sha512-JBwuSTJIgiJJX6wtr4wmXbfvOswHFj223AumUrK544QV69k60FJ9q2adPW9Csk+a8wm1hLxq4HKa2K334UHJ/g==
+
+"@swc/core-win32-x64-msvc@1.4.17":
+ version "1.4.17"
+ resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.17.tgz#b98f25fc277fb0e319f25f9fd00a82023662716b"
+ integrity sha512-jFkOnGQamtVDBm3MF5Kq1lgW8vx4Rm1UvJWRUfg+0gx7Uc3Jp3QMFeMNw/rDNQYRDYPG3yunCC+2463ycd5+dg==
+
+"@swc/core@^1.4.16":
version "1.4.17"
resolved "https://registry.npmjs.org/@swc/core/-/core-1.4.17.tgz"
integrity sha512-tq+mdWvodMBNBBZbwFIMTVGYHe9N7zvEaycVVjfvAx20k1XozHbHhRv+9pEVFJjwRxLdXmtvFZd3QZHRAOpoNQ==
@@ -1008,12 +1378,12 @@
dependencies:
"@types/ms" "*"
-"@types/estree@^1.0.0", "@types/estree@1.0.5":
+"@types/estree@1.0.5", "@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==
-"@types/fs-extra@^9.0.11", "@types/fs-extra@9.0.13":
+"@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"
integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==
@@ -1070,7 +1440,15 @@
resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz"
integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==
-"@types/node@*", "@types/node@^18.0.0 || >=20.0.0", "@types/node@^20.12.7":
+"@types/node-fetch@^2.6.11":
+ version "2.6.11"
+ resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24"
+ integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==
+ dependencies:
+ "@types/node" "*"
+ form-data "^4.0.0"
+
+"@types/node@*", "@types/node@^20.12.7":
version "20.12.7"
resolved "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz"
integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==
@@ -1120,7 +1498,7 @@
dependencies:
"@types/react" "*"
-"@types/react@*", "@types/react@^18.2.25", "@types/react@^18.2.48":
+"@types/react@*", "@types/react@^18.2.48":
version "18.3.1"
resolved "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz"
integrity sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==
@@ -1184,7 +1562,7 @@
semver "^7.5.4"
ts-api-utils "^1.0.1"
-"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.14.0":
+"@typescript-eslint/parser@^6.14.0":
version "6.21.0"
resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz"
integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==
@@ -1265,7 +1643,7 @@
dependencies:
"@babel/core" "^7.23.9"
-"@vanilla-extract/css@^1.0.0", "@vanilla-extract/css@^1.14.2":
+"@vanilla-extract/css@^1.14.2":
version "1.14.2"
resolved "https://registry.npmjs.org/@vanilla-extract/css/-/css-1.14.2.tgz"
integrity sha512-OasEW4ojGqqRiUpsyEDUMrSkLnmwbChtafkogpCZ1eDAgAZ9eY9CHLYodj2nB8aV5T25kQ5shm92k25ngjYhhg==
@@ -1334,11 +1712,6 @@
resolved "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz"
integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==
-"7zip-bin@~5.2.0":
- version "5.2.0"
- resolved "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz"
- integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==
-
abort-controller@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz"
@@ -1351,7 +1724,7 @@ acorn-jsx@^5.3.2:
resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.11.3, acorn@^8.8.1, acorn@^8.9.0:
+acorn@^8.11.3, acorn@^8.8.1, acorn@^8.9.0:
version "8.11.3"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz"
integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
@@ -1361,20 +1734,6 @@ adm-zip@^0.5.9:
resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.12.tgz"
integrity sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==
-agent-base@^7.0.2:
- version "7.1.1"
- resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz"
- integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==
- dependencies:
- debug "^4.3.4"
-
-agent-base@^7.1.0:
- version "7.1.1"
- resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz"
- integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==
- dependencies:
- debug "^4.3.4"
-
agent-base@6:
version "6.0.2"
resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz"
@@ -1382,12 +1741,19 @@ agent-base@6:
dependencies:
debug "4"
+agent-base@^7.0.2, agent-base@^7.1.0:
+ version "7.1.1"
+ resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz"
+ integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==
+ dependencies:
+ debug "^4.3.4"
+
ajv-keywords@^3.4.1:
version "3.5.2"
resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz"
integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
-ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4, ajv@^6.9.1:
+ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4:
version "6.12.6"
resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@@ -1482,51 +1848,6 @@ app-root-path@^3.1.0:
resolved "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz"
integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==
-archiver-utils@^2.1.0:
- version "2.1.0"
- resolved "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz"
- integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==
- dependencies:
- glob "^7.1.4"
- graceful-fs "^4.2.0"
- lazystream "^1.0.0"
- lodash.defaults "^4.2.0"
- lodash.difference "^4.5.0"
- lodash.flatten "^4.4.0"
- lodash.isplainobject "^4.0.6"
- lodash.union "^4.6.0"
- normalize-path "^3.0.0"
- readable-stream "^2.0.0"
-
-archiver-utils@^3.0.4:
- version "3.0.4"
- resolved "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz"
- integrity sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==
- dependencies:
- glob "^7.2.3"
- graceful-fs "^4.2.0"
- lazystream "^1.0.0"
- lodash.defaults "^4.2.0"
- lodash.difference "^4.5.0"
- lodash.flatten "^4.4.0"
- lodash.isplainobject "^4.0.6"
- lodash.union "^4.6.0"
- normalize-path "^3.0.0"
- readable-stream "^3.6.0"
-
-archiver@^5.3.1:
- version "5.3.2"
- resolved "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz"
- integrity sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==
- dependencies:
- archiver-utils "^2.1.0"
- async "^3.2.4"
- buffer-crc32 "^0.2.1"
- readable-stream "^3.6.0"
- readdir-glob "^1.1.2"
- tar-stream "^2.2.0"
- zip-stream "^4.1.0"
-
argparse@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
@@ -1639,7 +1960,7 @@ async-exit-hook@^2.0.1:
resolved "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz"
integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==
-async@^3.2.3, async@^3.2.4:
+async@^3.2.3:
version "3.2.5"
resolved "https://registry.npmjs.org/async/-/async-3.2.5.tgz"
integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==
@@ -1697,7 +2018,7 @@ bep53-range@^2.0.0:
resolved "https://registry.npmjs.org/bep53-range/-/bep53-range-2.0.0.tgz"
integrity sha512-sMm2sV5PRs0YOVk0LTKtjuIprVzxgTQUsrGX/7Yph2Rm4FO2Fqqtq7hNjsOB5xezM4v4+5rljCgK++UeQJZguA==
-"better-sqlite3@^7.1.2 || ^8.0.0 || ^9.0.0", better-sqlite3@^9.5.0:
+better-sqlite3@^9.5.0:
version "9.6.0"
resolved "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-9.6.0.tgz"
integrity sha512-yR5HATnqeYNVnkaUTf4bOP2dJSnyhP4puJN/QPRyx4YkBEEUxib422n2XzPqDEHjQQqazoYoADdAm5vE15+dAQ==
@@ -1765,7 +2086,7 @@ braces@^3.0.2, braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
-browserslist@^4.21.1, browserslist@^4.22.2, "browserslist@>= 4.21.0":
+browserslist@^4.21.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==
@@ -1775,7 +2096,7 @@ browserslist@^4.21.1, browserslist@^4.22.2, "browserslist@>= 4.21.0":
node-releases "^2.0.14"
update-browserslist-db "^1.0.13"
-buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3:
+buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz"
integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
@@ -1819,8 +2140,8 @@ builder-util@24.13.1:
resolved "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz"
integrity sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==
dependencies:
- "@types/debug" "^4.1.6"
"7zip-bin" "~5.2.0"
+ "@types/debug" "^4.1.6"
app-builder-bin "4.0.0"
bluebird-lst "^1.0.9"
builder-util-runtime "9.2.4"
@@ -2029,16 +2350,16 @@ color-convert@^2.0.1:
dependencies:
color-name "~1.1.4"
-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"
- integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
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"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
color-string@^1.6.0:
version "1.9.1"
resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz"
@@ -2085,16 +2406,6 @@ compare-version@^0.1.2:
resolved "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz"
integrity sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==
-compress-commons@^4.1.2:
- version "4.1.2"
- resolved "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz"
- integrity sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==
- dependencies:
- buffer-crc32 "^0.2.13"
- crc32-stream "^4.0.2"
- normalize-path "^3.0.0"
- readable-stream "^3.6.0"
-
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
@@ -2118,7 +2429,7 @@ convert-source-map@^2.0.0:
resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"
integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
-core-util-is@~1.0.0, core-util-is@1.0.2:
+core-util-is@1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==
@@ -2133,11 +2444,6 @@ cosmiconfig@^8.1.3:
parse-json "^5.2.0"
path-type "^4.0.0"
-crc-32@^1.2.0:
- version "1.2.2"
- resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz"
- integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
-
crc@^3.8.0:
version "3.8.0"
resolved "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz"
@@ -2145,14 +2451,6 @@ crc@^3.8.0:
dependencies:
buffer "^5.1.0"
-crc32-stream@^4.0.2:
- version "4.0.3"
- resolved "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz"
- integrity sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==
- dependencies:
- crc-32 "^1.2.0"
- readable-stream "^3.4.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"
@@ -2242,7 +2540,7 @@ dayjs@^1.11.9:
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz"
integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==
-debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@4:
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@@ -2276,16 +2574,16 @@ deep-object-diff@^1.1.9:
resolved "https://registry.npmjs.org/deep-object-diff/-/deep-object-diff-1.1.9.tgz"
integrity sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==
-deepmerge@^4.2.2:
- version "4.3.1"
- resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz"
- integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
-
deepmerge@4.3.0:
version "4.3.0"
resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz"
integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==
+deepmerge@^4.2.2:
+ version "4.3.1"
+ resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz"
+ integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
+
defer-to-connect@^2.0.0, defer-to-connect@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz"
@@ -2430,16 +2728,6 @@ ejs@^3.1.8:
dependencies:
jake "^10.8.5"
-electron-builder-squirrel-windows@24.13.3:
- version "24.13.3"
- resolved "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz"
- integrity sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==
- dependencies:
- app-builder-lib "24.13.3"
- archiver "^5.3.1"
- builder-util "24.13.1"
- fs-extra "^10.1.0"
-
electron-builder@^24.9.1:
version "24.13.3"
resolved "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz"
@@ -2457,6 +2745,14 @@ electron-builder@^24.9.1:
simple-update-notifier "2.0.0"
yargs "^17.6.2"
+electron-dl-manager@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/electron-dl-manager/-/electron-dl-manager-3.0.0.tgz#1b6ef6ee59f45733a5f13e8e916cb8189a21f8c8"
+ integrity sha512-DRyic9aY/6mSg7MvokrFWWY+NLYOnZcKGarujcBE4snobWND0hvV79s9b91kbo7+PLlANroK+jc/NDVliMSfbQ==
+ dependencies:
+ ext-name "^5.0.0"
+ unused-filename "^3.0.1"
+
electron-publish@24.13.1:
version "24.13.1"
resolved "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz"
@@ -2487,7 +2783,7 @@ electron-vite@^2.0.0:
magic-string "^0.30.5"
picocolors "^1.0.0"
-electron@^28.2.0, electron@>=13.0.0:
+electron@^28.2.0:
version "28.3.1"
resolved "https://registry.npmjs.org/electron/-/electron-28.3.1.tgz"
integrity sha512-aF9fONuhVDJlctJS7YOw76ynxVAQdfIWmlhRMKits24tDcdSL0eMHUS0wWYiRfGWbQnUKB6V49Rf17o32f4/fg==
@@ -2734,7 +3030,7 @@ escape-string-regexp@^4.0.0:
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
-eslint-config-prettier@*, eslint-config-prettier@^9.1.0:
+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"
integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==
@@ -2789,7 +3085,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4
resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
-"eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", eslint@^8.56.0, "eslint@>= 8.0.0", eslint@>=7.0.0, eslint@>=8.0.0:
+eslint@^8.56.0:
version "8.57.0"
resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz"
integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==
@@ -2889,6 +3185,21 @@ expand-template@^2.0.3:
resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz"
integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
+ext-list@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37"
+ integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==
+ dependencies:
+ mime-db "^1.28.0"
+
+ext-name@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6"
+ integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==
+ dependencies:
+ ext-list "^2.0.0"
+ sort-keys-length "^1.0.0"
+
extract-zip@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz"
@@ -3085,17 +3396,7 @@ fs-extra@^8.1.0:
jsonfile "^4.0.0"
universalify "^0.1.0"
-fs-extra@^9.0.0:
- version "9.1.0"
- resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz"
- integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
- dependencies:
- at-least-node "^1.0.0"
- graceful-fs "^4.2.0"
- jsonfile "^6.0.1"
- universalify "^2.0.0"
-
-fs-extra@^9.0.1:
+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"
integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
@@ -3227,43 +3528,7 @@ glob@^10.3.10:
minipass "^7.0.4"
path-scurry "^1.10.2"
-glob@^7.1.3:
- version "7.2.3"
- resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
- integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.1.1"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-glob@^7.1.4:
- version "7.2.3"
- resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
- integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.1.1"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-glob@^7.1.6:
- version "7.2.3"
- resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
- integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.1.1"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-glob@^7.2.3:
+glob@^7.1.3, glob@^7.1.6:
version "7.2.3"
resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
@@ -3542,7 +3807,7 @@ i18next-browser-languagedetector@^7.2.1:
dependencies:
"@babel/runtime" "^7.23.2"
-i18next@^23.11.2, "i18next@>= 23.2.3":
+i18next@^23.11.2:
version "23.11.2"
resolved "https://registry.npmjs.org/i18next/-/i18next-23.11.2.tgz"
integrity sha512-qMBm7+qT8jdpmmDw/kQD16VpmkL9BdL+XNAK5MNbNFaf1iQQq35ZbPrSlqmnNPOSUY4m342+c0t0evinF5l7sA==
@@ -3557,7 +3822,7 @@ iconv-corefoundation@^1.1.7:
cli-truncate "^2.1.0"
node-addon-api "^1.6.3"
-iconv-lite@^0.6.2, iconv-lite@0.6.3:
+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"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
@@ -3605,7 +3870,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@2:
+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"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -3767,6 +4032,11 @@ is-path-inside@^3.0.3:
resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+is-plain-obj@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+ integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==
+
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"
@@ -3843,11 +4113,6 @@ isarray@^2.0.5:
resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz"
integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
-isarray@~1.0.0:
- version "1.0.0"
- resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
- integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
-
isbinaryfile@^4.0.8:
version "4.0.10"
resolved "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz"
@@ -4015,13 +4280,6 @@ lazy-val@^1.0.4, lazy-val@^1.0.5:
resolved "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz"
integrity sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==
-lazystream@^1.0.0:
- version "1.0.1"
- resolved "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz"
- integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==
- dependencies:
- readable-stream "^2.0.5"
-
levn@^0.4.1:
version "0.4.1"
resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
@@ -4061,41 +4319,16 @@ lodash-es@^4.17.21:
resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
-lodash.defaults@^4.2.0:
- version "4.2.0"
- resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz"
- integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==
-
-lodash.difference@^4.5.0:
- version "4.5.0"
- resolved "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz"
- integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==
-
-lodash.flatten@^4.4.0:
- version "4.4.0"
- resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz"
- integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==
-
lodash.isequal@^4.5.0:
version "4.5.0"
resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz"
integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
-lodash.isplainobject@^4.0.6:
- version "4.0.6"
- resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz"
- integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==
-
lodash.merge@^4.6.2:
version "4.6.2"
resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-lodash.union@^4.6.0:
- version "4.6.0"
- resolved "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz"
- integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==
-
lodash@^4.17.15, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
@@ -4168,13 +4401,6 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
-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==
- dependencies:
- "@jridgewell/sourcemap-codec" "^1.4.15"
-
magic-string@0.30.8:
version "0.30.8"
resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz"
@@ -4182,6 +4408,13 @@ 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==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.4.15"
+
magnet-uri@^7.0.5:
version "7.0.5"
resolved "https://registry.npmjs.org/magnet-uri/-/magnet-uri-7.0.5.tgz"
@@ -4218,7 +4451,7 @@ micromatch@^4.0.4:
braces "^3.0.2"
picomatch "^2.3.1"
-mime-db@1.52.0:
+mime-db@1.52.0, mime-db@^1.28.0:
version "1.52.0"
resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
@@ -4250,6 +4483,13 @@ mimic-response@^4.0.0:
resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz"
integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==
+minimatch@9.0.3:
+ version "9.0.3"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz"
+ integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
+ 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"
@@ -4257,21 +4497,7 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
-minimatch@^5.0.1:
- version "5.1.6"
- resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz"
- integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
- dependencies:
- brace-expansion "^2.0.1"
-
-minimatch@^5.1.0:
- version "5.1.6"
- resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz"
- integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
- dependencies:
- brace-expansion "^2.0.1"
-
-minimatch@^5.1.1:
+minimatch@^5.0.1, minimatch@^5.1.1:
version "5.1.6"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz"
integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
@@ -4292,13 +4518,6 @@ minimatch@^9.0.1:
dependencies:
brace-expansion "^2.0.1"
-minimatch@9.0.3:
- version "9.0.3"
- resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz"
- integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
- dependencies:
- brace-expansion "^2.0.1"
-
minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6:
version "1.2.8"
resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"
@@ -4316,17 +4535,12 @@ minipass@^4.2.4:
resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz"
integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==
-"minipass@^5.0.0 || ^6.0.2 || ^7.0.0":
- version "7.0.4"
- resolved "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz"
- integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==
-
minipass@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz"
integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
-minipass@^7.0.4:
+"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4:
version "7.0.4"
resolved "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz"
integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==
@@ -4369,16 +4583,16 @@ modern-ahocorasick@^1.0.0:
resolved "https://registry.npmjs.org/modern-ahocorasick/-/modern-ahocorasick-1.0.1.tgz"
integrity sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==
-ms@^2.1.1:
- version "2.1.3"
- resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
- integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-
ms@2.1.2:
version "2.1.2"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ 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"
@@ -4449,6 +4663,11 @@ node-releases@^2.0.14:
resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz"
integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
+node-unrar-js@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/node-unrar-js/-/node-unrar-js-2.0.2.tgz#03ef602052497263b9aed8ff1e7afb315024f9ec"
+ integrity sha512-hLNmoJzqaKJnod8yiTVGe9hnlNRHotUi0CreSv/8HtfRi/3JnRC8DvsmKfeGGguRjTEulhZK6zXX5PXoVuDZ2w==
+
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
@@ -4776,16 +4995,11 @@ prettier-linter-helpers@^1.0.0:
dependencies:
fast-diff "^1.1.2"
-prettier@^3.2.4, "prettier@>= 3.0.0", prettier@>=3.0.0:
+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==
-process-nextick-args@~2.0.0:
- version "2.0.1"
- resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
- integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
-
progress@^2.0.3:
version "2.0.3"
resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"
@@ -4866,7 +5080,7 @@ rc@^1.2.7:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
-"react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", react-dom@^18.2.0, react-dom@>=16.8:
+react-dom@^18.2.0:
version "18.3.1"
resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz"
integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==
@@ -4892,7 +5106,7 @@ react-loading-skeleton@^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==
-"react-redux@^7.2.1 || ^8.1.3 || ^9.0.0", react-redux@^9.1.1:
+react-redux@^9.1.1:
version "9.1.1"
resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.1.1.tgz"
integrity sha512-5ynfGDzxxsoV73+4czQM56qF43vsmgJsO22rmAvU5tZT2z5Xow/A2uhhxwXuGTxgdReF3zcp7A80gma2onRs1A==
@@ -4920,7 +5134,7 @@ react-router@6.23.0:
dependencies:
"@remix-run/router" "1.16.0"
-"react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18", react@^18.0, react@^18.2.0, react@^18.3.1, "react@>= 16.8.0", react@>=16.3, react@>=16.8, react@>=16.8.0, "react@15.x || 16.x || 17.x || 18.x":
+react@^18.2.0:
version "18.3.1"
resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz"
integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==
@@ -4939,32 +5153,6 @@ read-config-file@6.3.2:
json5 "^2.2.0"
lazy-val "^1.0.4"
-readable-stream@^2.0.0:
- version "2.3.8"
- resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz"
- integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.3"
- isarray "~1.0.0"
- process-nextick-args "~2.0.0"
- safe-buffer "~5.1.1"
- string_decoder "~1.1.1"
- util-deprecate "~1.0.1"
-
-readable-stream@^2.0.5:
- version "2.3.8"
- resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz"
- integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
- dependencies:
- core-util-is "~1.0.0"
- inherits "~2.0.3"
- isarray "~1.0.0"
- process-nextick-args "~2.0.0"
- safe-buffer "~5.1.1"
- string_decoder "~1.1.1"
- util-deprecate "~1.0.1"
-
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"
@@ -4974,13 +5162,6 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
-readdir-glob@^1.1.2:
- version "1.1.3"
- resolved "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz"
- integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==
- dependencies:
- minimatch "^5.1.0"
-
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"
@@ -4993,7 +5174,7 @@ redux-thunk@^3.1.0:
resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz"
integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==
-redux@^5.0.0, redux@^5.0.1:
+redux@^5.0.1:
version "5.0.1"
resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz"
integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==
@@ -5113,7 +5294,7 @@ roarr@^2.15.3:
semver-compare "^1.0.0"
sprintf-js "^1.1.2"
-rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^4.13.0:
+rollup@^4.13.0:
version "4.17.0"
resolved "https://registry.npmjs.org/rollup/-/rollup-4.17.0.tgz"
integrity sha512-wZJSn0WMtWrxhYKQRt5Z6GIXlziOoMDFmbHmRfL3v+sBTAshx2DBq1AfMArB7eIjF63r4ocn2ZTAyUptg/7kmQ==
@@ -5165,11 +5346,6 @@ safe-buffer@^5.0.1, safe-buffer@~5.2.0:
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-safe-buffer@~5.1.0, safe-buffer@~5.1.1:
- version "5.1.2"
- resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
- integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-
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"
@@ -5220,12 +5396,7 @@ semver-compare@^1.0.0:
resolved "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz"
integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
-semver@^6.2.0:
- version "6.3.1"
- resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
- integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
-
-semver@^6.3.1:
+semver@^6.2.0, semver@^6.3.1:
version "6.3.1"
resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
@@ -5356,6 +5527,20 @@ snake-case@^3.0.4:
dot-case "^3.0.4"
tslib "^2.0.3"
+sort-keys-length@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188"
+ integrity sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==
+ dependencies:
+ sort-keys "^1.0.0"
+
+sort-keys@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+ integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==
+ dependencies:
+ is-plain-obj "^1.0.0"
+
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"
@@ -5389,20 +5574,6 @@ stat-mode@^1.0.0:
resolved "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz"
integrity sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==
-string_decoder@^1.1.1:
- version "1.3.0"
- resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
- integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
- dependencies:
- safe-buffer "~5.2.0"
-
-string_decoder@~1.1.1:
- version "1.1.1"
- resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
- integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
- dependencies:
- safe-buffer "~5.1.0"
-
"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"
@@ -5476,6 +5647,13 @@ string.prototype.trimstart@^1.0.8:
define-properties "^1.2.1"
es-object-atoms "^1.0.0"
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ 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"
@@ -5561,7 +5739,7 @@ tar-fs@^2.0.0:
pump "^3.0.0"
tar-stream "^2.1.4"
-tar-stream@^2.1.4, tar-stream@^2.2.0:
+tar-stream@^2.1.4:
version "2.2.0"
resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz"
integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
@@ -5778,7 +5956,7 @@ typeorm@^0.3.20:
uuid "^9.0.0"
yargs "^17.6.2"
-typescript@*, typescript@^5.3.3, typescript@>=4.2.0, typescript@>=4.9.5:
+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==
@@ -5876,7 +6054,7 @@ utf8-byte-length@^1.0.1:
resolved "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz"
integrity sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==
-util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+util-deprecate@^1.0.1:
version "1.0.2"
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
@@ -5920,7 +6098,7 @@ vite-plugin-svgr@^4.2.0:
"@svgr/core" "^8.1.0"
"@svgr/plugin-jsx" "^8.1.0"
-"vite@^2.6.0 || 3 || 4 || 5", "vite@^4.0.0 || ^5.0.0", "vite@^4.0.3 || ^5.0.0", "vite@^4.2.0 || ^5.0.0", vite@^5.0.0, vite@^5.0.11, vite@^5.0.12:
+vite@^5.0.0, vite@^5.0.11, vite@^5.0.12:
version "5.2.10"
resolved "https://registry.npmjs.org/vite/-/vite-5.2.10.tgz"
integrity sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==
@@ -6131,7 +6309,7 @@ xml-name-validator@^5.0.0:
resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz"
integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==
-xmlbuilder@^15.1.1, xmlbuilder@>=11.0.1:
+xmlbuilder@>=11.0.1, xmlbuilder@^15.1.1:
version "15.1.1"
resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz"
integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==
@@ -6209,12 +6387,3 @@ yocto-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
-
-zip-stream@^4.1.0:
- version "4.1.1"
- resolved "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz"
- integrity sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==
- dependencies:
- archiver-utils "^3.0.4"
- compress-commons "^4.1.2"
- readable-stream "^3.6.0"
From c5693e94afe651055ba93e6259f62ab800d03dbd Mon Sep 17 00:00:00 2001
From: lilezek
Date: Tue, 30 Apr 2024 11:09:53 +0200
Subject: [PATCH 12/30] refactor: real debrid types
---
.../{real-debrid.d.ts => real-debrid-types.ts} | 18 +++---------------
src/main/services/donwloaders/real-debrid.ts | 4 ++--
2 files changed, 5 insertions(+), 17 deletions(-)
rename src/main/services/donwloaders/{real-debrid.d.ts => real-debrid-types.ts} (81%)
diff --git a/src/main/services/donwloaders/real-debrid.d.ts b/src/main/services/donwloaders/real-debrid-types.ts
similarity index 81%
rename from src/main/services/donwloaders/real-debrid.d.ts
rename to src/main/services/donwloaders/real-debrid-types.ts
index 4ee5228a..10a87e60 100644
--- a/src/main/services/donwloaders/real-debrid.d.ts
+++ b/src/main/services/donwloaders/real-debrid-types.ts
@@ -1,4 +1,4 @@
-interface RealDebridUnrestrictLink {
+export interface RealDebridUnrestrictLink {
id: string;
filename: string;
mimeType: string;
@@ -12,13 +12,13 @@ interface RealDebridUnrestrictLink {
streamable: number;
}
-interface RealDebridAddMagnet {
+export interface RealDebridAddMagnet {
"id": string,
// URL of the created ressource
"uri": string
}
-interface RealDebridTorrentInfo {
+export interface RealDebridTorrentInfo {
"id": string,
"filename": string,
"original_filename": string, // Original name of the torrent
@@ -50,16 +50,4 @@ interface RealDebridTorrentInfo {
"ended": string, // !! Only present when finished, jsonDate
"speed": number, // !! Only present in "downloading", "compressing", "uploading" status
"seeders": number // !! Only present in "downloading", "magnet_conversion" status
-}
-
-declare module 'real-debrid-api' {
- interface Torrent {
- addMagnet(magnet: string): Promise;
- info(id: string): Promise;
- }
-
- export default class {
- constructor(token: string);
- torrents: Torrent;
- }
}
\ No newline at end of file
diff --git a/src/main/services/donwloaders/real-debrid.ts b/src/main/services/donwloaders/real-debrid.ts
index 0ab290d0..e01cb3cf 100644
--- a/src/main/services/donwloaders/real-debrid.ts
+++ b/src/main/services/donwloaders/real-debrid.ts
@@ -1,6 +1,6 @@
-///
import { userPreferencesRepository } from "@main/repository";
import fetch from "node-fetch";
+import { RealDebridAddMagnet, RealDebridTorrentInfo, RealDebridUnrestrictLink } from "./real-debrid-types";
const base = "https://api.real-debrid.com/rest/1.0";
@@ -50,6 +50,6 @@ export class RealDebridClient {
}
static getApiToken() {
- return userPreferencesRepository.findOne({ where: { id: 1 } }).then(userPreferences => userPreferences.realDebridApiToken);
+ return userPreferencesRepository.findOne({ where: { id: 1 } }).then(userPreferences => userPreferences!.realDebridApiToken);
}
}
\ No newline at end of file
From 7ee5b73688feda4b4dc8516db7b4bf347c74597a Mon Sep 17 00:00:00 2001
From: lilezek
Date: Tue, 30 Apr 2024 11:11:58 +0200
Subject: [PATCH 13/30] fix: real debrid decompression happens in a folder that
hydra recognises properly.
---
src/main/services/donwloaders/downloader.ts | 13 +++++++------
src/main/services/donwloaders/http-downloader.ts | 7 ++++++-
2 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/src/main/services/donwloaders/downloader.ts b/src/main/services/donwloaders/downloader.ts
index 9c3f1a72..c5f29fae 100644
--- a/src/main/services/donwloaders/downloader.ts
+++ b/src/main/services/donwloaders/downloader.ts
@@ -10,6 +10,7 @@ import { TorrentUpdate } from "./torrent-client";
import { HTTPDownloader } from "./http-downloader";
import { Unrar } from "../unrar";
import { GameStatus } from "@globals";
+import path from 'node:path';
interface DownloadStatus {
numPeers: number;
@@ -23,7 +24,7 @@ export class Downloader {
static async usesRealDebrid() {
const userPreferences = await userPreferencesRepository.findOne({ where: { id: 1 } });
- return userPreferences.realDebridApiToken !== null;
+ return userPreferences!.realDebridApiToken !== null;
}
static async cancelDownload() {
@@ -72,7 +73,7 @@ export class Downloader {
const { links } = await RealDebridClient.getInfo(torrent.id);
const { download } = await RealDebridClient.unrestrictLink(links[0]);
this.lastHttpDownloader = new HTTPDownloader();
- this.lastHttpDownloader.download(download, game.downloadPath, game.id);
+ this.lastHttpDownloader.download(download, game.downloadPath!, game.id);
}
} catch (e) {
console.error(e);
@@ -102,14 +103,14 @@ export class Downloader {
body: t("game_ready_to_install", {
ns: "notifications",
lng: userPreferences.language,
- title: game.title,
+ title: game?.title,
}),
}).show();
}
}
- if (gameUpdate.decompressionProgress === 0 && gameUpdate.status === GameStatus.Decompressing) {
- const unrar = await Unrar.fromFilePath(game.rarPath, game.downloadPath);
+ if (game && gameUpdate.decompressionProgress === 0 && gameUpdate.status === GameStatus.Decompressing) {
+ const unrar = await Unrar.fromFilePath(game.rarPath!, path.join(game.downloadPath!, game.folderName!));
unrar.extract();
this.updateGameProgress(gameId, {
decompressionProgress: 1,
@@ -117,7 +118,7 @@ export class Downloader {
}, downloadStatus);
}
- if (WindowManager.mainWindow) {
+ if (WindowManager.mainWindow && game) {
const progress = this.getGameProgress(game);
WindowManager.mainWindow.setProgressBar(progress === 1 ? -1 : progress);
diff --git a/src/main/services/donwloaders/http-downloader.ts b/src/main/services/donwloaders/http-downloader.ts
index aec963e0..01c3218f 100644
--- a/src/main/services/donwloaders/http-downloader.ts
+++ b/src/main/services/donwloaders/http-downloader.ts
@@ -5,6 +5,10 @@ import { WindowManager } from '../window-manager';
import { Downloader } from './downloader';
import { GameStatus } from '@globals';
+function dropExtension(fileName: string) {
+ return fileName.split('.').slice(0, -1).join('.');
+}
+
export class HTTPDownloader {
private downloadManager: ElectronDownloadManager;
private downloadId: string | null = null;
@@ -18,7 +22,7 @@ export class HTTPDownloader {
this.downloadId = await this.downloadManager.download({
url,
- window: window,
+ window: window!,
callbacks: {
onDownloadStarted: async (ev) => {
const updatePayload: QueryDeepPartialEntity = {
@@ -27,6 +31,7 @@ export class HTTPDownloader {
bytesDownloaded: 0,
fileSize: ev.item.getTotalBytes(),
rarPath: `${destination}/.rd/${ev.resolvedFilename}`,
+ folderName: dropExtension(ev.resolvedFilename)
};
const downloadStatus = {
numPeers: 0,
From e79b6f13917888141b08e9dbf583d3ea48cd24f8 Mon Sep 17 00:00:00 2001
From: lilezek
Date: Tue, 30 Apr 2024 11:24:35 +0200
Subject: [PATCH 14/30] refactor: prettier changes
---
src/globals.ts | 5 +-
src/main/entity/game.entity.ts | 4 +-
src/main/entity/user-preferences.entity.ts | 1 -
.../events/torrenting/cancel-game-download.ts | 2 +-
.../events/torrenting/start-game-download.ts | 2 +-
src/main/index.ts | 2 +-
src/main/main.ts | 2 +-
src/main/services/donwloaders/downloader.ts | 277 ++++++++++--------
.../services/donwloaders/http-downloader.ts | 180 ++++++------
.../services/donwloaders/real-debrid-types.ts | 92 +++---
src/main/services/donwloaders/real-debrid.ts | 90 +++---
.../services/donwloaders/torrent-client.ts | 2 +-
src/main/services/unrar.ts | 36 +--
.../src/components/sidebar/sidebar.tsx | 3 +-
src/renderer/src/hooks/use-download.ts | 2 +-
src/renderer/src/pages/settings/settings.tsx | 12 +-
16 files changed, 380 insertions(+), 332 deletions(-)
diff --git a/src/globals.ts b/src/globals.ts
index 2625e7f7..3ce216a8 100644
--- a/src/globals.ts
+++ b/src/globals.ts
@@ -21,6 +21,5 @@ export namespace GameStatus {
GameStatus.Decompressing == status;
export const isReady = (status: GameStatus | null) =>
- status === GameStatus.Finished ||
- status === GameStatus.Seeding;
-}
\ No newline at end of file
+ status === GameStatus.Finished || status === GameStatus.Seeding;
+}
diff --git a/src/main/entity/game.entity.ts b/src/main/entity/game.entity.ts
index c3621d5d..51e976fa 100644
--- a/src/main/entity/game.entity.ts
+++ b/src/main/entity/game.entity.ts
@@ -46,9 +46,9 @@ export class Game {
@Column("text", { nullable: true })
status: GameStatus | null;
- /**
+ /**
* Progress is a float between 0 and 1
- */
+ */
@Column("float", { default: 0 })
progress: number;
diff --git a/src/main/entity/user-preferences.entity.ts b/src/main/entity/user-preferences.entity.ts
index 8cb06aa5..eb220468 100644
--- a/src/main/entity/user-preferences.entity.ts
+++ b/src/main/entity/user-preferences.entity.ts
@@ -35,4 +35,3 @@ export class UserPreferences {
@UpdateDateColumn()
updatedAt: Date;
}
-
diff --git a/src/main/events/torrenting/cancel-game-download.ts b/src/main/events/torrenting/cancel-game-download.ts
index af8ae89f..39772e21 100644
--- a/src/main/events/torrenting/cancel-game-download.ts
+++ b/src/main/events/torrenting/cancel-game-download.ts
@@ -45,7 +45,7 @@ const cancelGameDownload = async (
game.status !== GameStatus.Seeding
) {
Downloader.cancelDownload();
- if (result.affected) WindowManager.mainWindow.setProgressBar(-1);
+ if (result.affected) WindowManager.mainWindow?.setProgressBar(-1);
}
});
};
diff --git a/src/main/events/torrenting/start-game-download.ts b/src/main/events/torrenting/start-game-download.ts
index f6125c8a..8ae520d5 100644
--- a/src/main/events/torrenting/start-game-download.ts
+++ b/src/main/events/torrenting/start-game-download.ts
@@ -1,4 +1,4 @@
-import { getSteamGameIconUrl, writePipe } from "@main/services";
+import { getSteamGameIconUrl } from "@main/services";
import { gameRepository, repackRepository } from "@main/repository";
import { registerEvent } from "../register-event";
diff --git a/src/main/index.ts b/src/main/index.ts
index b2a1b227..a146b6f7 100644
--- a/src/main/index.ts
+++ b/src/main/index.ts
@@ -106,4 +106,4 @@ app.on("activate", () => {
});
// In this file you can include the rest of your app's specific main process
-// code. You can also put them in separate files and import them here.
\ No newline at end of file
+// code. You can also put them in separate files and import them here.
diff --git a/src/main/main.ts b/src/main/main.ts
index be5a82b5..309d6272 100644
--- a/src/main/main.ts
+++ b/src/main/main.ts
@@ -123,4 +123,4 @@ const loadState = async () => {
import("./events");
};
-loadState().then(() => checkForNewRepacks());
\ No newline at end of file
+loadState().then(() => checkForNewRepacks());
diff --git a/src/main/services/donwloaders/downloader.ts b/src/main/services/donwloaders/downloader.ts
index c5f29fae..c13d4d01 100644
--- a/src/main/services/donwloaders/downloader.ts
+++ b/src/main/services/donwloaders/downloader.ts
@@ -10,139 +10,168 @@ import { TorrentUpdate } from "./torrent-client";
import { HTTPDownloader } from "./http-downloader";
import { Unrar } from "../unrar";
import { GameStatus } from "@globals";
-import path from 'node:path';
+import path from "node:path";
interface DownloadStatus {
- numPeers: number;
- numSeeds: number;
- downloadSpeed: number;
- timeRemaining: number;
+ numPeers: number;
+ numSeeds: number;
+ downloadSpeed: number;
+ timeRemaining: number;
}
export class Downloader {
- private static lastHttpDownloader: HTTPDownloader | null = null;
+ private static lastHttpDownloader: HTTPDownloader | null = null;
- static async usesRealDebrid() {
- const userPreferences = await userPreferencesRepository.findOne({ where: { id: 1 } });
- return userPreferences!.realDebridApiToken !== null;
+ static async usesRealDebrid() {
+ const userPreferences = await userPreferencesRepository.findOne({
+ where: { id: 1 },
+ });
+ return userPreferences!.realDebridApiToken !== null;
+ }
+
+ static async cancelDownload() {
+ if (!(await this.usesRealDebrid())) {
+ writePipe.write({ action: "cancel" });
+ } else {
+ if (this.lastHttpDownloader) {
+ this.lastHttpDownloader.cancel();
+ }
+ }
+ }
+
+ static async pauseDownload() {
+ if (!(await this.usesRealDebrid())) {
+ writePipe.write({ action: "pause" });
+ } else {
+ if (this.lastHttpDownloader) {
+ this.lastHttpDownloader.pause();
+ }
+ }
+ }
+
+ static async resumeDownload() {
+ if (!(await this.usesRealDebrid())) {
+ writePipe.write({ action: "pause" });
+ } else {
+ if (this.lastHttpDownloader) {
+ this.lastHttpDownloader.resume();
+ }
+ }
+ }
+
+ static async downloadGame(game: Game, repack: Repack) {
+ if (!(await this.usesRealDebrid())) {
+ writePipe.write({
+ action: "start",
+ game_id: game.id,
+ magnet: repack.magnet,
+ save_path: game.downloadPath,
+ });
+ } else {
+ try {
+ const torrent = await RealDebridClient.addMagnet(repack.magnet);
+ if (torrent && torrent.id) {
+ await RealDebridClient.selectAllFiles(torrent.id);
+ const { links } = await RealDebridClient.getInfo(torrent.id);
+ const { download } = await RealDebridClient.unrestrictLink(links[0]);
+ this.lastHttpDownloader = new HTTPDownloader();
+ this.lastHttpDownloader.download(
+ download,
+ game.downloadPath!,
+ game.id
+ );
+ }
+ } catch (e) {
+ console.error(e);
+ }
+ }
+ }
+
+ static async updateGameProgress(
+ gameId: number,
+ gameUpdate: QueryDeepPartialEntity,
+ downloadStatus: DownloadStatus
+ ) {
+ await gameRepository.update({ id: gameId }, gameUpdate);
+
+ const game = await gameRepository.findOne({
+ where: { id: gameId },
+ relations: { repack: true },
+ });
+
+ if (
+ gameUpdate.progress === 1 &&
+ gameUpdate.status !== GameStatus.Decompressing
+ ) {
+ const userPreferences = await userPreferencesRepository.findOne({
+ where: { id: 1 },
+ });
+
+ if (userPreferences?.downloadNotificationsEnabled) {
+ new Notification({
+ title: t("download_complete", {
+ ns: "notifications",
+ lng: userPreferences.language,
+ }),
+ body: t("game_ready_to_install", {
+ ns: "notifications",
+ lng: userPreferences.language,
+ title: game?.title,
+ }),
+ }).show();
+ }
}
- static async cancelDownload() {
- if (!await this.usesRealDebrid()) {
- writePipe.write({ action: "cancel" });
- } else {
- if (this.lastHttpDownloader) {
- this.lastHttpDownloader.cancel();
- }
- }
+ if (
+ game &&
+ gameUpdate.decompressionProgress === 0 &&
+ gameUpdate.status === GameStatus.Decompressing
+ ) {
+ const unrar = await Unrar.fromFilePath(
+ game.rarPath!,
+ path.join(game.downloadPath!, game.folderName!)
+ );
+ unrar.extract();
+ this.updateGameProgress(
+ gameId,
+ {
+ decompressionProgress: 1,
+ status: GameStatus.Finished,
+ },
+ downloadStatus
+ );
}
- static async pauseDownload() {
- if (!await this.usesRealDebrid()) {
- writePipe.write({ action: "pause" });
- } else {
- if (this.lastHttpDownloader) {
- this.lastHttpDownloader.pause();
- }
- }
+ if (WindowManager.mainWindow && game) {
+ const progress = this.getGameProgress(game);
+ WindowManager.mainWindow.setProgressBar(progress === 1 ? -1 : progress);
+
+ WindowManager.mainWindow.webContents.send(
+ "on-download-progress",
+ JSON.parse(
+ JSON.stringify({
+ ...({
+ progress: gameUpdate.progress,
+ bytesDownloaded: gameUpdate.bytesDownloaded,
+ fileSize: gameUpdate.fileSize,
+ gameId,
+ numPeers: downloadStatus.numPeers,
+ numSeeds: downloadStatus.numSeeds,
+ downloadSpeed: downloadStatus.downloadSpeed,
+ timeRemaining: downloadStatus.timeRemaining,
+ } as TorrentUpdate),
+ game,
+ })
+ )
+ );
}
+ }
- static async resumeDownload() {
- if (!await this.usesRealDebrid()) {
- writePipe.write({ action: "pause" });
- } else {
- if (this.lastHttpDownloader) {
- this.lastHttpDownloader.resume();
- }
- }
- }
-
- static async downloadGame(game: Game, repack: Repack) {
- if (!await this.usesRealDebrid()) {
- writePipe.write({
- action: "start",
- game_id: game.id,
- magnet: repack.magnet,
- save_path: game.downloadPath,
- });
- } else {
- try {
- const torrent = await RealDebridClient.addMagnet(repack.magnet);
- if (torrent && torrent.id) {
- await RealDebridClient.selectAllFiles(torrent.id);
- const { links } = await RealDebridClient.getInfo(torrent.id);
- const { download } = await RealDebridClient.unrestrictLink(links[0]);
- this.lastHttpDownloader = new HTTPDownloader();
- this.lastHttpDownloader.download(download, game.downloadPath!, game.id);
- }
- } catch (e) {
- console.error(e);
- }
- }
- }
-
- static async updateGameProgress(gameId: number, gameUpdate: QueryDeepPartialEntity, downloadStatus: DownloadStatus) {
- await gameRepository.update({ id: gameId }, gameUpdate);
-
- const game = await gameRepository.findOne({
- where: { id: gameId },
- relations: { repack: true },
- });
-
- if (gameUpdate.progress === 1 && gameUpdate.status !== GameStatus.Decompressing) {
- const userPreferences = await userPreferencesRepository.findOne({
- where: { id: 1 },
- });
-
- if (userPreferences?.downloadNotificationsEnabled) {
- new Notification({
- title: t("download_complete", {
- ns: "notifications",
- lng: userPreferences.language,
- }),
- body: t("game_ready_to_install", {
- ns: "notifications",
- lng: userPreferences.language,
- title: game?.title,
- }),
- }).show();
- }
- }
-
- if (game && gameUpdate.decompressionProgress === 0 && gameUpdate.status === GameStatus.Decompressing) {
- const unrar = await Unrar.fromFilePath(game.rarPath!, path.join(game.downloadPath!, game.folderName!));
- unrar.extract();
- this.updateGameProgress(gameId, {
- decompressionProgress: 1,
- status: GameStatus.Finished,
- }, downloadStatus);
- }
-
- if (WindowManager.mainWindow && game) {
- const progress = this.getGameProgress(game);
- WindowManager.mainWindow.setProgressBar(progress === 1 ? -1 : progress);
-
- WindowManager.mainWindow.webContents.send(
- "on-download-progress",
- JSON.parse(JSON.stringify({
- ...{
- progress: gameUpdate.progress,
- bytesDownloaded: gameUpdate.bytesDownloaded,
- fileSize: gameUpdate.fileSize,
- gameId,
- numPeers: downloadStatus.numPeers,
- numSeeds: downloadStatus.numSeeds,
- downloadSpeed: downloadStatus.downloadSpeed,
- timeRemaining: downloadStatus.timeRemaining,
- } as TorrentUpdate, game
- }))
- );
- }
- }
-
- static getGameProgress(game: Game) {
- if (game.status === GameStatus.CheckingFiles) return game.fileVerificationProgress;
- if (game.status === GameStatus.Decompressing) return game.decompressionProgress;
- return game.progress;
- }
-}
\ No newline at end of file
+ static getGameProgress(game: Game) {
+ if (game.status === GameStatus.CheckingFiles)
+ return game.fileVerificationProgress;
+ if (game.status === GameStatus.Decompressing)
+ return game.decompressionProgress;
+ return game.progress;
+ }
+}
diff --git a/src/main/services/donwloaders/http-downloader.ts b/src/main/services/donwloaders/http-downloader.ts
index 01c3218f..c94a5755 100644
--- a/src/main/services/donwloaders/http-downloader.ts
+++ b/src/main/services/donwloaders/http-downloader.ts
@@ -1,94 +1,106 @@
-import { Game } from '@main/entity';
-import { ElectronDownloadManager } from 'electron-dl-manager';
-import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity';
-import { WindowManager } from '../window-manager';
-import { Downloader } from './downloader';
-import { GameStatus } from '@globals';
+import { Game } from "@main/entity";
+import { ElectronDownloadManager } from "electron-dl-manager";
+import { QueryDeepPartialEntity } from "typeorm/query-builder/QueryPartialEntity";
+import { WindowManager } from "../window-manager";
+import { Downloader } from "./downloader";
+import { GameStatus } from "@globals";
function dropExtension(fileName: string) {
- return fileName.split('.').slice(0, -1).join('.');
+ return fileName.split(".").slice(0, -1).join(".");
}
export class HTTPDownloader {
- private downloadManager: ElectronDownloadManager;
- private downloadId: string | null = null;
-
- constructor() {
- this.downloadManager = new ElectronDownloadManager();
- }
-
- async download(url: string, destination: string, gameId: number) {
- const window = WindowManager.mainWindow;
+ private downloadManager: ElectronDownloadManager;
+ private downloadId: string | null = null;
- this.downloadId = await this.downloadManager.download({
- url,
- window: window!,
- callbacks: {
- onDownloadStarted: async (ev) => {
- const updatePayload: QueryDeepPartialEntity = {
- status: GameStatus.Downloading,
- progress: 0,
- bytesDownloaded: 0,
- fileSize: ev.item.getTotalBytes(),
- rarPath: `${destination}/.rd/${ev.resolvedFilename}`,
- folderName: dropExtension(ev.resolvedFilename)
- };
- const downloadStatus = {
- numPeers: 0,
- numSeeds: 0,
- downloadSpeed: 0,
- timeRemaining: Number.POSITIVE_INFINITY,
- };
- await Downloader.updateGameProgress(gameId, updatePayload, downloadStatus);
- },
- onDownloadCompleted: async (ev) => {
- const updatePayload: QueryDeepPartialEntity = {
- progress: 1,
- decompressionProgress: 0,
- bytesDownloaded: ev.item.getReceivedBytes(),
- status: GameStatus.Decompressing,
- };
- const downloadStatus = {
- numPeers: 1,
- numSeeds: 1,
- downloadSpeed: 0,
- timeRemaining: 0,
- };
- await Downloader.updateGameProgress(gameId, updatePayload, downloadStatus);
- },
- onDownloadProgress: async (ev) => {
- const updatePayload: QueryDeepPartialEntity = {
- progress: ev.percentCompleted / 100,
- bytesDownloaded: ev.item.getReceivedBytes(),
- };
- const downloadStatus = {
- numPeers: 1,
- numSeeds: 1,
- downloadSpeed: ev.downloadRateBytesPerSecond,
- timeRemaining: ev.estimatedTimeRemainingSeconds,
- };
- await Downloader.updateGameProgress(gameId, updatePayload, downloadStatus);
- }
- },
- directory: `${destination}/.rd/`,
- });
- }
+ constructor() {
+ this.downloadManager = new ElectronDownloadManager();
+ }
- pause() {
- if (this.downloadId) {
- this.downloadManager.pauseDownload(this.downloadId);
- }
- }
+ async download(url: string, destination: string, gameId: number) {
+ const window = WindowManager.mainWindow;
- cancel() {
- if (this.downloadId) {
- this.downloadManager.cancelDownload(this.downloadId);
- }
- }
+ this.downloadId = await this.downloadManager.download({
+ url,
+ window: window!,
+ callbacks: {
+ onDownloadStarted: async (ev) => {
+ const updatePayload: QueryDeepPartialEntity = {
+ status: GameStatus.Downloading,
+ progress: 0,
+ bytesDownloaded: 0,
+ fileSize: ev.item.getTotalBytes(),
+ rarPath: `${destination}/.rd/${ev.resolvedFilename}`,
+ folderName: dropExtension(ev.resolvedFilename),
+ };
+ const downloadStatus = {
+ numPeers: 0,
+ numSeeds: 0,
+ downloadSpeed: 0,
+ timeRemaining: Number.POSITIVE_INFINITY,
+ };
+ await Downloader.updateGameProgress(
+ gameId,
+ updatePayload,
+ downloadStatus
+ );
+ },
+ onDownloadCompleted: async (ev) => {
+ const updatePayload: QueryDeepPartialEntity = {
+ progress: 1,
+ decompressionProgress: 0,
+ bytesDownloaded: ev.item.getReceivedBytes(),
+ status: GameStatus.Decompressing,
+ };
+ const downloadStatus = {
+ numPeers: 1,
+ numSeeds: 1,
+ downloadSpeed: 0,
+ timeRemaining: 0,
+ };
+ await Downloader.updateGameProgress(
+ gameId,
+ updatePayload,
+ downloadStatus
+ );
+ },
+ onDownloadProgress: async (ev) => {
+ const updatePayload: QueryDeepPartialEntity = {
+ progress: ev.percentCompleted / 100,
+ bytesDownloaded: ev.item.getReceivedBytes(),
+ };
+ const downloadStatus = {
+ numPeers: 1,
+ numSeeds: 1,
+ downloadSpeed: ev.downloadRateBytesPerSecond,
+ timeRemaining: ev.estimatedTimeRemainingSeconds,
+ };
+ await Downloader.updateGameProgress(
+ gameId,
+ updatePayload,
+ downloadStatus
+ );
+ },
+ },
+ directory: `${destination}/.rd/`,
+ });
+ }
- resume() {
- if (this.downloadId) {
- this.downloadManager.resumeDownload(this.downloadId);
- }
+ pause() {
+ if (this.downloadId) {
+ this.downloadManager.pauseDownload(this.downloadId);
}
-}
\ No newline at end of file
+ }
+
+ cancel() {
+ if (this.downloadId) {
+ this.downloadManager.cancelDownload(this.downloadId);
+ }
+ }
+
+ resume() {
+ if (this.downloadId) {
+ this.downloadManager.resumeDownload(this.downloadId);
+ }
+ }
+}
diff --git a/src/main/services/donwloaders/real-debrid-types.ts b/src/main/services/donwloaders/real-debrid-types.ts
index 10a87e60..6a3e7304 100644
--- a/src/main/services/donwloaders/real-debrid-types.ts
+++ b/src/main/services/donwloaders/real-debrid-types.ts
@@ -1,53 +1,53 @@
export interface RealDebridUnrestrictLink {
- id: string;
- filename: string;
- mimeType: string;
- filesize: number;
- link: string;
- host: string;
- host_icon: string;
- chunks: number;
- crc: number;
- download: string;
- streamable: number;
+ id: string;
+ filename: string;
+ mimeType: string;
+ filesize: number;
+ link: string;
+ host: string;
+ host_icon: string;
+ chunks: number;
+ crc: number;
+ download: string;
+ streamable: number;
}
export interface RealDebridAddMagnet {
- "id": string,
- // URL of the created ressource
- "uri": string
+ id: string;
+ // URL of the created ressource
+ uri: string;
}
export interface RealDebridTorrentInfo {
- "id": string,
- "filename": string,
- "original_filename": string, // Original name of the torrent
- "hash": string, // SHA1 Hash of the torrent
- "bytes": number, // Size of selected files only
- "original_bytes": number, // Total size of the torrent
- "host": string, // Host main domain
- "split": number, // Split size of links
- "progress": number, // Possible values: 0 to 100
- "status": "downloaded", // Current status of the torrent: magnet_error, magnet_conversion, waiting_files_selection, queued, downloading, downloaded, error, virus, compressing, uploading, dead
- "added": string, // jsonDate
- "files": [
- {
- "id": number,
- "path": string, // Path to the file inside the torrent, starting with "/"
- "bytes": number,
- "selected": number // 0 or 1
- },
- {
- "id": number,
- "path": string, // Path to the file inside the torrent, starting with "/"
- "bytes": number,
- "selected": number // 0 or 1
- }
- ],
- "links": [
- "string" // Host URL
- ],
- "ended": string, // !! Only present when finished, jsonDate
- "speed": number, // !! Only present in "downloading", "compressing", "uploading" status
- "seeders": number // !! Only present in "downloading", "magnet_conversion" status
-}
\ No newline at end of file
+ id: string;
+ filename: string;
+ original_filename: string; // Original name of the torrent
+ hash: string; // SHA1 Hash of the torrent
+ bytes: number; // Size of selected files only
+ original_bytes: number; // Total size of the torrent
+ host: string; // Host main domain
+ split: number; // Split size of links
+ progress: number; // Possible values: 0 to 100
+ status: "downloaded"; // Current status of the torrent: magnet_error, magnet_conversion, waiting_files_selection, queued, downloading, downloaded, error, virus, compressing, uploading, dead
+ added: string; // jsonDate
+ files: [
+ {
+ id: number;
+ path: string; // Path to the file inside the torrent, starting with "/"
+ bytes: number;
+ selected: number; // 0 or 1
+ },
+ {
+ id: number;
+ path: string; // Path to the file inside the torrent, starting with "/"
+ bytes: number;
+ selected: number; // 0 or 1
+ },
+ ];
+ links: [
+ "string", // Host URL
+ ];
+ ended: string; // !! Only present when finished, jsonDate
+ speed: number; // !! Only present in "downloading", "compressing", "uploading" status
+ seeders: number; // !! Only present in "downloading", "magnet_conversion" status
+}
diff --git a/src/main/services/donwloaders/real-debrid.ts b/src/main/services/donwloaders/real-debrid.ts
index e01cb3cf..9fb170a9 100644
--- a/src/main/services/donwloaders/real-debrid.ts
+++ b/src/main/services/donwloaders/real-debrid.ts
@@ -1,55 +1,61 @@
import { userPreferencesRepository } from "@main/repository";
import fetch from "node-fetch";
-import { RealDebridAddMagnet, RealDebridTorrentInfo, RealDebridUnrestrictLink } from "./real-debrid-types";
+import {
+ RealDebridAddMagnet,
+ RealDebridTorrentInfo,
+ RealDebridUnrestrictLink,
+} from "./real-debrid-types";
const base = "https://api.real-debrid.com/rest/1.0";
export class RealDebridClient {
- static async addMagnet(magnet: string) {
- const response = await fetch(`${base}/torrents/addMagnet`, {
- method: "POST",
- headers: {
- "Authorization": `Bearer ${await this.getApiToken()}`,
- },
- body: `magnet=${encodeURIComponent(magnet)}`
- });
+ static async addMagnet(magnet: string) {
+ const response = await fetch(`${base}/torrents/addMagnet`, {
+ method: "POST",
+ headers: {
+ Authorization: `Bearer ${await this.getApiToken()}`,
+ },
+ body: `magnet=${encodeURIComponent(magnet)}`,
+ });
- return response.json() as Promise;
- }
+ return response.json() as Promise;
+ }
- static async getInfo(id: string) {
- const response = await fetch(`${base}/torrents/info/${id}`, {
- headers: {
- "Authorization": `Bearer ${await this.getApiToken()}`
- }
- });
+ static async getInfo(id: string) {
+ const response = await fetch(`${base}/torrents/info/${id}`, {
+ headers: {
+ Authorization: `Bearer ${await this.getApiToken()}`,
+ },
+ });
- return response.json() as Promise;
- }
+ return response.json() as Promise;
+ }
- static async selectAllFiles(id: string) {
- const response = await fetch(`${base}/torrents/selectFiles/${id}`, {
- method: "POST",
- headers: {
- "Authorization": `Bearer ${await this.getApiToken()}`,
- },
- body: "files=all"
- });
- }
+ static async selectAllFiles(id: string) {
+ await fetch(`${base}/torrents/selectFiles/${id}`, {
+ method: "POST",
+ headers: {
+ Authorization: `Bearer ${await this.getApiToken()}`,
+ },
+ body: "files=all",
+ });
+ }
- static async unrestrictLink(link: string) {
- const response = await fetch(`${base}/unrestrict/link`, {
- method: "POST",
- headers: {
- "Authorization": `Bearer ${await this.getApiToken()}`,
- },
- body: `link=${link}`
- });
+ static async unrestrictLink(link: string) {
+ const response = await fetch(`${base}/unrestrict/link`, {
+ method: "POST",
+ headers: {
+ Authorization: `Bearer ${await this.getApiToken()}`,
+ },
+ body: `link=${link}`,
+ });
- return response.json() as Promise;
- }
+ return response.json() as Promise;
+ }
- static getApiToken() {
- return userPreferencesRepository.findOne({ where: { id: 1 } }).then(userPreferences => userPreferences!.realDebridApiToken);
- }
-}
\ No newline at end of file
+ static getApiToken() {
+ return userPreferencesRepository
+ .findOne({ where: { id: 1 } })
+ .then((userPreferences) => userPreferences!.realDebridApiToken);
+ }
+}
diff --git a/src/main/services/donwloaders/torrent-client.ts b/src/main/services/donwloaders/torrent-client.ts
index ed4e16dc..f5c5cdd8 100644
--- a/src/main/services/donwloaders/torrent-client.ts
+++ b/src/main/services/donwloaders/torrent-client.ts
@@ -131,4 +131,4 @@ export class TorrentClient {
Sentry.captureException(err);
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/services/unrar.ts b/src/main/services/unrar.ts
index 9410de23..fcfd1fb1 100644
--- a/src/main/services/unrar.ts
+++ b/src/main/services/unrar.ts
@@ -1,24 +1,26 @@
-import { Extractor, createExtractorFromFile } from 'node-unrar-js';
-import fs from 'node:fs';
+import { Extractor, createExtractorFromFile } from "node-unrar-js";
+import fs from "node:fs";
-const wasmBinary = fs.readFileSync(require.resolve('node-unrar-js/esm/js/unrar.wasm'));
+const wasmBinary = fs.readFileSync(
+ require.resolve("node-unrar-js/esm/js/unrar.wasm")
+);
export class Unrar {
- private constructor(private extractor: Extractor) { }
+ private constructor(private extractor: Extractor) {}
- static async fromFilePath(filePath: string, targetFolder: string) {
- const extractor = await createExtractorFromFile({
- filepath: filePath,
- targetPath: targetFolder,
- wasmBinary,
- });
- return new Unrar(extractor);
- }
+ static async fromFilePath(filePath: string, targetFolder: string) {
+ const extractor = await createExtractorFromFile({
+ filepath: filePath,
+ targetPath: targetFolder,
+ wasmBinary,
+ });
+ return new Unrar(extractor);
+ }
- extract() {
- const files = this.extractor.extract().files;
- for (const file of files) {
- console.log("File:", file.fileHeader.name);
- }
+ extract() {
+ const files = this.extractor.extract().files;
+ for (const file of files) {
+ console.log("File:", file.fileHeader.name);
}
+ }
}
diff --git a/src/renderer/src/components/sidebar/sidebar.tsx b/src/renderer/src/components/sidebar/sidebar.tsx
index ab4ea26b..fe8e65d7 100644
--- a/src/renderer/src/components/sidebar/sidebar.tsx
+++ b/src/renderer/src/components/sidebar/sidebar.tsx
@@ -118,7 +118,8 @@ export function Sidebar() {
}, [isResizing]);
const getGameTitle = (game: Game) => {
- if (game.status === GameStatus.Paused) return t("paused", { title: game.title });
+ if (game.status === GameStatus.Paused)
+ return t("paused", { title: game.title });
if (gameDownloading?.id === game.id) {
const isVerifying = GameStatus.isVerifying(gameDownloading.status);
diff --git a/src/renderer/src/hooks/use-download.ts b/src/renderer/src/hooks/use-download.ts
index 092b352f..ea7665a5 100644
--- a/src/renderer/src/hooks/use-download.ts
+++ b/src/renderer/src/hooks/use-download.ts
@@ -99,7 +99,7 @@ export function useDownload() {
dispatch(setGameDeleting(gameId));
return window.electron.deleteGameFolder(gameId);
})
- .catch(() => { })
+ .catch(() => {})
.finally(() => {
updateLibrary();
dispatch(removeGameFromDeleting(gameId));
diff --git a/src/renderer/src/pages/settings/settings.tsx b/src/renderer/src/pages/settings/settings.tsx
index 4da8f07b..110124b3 100644
--- a/src/renderer/src/pages/settings/settings.tsx
+++ b/src/renderer/src/pages/settings/settings.tsx
@@ -111,12 +111,12 @@ export function Settings() {
/>
{
- updateUserPreferences("realDebridApiToken", event.target.value);
- }}
- />
+ label={t("real_debrid_api_token")}
+ value={form.realDebridApiToken ?? ""}
+ onChange={(event) => {
+ updateUserPreferences("realDebridApiToken", event.target.value);
+ }}
+ />
);
From 040dc475e7cb997c748a4e9222ae5545aaf85dc2 Mon Sep 17 00:00:00 2001
From: lilezek
Date: Tue, 30 Apr 2024 11:27:44 +0200
Subject: [PATCH 15/30] fix: forgot to add @globals to the vite config.
---
electron.vite.config.ts | 2 ++
1 file changed, 2 insertions(+)
diff --git a/electron.vite.config.ts b/electron.vite.config.ts
index d98d0238..70d2b92e 100644
--- a/electron.vite.config.ts
+++ b/electron.vite.config.ts
@@ -32,6 +32,7 @@ export default defineConfig(({ mode }) => {
"@main": resolve("src/main"),
"@locales": resolve("src/locales"),
"@resources": resolve("resources"),
+ "@globals": resolve("src/globals"),
},
},
plugins: [
@@ -52,6 +53,7 @@ export default defineConfig(({ mode }) => {
alias: {
"@renderer": resolve("src/renderer/src"),
"@locales": resolve("src/locales"),
+ "@globals": resolve("src/globals"),
},
},
plugins: [
From c5dc8e17f3ac3c5e7af9fbbad29f62e462627c5b Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 30 Apr 2024 09:28:06 +0000
Subject: [PATCH 16/30] docs(contributor): contrib-readme-action has updated
readme
---
README.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index c5ab2b52..1829f22a 100644
--- a/README.md
+++ b/README.md
@@ -99,15 +99,15 @@ yarn make
|
-
-
+
+
Null
|
-
-
+
+
Null
From e2feb5f0562c7126a1cb33345a3517bcb58a2aec Mon Sep 17 00:00:00 2001
From: lilezek
Date: Tue, 30 Apr 2024 11:39:35 +0200
Subject: [PATCH 17/30] refactor: drop unnecesary node-fetch library
---
package.json | 4 +---
src/main/services/donwloaders/real-debrid.ts | 1 -
yarn.lock | 10 +---------
3 files changed, 2 insertions(+), 13 deletions(-)
diff --git a/package.json b/package.json
index 84c47e42..1adf050f 100644
--- a/package.json
+++ b/package.json
@@ -26,7 +26,6 @@
"build:linux": "electron-vite build && electron-builder --linux"
},
"dependencies": {
- "@types/node-fetch": "^2.6.11",
"@electron-toolkit/preload": "^3.0.0",
"@electron-toolkit/utils": "^3.0.0",
"@fontsource/fira-mono": "^5.0.13",
@@ -43,8 +42,8 @@
"check-disk-space": "^3.4.0",
"classnames": "^2.5.1",
"color.js": "^1.2.0",
- "electron-dl-manager": "^3.0.0",
"date-fns": "^3.6.0",
+ "electron-dl-manager": "^3.0.0",
"flexsearch": "^0.7.43",
"got-scraping": "^4.0.5",
"i18next": "^23.11.2",
@@ -52,7 +51,6 @@
"jsdom": "^24.0.0",
"lodash-es": "^4.17.21",
"lottie-react": "^2.4.0",
- "node-fetch": "^2.6.1",
"node-unrar-js": "^2.0.2",
"parse-torrent": "^11.0.16",
"ps-list": "^8.1.1",
diff --git a/src/main/services/donwloaders/real-debrid.ts b/src/main/services/donwloaders/real-debrid.ts
index 9fb170a9..c502d3ad 100644
--- a/src/main/services/donwloaders/real-debrid.ts
+++ b/src/main/services/donwloaders/real-debrid.ts
@@ -1,5 +1,4 @@
import { userPreferencesRepository } from "@main/repository";
-import fetch from "node-fetch";
import {
RealDebridAddMagnet,
RealDebridTorrentInfo,
diff --git a/yarn.lock b/yarn.lock
index 90d99bdc..4bb0476c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1440,14 +1440,6 @@
resolved "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz"
integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==
-"@types/node-fetch@^2.6.11":
- version "2.6.11"
- resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24"
- integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==
- dependencies:
- "@types/node" "*"
- form-data "^4.0.0"
-
"@types/node@*", "@types/node@^20.12.7":
version "20.12.7"
resolved "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz"
@@ -4642,7 +4634,7 @@ node-domexception@^1.0.0:
resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz"
integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
-node-fetch@^2.6.1, node-fetch@^2.6.7:
+node-fetch@^2.6.7:
version "2.7.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
From 27bf3c92ec0fc69012994a326d015108b016fc4a Mon Sep 17 00:00:00 2001
From: lilezek
Date: Tue, 30 Apr 2024 21:11:32 +0200
Subject: [PATCH 18/30] fix: do not add the same magnet twice to real debrid
---
src/main/services/donwloaders/downloader.ts | 20 ++++++++++++++++----
src/main/services/donwloaders/real-debrid.ts | 14 ++++++++++++++
2 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/src/main/services/donwloaders/downloader.ts b/src/main/services/donwloaders/downloader.ts
index c13d4d01..b7c3df23 100644
--- a/src/main/services/donwloaders/downloader.ts
+++ b/src/main/services/donwloaders/downloader.ts
@@ -69,10 +69,22 @@ export class Downloader {
});
} else {
try {
- const torrent = await RealDebridClient.addMagnet(repack.magnet);
- if (torrent && torrent.id) {
- await RealDebridClient.selectAllFiles(torrent.id);
- const { links } = await RealDebridClient.getInfo(torrent.id);
+ // Lets try first to find the torrent on RealDebrid
+ const torrents = await RealDebridClient.getAllTorrents();
+ const hash = RealDebridClient.extractSHA1FromMagnet(repack.magnet);
+ let torrent = torrents.find((t) => t.hash === hash);
+
+ if (!torrent) {
+ // Torrent is missing, lets add it
+ const magnet = await RealDebridClient.addMagnet(repack.magnet);
+ if (magnet && magnet.id) {
+ await RealDebridClient.selectAllFiles(magnet.id);
+ torrent = await RealDebridClient.getInfo(magnet.id);
+ }
+ }
+
+ if (torrent) {
+ const { links } = torrent;
const { download } = await RealDebridClient.unrestrictLink(links[0]);
this.lastHttpDownloader = new HTTPDownloader();
this.lastHttpDownloader.download(
diff --git a/src/main/services/donwloaders/real-debrid.ts b/src/main/services/donwloaders/real-debrid.ts
index c502d3ad..7f9ccb48 100644
--- a/src/main/services/donwloaders/real-debrid.ts
+++ b/src/main/services/donwloaders/real-debrid.ts
@@ -52,9 +52,23 @@ export class RealDebridClient {
return response.json() as Promise;
}
+ static async getAllTorrents() {
+ const response = await fetch(`${base}/torrents`, {
+ headers: {
+ Authorization: `Bearer ${await this.getApiToken()}`,
+ },
+ });
+
+ return response.json() as Promise;
+ }
+
static getApiToken() {
return userPreferencesRepository
.findOne({ where: { id: 1 } })
.then((userPreferences) => userPreferences!.realDebridApiToken);
}
+
+ static extractSHA1FromMagnet(magnet: string) {
+ return magnet.match(/btih:([0-9a-fA-F]*)/)?.[1].toLowerCase();
+ }
}
From e6c9a2eaa90f12b3d192a8b6f3714a155d34208c Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Wed, 1 May 2024 09:37:59 +0000
Subject: [PATCH 19/30] docs(contributor): contrib-readme-action has updated
readme
---
README.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 1829f22a..c5ab2b52 100644
--- a/README.md
+++ b/README.md
@@ -99,15 +99,15 @@ yarn make
|
-
-
+
+
Null
|
-
-
+
+
Null
From fb968310e09b5ae09e109bbf96749858f1835354 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Wed, 1 May 2024 19:11:10 +0000
Subject: [PATCH 20/30] docs(contributor): contrib-readme-action has updated
readme
---
README.md | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/README.md b/README.md
index c5ab2b52..0d526bf7 100644
--- a/README.md
+++ b/README.md
@@ -105,13 +105,6 @@ yarn make
Null
|
-
-
-
-
- Null
-
- |
@@ -120,19 +113,26 @@ yarn make
|
-
-
+
+
- Fhilipe Coelho
+ Null
- |
-
+
Magrid
+ |
+
+
+
+
+
+ Fhilipe Coelho
+
|
From 90a40d379af53dca489172b4de61a3c096fae25b Mon Sep 17 00:00:00 2001
From: lilezek
Date: Wed, 1 May 2024 21:49:40 +0200
Subject: [PATCH 21/30] feat: i18n for the real debrid api token
---
src/locales/en/translation.json | 3 ++-
src/locales/es/translation.json | 3 ++-
src/locales/fr/translation.json | 3 ++-
src/locales/hu/translation.json | 3 ++-
src/locales/it/translation.json | 3 ++-
src/locales/pt/translation.json | 3 ++-
src/renderer/src/pages/settings/settings.tsx | 2 +-
7 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json
index 03f00a0d..cea1d931 100644
--- a/src/locales/en/translation.json
+++ b/src/locales/en/translation.json
@@ -123,7 +123,8 @@
"enable_download_notifications": "When a download is complete",
"enable_repack_list_notifications": "When a new repack is added",
"telemetry": "Telemetry",
- "telemetry_description": "Enable anonymous usage statistics"
+ "telemetry_description": "Enable anonymous usage statistics",
+ "real_debrid_api_token_description": "(Optional) Real Debrid API token"
},
"notifications": {
"download_complete": "Download complete",
diff --git a/src/locales/es/translation.json b/src/locales/es/translation.json
index ad484825..da71ecef 100644
--- a/src/locales/es/translation.json
+++ b/src/locales/es/translation.json
@@ -113,7 +113,8 @@
"enable_download_notifications": "Cuando se completa una descarga",
"enable_repack_list_notifications": "Cuando se añade un repack nuevo",
"telemetry": "Telemetría",
- "telemetry_description": "Habilitar recopilación de datos de manera anónima"
+ "telemetry_description": "Habilitar recopilación de datos de manera anónima",
+ "real_debrid_api_token_description": "(Opcional) Real Debrid API token"
},
"notifications": {
"download_complete": "Descarga completada",
diff --git a/src/locales/fr/translation.json b/src/locales/fr/translation.json
index 3e247b07..c06e483a 100644
--- a/src/locales/fr/translation.json
+++ b/src/locales/fr/translation.json
@@ -113,7 +113,8 @@
"enable_download_notifications": "Quand un téléchargement est terminé",
"enable_repack_list_notifications": "Quand un nouveau repack est ajouté",
"telemetry": "Télémétrie",
- "telemetry_description": "Activer les statistiques d'utilisation anonymes"
+ "telemetry_description": "Activer les statistiques d'utilisation anonymes",
+ "real_debrid_api_token_description": "(Facultatif) Real Debrid API token"
},
"notifications": {
"download_complete": "Téléchargement terminé",
diff --git a/src/locales/hu/translation.json b/src/locales/hu/translation.json
index 901574a1..35b3e51a 100644
--- a/src/locales/hu/translation.json
+++ b/src/locales/hu/translation.json
@@ -123,7 +123,8 @@
"enable_download_notifications": "Amikor egy letöltés befejeződik",
"enable_repack_list_notifications": "Amikor egy új repack hozzáadásra kerül",
"telemetry": "Telemetria",
- "telemetry_description": "Névtelen felhasználási statisztikák engedélyezése"
+ "telemetry_description": "Névtelen felhasználási statisztikák engedélyezése",
+ "real_debrid_api_token_description": "(Választható) Real Debrid API token"
},
"notifications": {
"download_complete": "Letöltés befejeződött",
diff --git a/src/locales/it/translation.json b/src/locales/it/translation.json
index 01b34c1e..cfdbf714 100644
--- a/src/locales/it/translation.json
+++ b/src/locales/it/translation.json
@@ -117,7 +117,8 @@
"enable_download_notifications": "Quando un download è completo",
"enable_repack_list_notifications": "Quando viene aggiunto un nuovo repack",
"telemetry": "Telemetria",
- "telemetry_description": "Abilita statistiche di utilizzo anonime"
+ "telemetry_description": "Abilita statistiche di utilizzo anonime",
+ "real_debrid_api_token_description": "(Facoltativo) Real Debrid API token"
},
"notifications": {
"download_complete": "Download completato",
diff --git a/src/locales/pt/translation.json b/src/locales/pt/translation.json
index 270e0451..0ad1b297 100644
--- a/src/locales/pt/translation.json
+++ b/src/locales/pt/translation.json
@@ -119,7 +119,8 @@
"enable_download_notifications": "Quando um download for concluído",
"enable_repack_list_notifications": "Quando a lista de repacks for atualizada",
"telemetry": "Telemetria",
- "telemetry_description": "Habilitar estatísticas de uso anônimas"
+ "telemetry_description": "Habilitar estatísticas de uso anônimas",
+ "real_debrid_api_token_description": "(Opcional) Real Debrid API token"
},
"notifications": {
"download_complete": "Download concluído",
diff --git a/src/renderer/src/pages/settings/settings.tsx b/src/renderer/src/pages/settings/settings.tsx
index 110124b3..ce165913 100644
--- a/src/renderer/src/pages/settings/settings.tsx
+++ b/src/renderer/src/pages/settings/settings.tsx
@@ -111,7 +111,7 @@ export function Settings() {
/>
{
updateUserPreferences("realDebridApiToken", event.target.value);
From 43bd72d02f784248afa1c07626f944327373b03c Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 2 May 2024 08:25:01 +0000
Subject: [PATCH 22/30] docs(contributor): contrib-readme-action has updated
readme
---
README.md | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/README.md b/README.md
index d7a7d4a3..8947899e 100644
--- a/README.md
+++ b/README.md
@@ -105,6 +105,13 @@ yarn make
Null
|
+
+
+
+
+ Null
+
+ |
@@ -118,15 +125,15 @@ yarn make
Magrid
- |
+
+
- Null
+ Fhilipe Coelho
- |
-
+
@@ -141,13 +148,6 @@ yarn make
Null
|
-
-
-
-
- Fhilipe Coelho
-
- |
@@ -168,15 +168,15 @@ yarn make
João Martins
- |
+
+
Ikko Eltociear Ashimine
- |
-
+
From 27e22917f1231386ad502bb861c9f6e850746947 Mon Sep 17 00:00:00 2001
From: lilezek
Date: Fri, 3 May 2024 16:28:05 +0200
Subject: [PATCH 23/30] fix: forgot to update the yarn.lock after merge
---
yarn.lock | 16 +++-------------
1 file changed, 3 insertions(+), 13 deletions(-)
diff --git a/yarn.lock b/yarn.lock
index b76df8be..a1395556 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4311,20 +4311,10 @@ lodash-es@^4.17.21:
resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
-lodash.defaults@^4.2.0:
- version "4.2.0"
- resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz"
- integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==
-
-lodash.difference@^4.5.0:
+lodash.clonedeep@^4.5.0:
version "4.5.0"
- resolved "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz"
- integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==
-
-lodash.flatten@^4.4.0:
- version "4.4.0"
- resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz"
- integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==
+ resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+ integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==
lodash.isequal@^4.5.0:
version "4.5.0"
From 86a21ea2c2b3f3fde2e2b5d3ff17d527b9ca3e0f Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Fri, 3 May 2024 20:09:26 +0000
Subject: [PATCH 24/30] docs(contributor): contrib-readme-action has updated
readme
---
README.md | 21 ++++++++++++++-------
1 file changed, 14 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index 62d0011c..690c9496 100644
--- a/README.md
+++ b/README.md
@@ -148,6 +148,13 @@ yarn make
Null
|
+
+
+
+
+ João Martins
+
+ |
@@ -161,13 +168,6 @@ yarn make
Guilherme Viana
- |
-
-
-
-
- João Martins
-
|
@@ -184,6 +184,13 @@ yarn make
Netflixy
|
+
+
+
+
+ Hachi
+
+ |
From 56ac59bce688fb6c85bc33d7356865bac575926b Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Sat, 4 May 2024 10:08:05 +0000
Subject: [PATCH 25/30] docs(contributor): contrib-readme-action has updated
readme
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 8ce64f23..690c9496 100644
--- a/README.md
+++ b/README.md
@@ -168,7 +168,8 @@ yarn make
Guilherme Viana
- |
+
+
From ff189f76773d41a1f6d3a550fcc08bbdefae7a8e Mon Sep 17 00:00:00 2001
From: lilezek
Date: Sat, 4 May 2024 12:34:21 +0200
Subject: [PATCH 26/30] fix: forgot to import something during the merge commit
---
src/main/services/donwloaders/downloader.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/main/services/donwloaders/downloader.ts b/src/main/services/donwloaders/downloader.ts
index ef8f68cf..41297c5a 100644
--- a/src/main/services/donwloaders/downloader.ts
+++ b/src/main/services/donwloaders/downloader.ts
@@ -13,6 +13,7 @@ import { GameStatus } from "@globals";
import path from "node:path";
import crypto from "node:crypto";
import fs from "node:fs";
+import { app } from "electron";
interface DownloadStatus {
From 2a674ed988b560c0c5a25e5636a9ddf0475b511c Mon Sep 17 00:00:00 2001
From: lilezek
Date: Sat, 4 May 2024 19:20:46 +0200
Subject: [PATCH 27/30] fix: typo on downloaders folder
---
src/main/events/torrenting/cancel-game-download.ts | 2 +-
src/main/events/torrenting/pause-game-download.ts | 2 +-
src/main/events/torrenting/resume-game-download.ts | 2 +-
src/main/events/torrenting/start-game-download.ts | 2 +-
src/main/main.ts | 4 ++--
src/main/services/{donwloaders => downloaders}/downloader.ts | 0
.../services/{donwloaders => downloaders}/http-downloader.ts | 0
.../{donwloaders => downloaders}/real-debrid-types.ts | 0
src/main/services/{donwloaders => downloaders}/real-debrid.ts | 0
.../services/{donwloaders => downloaders}/torrent-client.ts | 0
src/main/services/index.ts | 2 +-
11 files changed, 7 insertions(+), 7 deletions(-)
rename src/main/services/{donwloaders => downloaders}/downloader.ts (100%)
rename src/main/services/{donwloaders => downloaders}/http-downloader.ts (100%)
rename src/main/services/{donwloaders => downloaders}/real-debrid-types.ts (100%)
rename src/main/services/{donwloaders => downloaders}/real-debrid.ts (100%)
rename src/main/services/{donwloaders => downloaders}/torrent-client.ts (100%)
diff --git a/src/main/events/torrenting/cancel-game-download.ts b/src/main/events/torrenting/cancel-game-download.ts
index 39772e21..73ae0bb6 100644
--- a/src/main/events/torrenting/cancel-game-download.ts
+++ b/src/main/events/torrenting/cancel-game-download.ts
@@ -4,7 +4,7 @@ import { registerEvent } from "../register-event";
import { WindowManager } from "@main/services";
import { In } from "typeorm";
-import { Downloader } from "@main/services/donwloaders/downloader";
+import { Downloader } from "@main/services/downloaders/downloader";
import { GameStatus } from "@globals";
const cancelGameDownload = async (
diff --git a/src/main/events/torrenting/pause-game-download.ts b/src/main/events/torrenting/pause-game-download.ts
index 263ec9be..3d486562 100644
--- a/src/main/events/torrenting/pause-game-download.ts
+++ b/src/main/events/torrenting/pause-game-download.ts
@@ -3,7 +3,7 @@ import { WindowManager } from "@main/services";
import { registerEvent } from "../register-event";
import { gameRepository } from "../../repository";
import { In } from "typeorm";
-import { Downloader } from "@main/services/donwloaders/downloader";
+import { Downloader } from "@main/services/downloaders/downloader";
import { GameStatus } from "@globals";
const pauseGameDownload = async (
diff --git a/src/main/events/torrenting/resume-game-download.ts b/src/main/events/torrenting/resume-game-download.ts
index a394c84a..03f56a13 100644
--- a/src/main/events/torrenting/resume-game-download.ts
+++ b/src/main/events/torrenting/resume-game-download.ts
@@ -2,7 +2,7 @@ import { registerEvent } from "../register-event";
import { gameRepository } from "../../repository";
import { getDownloadsPath } from "../helpers/get-downloads-path";
import { In } from "typeorm";
-import { Downloader } from "@main/services/donwloaders/downloader";
+import { Downloader } from "@main/services/downloaders/downloader";
import { GameStatus } from "@globals";
const resumeGameDownload = async (
diff --git a/src/main/events/torrenting/start-game-download.ts b/src/main/events/torrenting/start-game-download.ts
index 8ae520d5..dec41b8e 100644
--- a/src/main/events/torrenting/start-game-download.ts
+++ b/src/main/events/torrenting/start-game-download.ts
@@ -6,7 +6,7 @@ import { registerEvent } from "../register-event";
import type { GameShop } from "@types";
import { getImageBase64 } from "@main/helpers";
import { In } from "typeorm";
-import { Downloader } from "@main/services/donwloaders/downloader";
+import { Downloader } from "@main/services/downloaders/downloader";
import { GameStatus } from "@globals";
const startGameDownload = async (
diff --git a/src/main/main.ts b/src/main/main.ts
index 9a09db3d..80f975eb 100644
--- a/src/main/main.ts
+++ b/src/main/main.ts
@@ -17,12 +17,12 @@ import {
steamGameRepository,
userPreferencesRepository,
} from "./repository";
-import { TorrentClient } from "./services/donwloaders/torrent-client";
+import { TorrentClient } from "./services/downloaders/torrent-client";
import { Repack } from "./entity";
import { Notification } from "electron";
import { t } from "i18next";
import { In } from "typeorm";
-import { Downloader } from "./services/donwloaders/downloader";
+import { Downloader } from "./services/downloaders/downloader";
import { GameStatus } from "@globals";
startProcessWatcher();
diff --git a/src/main/services/donwloaders/downloader.ts b/src/main/services/downloaders/downloader.ts
similarity index 100%
rename from src/main/services/donwloaders/downloader.ts
rename to src/main/services/downloaders/downloader.ts
diff --git a/src/main/services/donwloaders/http-downloader.ts b/src/main/services/downloaders/http-downloader.ts
similarity index 100%
rename from src/main/services/donwloaders/http-downloader.ts
rename to src/main/services/downloaders/http-downloader.ts
diff --git a/src/main/services/donwloaders/real-debrid-types.ts b/src/main/services/downloaders/real-debrid-types.ts
similarity index 100%
rename from src/main/services/donwloaders/real-debrid-types.ts
rename to src/main/services/downloaders/real-debrid-types.ts
diff --git a/src/main/services/donwloaders/real-debrid.ts b/src/main/services/downloaders/real-debrid.ts
similarity index 100%
rename from src/main/services/donwloaders/real-debrid.ts
rename to src/main/services/downloaders/real-debrid.ts
diff --git a/src/main/services/donwloaders/torrent-client.ts b/src/main/services/downloaders/torrent-client.ts
similarity index 100%
rename from src/main/services/donwloaders/torrent-client.ts
rename to src/main/services/downloaders/torrent-client.ts
diff --git a/src/main/services/index.ts b/src/main/services/index.ts
index 215cd016..7db479a0 100644
--- a/src/main/services/index.ts
+++ b/src/main/services/index.ts
@@ -6,6 +6,6 @@ export * from "./steam-grid";
export * from "./update-resolver";
export * from "./window-manager";
export * from "./fifo";
-export * from "./donwloaders/torrent-client";
+export * from "./downloaders/torrent-client";
export * from "./how-long-to-beat";
export * from "./process-watcher";
From 8caea2893d005b174e6520e697102132b47c04ec Mon Sep 17 00:00:00 2001
From: lilezek
Date: Sat, 4 May 2024 19:27:14 +0200
Subject: [PATCH 28/30] fix: copy unrar.wasm as part of the postinstallation
process
---
.gitignore | 1 +
electron-builder.yml | 1 +
postinstall.cjs | 2 ++
src/main/services/unrar.ts | 10 ++++++++--
4 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/.gitignore b/.gitignore
index 675a83ee..95835897 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@
node_modules
hydra-download-manager
fastlist.exe
+unrar.wasm
__pycache__
dist
out
diff --git a/electron-builder.yml b/electron-builder.yml
index 06f6a5c5..83c7c80a 100644
--- a/electron-builder.yml
+++ b/electron-builder.yml
@@ -6,6 +6,7 @@ extraResources:
- hydra-download-manager
- hydra.db
- fastlist.exe
+ - unrar.wasm
files:
- "!**/.vscode/*"
- "!src/*"
diff --git a/postinstall.cjs b/postinstall.cjs
index 8ca8f101..7f6457cc 100644
--- a/postinstall.cjs
+++ b/postinstall.cjs
@@ -6,3 +6,5 @@ if (process.platform === "win32") {
"fastlist.exe"
);
}
+
+fs.copyFileSync("node_modules/node-unrar-js/esm/js/unrar.wasm", "unrar.wasm");
\ No newline at end of file
diff --git a/src/main/services/unrar.ts b/src/main/services/unrar.ts
index fcfd1fb1..e24d41d4 100644
--- a/src/main/services/unrar.ts
+++ b/src/main/services/unrar.ts
@@ -1,12 +1,18 @@
import { Extractor, createExtractorFromFile } from "node-unrar-js";
import fs from "node:fs";
+import path from "node:path";
+import { app } from "electron";
+
+const wasmPath = app.isPackaged
+ ? path.join(process.resourcesPath, "unrar.wasm")
+ : path.join(__dirname, "..", "..", "unrar.wasm");
const wasmBinary = fs.readFileSync(
- require.resolve("node-unrar-js/esm/js/unrar.wasm")
+ require.resolve(wasmPath)
);
export class Unrar {
- private constructor(private extractor: Extractor) {}
+ private constructor(private extractor: Extractor) { }
static async fromFilePath(filePath: string, targetFolder: string) {
const extractor = await createExtractorFromFile({
From 2bcc40278c051357ffead8c09368f535db28c018 Mon Sep 17 00:00:00 2001
From: lilezek
Date: Sat, 4 May 2024 19:27:58 +0200
Subject: [PATCH 29/30] refactor: ran prettier
---
postinstall.cjs | 2 +-
src/main/constants.ts | 1 -
src/main/services/downloaders/downloader.ts | 1 -
src/main/services/unrar.ts | 6 ++----
src/renderer/src/pages/settings/settings.tsx | 3 ++-
5 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/postinstall.cjs b/postinstall.cjs
index 7f6457cc..d2c91bca 100644
--- a/postinstall.cjs
+++ b/postinstall.cjs
@@ -7,4 +7,4 @@ if (process.platform === "win32") {
);
}
-fs.copyFileSync("node_modules/node-unrar-js/esm/js/unrar.wasm", "unrar.wasm");
\ No newline at end of file
+fs.copyFileSync("node_modules/node-unrar-js/esm/js/unrar.wasm", "unrar.wasm");
diff --git a/src/main/constants.ts b/src/main/constants.ts
index f80de77c..b1b9bcb5 100644
--- a/src/main/constants.ts
+++ b/src/main/constants.ts
@@ -33,7 +33,6 @@ export const months = [
"Dec",
];
-
export const defaultDownloadsPath = app.getPath("downloads");
export const databasePath = path.join(
diff --git a/src/main/services/downloaders/downloader.ts b/src/main/services/downloaders/downloader.ts
index 41297c5a..da1926f2 100644
--- a/src/main/services/downloaders/downloader.ts
+++ b/src/main/services/downloaders/downloader.ts
@@ -15,7 +15,6 @@ import crypto from "node:crypto";
import fs from "node:fs";
import { app } from "electron";
-
interface DownloadStatus {
numPeers: number;
numSeeds: number;
diff --git a/src/main/services/unrar.ts b/src/main/services/unrar.ts
index e24d41d4..992f2377 100644
--- a/src/main/services/unrar.ts
+++ b/src/main/services/unrar.ts
@@ -7,12 +7,10 @@ const wasmPath = app.isPackaged
? path.join(process.resourcesPath, "unrar.wasm")
: path.join(__dirname, "..", "..", "unrar.wasm");
-const wasmBinary = fs.readFileSync(
- require.resolve(wasmPath)
-);
+const wasmBinary = fs.readFileSync(require.resolve(wasmPath));
export class Unrar {
- private constructor(private extractor: Extractor) { }
+ private constructor(private extractor: Extractor) {}
static async fromFilePath(filePath: string, targetFolder: string) {
const extractor = await createExtractorFromFile({
diff --git a/src/renderer/src/pages/settings/settings.tsx b/src/renderer/src/pages/settings/settings.tsx
index e05af66e..6c52e7c8 100644
--- a/src/renderer/src/pages/settings/settings.tsx
+++ b/src/renderer/src/pages/settings/settings.tsx
@@ -131,7 +131,8 @@ export function Settings() {
value={form.realDebridApiToken ?? ""}
onChange={(event) => {
updateUserPreferences("realDebridApiToken", event.target.value);
- }} />
+ }}
+ />
);
From d1973eba264326c3ab1ab374b1711fddf22a6b9f Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Sat, 4 May 2024 17:28:12 +0000
Subject: [PATCH 30/30] docs(contributor): contrib-readme-action has updated
readme
---
README.md | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index 690c9496..941ac470 100644
--- a/README.md
+++ b/README.md
@@ -134,13 +134,6 @@ yarn make
Fhilipe Coelho
|
-
-
-
-
- José Luís
-
- |
@@ -148,6 +141,13 @@ yarn make
Null
|
+
+
+
+
+ José Luís
+
+ |
|