Compare commits
29 Commits
Author | SHA1 | Date | |
---|---|---|---|
9c1e958715 | |||
084409a955 | |||
1739618278 | |||
c38965794a | |||
c3cf45d61d | |||
5f2e05b4b9 | |||
d171545f18 | |||
6551f0b369 | |||
74e233ecc3 | |||
a848f078be | |||
9f71ad0f8e | |||
45c5b329b5 | |||
b0f180f1fb | |||
6d42b4fe89 | |||
cd8f42327c | |||
6881a0d1d5 | |||
9f9804f161 | |||
3bd1fb9edb | |||
8a8856772e | |||
80343bd929 | |||
9da481b991 | |||
70643c4287 | |||
db03ed552f | |||
a72ae1df5f | |||
9fbab69206 | |||
4e79809c19 | |||
f06e63f7f8 | |||
638f1e852e | |||
8b30b7c1fa |
@@ -1,4 +1,4 @@
|
|||||||
const appName = "EZPPLauncher";
|
const appName = "EZPPLauncher";
|
||||||
const appVersion = "2.1.4";
|
const appVersion = "2.1.7";
|
||||||
|
|
||||||
module.exports = { appName, appVersion };
|
module.exports = { appName, appVersion };
|
||||||
|
@@ -2,19 +2,19 @@ const childProcess = require("child_process");
|
|||||||
|
|
||||||
const runFile = (folder, file, args, onExit) => {
|
const runFile = (folder, file, args, onExit) => {
|
||||||
childProcess.execFile(file, args, {
|
childProcess.execFile(file, args, {
|
||||||
cwd: folder
|
cwd: folder,
|
||||||
}, (_err, _stdout, _stdin) => {
|
}, (_err, _stdout, _stdin) => {
|
||||||
if (onExit) onExit();
|
if (onExit) onExit();
|
||||||
})
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
const runFileDetached = (folder, file, args) => {
|
const runFileDetached = (folder, file, args) => {
|
||||||
const subProcess = childProcess.spawn(file + (args ? " " + args : ''), {
|
const subProcess = childProcess.spawn(file + (args ? " " + args : ""), {
|
||||||
cwd: folder,
|
cwd: folder,
|
||||||
detached: true,
|
detached: true,
|
||||||
stdio: 'ignore'
|
stdio: "ignore",
|
||||||
});
|
});
|
||||||
subProcess.unref();
|
subProcess.unref();
|
||||||
}
|
};
|
||||||
|
|
||||||
module.exports = { runFile, runFileDetached };
|
module.exports = { runFile, runFileDetached };
|
15
electron/fileUtil.js
Normal file
15
electron/fileUtil.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
const fs = require("fs");
|
||||||
|
|
||||||
|
function isWritable(filePath) {
|
||||||
|
let fileAccess = false;
|
||||||
|
try {
|
||||||
|
fs.closeSync(fs.openSync(filePath, "r+"));
|
||||||
|
fileAccess = true;
|
||||||
|
} catch {
|
||||||
|
}
|
||||||
|
return fileAccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
isWritable,
|
||||||
|
};
|
@@ -1,13 +1,13 @@
|
|||||||
function formatBytes(bytes, decimals = 2) {
|
function formatBytes(bytes, decimals = 2) {
|
||||||
if (!+bytes) return '0 Bytes'
|
if (!+bytes) return "0 B";
|
||||||
|
|
||||||
const k = 1024
|
const k = 1024;
|
||||||
const dm = decimals < 0 ? 0 : decimals
|
const dm = decimals < 0 ? 0 : decimals;
|
||||||
const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
|
const sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
|
||||||
|
|
||||||
const i = Math.floor(Math.log(bytes) / Math.log(k))
|
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
||||||
|
|
||||||
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))}${sizes[i]}`
|
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))}${sizes[i]}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = { formatBytes };
|
module.exports = { formatBytes };
|
@@ -16,17 +16,24 @@ const platforms = {
|
|||||||
};
|
};
|
||||||
const crypto = require("crypto");
|
const crypto = require("crypto");
|
||||||
|
|
||||||
|
const defaultHWID = "recorderinthesandybridge";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns machine hardware id.
|
* Returns machine hardware id.
|
||||||
* Returns `undefined` if cannot determine.
|
* @return {Promise<string>}
|
||||||
* @return {string?}
|
|
||||||
*/
|
*/
|
||||||
function getHwId() {
|
function getHwId() {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
try {
|
||||||
const getter = platforms[process.platform];
|
const getter = platforms[process.platform];
|
||||||
if (!getter) return;
|
if (getter) {
|
||||||
const result = getter[1].exec(child_process.execSync(getter[0], options));
|
const result = getter[1].exec(child_process.execSync(getter[0], options));
|
||||||
if (!result) return;
|
if (result) resolve(crypto.createHash("md5").update(result[1]).digest("hex"));
|
||||||
return crypto.createHash("md5").update(result[1]).digest("hex") ||
|
}
|
||||||
undefined;
|
resolve(crypto.createHash("md5").update(defaultHWID).digest("hex"));
|
||||||
|
} catch {
|
||||||
|
resolve(crypto.createHash("md5").update(defaultHWID).digest("hex"));
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
exports.getHwId = getHwId;
|
exports.getHwId = getHwId;
|
||||||
|
@@ -1,6 +1,12 @@
|
|||||||
async function checkImageExists(url) {
|
async function checkImageExists(url) {
|
||||||
try {
|
try {
|
||||||
const response = await fetch(url, { method: "HEAD" });
|
const response = await fetch(url, {
|
||||||
|
method: "HEAD",
|
||||||
|
headers: {
|
||||||
|
"User-Agent":
|
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||||
|
},
|
||||||
|
});
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
44
electron/logging.js
Normal file
44
electron/logging.js
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
|
||||||
|
class Logger {
|
||||||
|
constructor(directory) {
|
||||||
|
this.directory = directory;
|
||||||
|
this.enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async init() {
|
||||||
|
const filename = `${new Date().toISOString().replace(/:/g, "-")}.log`;
|
||||||
|
this.logPath = path.join(this.directory, filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
async log(message) {
|
||||||
|
if (this.logPath === undefined || this.enabled == false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!fs.existsSync(this.logPath)) {
|
||||||
|
await fs.promises.mkdir(this.directory, { recursive: true });
|
||||||
|
await fs.promises.writeFile(this.logPath, "");
|
||||||
|
}
|
||||||
|
const logMessage = `[${new Date().toISOString()}] LOG: ${message}`;
|
||||||
|
await fs.promises.appendFile(this.logPath, `${logMessage}\n`);
|
||||||
|
console.log(logMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
async error(message, error) {
|
||||||
|
if (this.logPath === undefined || this.enabled == false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!fs.existsSync(this.logPath)) {
|
||||||
|
await fs.promises.mkdir(this.directory, { recursive: true });
|
||||||
|
await fs.promises.writeFile(this.logPath, "");
|
||||||
|
}
|
||||||
|
const errorMessage = `[${
|
||||||
|
new Date().toISOString()
|
||||||
|
}] ERROR: ${message}\n${error.stack}`;
|
||||||
|
await fs.promises.appendFile(this.logPath, `${errorMessage}\n`);
|
||||||
|
console.error(errorMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Logger;
|
@@ -1,8 +1,8 @@
|
|||||||
const { exec } = require("child_process");
|
const { exec } = require("child_process");
|
||||||
|
|
||||||
async function isNet8Installed() {
|
async function isNet8Installed() {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve) => {
|
||||||
exec("dotnet --version", (error, stdout, stderr) => {
|
exec("dotnet --list-runtimes", (error, stdout, stderr) => {
|
||||||
if (error) {
|
if (error) {
|
||||||
resolve(false);
|
resolve(false);
|
||||||
return;
|
return;
|
||||||
@@ -12,7 +12,13 @@ async function isNet8Installed() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const version = stdout.trim();
|
const version = stdout.trim();
|
||||||
resolve(version.startsWith("8."));
|
for (const line of version.split('\n')) {
|
||||||
|
if (line.startsWith("Microsoft.WindowsDesktop.App 8.")) {
|
||||||
|
resolve(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resolve(false);
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -18,8 +18,8 @@ const gamemodes = {
|
|||||||
4: "osu!(rx)",
|
4: "osu!(rx)",
|
||||||
5: "taiko(rx)",
|
5: "taiko(rx)",
|
||||||
6: "catch(rx)",
|
6: "catch(rx)",
|
||||||
8: "osu!(ap)"
|
8: "osu!(ap)",
|
||||||
}
|
};
|
||||||
const osuEntities = [
|
const osuEntities = [
|
||||||
"avcodec-51.dll",
|
"avcodec-51.dll",
|
||||||
"avformat-52.dll",
|
"avformat-52.dll",
|
||||||
@@ -44,7 +44,7 @@ const osuEntities = [
|
|||||||
"scores.db",
|
"scores.db",
|
||||||
];
|
];
|
||||||
|
|
||||||
const ezppLauncherUpdateList = "https://ez-pp.farm/ezpplauncher"
|
const ezppLauncherUpdateList = "https://ez-pp.farm/ezpplauncher";
|
||||||
|
|
||||||
async function isValidOsuFolder(path) {
|
async function isValidOsuFolder(path) {
|
||||||
const allFiles = await fs.promises.readdir(path);
|
const allFiles = await fs.promises.readdir(path);
|
||||||
@@ -152,7 +152,12 @@ function getUserConfig(osuPath) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function getUpdateFiles(releaseStream) {
|
async function getUpdateFiles(releaseStream) {
|
||||||
const releaseData = await fetch(checkUpdateURL + releaseStream);
|
const releaseData = await fetch(checkUpdateURL + releaseStream, {
|
||||||
|
headers: {
|
||||||
|
"User-Agent":
|
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||||
|
},
|
||||||
|
});
|
||||||
return releaseData.ok ? await releaseData.json() : undefined;
|
return releaseData.ok ? await releaseData.json() : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,6 +189,7 @@ function downloadUpdateFiles(osuPath, updateFiles) {
|
|||||||
|
|
||||||
const startDownload = async () => {
|
const startDownload = async () => {
|
||||||
for (const updatePatch of updateFiles) {
|
for (const updatePatch of updateFiles) {
|
||||||
|
try {
|
||||||
const fileName = updatePatch.filename;
|
const fileName = updatePatch.filename;
|
||||||
const fileSize = updatePatch.filesize;
|
const fileSize = updatePatch.filesize;
|
||||||
const fileURL = updatePatch.url_full;
|
const fileURL = updatePatch.url_full;
|
||||||
@@ -200,15 +206,7 @@ function downloadUpdateFiles(osuPath, updateFiles) {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
axiosDownloadWithProgress.data.on("end", () => {
|
|
||||||
eventEmitter.emit("data", {
|
|
||||||
fileName,
|
|
||||||
loaded: fileSize,
|
|
||||||
total: fileSize,
|
|
||||||
progress: 100,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
try {
|
|
||||||
if (fs.existsSync(path.join(osuPath, fileName))) {
|
if (fs.existsSync(path.join(osuPath, fileName))) {
|
||||||
await fs.promises.rm(path.join(osuPath, fileName), {
|
await fs.promises.rm(path.join(osuPath, fileName), {
|
||||||
force: true,
|
force: true,
|
||||||
@@ -222,6 +220,7 @@ function downloadUpdateFiles(osuPath, updateFiles) {
|
|||||||
console.log(err);
|
console.log(err);
|
||||||
eventEmitter.emit("error", {
|
eventEmitter.emit("error", {
|
||||||
fileName,
|
fileName,
|
||||||
|
error: err,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -248,10 +247,20 @@ function runOsuWithDevServer(osuPath, serverDomain, onExit) {
|
|||||||
|
|
||||||
async function getEZPPLauncherUpdateFiles(osuPath) {
|
async function getEZPPLauncherUpdateFiles(osuPath) {
|
||||||
const filesToDownload = [];
|
const filesToDownload = [];
|
||||||
const updateFilesRequest = await fetch(ezppLauncherUpdateList, { method: "PATCH" });
|
const updateFilesRequest = await fetch(ezppLauncherUpdateList, {
|
||||||
|
method: "PATCH",
|
||||||
|
headers: {
|
||||||
|
"User-Agent":
|
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||||
|
},
|
||||||
|
});
|
||||||
const updateFiles = await updateFilesRequest.json();
|
const updateFiles = await updateFilesRequest.json();
|
||||||
for (const updateFile of updateFiles) {
|
for (const updateFile of updateFiles) {
|
||||||
const filePath = path.join(osuPath, ...updateFile.folder.split("/"), updateFile.name);
|
const filePath = path.join(
|
||||||
|
osuPath,
|
||||||
|
...updateFile.folder.split("/"),
|
||||||
|
updateFile.name,
|
||||||
|
);
|
||||||
if (fs.existsSync(filePath)) {
|
if (fs.existsSync(filePath)) {
|
||||||
const fileHash = updateFile.md5.toLowerCase();
|
const fileHash = updateFile.md5.toLowerCase();
|
||||||
const localFileHash = crypto.createHash("md5").update(
|
const localFileHash = crypto.createHash("md5").update(
|
||||||
@@ -264,30 +273,73 @@ async function getEZPPLauncherUpdateFiles(osuPath) {
|
|||||||
filesToDownload.push(updateFile);
|
filesToDownload.push(updateFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return filesToDownload;
|
return [filesToDownload, updateFiles];
|
||||||
}
|
}
|
||||||
|
|
||||||
async function downloadEZPPLauncherUpdateFiles(osuPath, updateFiles) {
|
async function downloadEZPPLauncherUpdateFiles(osuPath, updateFiles, allFiles) {
|
||||||
const eventEmitter = new EventEmitter();
|
const eventEmitter = new EventEmitter();
|
||||||
|
|
||||||
const startDownload = async () => {
|
const startDownload = async () => {
|
||||||
|
//NOTE: delete files that are not in the updateFiles array
|
||||||
|
const foldersToPrune = allFiles.map((file) =>
|
||||||
|
path.dirname(path.join(osuPath, ...file.folder.split("/"), file.name))
|
||||||
|
).filter((folder, index, self) => self.indexOf(folder) === index);
|
||||||
|
for (const pruneFolder of foldersToPrune) {
|
||||||
|
//NOTE: check if the folder is not the osu root folder.
|
||||||
|
if (path.basename(pruneFolder) == "osu!") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (fs.existsSync(pruneFolder)) {
|
||||||
|
for (const files of await fs.promises.readdir(pruneFolder)) {
|
||||||
|
const filePath = path.join(pruneFolder, files);
|
||||||
|
const validFolder = allFiles.find((file) =>
|
||||||
|
path.dirname(filePath).endsWith(file.folder)
|
||||||
|
);
|
||||||
|
if (!validFolder) {
|
||||||
|
if (
|
||||||
|
allFiles.find((file) => file.name == path.basename(filePath)) ===
|
||||||
|
undefined
|
||||||
|
) {
|
||||||
|
eventEmitter.emit("data", {
|
||||||
|
fileName: path.basename(filePath),
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
await fs.promises.rm(filePath, {
|
||||||
|
recursive: true,
|
||||||
|
force: true,
|
||||||
|
});
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (const updateFile of updateFiles) {
|
for (const updateFile of updateFiles) {
|
||||||
const filePath = path.join(osuPath, ...updateFile.folder.split("/"), updateFile.name);
|
try {
|
||||||
|
const filePath = path.join(
|
||||||
|
osuPath,
|
||||||
|
...updateFile.folder.split("/"),
|
||||||
|
updateFile.name,
|
||||||
|
);
|
||||||
const folder = path.dirname(filePath);
|
const folder = path.dirname(filePath);
|
||||||
if (!fs.existsSync(folder)) await fs.promises.mkdir(folder, { recursive: true });
|
if (!fs.existsSync(folder)) {
|
||||||
|
await fs.promises.mkdir(folder, { recursive: true });
|
||||||
|
}
|
||||||
const axiosDownloadWithProgress = await axios.get(updateFile.url, {
|
const axiosDownloadWithProgress = await axios.get(updateFile.url, {
|
||||||
responseType: "stream",
|
responseType: "stream",
|
||||||
onDownloadProgress: (progressEvent) => {
|
onDownloadProgress: (progressEvent) => {
|
||||||
const { loaded, total } = progressEvent;
|
const fileSize = updateFile.size;
|
||||||
|
const { loaded } = progressEvent;
|
||||||
eventEmitter.emit("data", {
|
eventEmitter.emit("data", {
|
||||||
fileName: path.basename(filePath),
|
fileName: path.basename(filePath),
|
||||||
loaded,
|
loaded,
|
||||||
total,
|
total: fileSize,
|
||||||
progress: Math.floor((loaded / total) * 100),
|
progress: Math.floor((loaded / fileSize) * 100),
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
try {
|
|
||||||
if (fs.existsSync(filePath)) {
|
if (fs.existsSync(filePath)) {
|
||||||
await fs.promises.rm(filePath, {
|
await fs.promises.rm(filePath, {
|
||||||
force: true,
|
force: true,
|
||||||
@@ -301,10 +353,11 @@ async function downloadEZPPLauncherUpdateFiles(osuPath, updateFiles) {
|
|||||||
console.log(err);
|
console.log(err);
|
||||||
eventEmitter.emit("error", {
|
eventEmitter.emit("error", {
|
||||||
fileName: path.basename(filePath),
|
fileName: path.basename(filePath),
|
||||||
|
error: err,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
eventEmitter,
|
eventEmitter,
|
||||||
@@ -316,7 +369,11 @@ async function replaceUIFiles(osuPath, revert) {
|
|||||||
if (!revert) {
|
if (!revert) {
|
||||||
const ezppUIFile = path.join(osuPath, "EZPPLauncher", "ezpp!ui.dll");
|
const ezppUIFile = path.join(osuPath, "EZPPLauncher", "ezpp!ui.dll");
|
||||||
const oldOsuUIFile = path.join(osuPath, "osu!ui.dll");
|
const oldOsuUIFile = path.join(osuPath, "osu!ui.dll");
|
||||||
const ezppGameplayFile = path.join(osuPath, "EZPPLauncher", "ezpp!gameplay.dll");
|
const ezppGameplayFile = path.join(
|
||||||
|
osuPath,
|
||||||
|
"EZPPLauncher",
|
||||||
|
"ezpp!gameplay.dll",
|
||||||
|
);
|
||||||
const oldOsuGameplayFile = path.join(osuPath, "osu!gameplay.dll");
|
const oldOsuGameplayFile = path.join(osuPath, "osu!gameplay.dll");
|
||||||
|
|
||||||
await fs.promises.rename(
|
await fs.promises.rename(
|
||||||
@@ -334,7 +391,11 @@ async function replaceUIFiles(osuPath, revert) {
|
|||||||
const oldOsuUIFile = path.join(osuPath, "osu!ui.dll");
|
const oldOsuUIFile = path.join(osuPath, "osu!ui.dll");
|
||||||
const ezppUIFile = path.join(osuPath, "EZPPLauncher", "ezpp!ui.dll");
|
const ezppUIFile = path.join(osuPath, "EZPPLauncher", "ezpp!ui.dll");
|
||||||
const oldOsuGameplayFile = path.join(osuPath, "osu!gameplay.dll");
|
const oldOsuGameplayFile = path.join(osuPath, "osu!gameplay.dll");
|
||||||
const ezppGameplayFile = path.join(osuPath, "EZPPLauncher", "ezpp!gameplay.dll");
|
const ezppGameplayFile = path.join(
|
||||||
|
osuPath,
|
||||||
|
"EZPPLauncher",
|
||||||
|
"ezpp!gameplay.dll",
|
||||||
|
);
|
||||||
|
|
||||||
await fs.promises.rename(oldOsuUIFile, ezppUIFile);
|
await fs.promises.rename(oldOsuUIFile, ezppUIFile);
|
||||||
await fs.promises.rename(
|
await fs.promises.rename(
|
||||||
@@ -413,5 +474,5 @@ module.exports = {
|
|||||||
runOsuUpdater,
|
runOsuUpdater,
|
||||||
getEZPPLauncherUpdateFiles,
|
getEZPPLauncherUpdateFiles,
|
||||||
downloadEZPPLauncherUpdateFiles,
|
downloadEZPPLauncherUpdateFiles,
|
||||||
gamemodes
|
gamemodes,
|
||||||
};
|
};
|
||||||
|
@@ -34,21 +34,22 @@ module.exports = {
|
|||||||
if (!richPresence) {
|
if (!richPresence) {
|
||||||
richPresence = new DiscordRPC.AutoClient({ transport: "ipc" });
|
richPresence = new DiscordRPC.AutoClient({ transport: "ipc" });
|
||||||
richPresence.endlessLogin({ clientId });
|
richPresence.endlessLogin({ clientId });
|
||||||
richPresence.once("ready", () => {
|
richPresence.once("ready", async () => {
|
||||||
console.log("connected presence with user " + richPresence.user.username);
|
console.log(
|
||||||
richPresence.setActivity(currentStatus);
|
"connected presence with user " + richPresence.user.username,
|
||||||
intervalId = setInterval(() => {
|
);
|
||||||
richPresence.setActivity(currentStatus);
|
await richPresence.setActivity(currentStatus);
|
||||||
}, 2500);
|
intervalId = setInterval(() => richPresence.setActivity(currentStatus), 2500);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
disconnect: async () => {
|
disconnect: async () => {
|
||||||
if (richPresence) {
|
if (richPresence) {
|
||||||
clearInterval(intervalId);
|
const presence = richPresence;
|
||||||
await richPresence.clearActivity();
|
|
||||||
await richPresence.destroy();
|
|
||||||
richPresence = null;
|
richPresence = null;
|
||||||
|
clearInterval(intervalId);
|
||||||
|
await presence.clearActivity();
|
||||||
|
await presence.destroy();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
updateStatus: ({ state, details, largeImageKey }) => {
|
updateStatus: ({ state, details, largeImageKey }) => {
|
||||||
@@ -60,9 +61,9 @@ module.exports = {
|
|||||||
currentStatus.smallImageKey = id ? `https://a.ez-pp.farm/${id}` : " ";
|
currentStatus.smallImageKey = id ? `https://a.ez-pp.farm/${id}` : " ";
|
||||||
currentStatus.smallImageText = username ?? " ";
|
currentStatus.smallImageText = username ?? " ";
|
||||||
},
|
},
|
||||||
update: () => {
|
update: async () => {
|
||||||
if (richPresence && richPresence.user) {
|
if (richPresence && richPresence.user) {
|
||||||
richPresence.setActivity(currentStatus);
|
await richPresence.setActivity(currentStatus);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
hasPresence: () => richPresence != undefined,
|
hasPresence: () => richPresence != undefined,
|
||||||
|
@@ -10,7 +10,12 @@ const releasesUrl =
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
updateAvailable: async () => {
|
updateAvailable: async () => {
|
||||||
try {
|
try {
|
||||||
const latestRelease = await fetch(repoApiUrl);
|
const latestRelease = await fetch(repoApiUrl, {
|
||||||
|
headers: {
|
||||||
|
"User-Agent":
|
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||||
|
},
|
||||||
|
});
|
||||||
const json = await latestRelease.json();
|
const json = await latestRelease.json();
|
||||||
if (json.length <= 0) return false;
|
if (json.length <= 0) return false;
|
||||||
return {
|
return {
|
||||||
|
261
main.js
261
main.js
@@ -1,5 +1,5 @@
|
|||||||
// Modules to control application life and create native browser window
|
// Modules to control application life and create native browser window
|
||||||
const { app, BrowserWindow, Menu, ipcMain, dialog, shell } = require(
|
const { app, BrowserWindow, Menu, ipcMain, dialog, shell, protocol, session } = require(
|
||||||
"electron",
|
"electron",
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -20,7 +20,6 @@ const {
|
|||||||
runOsuWithDevServer,
|
runOsuWithDevServer,
|
||||||
replaceUIFiles,
|
replaceUIFiles,
|
||||||
findOsuInstallation,
|
findOsuInstallation,
|
||||||
updateOsuConfigHashes,
|
|
||||||
runOsuUpdater,
|
runOsuUpdater,
|
||||||
gamemodes,
|
gamemodes,
|
||||||
getEZPPLauncherUpdateFiles,
|
getEZPPLauncherUpdateFiles,
|
||||||
@@ -38,6 +37,8 @@ const { updateAvailable, releasesUrl } = require("./electron/updateCheck");
|
|||||||
const fkill = require("fkill");
|
const fkill = require("fkill");
|
||||||
const { checkImageExists } = require("./electron/imageUtil");
|
const { checkImageExists } = require("./electron/imageUtil");
|
||||||
const { isNet8Installed } = require("./electron/netUtils");
|
const { isNet8Installed } = require("./electron/netUtils");
|
||||||
|
const Logger = require("./electron/logging");
|
||||||
|
const { isWritable } = require("./electron/fileUtil");
|
||||||
|
|
||||||
// Keep a global reference of the window object, if you don't, the window will
|
// Keep a global reference of the window object, if you don't, the window will
|
||||||
// be closed automatically when the JavaScript object is garbage collected.
|
// be closed automatically when the JavaScript object is garbage collected.
|
||||||
@@ -46,6 +47,13 @@ let osuCheckInterval;
|
|||||||
let userOsuPath;
|
let userOsuPath;
|
||||||
let osuLoaded = false;
|
let osuLoaded = false;
|
||||||
let patch = false;
|
let patch = false;
|
||||||
|
let logger = new Logger(path.join(
|
||||||
|
process.platform == "win32"
|
||||||
|
? process.env["LOCALAPPDATA"]
|
||||||
|
: process.env["HOME"],
|
||||||
|
"EZPPLauncher",
|
||||||
|
"logs",
|
||||||
|
));
|
||||||
|
|
||||||
let currentUser = undefined;
|
let currentUser = undefined;
|
||||||
|
|
||||||
@@ -66,21 +74,34 @@ function startOsuStatus() {
|
|||||||
osuLoaded = true;
|
osuLoaded = true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const currentUserInfo = await fetch(`https://api.ez-pp.farm/get_player_info?name=${currentUser.username}&scope=info`);
|
const currentUserInfo = await fetch(
|
||||||
|
`https://api.ez-pp.farm/get_player_info?name=${currentUser.username}&scope=info`,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
"User-Agent":
|
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
);
|
||||||
const currentUserInfoJson = await currentUserInfo.json();
|
const currentUserInfoJson = await currentUserInfo.json();
|
||||||
if ("player" in currentUserInfoJson && currentUserInfoJson.player != null) {
|
if (
|
||||||
if ("info" in currentUserInfoJson.player && currentUserInfoJson.player.info != null) {
|
"player" in currentUserInfoJson &&
|
||||||
|
currentUserInfoJson.player != null
|
||||||
|
) {
|
||||||
|
if (
|
||||||
|
"info" in currentUserInfoJson.player &&
|
||||||
|
currentUserInfoJson.player.info != null
|
||||||
|
) {
|
||||||
const id = currentUserInfoJson.player.info.id;
|
const id = currentUserInfoJson.player.info.id;
|
||||||
const username = currentUserInfoJson.player.info.name;
|
const username = currentUserInfoJson.player.info.name;
|
||||||
richPresence.updateUser({
|
richPresence.updateUser({
|
||||||
id,
|
id,
|
||||||
username,
|
username,
|
||||||
});
|
});
|
||||||
richPresence.update();
|
await richPresence.update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@@ -101,7 +122,14 @@ function startOsuStatus() {
|
|||||||
const windowTitle = firstInstance.processTitle;
|
const windowTitle = firstInstance.processTitle;
|
||||||
lastOsuStatus = windowTitle;
|
lastOsuStatus = windowTitle;
|
||||||
const currentStatusRequest = await fetch(
|
const currentStatusRequest = await fetch(
|
||||||
"https://api.ez-pp.farm/get_player_status?name=" + currentUser.username,
|
"https://api.ez-pp.farm/v1/get_player_status?name=" +
|
||||||
|
currentUser.username,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
"User-Agent":
|
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
);
|
);
|
||||||
const currentStatus = await currentStatusRequest.json();
|
const currentStatus = await currentStatusRequest.json();
|
||||||
|
|
||||||
@@ -112,7 +140,14 @@ function startOsuStatus() {
|
|||||||
const currentModeString = gamemodes[currentMode];
|
const currentModeString = gamemodes[currentMode];
|
||||||
|
|
||||||
const currentInfoRequest = await fetch(
|
const currentInfoRequest = await fetch(
|
||||||
"https://api.ez-pp.farm/get_player_info?name=" + currentUser.username + "&scope=all",
|
"https://api.ez-pp.farm/v1/get_player_info?name=" +
|
||||||
|
currentUser.username + "&scope=all",
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
"User-Agent":
|
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||||
|
},
|
||||||
|
},
|
||||||
);
|
);
|
||||||
const currentInfo = await currentInfoRequest.json();
|
const currentInfo = await currentInfoRequest.json();
|
||||||
let currentUsername = currentInfo.player.info.name;
|
let currentUsername = currentInfo.player.info.name;
|
||||||
@@ -192,7 +227,7 @@ function startOsuStatus() {
|
|||||||
richPresence.updateUser({
|
richPresence.updateUser({
|
||||||
username: currentUsername,
|
username: currentUsername,
|
||||||
id: currentId,
|
id: currentId,
|
||||||
})
|
});
|
||||||
|
|
||||||
richPresence.updateStatus({
|
richPresence.updateStatus({
|
||||||
details,
|
details,
|
||||||
@@ -200,7 +235,7 @@ function startOsuStatus() {
|
|||||||
largeImageKey,
|
largeImageKey,
|
||||||
});
|
});
|
||||||
|
|
||||||
richPresence.update();
|
await richPresence.update();
|
||||||
}
|
}
|
||||||
}, 2500);
|
}, 2500);
|
||||||
}
|
}
|
||||||
@@ -211,9 +246,19 @@ function stopOsuStatus() {
|
|||||||
|
|
||||||
function registerIPCPipes() {
|
function registerIPCPipes() {
|
||||||
ipcMain.handle("ezpplauncher:login", async (e, args) => {
|
ipcMain.handle("ezpplauncher:login", async (e, args) => {
|
||||||
const hwid = getHwId();
|
let hwid = "";
|
||||||
|
try {
|
||||||
|
hwid = await getHwId();
|
||||||
|
} catch (err) {
|
||||||
|
logger.error(`Failed to get HWID.`, err);
|
||||||
|
return {
|
||||||
|
code: 500,
|
||||||
|
message: "Failed to get HWID.",
|
||||||
|
};
|
||||||
|
}
|
||||||
const timeout = new AbortController();
|
const timeout = new AbortController();
|
||||||
const timeoutId = setTimeout(() => timeout.abort(), 8000);
|
const timeoutId = setTimeout(() => timeout.abort(), 1000 * 10);
|
||||||
|
logger.log(`Logging in with user ${args.username}...`);
|
||||||
try {
|
try {
|
||||||
const fetchResult = await fetch("https://ez-pp.farm/login/check", {
|
const fetchResult = await fetch("https://ez-pp.farm/login/check", {
|
||||||
signal: timeout.signal,
|
signal: timeout.signal,
|
||||||
@@ -224,6 +269,8 @@ function registerIPCPipes() {
|
|||||||
}),
|
}),
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
|
"User-Agent":
|
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -238,14 +285,20 @@ function registerIPCPipes() {
|
|||||||
}
|
}
|
||||||
currentUser = args;
|
currentUser = args;
|
||||||
config.remove("guest");
|
config.remove("guest");
|
||||||
}
|
logger.log(`Logged in as user ${args.username}!`);
|
||||||
|
} else logger.log(`Login failed for user ${args.username}.`);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
logger.log(
|
||||||
|
`Login failed for user ${args.username}.\nResponse:\n${await fetchResult
|
||||||
|
.text()}`,
|
||||||
|
);
|
||||||
return {
|
return {
|
||||||
code: 500,
|
code: 500,
|
||||||
message: "Something went wrong while logging you in.",
|
message: "Something went wrong while logging you in.",
|
||||||
};
|
};
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
logger.error("Error while logging in:", err);
|
||||||
return {
|
return {
|
||||||
code: 500,
|
code: 500,
|
||||||
message: "Something went wrong while logging you in.",
|
message: "Something went wrong while logging you in.",
|
||||||
@@ -262,7 +315,7 @@ function registerIPCPipes() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
ipcMain.handle("ezpplauncher:autologin", async (e) => {
|
ipcMain.handle("ezpplauncher:autologin", async (e) => {
|
||||||
const hwid = getHwId();
|
const hwid = await getHwId();
|
||||||
const username = config.get("username");
|
const username = config.get("username");
|
||||||
const guest = config.get("guest");
|
const guest = config.get("guest");
|
||||||
if (guest) return { code: 200, message: "Login as guest", guest: true };
|
if (guest) return { code: 200, message: "Login as guest", guest: true };
|
||||||
@@ -275,6 +328,7 @@ function registerIPCPipes() {
|
|||||||
}
|
}
|
||||||
const timeout = new AbortController();
|
const timeout = new AbortController();
|
||||||
const timeoutId = setTimeout(() => timeout.abort(), 8000);
|
const timeoutId = setTimeout(() => timeout.abort(), 8000);
|
||||||
|
logger.log(`Logging in with user ${username}...`);
|
||||||
try {
|
try {
|
||||||
const fetchResult = await fetch("https://ez-pp.farm/login/check", {
|
const fetchResult = await fetch("https://ez-pp.farm/login/check", {
|
||||||
signal: timeout.signal,
|
signal: timeout.signal,
|
||||||
@@ -285,6 +339,8 @@ function registerIPCPipes() {
|
|||||||
}),
|
}),
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
|
"User-Agent":
|
||||||
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -297,16 +353,23 @@ function registerIPCPipes() {
|
|||||||
username: username,
|
username: username,
|
||||||
password: password,
|
password: password,
|
||||||
};
|
};
|
||||||
}
|
logger.log(`Logged in as user ${username}!`);
|
||||||
|
} else logger.log(`Login failed for user ${username}.`);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
config.remove("password");
|
config.remove("password");
|
||||||
}
|
}
|
||||||
|
logger.log(
|
||||||
|
`Login failed for user ${username}.\nResponse:\n${await fetchResult
|
||||||
|
.text()}`,
|
||||||
|
);
|
||||||
return {
|
return {
|
||||||
code: 500,
|
code: 500,
|
||||||
message: "Something went wrong while logging you in.",
|
message: "Something went wrong while logging you in.",
|
||||||
};
|
};
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
logger.error("Error while logging in:", err);
|
||||||
return {
|
return {
|
||||||
code: 500,
|
code: 500,
|
||||||
message: "Something went wrong while logging you in.",
|
message: "Something went wrong while logging you in.",
|
||||||
@@ -319,6 +382,7 @@ function registerIPCPipes() {
|
|||||||
config.remove("password");
|
config.remove("password");
|
||||||
config.set("guest", "1");
|
config.set("guest", "1");
|
||||||
currentUser = undefined;
|
currentUser = undefined;
|
||||||
|
logger.log("Logged in as guest user.");
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcMain.handle("ezpplauncher:logout", (e) => {
|
ipcMain.handle("ezpplauncher:logout", (e) => {
|
||||||
@@ -326,6 +390,7 @@ function registerIPCPipes() {
|
|||||||
config.remove("password");
|
config.remove("password");
|
||||||
config.remove("guest");
|
config.remove("guest");
|
||||||
currentUser = undefined;
|
currentUser = undefined;
|
||||||
|
logger.log("Loging out.");
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -342,6 +407,10 @@ function registerIPCPipes() {
|
|||||||
else richPresence.connect();
|
else richPresence.connect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (key == "logging") {
|
||||||
|
logger.enabled = value;
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof value == "boolean") {
|
if (typeof value == "boolean") {
|
||||||
config.set(key, value ? "true" : "false");
|
config.set(key, value ? "true" : "false");
|
||||||
} else {
|
} else {
|
||||||
@@ -385,12 +454,31 @@ function registerIPCPipes() {
|
|||||||
return config.all();
|
return config.all();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ipcMain.handle("ezpplauncher:checkUpdate", async (e) => {
|
||||||
|
const updateInfo = await updateAvailable();
|
||||||
|
if (updateInfo.update) {
|
||||||
|
mainWindow.webContents.send("ezpplauncher:update", updateInfo.release);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
ipcMain.handle("ezpplauncher:exitAndUpdate", async (e) => {
|
ipcMain.handle("ezpplauncher:exitAndUpdate", async (e) => {
|
||||||
await shell.openExternal(releasesUrl);
|
await shell.openExternal(releasesUrl);
|
||||||
app.exit();
|
app.exit();
|
||||||
});
|
});
|
||||||
|
|
||||||
ipcMain.handle("ezpplauncher:launch", async (e) => {
|
ipcMain.handle("ezpplauncher:launch", async (e) => {
|
||||||
|
try {
|
||||||
|
const osuWindowTitle = windowName.getWindowText("osu!.exe");
|
||||||
|
if (osuWindowTitle.length > 0) {
|
||||||
|
mainWindow.webContents.send("ezpplauncher:alert", {
|
||||||
|
type: "error",
|
||||||
|
message: "osu! is running, please exit.",
|
||||||
|
});
|
||||||
|
mainWindow.webContents.send("ezpplauncher:launchabort");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.log("Preparing launch...");
|
||||||
const configPatch = config.get("patch");
|
const configPatch = config.get("patch");
|
||||||
patch = configPatch != undefined ? configPatch == "true" : true;
|
patch = configPatch != undefined ? configPatch == "true" : true;
|
||||||
mainWindow.webContents.send("ezpplauncher:launchstatus", {
|
mainWindow.webContents.send("ezpplauncher:launchstatus", {
|
||||||
@@ -406,6 +494,7 @@ function registerIPCPipes() {
|
|||||||
message: "osu! path not set!",
|
message: "osu! path not set!",
|
||||||
});
|
});
|
||||||
mainWindow.webContents.send("ezpplauncher:open-settings");
|
mainWindow.webContents.send("ezpplauncher:open-settings");
|
||||||
|
logger.log("osu! path is not set.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!(await isValidOsuFolder(osuPath))) {
|
if (!(await isValidOsuFolder(osuPath))) {
|
||||||
@@ -414,6 +503,7 @@ function registerIPCPipes() {
|
|||||||
type: "error",
|
type: "error",
|
||||||
message: "invalid osu! path!",
|
message: "invalid osu! path!",
|
||||||
});
|
});
|
||||||
|
logger.log("osu! path is invalid.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (patch) {
|
if (patch) {
|
||||||
@@ -424,21 +514,31 @@ function registerIPCPipes() {
|
|||||||
message: ".NET 8 is not installed.",
|
message: ".NET 8 is not installed.",
|
||||||
});
|
});
|
||||||
//open .net 8 download in browser
|
//open .net 8 download in browser
|
||||||
shell.openExternal('https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-8.0.4-windows-x64-installer');
|
shell.openExternal(
|
||||||
|
"https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-8.0.4-windows-x64-installer",
|
||||||
|
);
|
||||||
|
logger.log(".NET 8 is not installed.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mainWindow.webContents.send("ezpplauncher:launchstatus", {
|
mainWindow.webContents.send("ezpplauncher:launchstatus", {
|
||||||
status: "Checking for osu! updates...",
|
status: "Checking for osu! updates...",
|
||||||
});
|
});
|
||||||
await new Promise((res) => setTimeout(res, 1000));
|
await new Promise((res) => setTimeout(res, 1000));
|
||||||
const releaseStream = await getGlobalConfig(osuPath).get("_ReleaseStream");
|
const releaseStream = await getGlobalConfig(osuPath).get(
|
||||||
|
"_ReleaseStream",
|
||||||
|
);
|
||||||
const latestFiles = await getUpdateFiles(releaseStream);
|
const latestFiles = await getUpdateFiles(releaseStream);
|
||||||
const updateFiles = await getFilesThatNeedUpdate(osuPath, latestFiles);
|
const updateFiles = await getFilesThatNeedUpdate(osuPath, latestFiles);
|
||||||
if (updateFiles.length > 0) {
|
if (updateFiles.length > 0) {
|
||||||
|
logger.log("osu! updates found.");
|
||||||
const updateDownloader = downloadUpdateFiles(osuPath, updateFiles);
|
const updateDownloader = downloadUpdateFiles(osuPath, updateFiles);
|
||||||
let errored = false;
|
let errored = false;
|
||||||
updateDownloader.eventEmitter.on("error", (data) => {
|
updateDownloader.eventEmitter.on("error", (data) => {
|
||||||
const filename = data.fileName;
|
const filename = data.fileName;
|
||||||
|
logger.error(
|
||||||
|
`Failed to download/replace ${filename}!`,
|
||||||
|
data.error,
|
||||||
|
);
|
||||||
errored = true;
|
errored = true;
|
||||||
mainWindow.webContents.send("ezpplauncher:alert", {
|
mainWindow.webContents.send("ezpplauncher:alert", {
|
||||||
type: "error",
|
type: "error",
|
||||||
@@ -447,6 +547,9 @@ function registerIPCPipes() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
updateDownloader.eventEmitter.on("data", (data) => {
|
updateDownloader.eventEmitter.on("data", (data) => {
|
||||||
|
if (data.progress >= 100) {
|
||||||
|
logger.log(`Downloaded ${data.fileName} successfully.`);
|
||||||
|
}
|
||||||
mainWindow.webContents.send("ezpplauncher:launchprogress", {
|
mainWindow.webContents.send("ezpplauncher:launchprogress", {
|
||||||
progress: Math.ceil(data.progress),
|
progress: Math.ceil(data.progress),
|
||||||
});
|
});
|
||||||
@@ -479,12 +582,20 @@ function registerIPCPipes() {
|
|||||||
status: "Looking for patcher updates...",
|
status: "Looking for patcher updates...",
|
||||||
});
|
});
|
||||||
await new Promise((res) => setTimeout(res, 1000));
|
await new Promise((res) => setTimeout(res, 1000));
|
||||||
const patchFiles = await getEZPPLauncherUpdateFiles(osuPath);
|
const [patchFiles, allUpdateFiles] = await getEZPPLauncherUpdateFiles(
|
||||||
|
osuPath,
|
||||||
|
);
|
||||||
if (patchFiles.length > 0) {
|
if (patchFiles.length > 0) {
|
||||||
const patcherDownloader = await downloadEZPPLauncherUpdateFiles(osuPath, patchFiles);
|
logger.log("EZPPLauncher updates found.");
|
||||||
|
const patcherDownloader = await downloadEZPPLauncherUpdateFiles(
|
||||||
|
osuPath,
|
||||||
|
patchFiles,
|
||||||
|
allUpdateFiles,
|
||||||
|
);
|
||||||
let errored = false;
|
let errored = false;
|
||||||
patcherDownloader.eventEmitter.on("error", (data) => {
|
patcherDownloader.eventEmitter.on("error", (data) => {
|
||||||
const filename = data.fileName;
|
const filename = data.fileName;
|
||||||
|
logger.error(`Failed to download/replace ${filename}!`, data.error);
|
||||||
errored = true;
|
errored = true;
|
||||||
mainWindow.webContents.send("ezpplauncher:alert", {
|
mainWindow.webContents.send("ezpplauncher:alert", {
|
||||||
type: "error",
|
type: "error",
|
||||||
@@ -493,12 +604,24 @@ function registerIPCPipes() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
patcherDownloader.eventEmitter.on("data", (data) => {
|
patcherDownloader.eventEmitter.on("data", (data) => {
|
||||||
|
if (data.progress >= 100) {
|
||||||
|
logger.log(`Downloaded ${data.fileName} successfully.`);
|
||||||
|
}
|
||||||
mainWindow.webContents.send("ezpplauncher:launchprogress", {
|
mainWindow.webContents.send("ezpplauncher:launchprogress", {
|
||||||
progress: Math.ceil(data.progress),
|
progress: Math.ceil(data.progress),
|
||||||
});
|
});
|
||||||
mainWindow.webContents.send("ezpplauncher:launchstatus", {
|
mainWindow.webContents.send("ezpplauncher:launchstatus", {
|
||||||
status: `Downloading ${data.fileName}(${formatBytes(data.loaded)}/${formatBytes(data.total)
|
status: `Downloading ${data.fileName}(${formatBytes(data.loaded)
|
||||||
})...`,
|
}/${formatBytes(data.total)})...`,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
patcherDownloader.eventEmitter.on("delete", (data) => {
|
||||||
|
logger.log(`Deleting ${data.fileName}!`);
|
||||||
|
mainWindow.webContents.send("ezpplauncher:launchprogress", {
|
||||||
|
progress: -1,
|
||||||
|
});
|
||||||
|
mainWindow.webContents.send("ezpplauncher:launchstatus", {
|
||||||
|
status: `Deleting ${data.fileName}...`,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
await patcherDownloader.startDownload();
|
await patcherDownloader.startDownload();
|
||||||
@@ -551,8 +674,20 @@ function registerIPCPipes() {
|
|||||||
status: "Preparing launch...",
|
status: "Preparing launch...",
|
||||||
});
|
});
|
||||||
|
|
||||||
await updateOsuConfigHashes(osuPath);
|
/* await updateOsuConfigHashes(osuPath); */
|
||||||
|
logger.log("Replacing UI files...");
|
||||||
|
try {
|
||||||
await replaceUIFiles(osuPath, false);
|
await replaceUIFiles(osuPath, false);
|
||||||
|
logger.log("UI files replaced successfully.");
|
||||||
|
} catch (err) {
|
||||||
|
logger.error("Failed to replace UI files:", err);
|
||||||
|
mainWindow.webContents.send("ezpplauncher:alert", {
|
||||||
|
type: "error",
|
||||||
|
message: "Failed to replace UI files. try restarting EZPPLauncher.",
|
||||||
|
});
|
||||||
|
mainWindow.webContents.send("ezpplauncher:launchabort");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const forceUpdateFiles = [
|
const forceUpdateFiles = [
|
||||||
".require_update",
|
".require_update",
|
||||||
@@ -566,11 +701,13 @@ function registerIPCPipes() {
|
|||||||
if (fs.existsSync(updateFile)) {
|
if (fs.existsSync(updateFile)) {
|
||||||
await fs.promises.rm(updateFile, {
|
await fs.promises.rm(updateFile, {
|
||||||
force: true,
|
force: true,
|
||||||
recursive: (await fs.promises.lstat(updateFile)).isDirectory,
|
recursive: (await fs.promises.lstat(updateFile)).isDirectory(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch { }
|
} catch (err) {
|
||||||
|
logger.error("Failed to remove force update files:", err);
|
||||||
|
}
|
||||||
|
|
||||||
const userConfig = getUserConfig(osuPath);
|
const userConfig = getUserConfig(osuPath);
|
||||||
if (richPresence.hasPresence) {
|
if (richPresence.hasPresence) {
|
||||||
@@ -589,40 +726,57 @@ function registerIPCPipes() {
|
|||||||
status: "Launching osu!...",
|
status: "Launching osu!...",
|
||||||
});
|
});
|
||||||
|
|
||||||
const onExitHook = () => {
|
await new Promise((res) => setTimeout(res, 1000));
|
||||||
|
|
||||||
|
logger.log("Launching osu!...");
|
||||||
|
|
||||||
|
const onExitHook = async () => {
|
||||||
|
logger.log("osu! has exited.");
|
||||||
mainWindow.show();
|
mainWindow.show();
|
||||||
mainWindow.focus();
|
mainWindow.focus();
|
||||||
stopOsuStatus();
|
stopOsuStatus();
|
||||||
richPresence.updateUser({
|
richPresence.updateUser({
|
||||||
username: " ",
|
username: " ",
|
||||||
id: undefined
|
id: undefined,
|
||||||
});
|
});
|
||||||
richPresence.updateStatus({
|
richPresence.updateStatus({
|
||||||
state: "Idle in Launcher...",
|
state: "Idle in Launcher...",
|
||||||
details: undefined,
|
details: undefined,
|
||||||
});
|
});
|
||||||
richPresence.update();
|
await richPresence.update();
|
||||||
mainWindow.webContents.send("ezpplauncher:launchstatus", {
|
mainWindow.webContents.send("ezpplauncher:launchstatus", {
|
||||||
status: "Waiting for cleanup...",
|
status: "Waiting for cleanup...",
|
||||||
});
|
});
|
||||||
|
const timeStart = performance.now();
|
||||||
|
logger.log("Waiting for cleanup...");
|
||||||
|
|
||||||
setTimeout(async () => {
|
const cleanup = setInterval(async () => {
|
||||||
|
const osuUIFile = path.join(osuPath, "osu!ui.dll");
|
||||||
|
const osuGameplayFile = path.join(osuPath, "osu!gameplay.dll");
|
||||||
|
if (isWritable(osuUIFile) && isWritable(osuGameplayFile)) {
|
||||||
|
logger.log(
|
||||||
|
`Cleanup complete, took ${((performance.now() - timeStart) / 1000).toFixed(3)
|
||||||
|
} seconds.`,
|
||||||
|
);
|
||||||
|
clearInterval(cleanup);
|
||||||
await replaceUIFiles(osuPath, true);
|
await replaceUIFiles(osuPath, true);
|
||||||
mainWindow.webContents.send("ezpplauncher:launchabort");
|
mainWindow.webContents.send("ezpplauncher:launchabort");
|
||||||
osuLoaded = false;
|
osuLoaded = false;
|
||||||
}, 5000);
|
}
|
||||||
|
}, 1000);
|
||||||
};
|
};
|
||||||
runOsuWithDevServer(osuPath, "ez-pp.farm", onExitHook);
|
runOsuWithDevServer(osuPath, "ez-pp.farm", onExitHook);
|
||||||
mainWindow.hide();
|
mainWindow.hide();
|
||||||
startOsuStatus();
|
startOsuStatus();
|
||||||
|
|
||||||
/* mainWindow.webContents.send("ezpplauncher:launchprogress", {
|
|
||||||
progress: 0,
|
|
||||||
});
|
|
||||||
mainWindow.webContents.send("ezpplauncher:launchprogress", {
|
|
||||||
progress: 100,
|
|
||||||
}); */
|
|
||||||
return true;
|
return true;
|
||||||
|
} catch (err) {
|
||||||
|
logger.error("Failed to launch", err);
|
||||||
|
mainWindow.webContents.send("ezpplauncher:alert", {
|
||||||
|
type: "error",
|
||||||
|
message: "Failed to launch osu!. Please try again.",
|
||||||
|
});
|
||||||
|
mainWindow.webContents.send("ezpplauncher:launchabort");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -632,7 +786,18 @@ function createWindow() {
|
|||||||
app.quit();
|
app.quit();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
app.on('second-instance', (e, argv) => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
// Find the arg that is our custom protocol url and store it
|
||||||
|
const deeplinkingUrl = argv.find((arg) => arg.startsWith('ezpplauncher://'));
|
||||||
|
console.log(deeplinkingUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mainWindow) {
|
||||||
|
if (mainWindow.isMinimized()) mainWindow.restore();
|
||||||
|
mainWindow.focus();
|
||||||
|
}
|
||||||
|
});
|
||||||
setupTitlebar();
|
setupTitlebar();
|
||||||
|
|
||||||
// Create the browser window.
|
// Create the browser window.
|
||||||
@@ -678,6 +843,13 @@ function createWindow() {
|
|||||||
richPresence.connect();
|
richPresence.connect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.init();
|
||||||
|
|
||||||
|
const loggingEnabled = config.get("logging");
|
||||||
|
if (loggingEnabled && loggingEnabled == "true") {
|
||||||
|
logger.enabled = true;
|
||||||
|
}
|
||||||
// Uncomment the following line of code when app is ready to be packaged.
|
// Uncomment the following line of code when app is ready to be packaged.
|
||||||
// loadURL(mainWindow);
|
// loadURL(mainWindow);
|
||||||
|
|
||||||
@@ -698,10 +870,6 @@ function createWindow() {
|
|||||||
// Emitted when the window is ready to be shown
|
// Emitted when the window is ready to be shown
|
||||||
// This helps in showing the window gracefully.
|
// This helps in showing the window gracefully.
|
||||||
mainWindow.once("ready-to-show", async () => {
|
mainWindow.once("ready-to-show", async () => {
|
||||||
const updateInfo = await updateAvailable();
|
|
||||||
if (updateInfo.update) {
|
|
||||||
mainWindow.webContents.send("ezpplauncher:update", updateInfo.release);
|
|
||||||
}
|
|
||||||
mainWindow.show();
|
mainWindow.show();
|
||||||
mainWindow.focus();
|
mainWindow.focus();
|
||||||
});
|
});
|
||||||
@@ -710,7 +878,16 @@ function createWindow() {
|
|||||||
// This method will be called when Electron has finished
|
// This method will be called when Electron has finished
|
||||||
// initialization and is ready to create browser windows.
|
// initialization and is ready to create browser windows.
|
||||||
// Some APIs can only be used after this event occurs.
|
// Some APIs can only be used after this event occurs.
|
||||||
app.on("ready", createWindow);
|
app.whenReady().then(() => {
|
||||||
|
createWindow();
|
||||||
|
if (isDev() && process.platform === 'win32') {
|
||||||
|
app.setAsDefaultProtocolClient('ezpplauncher', process.execPath, [
|
||||||
|
path.resolve(process.argv[1])
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
app.setAsDefaultProtocolClient('ezpplauncher');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// Quit when all windows are closed.
|
// Quit when all windows are closed.
|
||||||
app.on("window-all-closed", async function () {
|
app.on("window-all-closed", async function () {
|
||||||
|
418
package-lock.json
generated
418
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "ezpplauncher-next",
|
"name": "ezpplauncher-next",
|
||||||
"version": "2.1.2",
|
"version": "2.1.7",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "ezpplauncher-next",
|
"name": "ezpplauncher-next",
|
||||||
"version": "2.1.2",
|
"version": "2.1.7",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
"regedit-rs": "^1.0.2",
|
"regedit-rs": "^1.0.2",
|
||||||
"semver": "^7.5.4",
|
"semver": "^7.5.4",
|
||||||
"svelte-french-toast": "^1.2.0",
|
"svelte-french-toast": "^1.2.0",
|
||||||
"sweetalert2": "^11.10.3",
|
"sweetalert2": "^11.6.13",
|
||||||
"systeminformation": "^5.21.22"
|
"systeminformation": "^5.21.22"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -86,13 +86,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@babel/runtime": {
|
"node_modules/@babel/runtime": {
|
||||||
"version": "7.23.8",
|
"version": "7.27.1",
|
||||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
|
||||||
"integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==",
|
"integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"license": "MIT",
|
||||||
"regenerator-runtime": "^0.14.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6.9.0"
|
"node": ">=6.9.0"
|
||||||
}
|
}
|
||||||
@@ -981,169 +979,280 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm-eabi": {
|
"node_modules/@rollup/rollup-android-arm-eabi": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz",
|
||||||
"integrity": "sha512-ub/SN3yWqIv5CWiAZPHVS1DloyZsJbtXmX4HxUTIpS0BHm9pW5iYBo2mIZi+hE3AeiTzHz33blwSnhdUo+9NpA==",
|
"integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"android"
|
"android"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-android-arm64": {
|
"node_modules/@rollup/rollup-android-arm64": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz",
|
||||||
"integrity": "sha512-ehcBrOR5XTl0W0t2WxfTyHCR/3Cq2jfb+I4W+Ch8Y9b5G+vbAecVv0Fx/J1QKktOrgUYsIKxWAKgIpvw56IFNA==",
|
"integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"android"
|
"android"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-arm64": {
|
"node_modules/@rollup/rollup-darwin-arm64": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz",
|
||||||
"integrity": "sha512-1fzh1lWExwSTWy8vJPnNbNM02WZDS8AW3McEOb7wW+nPChLKf3WG2aG7fhaUmfX5FKw9zhsF5+MBwArGyNM7NA==",
|
"integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"darwin"
|
"darwin"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-darwin-x64": {
|
"node_modules/@rollup/rollup-darwin-x64": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz",
|
||||||
"integrity": "sha512-Gc6cukkF38RcYQ6uPdiXi70JB0f29CwcQ7+r4QpfNpQFVHXRd0DfWFidoGxjSx1DwOETM97JPz1RXL5ISSB0pA==",
|
"integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"darwin"
|
"darwin"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"node_modules/@rollup/rollup-freebsd-arm64": {
|
||||||
|
"version": "4.40.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz",
|
||||||
|
"integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"freebsd"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/@rollup/rollup-freebsd-x64": {
|
||||||
|
"version": "4.40.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz",
|
||||||
|
"integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"freebsd"
|
||||||
|
]
|
||||||
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz",
|
||||||
"integrity": "sha512-g21RTeFzoTl8GxosHbnQZ0/JkuFIB13C3T7Y0HtKzOXmoHhewLbVTFBQZu+z5m9STH6FZ7L/oPgU4Nm5ErN2fw==",
|
"integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm"
|
"arm"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
|
||||||
|
"version": "4.40.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz",
|
||||||
|
"integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==",
|
||||||
|
"cpu": [
|
||||||
|
"arm"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
"node_modules/@rollup/rollup-linux-arm64-gnu": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz",
|
||||||
"integrity": "sha512-TVYVWD/SYwWzGGnbfTkrNpdE4HON46orgMNHCivlXmlsSGQOx/OHHYiQcMIOx38/GWgwr/po2LBn7wypkWw/Mg==",
|
"integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
"node_modules/@rollup/rollup-linux-arm64-musl": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz",
|
||||||
"integrity": "sha512-XcKvuendwizYYhFxpvQ3xVpzje2HHImzg33wL9zvxtj77HvPStbSGI9czrdbfrf8DGMcNNReH9pVZv8qejAQ5A==",
|
"integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
|
||||||
|
"version": "4.40.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz",
|
||||||
|
"integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==",
|
||||||
|
"cpu": [
|
||||||
|
"loong64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
|
||||||
|
"version": "4.40.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz",
|
||||||
|
"integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==",
|
||||||
|
"cpu": [
|
||||||
|
"ppc64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz",
|
||||||
"integrity": "sha512-LFHS/8Q+I9YA0yVETyjonMJ3UA+DczeBd/MqNEzsGSTdNvSJa1OJZcSH8GiXLvcizgp9AlHs2walqRcqzjOi3A==",
|
"integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"riscv64"
|
"riscv64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/@rollup/rollup-linux-riscv64-musl": {
|
||||||
|
"version": "4.40.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz",
|
||||||
|
"integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==",
|
||||||
|
"cpu": [
|
||||||
|
"riscv64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/@rollup/rollup-linux-s390x-gnu": {
|
||||||
|
"version": "4.40.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz",
|
||||||
|
"integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==",
|
||||||
|
"cpu": [
|
||||||
|
"s390x"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
"node_modules/@rollup/rollup-linux-x64-gnu": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz",
|
||||||
"integrity": "sha512-dIYgo+j1+yfy81i0YVU5KnQrIJZE8ERomx17ReU4GREjGtDW4X+nvkBak2xAUpyqLs4eleDSj3RrV72fQos7zw==",
|
"integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-linux-x64-musl": {
|
"node_modules/@rollup/rollup-linux-x64-musl": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz",
|
||||||
"integrity": "sha512-RoaYxjdHQ5TPjaPrLsfKqR3pakMr3JGqZ+jZM0zP2IkDtsGa4CqYaWSfQmZVgFUCgLrTnzX+cnHS3nfl+kB6ZQ==",
|
"integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"linux"
|
"linux"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
"node_modules/@rollup/rollup-win32-arm64-msvc": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz",
|
||||||
"integrity": "sha512-T8Q3XHV+Jjf5e49B4EAaLKV74BbX7/qYBRQ8Wop/+TyyU0k+vSjiLVSHNWdVd1goMjZcbhDmYZUYW5RFqkBNHQ==",
|
"integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"arm64"
|
"arm64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"win32"
|
"win32"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
"node_modules/@rollup/rollup-win32-ia32-msvc": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz",
|
||||||
"integrity": "sha512-z+JQ7JirDUHAsMecVydnBPWLwJjbppU+7LZjffGf+Jvrxq+dVjIE7By163Sc9DKc3ADSU50qPVw0KonBS+a+HQ==",
|
"integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"ia32"
|
"ia32"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"win32"
|
"win32"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
"node_modules/@rollup/rollup-win32-x64-msvc": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz",
|
||||||
"integrity": "sha512-LfdGXCV9rdEify1oxlN9eamvDSjv9md9ZVMAbNHA87xqIfFCxImxan9qZ8+Un54iK2nnqPlbnSi4R54ONtbWBw==",
|
"integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==",
|
||||||
"cpu": [
|
"cpu": [
|
||||||
"x64"
|
"x64"
|
||||||
],
|
],
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"optional": true,
|
"optional": true,
|
||||||
"os": [
|
"os": [
|
||||||
"win32"
|
"win32"
|
||||||
@@ -1253,9 +1362,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/estree": {
|
"node_modules/@types/estree": {
|
||||||
"version": "1.0.5",
|
"version": "1.0.7",
|
||||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
|
||||||
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
|
"integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
|
||||||
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/@types/events": {
|
"node_modules/@types/events": {
|
||||||
"version": "3.0.3",
|
"version": "3.0.3",
|
||||||
@@ -1844,21 +1954,23 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/axios": {
|
"node_modules/axios": {
|
||||||
"version": "1.6.5",
|
"version": "1.9.0",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz",
|
||||||
"integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==",
|
"integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"follow-redirects": "^1.15.4",
|
"follow-redirects": "^1.15.6",
|
||||||
"form-data": "^4.0.0",
|
"form-data": "^4.0.0",
|
||||||
"proxy-from-env": "^1.1.0"
|
"proxy-from-env": "^1.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/axobject-query": {
|
"node_modules/axobject-query": {
|
||||||
"version": "3.2.1",
|
"version": "4.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
|
||||||
"integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==",
|
"integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
|
||||||
"dependencies": {
|
"license": "Apache-2.0",
|
||||||
"dequal": "^2.0.3"
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/balanced-match": {
|
"node_modules/balanced-match": {
|
||||||
@@ -1961,12 +2073,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/braces": {
|
"node_modules/braces": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fill-range": "^7.0.1"
|
"fill-range": "^7.1.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
@@ -2738,9 +2851,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/cross-spawn": {
|
"node_modules/cross-spawn": {
|
||||||
"version": "7.0.3",
|
"version": "7.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
|
||||||
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"path-key": "^3.1.0",
|
"path-key": "^3.1.0",
|
||||||
"shebang-command": "^2.0.0",
|
"shebang-command": "^2.0.0",
|
||||||
@@ -3338,10 +3452,11 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/ejs": {
|
"node_modules/ejs": {
|
||||||
"version": "3.1.9",
|
"version": "3.1.10",
|
||||||
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
|
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
|
||||||
"integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
|
"integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"jake": "^10.8.5"
|
"jake": "^10.8.5"
|
||||||
},
|
},
|
||||||
@@ -3865,10 +3980,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/fill-range": {
|
"node_modules/fill-range": {
|
||||||
"version": "7.0.1",
|
"version": "7.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"to-regex-range": "^5.0.1"
|
"to-regex-range": "^5.0.1"
|
||||||
},
|
},
|
||||||
@@ -4161,9 +4277,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/get-window-by-name/node_modules/cross-spawn": {
|
"node_modules/get-window-by-name/node_modules/cross-spawn": {
|
||||||
"version": "6.0.5",
|
"version": "6.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz",
|
||||||
"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
|
"integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"nice-try": "^1.0.4",
|
"nice-try": "^1.0.4",
|
||||||
"path-key": "^2.0.1",
|
"path-key": "^2.0.1",
|
||||||
@@ -4674,11 +4791,19 @@
|
|||||||
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
|
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
|
||||||
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
|
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
|
||||||
},
|
},
|
||||||
"node_modules/ip": {
|
"node_modules/ip-address": {
|
||||||
"version": "2.0.1",
|
"version": "9.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
|
||||||
"integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==",
|
"integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"jsbn": "1.1.0",
|
||||||
|
"sprintf-js": "^1.1.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 12"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"node_modules/is-binary-path": {
|
"node_modules/is-binary-path": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
@@ -4787,6 +4912,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
||||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.12.0"
|
"node": ">=0.12.0"
|
||||||
}
|
}
|
||||||
@@ -4917,6 +5043,13 @@
|
|||||||
"js-yaml": "bin/js-yaml.js"
|
"js-yaml": "bin/js-yaml.js"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/jsbn": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT"
|
||||||
|
},
|
||||||
"node_modules/json-buffer": {
|
"node_modules/json-buffer": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
|
||||||
@@ -5275,12 +5408,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/micromatch": {
|
"node_modules/micromatch": {
|
||||||
"version": "4.0.5",
|
"version": "4.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
|
||||||
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
|
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"braces": "^3.0.2",
|
"braces": "^3.0.3",
|
||||||
"picomatch": "^2.3.1"
|
"picomatch": "^2.3.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -5588,9 +5722,9 @@
|
|||||||
"integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w=="
|
"integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w=="
|
||||||
},
|
},
|
||||||
"node_modules/nanoid": {
|
"node_modules/nanoid": {
|
||||||
"version": "3.3.7",
|
"version": "3.3.11",
|
||||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
|
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
|
||||||
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
|
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -5598,6 +5732,7 @@
|
|||||||
"url": "https://github.com/sponsors/ai"
|
"url": "https://github.com/sponsors/ai"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
"bin": {
|
"bin": {
|
||||||
"nanoid": "bin/nanoid.cjs"
|
"nanoid": "bin/nanoid.cjs"
|
||||||
},
|
},
|
||||||
@@ -7070,12 +7205,6 @@
|
|||||||
"node": ">= 10"
|
"node": ">= 10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/regenerator-runtime": {
|
|
||||||
"version": "0.14.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
|
|
||||||
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/register-scheme": {
|
"node_modules/register-scheme": {
|
||||||
"version": "0.0.2",
|
"version": "0.0.2",
|
||||||
"resolved": "git+ssh://git@github.com/devsnek/node-register-scheme.git#e7cc9a63a1f512565da44cb57316d9fb10750e17",
|
"resolved": "git+ssh://git@github.com/devsnek/node-register-scheme.git#e7cc9a63a1f512565da44cb57316d9fb10750e17",
|
||||||
@@ -7235,12 +7364,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/rollup": {
|
"node_modules/rollup": {
|
||||||
"version": "4.9.4",
|
"version": "4.40.2",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.4.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz",
|
||||||
"integrity": "sha512-2ztU7pY/lrQyXSCnnoU4ICjT/tCG9cdH3/G25ERqE3Lst6vl2BCM5hL2Nw+sslAvAf+ccKsAq1SkKQALyqhR7g==",
|
"integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/estree": "1.0.5"
|
"@types/estree": "1.0.7"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"rollup": "dist/bin/rollup"
|
"rollup": "dist/bin/rollup"
|
||||||
@@ -7250,19 +7380,26 @@
|
|||||||
"npm": ">=8.0.0"
|
"npm": ">=8.0.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@rollup/rollup-android-arm-eabi": "4.9.4",
|
"@rollup/rollup-android-arm-eabi": "4.40.2",
|
||||||
"@rollup/rollup-android-arm64": "4.9.4",
|
"@rollup/rollup-android-arm64": "4.40.2",
|
||||||
"@rollup/rollup-darwin-arm64": "4.9.4",
|
"@rollup/rollup-darwin-arm64": "4.40.2",
|
||||||
"@rollup/rollup-darwin-x64": "4.9.4",
|
"@rollup/rollup-darwin-x64": "4.40.2",
|
||||||
"@rollup/rollup-linux-arm-gnueabihf": "4.9.4",
|
"@rollup/rollup-freebsd-arm64": "4.40.2",
|
||||||
"@rollup/rollup-linux-arm64-gnu": "4.9.4",
|
"@rollup/rollup-freebsd-x64": "4.40.2",
|
||||||
"@rollup/rollup-linux-arm64-musl": "4.9.4",
|
"@rollup/rollup-linux-arm-gnueabihf": "4.40.2",
|
||||||
"@rollup/rollup-linux-riscv64-gnu": "4.9.4",
|
"@rollup/rollup-linux-arm-musleabihf": "4.40.2",
|
||||||
"@rollup/rollup-linux-x64-gnu": "4.9.4",
|
"@rollup/rollup-linux-arm64-gnu": "4.40.2",
|
||||||
"@rollup/rollup-linux-x64-musl": "4.9.4",
|
"@rollup/rollup-linux-arm64-musl": "4.40.2",
|
||||||
"@rollup/rollup-win32-arm64-msvc": "4.9.4",
|
"@rollup/rollup-linux-loongarch64-gnu": "4.40.2",
|
||||||
"@rollup/rollup-win32-ia32-msvc": "4.9.4",
|
"@rollup/rollup-linux-powerpc64le-gnu": "4.40.2",
|
||||||
"@rollup/rollup-win32-x64-msvc": "4.9.4",
|
"@rollup/rollup-linux-riscv64-gnu": "4.40.2",
|
||||||
|
"@rollup/rollup-linux-riscv64-musl": "4.40.2",
|
||||||
|
"@rollup/rollup-linux-s390x-gnu": "4.40.2",
|
||||||
|
"@rollup/rollup-linux-x64-gnu": "4.40.2",
|
||||||
|
"@rollup/rollup-linux-x64-musl": "4.40.2",
|
||||||
|
"@rollup/rollup-win32-arm64-msvc": "4.40.2",
|
||||||
|
"@rollup/rollup-win32-ia32-msvc": "4.40.2",
|
||||||
|
"@rollup/rollup-win32-x64-msvc": "4.40.2",
|
||||||
"fsevents": "~2.3.2"
|
"fsevents": "~2.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -7529,10 +7666,11 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/rollup-plugin-unused/node_modules/rollup": {
|
"node_modules/rollup-plugin-unused/node_modules/rollup": {
|
||||||
"version": "2.79.1",
|
"version": "2.79.2",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz",
|
||||||
"integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
|
"integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"peer": true,
|
"peer": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"rollup": "dist/bin/rollup"
|
"rollup": "dist/bin/rollup"
|
||||||
@@ -7892,16 +8030,17 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/socks": {
|
"node_modules/socks": {
|
||||||
"version": "2.7.1",
|
"version": "2.8.4",
|
||||||
"resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
|
"resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz",
|
||||||
"integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
|
"integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ip": "^2.0.0",
|
"ip-address": "^9.0.5",
|
||||||
"smart-buffer": "^4.2.0"
|
"smart-buffer": "^4.2.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 10.13.0",
|
"node": ">= 10.0.0",
|
||||||
"npm": ">= 3.0.0"
|
"npm": ">= 3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -7971,7 +8110,7 @@
|
|||||||
"version": "1.1.3",
|
"version": "1.1.3",
|
||||||
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
|
||||||
"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
|
"integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
|
||||||
"optional": true
|
"devOptional": true
|
||||||
},
|
},
|
||||||
"node_modules/ssri": {
|
"node_modules/ssri": {
|
||||||
"version": "9.0.1",
|
"version": "9.0.1",
|
||||||
@@ -8247,16 +8386,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/svelte": {
|
"node_modules/svelte": {
|
||||||
"version": "4.2.8",
|
"version": "4.2.19",
|
||||||
"resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.8.tgz",
|
"resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz",
|
||||||
"integrity": "sha512-hU6dh1MPl8gh6klQZwK/n73GiAHiR95IkFsesLPbMeEZi36ydaXL/ZAb4g9sayT0MXzpxyZjR28yderJHxcmYA==",
|
"integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ampproject/remapping": "^2.2.1",
|
"@ampproject/remapping": "^2.2.1",
|
||||||
"@jridgewell/sourcemap-codec": "^1.4.15",
|
"@jridgewell/sourcemap-codec": "^1.4.15",
|
||||||
"@jridgewell/trace-mapping": "^0.3.18",
|
"@jridgewell/trace-mapping": "^0.3.18",
|
||||||
|
"@types/estree": "^1.0.1",
|
||||||
"acorn": "^8.9.0",
|
"acorn": "^8.9.0",
|
||||||
"aria-query": "^5.3.0",
|
"aria-query": "^5.3.0",
|
||||||
"axobject-query": "^3.2.1",
|
"axobject-query": "^4.0.0",
|
||||||
"code-red": "^1.0.3",
|
"code-red": "^1.0.3",
|
||||||
"css-tree": "^2.3.1",
|
"css-tree": "^2.3.1",
|
||||||
"estree-walker": "^3.0.3",
|
"estree-walker": "^3.0.3",
|
||||||
@@ -8533,18 +8674,20 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/sweetalert2": {
|
"node_modules/sweetalert2": {
|
||||||
"version": "11.10.7",
|
"version": "11.6.13",
|
||||||
"resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.10.7.tgz",
|
"resolved": "https://registry.npmjs.org/sweetalert2/-/sweetalert2-11.6.13.tgz",
|
||||||
"integrity": "sha512-5Jlzrmaitay6KzU+2+LhYu9q+L4v/dZ8oZyEDH14ep0C/QilCnFLHmqAyD/Lhq/lm5DiwsOs6Tr58iv8k3wyGg==",
|
"integrity": "sha512-n5yVF0FNx1lm4XzpPyb1HIaiptzODfVyeCzmB809tpK+1bPdoKoevKOxYjrtId75DV7xuIp4r6cjn8xUAB8dPQ==",
|
||||||
|
"license": "MIT",
|
||||||
"funding": {
|
"funding": {
|
||||||
"type": "individual",
|
"type": "individual",
|
||||||
"url": "https://github.com/sponsors/limonte"
|
"url": "https://github.com/sponsors/limonte"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/systeminformation": {
|
"node_modules/systeminformation": {
|
||||||
"version": "5.21.22",
|
"version": "5.25.11",
|
||||||
"resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.21.22.tgz",
|
"resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.25.11.tgz",
|
||||||
"integrity": "sha512-gNHloAJSyS+sKWkwvmvozZ1eHrdVTEsynWMTY6lvLGBB70gflkBQFw8drXXr1oEXY84+Vr9tOOrN8xHZLJSycA==",
|
"integrity": "sha512-jI01fn/t47rrLTQB0FTlMCC+5dYx8o0RRF+R4BPiUNsvg5OdY0s9DKMFmJGrx5SwMZQ4cag0Gl6v8oycso9b/g==",
|
||||||
|
"license": "MIT",
|
||||||
"os": [
|
"os": [
|
||||||
"darwin",
|
"darwin",
|
||||||
"linux",
|
"linux",
|
||||||
@@ -8699,9 +8842,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tar-fs": {
|
"node_modules/tar-fs": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz",
|
||||||
"integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
|
"integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chownr": "^1.1.1",
|
"chownr": "^1.1.1",
|
||||||
"mkdirp-classic": "^0.5.2",
|
"mkdirp-classic": "^0.5.2",
|
||||||
@@ -8916,6 +9060,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
||||||
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"is-number": "^7.0.0"
|
"is-number": "^7.0.0"
|
||||||
},
|
},
|
||||||
@@ -9211,9 +9356,10 @@
|
|||||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
||||||
},
|
},
|
||||||
"node_modules/ws": {
|
"node_modules/ws": {
|
||||||
"version": "7.5.9",
|
"version": "7.5.10",
|
||||||
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
|
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
|
||||||
"integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
|
"integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
|
||||||
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8.3.0"
|
"node": ">=8.3.0"
|
||||||
},
|
},
|
||||||
|
14
package.json
14
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ezpplauncher-next",
|
"name": "ezpplauncher-next",
|
||||||
"version": "2.1.4",
|
"version": "2.1.7",
|
||||||
"description": "EZPPLauncher rewritten with Svelte.",
|
"description": "EZPPLauncher rewritten with Svelte.",
|
||||||
"private": false,
|
"private": false,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
@@ -22,7 +22,15 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"linux": {},
|
"linux": {},
|
||||||
"mac": {}
|
"mac": {},
|
||||||
|
"protocols": [
|
||||||
|
{
|
||||||
|
"name": "ezpplauncher",
|
||||||
|
"schemes": [
|
||||||
|
"ezpplauncher"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "rollup -c --bundleConfigAsCjs",
|
"build": "rollup -c --bundleConfigAsCjs",
|
||||||
@@ -51,7 +59,7 @@
|
|||||||
"regedit-rs": "^1.0.2",
|
"regedit-rs": "^1.0.2",
|
||||||
"semver": "^7.5.4",
|
"semver": "^7.5.4",
|
||||||
"svelte-french-toast": "^1.2.0",
|
"svelte-french-toast": "^1.2.0",
|
||||||
"sweetalert2": "^11.10.3",
|
"sweetalert2": "^11.6.13",
|
||||||
"systeminformation": "^5.21.22"
|
"systeminformation": "^5.21.22"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
@@ -82,6 +82,10 @@ window.addEventListener("settings-set", async (e) => {
|
|||||||
await ipcRenderer.invoke("ezpplauncher:settings-set", e.detail);
|
await ipcRenderer.invoke("ezpplauncher:settings-set", e.detail);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
window.addEventListener("updateCheck", async () => {
|
||||||
|
await ipcRenderer.invoke("ezpplauncher:checkUpdate");
|
||||||
|
})
|
||||||
|
|
||||||
window.addEventListener("updateExit", async () => {
|
window.addEventListener("updateExit", async () => {
|
||||||
await ipcRenderer.invoke("ezpplauncher:exitAndUpdate");
|
await ipcRenderer.invoke("ezpplauncher:exitAndUpdate");
|
||||||
});
|
});
|
||||||
|
@@ -69,6 +69,7 @@ export default {
|
|||||||
resolve({
|
resolve({
|
||||||
browser: true,
|
browser: true,
|
||||||
dedupe: ["svelte"],
|
dedupe: ["svelte"],
|
||||||
|
exportConditions: ["svelte"],
|
||||||
}),
|
}),
|
||||||
typescript({
|
typescript({
|
||||||
sourceMap: !production,
|
sourceMap: !production,
|
||||||
|
@@ -1,20 +1,16 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import {
|
import Avatar from "flowbite-svelte/Avatar.svelte";
|
||||||
Avatar,
|
import Dropdown from "flowbite-svelte/Dropdown.svelte";
|
||||||
Dropdown,
|
import DropdownItem from "flowbite-svelte/DropdownItem.svelte";
|
||||||
DropdownItem,
|
import DropdownHeader from "flowbite-svelte/DropdownHeader.svelte";
|
||||||
DropdownHeader,
|
import DropdownDivider from "flowbite-svelte/DropdownDivider.svelte";
|
||||||
DropdownDivider,
|
import Button from "flowbite-svelte/Button.svelte";
|
||||||
Button,
|
import Indicator from "flowbite-svelte/Indicator.svelte";
|
||||||
Indicator,
|
import ArrowLeftSolid from "flowbite-svelte-icons/ArrowLeftSolid.svelte";
|
||||||
} from "flowbite-svelte";
|
import ArrowRightFromBracketSolid from "flowbite-svelte-icons/ArrowRightFromBracketSolid.svelte";
|
||||||
import {
|
import ArrowRightToBracketSolid from "flowbite-svelte-icons/ArrowRightToBracketSolid.svelte";
|
||||||
ArrowLeftSolid,
|
import HeartSolid from "flowbite-svelte-icons/HeartSolid.svelte";
|
||||||
ArrowRightFromBracketSolid,
|
import UserSettingsSolid from "flowbite-svelte-icons/UserSettingsSolid.svelte";
|
||||||
ArrowRightToBracketSolid,
|
|
||||||
HeartSolid,
|
|
||||||
UserSettingsSolid,
|
|
||||||
} from "flowbite-svelte-icons";
|
|
||||||
import ezppLogo from "../public/favicon.png";
|
import ezppLogo from "../public/favicon.png";
|
||||||
import {
|
import {
|
||||||
currentPage,
|
currentPage,
|
||||||
@@ -66,6 +62,8 @@
|
|||||||
window.dispatchEvent(new CustomEvent("updateExit"));
|
window.dispatchEvent(new CustomEvent("updateExit"));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
window.dispatchEvent(new CustomEvent("updateCheck"));
|
||||||
|
|
||||||
window.addEventListener("open-settings", (e) => {
|
window.addEventListener("open-settings", (e) => {
|
||||||
currentPage.set(Page.Settings);
|
currentPage.set(Page.Settings);
|
||||||
});
|
});
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Button } from "flowbite-svelte";
|
import Button from "flowbite-svelte/Button.svelte";
|
||||||
import Progressbar from "../lib/Progressbar.svelte";
|
import Progressbar from "../lib/Progressbar.svelte";
|
||||||
import {
|
import {
|
||||||
launching,
|
launching,
|
||||||
patch,
|
patch,
|
||||||
launchStatus,
|
launchStatus,
|
||||||
launchPercentage
|
launchPercentage,
|
||||||
} from "./../storage/localStore";
|
} from "./../storage/localStore";
|
||||||
let progressbarFix = true;
|
let progressbarFix = true;
|
||||||
|
|
||||||
|
@@ -1,10 +1,14 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Input, Button, Spinner, Checkbox } from "flowbite-svelte";
|
import Input from "flowbite-svelte/Input.svelte";
|
||||||
|
import Button from "flowbite-svelte/Button.svelte";
|
||||||
|
import Spinner from "flowbite-svelte/Spinner.svelte";
|
||||||
|
import Checkbox from "flowbite-svelte/Checkbox.svelte";
|
||||||
import { type User } from "../types/user";
|
import { type User } from "../types/user";
|
||||||
import { currentPage, currentUser, startup } from "../storage/localStore";
|
import { currentPage, currentUser, startup } from "../storage/localStore";
|
||||||
import toast from "svelte-french-toast";
|
import toast from "svelte-french-toast";
|
||||||
import { Page } from "../consts/pages";
|
import { Page } from "../consts/pages";
|
||||||
import { EyeSlashSolid, EyeSolid } from "flowbite-svelte-icons";
|
import EyeSolid from "flowbite-svelte-icons/EyeSolid.svelte";
|
||||||
|
import EyeSlashSolid from "flowbite-svelte-icons/EyeSlashSolid.svelte";
|
||||||
|
|
||||||
let loading = false;
|
let loading = false;
|
||||||
let username = "";
|
let username = "";
|
||||||
@@ -13,11 +17,20 @@
|
|||||||
let showPassword = false;
|
let showPassword = false;
|
||||||
|
|
||||||
const processLogin = async () => {
|
const processLogin = async () => {
|
||||||
|
if (username.length <= 0 || password.length <= 0) {
|
||||||
|
toast.error(`Please provice a valid Username and Password!`, {
|
||||||
|
position: "bottom-center",
|
||||||
|
className:
|
||||||
|
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||||
|
duration: 3000,
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
loading = true;
|
loading = true;
|
||||||
const loginPromise = new Promise<void>((res, rej) => {
|
const loginPromise = new Promise<string>((res, rej) => {
|
||||||
window.addEventListener(
|
window.addEventListener(
|
||||||
"login-result",
|
"login-result",
|
||||||
(e) => {
|
async (e) => {
|
||||||
const customEvent = e as CustomEvent;
|
const customEvent = e as CustomEvent;
|
||||||
const resultData = customEvent.detail;
|
const resultData = customEvent.detail;
|
||||||
const wasSuccessful = "user" in resultData;
|
const wasSuccessful = "user" in resultData;
|
||||||
@@ -30,26 +43,26 @@
|
|||||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||||
duration: 1500,
|
duration: 1500,
|
||||||
}); */
|
}); */
|
||||||
rej();
|
rej(resultData.message);
|
||||||
loading = false;
|
loading = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const userResult = resultData.user as User;
|
const userResult = resultData.user as User;
|
||||||
currentUser.set(userResult);
|
currentUser.set(userResult);
|
||||||
currentPage.set(Page.Launch);
|
currentPage.set(Page.Launch);
|
||||||
res();
|
res("");
|
||||||
toast.success(`Welcome back, ${userResult.name}!`, {
|
toast.success(`Welcome back, ${userResult.name}!`, {
|
||||||
position: "bottom-center",
|
position: "bottom-center",
|
||||||
className:
|
className:
|
||||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||||
duration: 3000
|
duration: 3000,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
{ once: true }
|
{ once: true }
|
||||||
);
|
);
|
||||||
window.dispatchEvent(
|
window.dispatchEvent(
|
||||||
new CustomEvent("login-attempt", {
|
new CustomEvent("login-attempt", {
|
||||||
detail: { username, password, saveCredentials }
|
detail: { username, password, saveCredentials },
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@@ -58,20 +71,20 @@
|
|||||||
{
|
{
|
||||||
loading: "Logging in...",
|
loading: "Logging in...",
|
||||||
success: "Successfully logged in!",
|
success: "Successfully logged in!",
|
||||||
error: "Invalid Username or Password!"
|
error: (e) => e,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
position: "bottom-center",
|
position: "bottom-center",
|
||||||
className:
|
className:
|
||||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||||
duration: 3000
|
duration: 0,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const tryAutoLogin = async () => {
|
const tryAutoLogin = async () => {
|
||||||
loading = true;
|
loading = true;
|
||||||
const loginPromise = new Promise<void>((res, rej) => {
|
const loginPromise = new Promise<string>((res, rej) => {
|
||||||
window.addEventListener(
|
window.addEventListener(
|
||||||
"login-result",
|
"login-result",
|
||||||
(e) => {
|
(e) => {
|
||||||
@@ -81,29 +94,29 @@
|
|||||||
const wasSuccessful = "user" in resultData;
|
const wasSuccessful = "user" in resultData;
|
||||||
if (isGuest) {
|
if (isGuest) {
|
||||||
currentPage.set(Page.Launch);
|
currentPage.set(Page.Launch);
|
||||||
res();
|
res("");
|
||||||
toast.success(`Logged in as Guest`, {
|
toast.success(`Logged in as Guest`, {
|
||||||
position: "bottom-center",
|
position: "bottom-center",
|
||||||
className:
|
className:
|
||||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||||
duration: 3000
|
duration: 3000,
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!wasSuccessful) {
|
if (!wasSuccessful) {
|
||||||
loading = false;
|
loading = false;
|
||||||
rej();
|
rej(resultData.message);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const userResult = resultData.user as User;
|
const userResult = resultData.user as User;
|
||||||
currentUser.set(userResult);
|
currentUser.set(userResult);
|
||||||
currentPage.set(Page.Launch);
|
currentPage.set(Page.Launch);
|
||||||
res();
|
res("");
|
||||||
toast.success(`Welcome back, ${userResult.name}!`, {
|
toast.success(`Welcome back, ${userResult.name}!`, {
|
||||||
position: "bottom-center",
|
position: "bottom-center",
|
||||||
className:
|
className:
|
||||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||||
duration: 3000
|
duration: 3000,
|
||||||
});
|
});
|
||||||
loading = false;
|
loading = false;
|
||||||
},
|
},
|
||||||
@@ -116,13 +129,13 @@
|
|||||||
{
|
{
|
||||||
loading: "Logging in...",
|
loading: "Logging in...",
|
||||||
success: "Successfully logged in!",
|
success: "Successfully logged in!",
|
||||||
error: "Failed to login."
|
error: (e) => e,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
position: "bottom-center",
|
position: "bottom-center",
|
||||||
className:
|
className:
|
||||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||||
duration: 3000
|
duration: 0,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
@@ -134,7 +147,7 @@
|
|||||||
position: "bottom-center",
|
position: "bottom-center",
|
||||||
className:
|
className:
|
||||||
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
"dark:!bg-gray-800 border-1 dark:!border-gray-700 dark:!text-gray-100",
|
||||||
duration: 3000
|
duration: 3000,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -1,7 +1,11 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Button, ButtonGroup, Input, Toggle } from "flowbite-svelte";
|
import Button from "flowbite-svelte/Button.svelte";
|
||||||
import { FileSearchSolid, FolderSolid } from "flowbite-svelte-icons";
|
import ButtonGroup from "flowbite-svelte/ButtonGroup.svelte";
|
||||||
import { patch, presence } from "./../storage/localStore";
|
import Input from "flowbite-svelte/Input.svelte";
|
||||||
|
import Toggle from "flowbite-svelte/Toggle.svelte";
|
||||||
|
import FileSearchSolid from "flowbite-svelte-icons/FileSearchSolid.svelte";
|
||||||
|
import FolderSolid from "flowbite-svelte-icons/FolderSolid.svelte";
|
||||||
|
import { patch, presence, logging } from "./../storage/localStore";
|
||||||
|
|
||||||
let folderPath: string = "";
|
let folderPath: string = "";
|
||||||
|
|
||||||
@@ -12,8 +16,10 @@
|
|||||||
const settingPresence = settings.find(
|
const settingPresence = settings.find(
|
||||||
(setting) => setting.key == "presence"
|
(setting) => setting.key == "presence"
|
||||||
);
|
);
|
||||||
|
const settingLogging = settings.find((setting) => setting.key == "logging");
|
||||||
patch.set(settingPatch ? settingPatch.val == "true" : true);
|
patch.set(settingPatch ? settingPatch.val == "true" : true);
|
||||||
presence.set(settingPresence ? settingPresence.val == "true" : true);
|
presence.set(settingPresence ? settingPresence.val == "true" : true);
|
||||||
|
logging.set(settingLogging ? settingLogging.val == "true" : false);
|
||||||
folderPath = osuPath ? osuPath.val : "";
|
folderPath = osuPath ? osuPath.val : "";
|
||||||
});
|
});
|
||||||
window.dispatchEvent(new CustomEvent("settings-get"));
|
window.dispatchEvent(new CustomEvent("settings-get"));
|
||||||
@@ -39,19 +45,18 @@
|
|||||||
new CustomEvent("setting-update", { detail: { presence: $presence } })
|
new CustomEvent("setting-update", { detail: { presence: $presence } })
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const toggleLogging = () => {
|
||||||
|
logging.set(!$logging);
|
||||||
|
window.dispatchEvent(
|
||||||
|
new CustomEvent("setting-update", { detail: { logging: $logging } })
|
||||||
|
);
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<main
|
<main
|
||||||
class="h-[265px] flex flex-col justify-start p-3 animate-fadeIn opacity-0"
|
class="h-[265px] flex flex-col justify-start p-3 animate-fadeIn opacity-0"
|
||||||
>
|
>
|
||||||
<div class="flex flex-col gap-2 p-3">
|
|
||||||
<Toggle class="w-fit" bind:checked={$presence} on:click={togglePresence}
|
|
||||||
>Discord Presence</Toggle
|
|
||||||
>
|
|
||||||
<Toggle class="w-fit" bind:checked={$patch} on:click={togglePatching}
|
|
||||||
>Patching</Toggle
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
<div
|
<div
|
||||||
class="container flex flex-col items-center justify-center gap-5 rounded-lg p-3"
|
class="container flex flex-col items-center justify-center gap-5 rounded-lg p-3"
|
||||||
>
|
>
|
||||||
@@ -77,4 +82,15 @@
|
|||||||
</Button>
|
</Button>
|
||||||
</ButtonGroup>
|
</ButtonGroup>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="flex flex-col gap-2 p-3">
|
||||||
|
<Toggle class="w-fit" bind:checked={$presence} on:click={togglePresence}
|
||||||
|
>Discord Presence</Toggle
|
||||||
|
>
|
||||||
|
<Toggle class="w-fit" bind:checked={$patch} on:click={togglePatching}
|
||||||
|
>Patching</Toggle
|
||||||
|
>
|
||||||
|
<Toggle class="w-fit" bind:checked={$logging} on:click={toggleLogging}
|
||||||
|
>Debug Logging</Toggle
|
||||||
|
>
|
||||||
|
</div>
|
||||||
</main>
|
</main>
|
||||||
|
@@ -7,8 +7,11 @@ export const updateAvailable = writable(false);
|
|||||||
export const launching = writable(false);
|
export const launching = writable(false);
|
||||||
export const launchStatus = writable("Waiting...");
|
export const launchStatus = writable("Waiting...");
|
||||||
export const launchPercentage = writable(-1);
|
export const launchPercentage = writable(-1);
|
||||||
|
|
||||||
|
export const currentUser: Writable<undefined | User> = writable(undefined);
|
||||||
|
export const currentPage = writable(Page.Login);
|
||||||
|
|
||||||
export const osuPath: Writable<undefined | string> = writable(undefined);
|
export const osuPath: Writable<undefined | string> = writable(undefined);
|
||||||
export const patch = writable(true);
|
export const patch = writable(true);
|
||||||
export const presence = writable(true);
|
export const presence = writable(true);
|
||||||
export const currentUser: Writable<undefined | User> = writable(undefined);
|
export const logging = writable(false);
|
||||||
export const currentPage = writable(Page.Login);
|
|
||||||
|
Reference in New Issue
Block a user