From 801cbf9ccc816de4c3c57ceaaad3e2dd10595a76 Mon Sep 17 00:00:00 2001 From: MasterGordon Date: Mon, 18 Mar 2024 22:43:28 +0100 Subject: [PATCH] updated mod sources --- apps/frontend/package.json | 1 + .../packages/main/src/api/mutations.ts | 4 + apps/frontend/packages/main/src/mainWindow.ts | 4 +- .../InstanceSettings/InstanceSettings.tsx | 1 + .../InstanceMenu/InstanceSettings/Mods.tsx | 102 ++++++-- .../packages/renderer/src/utils/filter.ts | 41 +++ apps/frontend/packages/renderer/tsconfig.json | 3 +- packages/mod-sources/src/index.ts | 4 +- packages/mod-sources/src/modrinth-source.ts | 2 +- packages/piston/package.json | 3 + packages/piston/src/index.ts | 2 + packages/piston/src/instances/Instance.ts | 2 +- .../piston/src/instances/instance-manager.ts | 37 +++ packages/piston/src/instances/toggle-mod.ts | 21 ++ packages/piston/src/mod-source-manager.ts | 19 ++ packages/piston/src/utils/cache-manager.ts | 11 + pnpm-lock.yaml | 239 +++++++++++++++++- 17 files changed, 461 insertions(+), 35 deletions(-) create mode 100644 apps/frontend/packages/renderer/src/utils/filter.ts create mode 100644 packages/piston/src/instances/toggle-mod.ts create mode 100644 packages/piston/src/mod-source-manager.ts create mode 100644 packages/piston/src/utils/cache-manager.ts diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 5053f17..beb35ad 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -46,6 +46,7 @@ "@emotion/react": "^11.11.1", "@emotion/styled": "^11.11.0", "@slime-launcher/downloader": "workspace:*", + "@slime-launcher/mod-sources": "workspace:*", "@slime-launcher/piston": "workspace:*", "@supercharge/promise-pool": "^2.3.2", "@tanstack/react-query": "^4.2.3", diff --git a/apps/frontend/packages/main/src/api/mutations.ts b/apps/frontend/packages/main/src/api/mutations.ts index f30f451..cb818f5 100644 --- a/apps/frontend/packages/main/src/api/mutations.ts +++ b/apps/frontend/packages/main/src/api/mutations.ts @@ -14,6 +14,8 @@ import { deleteInstance, openInstance, fetchInstanceMods, + enableMod, + disableMod, } from "@slime-launcher/piston"; import { inspect } from "util"; @@ -31,6 +33,8 @@ export const mutate = { updateInstance, openInstance, fetchInstanceMods, + enableMod, + disableMod, }; type Event = { diff --git a/apps/frontend/packages/main/src/mainWindow.ts b/apps/frontend/packages/main/src/mainWindow.ts index 08616a0..7633b1b 100644 --- a/apps/frontend/packages/main/src/mainWindow.ts +++ b/apps/frontend/packages/main/src/mainWindow.ts @@ -6,7 +6,8 @@ import { registerMutationIpc, registerListeners, } from "./api"; -import { generateSettings } from "@slime-launcher/piston"; +import { generateSettings, modSourceManager } from "@slime-launcher/piston"; +import { modrinthSource } from "@slime-launcher/mod-sources"; async function createWindow() { const browserWindow = new BrowserWindow({ @@ -47,6 +48,7 @@ async function createWindow() { registerQueryIpc(); registerListeners(); void generateSettings(); + modSourceManager.registerModSource(modrinthSource); return browserWindow; } diff --git a/apps/frontend/packages/renderer/src/components/Instances/InstanceMenu/InstanceSettings/InstanceSettings.tsx b/apps/frontend/packages/renderer/src/components/Instances/InstanceMenu/InstanceSettings/InstanceSettings.tsx index 8e0e3dd..247708a 100644 --- a/apps/frontend/packages/renderer/src/components/Instances/InstanceMenu/InstanceSettings/InstanceSettings.tsx +++ b/apps/frontend/packages/renderer/src/components/Instances/InstanceMenu/InstanceSettings/InstanceSettings.tsx @@ -43,6 +43,7 @@ const InstanceSettingsMenu: React.FC = () => { onChange={handleTabsChange} background="gray.700" index={tabIndex} + borderBottomLeftRadius="md" > = (props) => ; +const Th: React.FC = (props) => ; + const Mods: React.FC = () => { const instance = useInstance(); const fetchMods = useMainMutation("fetchInstanceMods"); + const enableMod = useMainMutation("enableMod"); + const disableMod = useMainMutation("disableMod"); + const [keyword, setKeyword] = useState(""); + const [filteredMods, setFilteredMods] = useState(instance.mods); + const timer = useRef(); + useEffect(() => { + if (timer.current) clearTimeout(timer.current); + timer.current = setTimeout(() => { + setFilteredMods(filter(instance.mods, keyword, "title", "fileName")); + }, 200); + }, [instance.mods, keyword]); useEffect(() => { fetchMods.mutate(instance.path); @@ -13,26 +41,62 @@ const Mods: React.FC = () => { }, [instance.path]); return ( - - - - + <> + + setKeyword(e.target.value)} + /> + + + + +
+ - - - - {instance.mods.map((mod) => ( - - - - - - ))} - -
Mod Version Actions
{mod.title || mod.fileName}{mod.version}
-
+ + + {filteredMods.map((mod) => ( + + + + <> + { + if (e.target.checked) { + enableMod.mutate({ + instancePath: instance.path, + fileName: mod.fileName, + }); + } else { + disableMod.mutate({ + instancePath: instance.path, + fileName: mod.fileName, + }); + } + }} + > + {mod.title ?? mod.fileName} + + + + {mod.version} + + + ))} + + + + ); }; diff --git a/apps/frontend/packages/renderer/src/utils/filter.ts b/apps/frontend/packages/renderer/src/utils/filter.ts new file mode 100644 index 0000000..6e0799e --- /dev/null +++ b/apps/frontend/packages/renderer/src/utils/filter.ts @@ -0,0 +1,41 @@ +export const filter = ( + array: T[], + keyword: string, + key: keyof T, + alternativeKey?: keyof T, +) => { + console.time("filter"); + const fuzzyRegex = new RegExp(keyword.split("").join(".*"), "i"); + const startingRegex = new RegExp(`^${keyword}`, "i"); + const containsRegex = new RegExp(`${keyword}`, "i"); + const word = (item: T): string => { + if (!alternativeKey) return item[key] as unknown as string; + return (item[key] ?? item[alternativeKey]) as unknown as string; + }; + const weight = (item: T) => { + const itemString = word(item); + if (startingRegex.test(itemString)) { + return 1; + } + if (containsRegex.test(itemString)) { + return 2; + } + if (fuzzyRegex.test(itemString)) { + return 3; + } + return 4; + }; + const filteredArray = array + .filter((item) => fuzzyRegex.test(word(item))) + // sort by weight and alphabetical order + .sort((a, b) => { + const weightA = weight(a); + const weightB = weight(b); + if (weightA === weightB) { + return word(a).localeCompare(word(b)); + } + return weightA - weightB; + }); + console.timeEnd("filter"); + return filteredArray; +}; diff --git a/apps/frontend/packages/renderer/tsconfig.json b/apps/frontend/packages/renderer/tsconfig.json index dd8e8bc..8217f64 100644 --- a/apps/frontend/packages/renderer/tsconfig.json +++ b/apps/frontend/packages/renderer/tsconfig.json @@ -14,7 +14,8 @@ "#preload": ["../preload/src/index"] }, "lib": ["ESNext", "dom", "dom.iterable"], - "allowSyntheticDefaultImports": true + "allowSyntheticDefaultImports": true, + "verbatimModuleSyntax": true }, "include": [ "src/**/*.ts", diff --git a/packages/mod-sources/src/index.ts b/packages/mod-sources/src/index.ts index ef688c1..2482c57 100644 --- a/packages/mod-sources/src/index.ts +++ b/packages/mod-sources/src/index.ts @@ -1,3 +1 @@ -import { modrinthSource } from "./modrinth-source"; - -export const modSources = [modrinthSource]; +export { modrinthSource } from "./modrinth-source"; diff --git a/packages/mod-sources/src/modrinth-source.ts b/packages/mod-sources/src/modrinth-source.ts index 7f0fcda..3e0703c 100644 --- a/packages/mod-sources/src/modrinth-source.ts +++ b/packages/mod-sources/src/modrinth-source.ts @@ -57,7 +57,7 @@ export const modrinthSource: ModSource = { title: project.title, modId: project.id, fileId: version.id, - source: sourceId, + source: [sourceId], fileName: path.basename(filePath), sha512: await getHash(filePath, "sha512"), }; diff --git a/packages/piston/package.json b/packages/piston/package.json index 78dbd98..8fea32d 100644 --- a/packages/piston/package.json +++ b/packages/piston/package.json @@ -11,6 +11,7 @@ "devDependencies": { "@slime-launcher/eslint-config-custom": "workspace:*", "@slime-launcher/tsconfig": "workspace:*", + "@types/better-sqlite3": "^7.6.5", "@types/fs-extra": "^9.0.13", "@types/node": "^18.7.13", "eslint": "^7.32.0", @@ -23,6 +24,8 @@ "@slime-launcher/unpack": "workspace:*", "@xmcl/mod-parser": "^3.3.3", "axios": "^0.27.2", + "better-sqlite3": "^8.6.0", + "drizzle-orm": "^0.28.6", "fast-deep-equal": "^3.1.3", "fs-extra": "^10.1.0", "glob": "10.3.3", diff --git a/packages/piston/src/index.ts b/packages/piston/src/index.ts index dc07f87..a86dee5 100644 --- a/packages/piston/src/index.ts +++ b/packages/piston/src/index.ts @@ -11,5 +11,7 @@ export * from "./instances/kill-instance"; export * from "./instances/delete-instance"; export * from "./instances/update-instance"; export * from "./instances/fetch-instance-mods"; +export * from "./instances/toggle-mod"; export * from "./utils/open-instance"; export * from "./interfaces/ModSource"; +export * from "./mod-source-manager"; diff --git a/packages/piston/src/instances/Instance.ts b/packages/piston/src/instances/Instance.ts index d12ab29..72e547f 100644 --- a/packages/piston/src/instances/Instance.ts +++ b/packages/piston/src/instances/Instance.ts @@ -4,7 +4,7 @@ export interface InstanceMod { modId?: number | string; fileId?: number | string; title?: string; - source?: string | "unknown"; + source?: string[]; fileName: string; version?: string; sha512?: string; diff --git a/packages/piston/src/instances/instance-manager.ts b/packages/piston/src/instances/instance-manager.ts index 876be4d..bf59987 100644 --- a/packages/piston/src/instances/instance-manager.ts +++ b/packages/piston/src/instances/instance-manager.ts @@ -92,6 +92,43 @@ const instanceManager = { instanceProcesses.delete(instancePath); } }, + enableMod: async (instancePath: string, fileName: string) => { + if (!fileName.endsWith(".jar.disabled")) return; + const instance = instanceManager.getInstance(instancePath); + if (!instance) throw new Error(`Instance ${instancePath} not found`); + await fs.rename( + `${instancesPath}/${instancePath}/mods/${fileName}`, + `${instancesPath}/${instancePath}/mods/${fileName.replace( + ".disabled", + "", + )}`, + ); + await instanceManager.updateInstance(instancePath, { + mods: instance.mods.map((mod) => { + if (mod.fileName === fileName) { + return { ...mod, fileName: mod.fileName.replace(".disabled", "") }; + } + return mod; + }), + }); + }, + disableMod: async (instancePath: string, fileName: string) => { + if (fileName.endsWith(".jar.disabled")) return; + const instance = instanceManager.getInstance(instancePath); + if (!instance) throw new Error(`Instance ${instancePath} not found`); + await fs.rename( + `${instancesPath}/${instancePath}/mods/${fileName}`, + `${instancesPath}/${instancePath}/mods/${fileName}.disabled`, + ); + await instanceManager.updateInstance(instancePath, { + mods: instance.mods.map((mod) => { + if (mod.fileName === fileName) { + return { ...mod, fileName: `${mod.fileName}.disabled` }; + } + return mod; + }), + }); + }, }; instanceManager.loadInstances(); diff --git a/packages/piston/src/instances/toggle-mod.ts b/packages/piston/src/instances/toggle-mod.ts new file mode 100644 index 0000000..0825001 --- /dev/null +++ b/packages/piston/src/instances/toggle-mod.ts @@ -0,0 +1,21 @@ +import { instanceManager } from "./instance-manager"; + +export const enableMod = async ({ + instancePath, + fileName, +}: { + instancePath: string; + fileName: string; +}) => { + instanceManager.enableMod(instancePath, fileName); +}; + +export const disableMod = async ({ + instancePath, + fileName, +}: { + instancePath: string; + fileName: string; +}) => { + instanceManager.disableMod(instancePath, fileName); +}; diff --git a/packages/piston/src/mod-source-manager.ts b/packages/piston/src/mod-source-manager.ts new file mode 100644 index 0000000..ee1d5fb --- /dev/null +++ b/packages/piston/src/mod-source-manager.ts @@ -0,0 +1,19 @@ +import type { ModSource } from "./interfaces/ModSource"; + +class ModSourceManager { + private modSources: ModSource[] = []; + + public registerModSource(modSource: ModSource): void { + this.modSources.push(modSource); + } + + public getModSources(): ModSource[] { + return this.modSources; + } + + public getModSource(id: string): ModSource | undefined { + return this.modSources.find((modSource) => modSource.id === id); + } +} + +export const modSourceManager = new ModSourceManager(); diff --git a/packages/piston/src/utils/cache-manager.ts b/packages/piston/src/utils/cache-manager.ts new file mode 100644 index 0000000..7123171 --- /dev/null +++ b/packages/piston/src/utils/cache-manager.ts @@ -0,0 +1,11 @@ +import { drizzle } from "drizzle-orm/better-sqlite3"; +import Database from "better-sqlite3"; +import getAppData from "./get-app-data"; +import path from "path"; + +const sqlite = new Database(path.join(getAppData(), "cache.db"), { + verbose: console.log, +}); +const db = drizzle(sqlite); + +export const cacheManager = {}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d79aef3..1409bb9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: '@slime-launcher/downloader': specifier: workspace:* version: link:../../packages/downloader + '@slime-launcher/mod-sources': + specifier: workspace:^ + version: link:../../packages/mod-sources '@slime-launcher/piston': specifier: workspace:* version: link:../../packages/piston @@ -358,6 +361,12 @@ importers: axios: specifier: ^0.27.2 version: 0.27.2 + better-sqlite3: + specifier: ^8.6.0 + version: 8.6.0 + drizzle-orm: + specifier: ^0.28.6 + version: 0.28.6(@types/better-sqlite3@7.6.5)(better-sqlite3@8.6.0) fast-deep-equal: specifier: ^3.1.3 version: 3.1.3 @@ -389,6 +398,9 @@ importers: '@slime-launcher/tsconfig': specifier: workspace:* version: link:../tsconfig + '@types/better-sqlite3': + specifier: ^7.6.5 + version: 7.6.5 '@types/fs-extra': specifier: ^9.0.13 version: 9.0.13 @@ -2423,6 +2435,11 @@ packages: '@types/node': 18.17.1 dev: true + /@types/better-sqlite3@7.6.5: + resolution: {integrity: sha512-H3ZUx89KiPhYa9nalUXVVStSUFHuzYxt4yoazufpTTYW9rVUCzhh02V8CH2C8nE4libnK0UgFq5DFIe0DOhqow==} + dependencies: + '@types/node': 18.17.1 + /@types/cacheable-request@6.0.3: resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} dependencies: @@ -3312,7 +3329,6 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} requiresBuild: true - dev: true /bcrypt-pbkdf@1.0.2: resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} @@ -3320,11 +3336,33 @@ packages: tweetnacl: 0.14.5 dev: false + /better-sqlite3@8.6.0: + resolution: {integrity: sha512-jwAudeiTMTSyby+/SfbHDebShbmC2MCH8mU2+DXi0WJfv13ypEJm47cd3kljmy/H130CazEvkf2Li//ewcMJ1g==} + requiresBuild: true + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.1 + dev: false + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + /bluebird-lst@1.0.9: resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} dependencies: @@ -3387,8 +3425,6 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true - optional: true /builder-util-runtime@9.0.3: resolution: {integrity: sha512-SfG2wnyjpUbbdtpnqDpWwklujofC6GarGpvdWrEkg9p5AD/xJmTF2buTNaqs3qtsNBEVQDDjZz9xc2GGpVyMfA==} @@ -3542,6 +3578,10 @@ packages: fsevents: 2.3.2 dev: true + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -3736,7 +3776,6 @@ packages: engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 - dev: true /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} @@ -3745,6 +3784,11 @@ packages: type-detect: 4.0.8 dev: true + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -3769,6 +3813,11 @@ packages: engines: {node: '>=6'} dev: false + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + /detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false @@ -3856,6 +3905,72 @@ packages: engines: {node: '>=10'} dev: true + /drizzle-orm@0.28.6(@types/better-sqlite3@7.6.5)(better-sqlite3@8.6.0): + resolution: {integrity: sha512-yBe+F9htrlYER7uXgDJUQsTHFoIrI5yMm5A0bg0GiZ/kY5jNXTWoEy4KQtg35cE27sw1VbgzoMWHAgCckUUUww==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@libsql/client': '*' + '@neondatabase/serverless': '>=0.1' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/sql.js': '*' + '@vercel/postgres': '*' + better-sqlite3: '>=7' + bun-types: '*' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@libsql/client': + optional: true + '@neondatabase/serverless': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + dependencies: + '@types/better-sqlite3': 7.6.5 + better-sqlite3: 8.6.0 + dev: false + /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: false @@ -3959,7 +4074,6 @@ packages: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 - dev: true /enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} @@ -4542,6 +4656,11 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} dev: false @@ -4611,6 +4730,10 @@ packages: dependencies: flat-cache: 3.0.4 + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + /filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} dependencies: @@ -4720,6 +4843,10 @@ packages: tslib: 2.4.0 dev: false + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -4829,6 +4956,10 @@ packages: assert-plus: 1.0.0 dev: false + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -5080,8 +5211,6 @@ packages: /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} requiresBuild: true - dev: true - optional: true /ignore@4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} @@ -5115,6 +5244,10 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -5620,7 +5753,6 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - dev: true /minecraft-launcher-core@3.16.16: resolution: {integrity: sha512-fIvbahGtAnH1EgZQ4UF7YgM+Xw8EIWe/2g3uqSFV6KnAXfMbnTIbco47o1SF9mdUO4oFxYfskMRNjz98KbCLdw==} @@ -5675,6 +5807,10 @@ packages: minipass: 3.3.6 yallist: 4.0.0 + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} @@ -5721,6 +5857,10 @@ packages: hasBin: true dev: true + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -5728,6 +5868,13 @@ packages: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true + /node-abi@3.47.0: + resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + /node-addon-api@1.7.2: resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} requiresBuild: true @@ -6019,6 +6166,25 @@ packages: source-map-js: 1.0.2 dev: true + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.47.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -6062,7 +6228,6 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} @@ -6081,6 +6246,16 @@ packages: engines: {node: '>=10'} dev: true + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + /react-clientside-effect@1.2.6(react@18.2.0): resolution: {integrity: sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==} peerDependencies: @@ -6244,6 +6419,15 @@ packages: util-deprecate: 1.0.2 dev: false + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -6504,6 +6688,18 @@ packages: engines: {node: '>=14'} dev: false + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + /simple-update-notifier@2.0.0: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} @@ -6706,6 +6902,11 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -6755,6 +6956,26 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + /tar@6.1.15: resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} engines: {node: '>=10'}