diff --git a/gulpfile.js b/gulpfile.js index cd84e400f..e288c8b10 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -151,7 +151,7 @@ function installCrossDeps(done) { } // List installed deps for fparchive const packageLocation = 'node_modules/' + packageName; - const badPackages = fs.readdirSync('./node_modules/@fparchive/', { withFileTypes: true }).filter(m => m.isDirectory() && m.name !== 'flashpoint-archive' && ('@fparchive/' + m.name) !== packageName); + const badPackages = fs.readdirSync('./node_modules/@fparchive/', { withFileTypes: true }).filter(m => m.isDirectory() && m.name !== 'flashpoint-archive' && m.name.startsWith('flashpoint-archive') && ('@fparchive/' + m.name) !== packageName); // Remove old packages for (const bp of badPackages) { diff --git a/package-lock.json b/package-lock.json index 1694e2ccf..d3588c561 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,20 +1,21 @@ { "name": "flashpoint-launcher", - "version": "14.0.0", + "version": "14.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "flashpoint-launcher", - "version": "14.0.0", + "version": "14.0.2", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@electron/remote": "2.0.8", + "@electron/remote": "2.1.3", "@fortawesome/fontawesome-svg-core": "1.2.36", "@fortawesome/free-solid-svg-icons": "5.15.4", "@fortawesome/react-fontawesome": "0.1.18", "@fparchive/flashpoint-archive": "0.11.2", + "@fparchive/multi-zip-reader": "^1.0.5", "@mdx-js/mdx": "^3.1.0", "@mdx-js/react": "^3.1.0", "@reduxjs/toolkit": "^2.2.6", @@ -66,6 +67,7 @@ "@stylistic/eslint-plugin": "^2.3.0", "@swc/cli": "0.3.12", "@swc/core": "1.5.5", + "@types/adm-zip": "^0.5.7", "@types/dns-packet": "^5.6.5", "@types/eslint__js": "^8.42.3", "@types/follow-redirects": "1.8.0", @@ -74,7 +76,7 @@ "@types/lodash": "^4.14.192", "@types/mime": "2.0.1", "@types/minimist": "^1.2.2", - "@types/node": "18.19.75", + "@types/node": "22.13.14", "@types/ps-tree": "1.1.2", "@types/react": "17.0.2", "@types/react-color": "3.0.1", @@ -90,7 +92,7 @@ "chokidar": "^3.5.3", "coveralls": "3.1.0", "cross-env": "7.0.2", - "electron": "19.1.9", + "electron": "^37.3.0", "electron-builder": "24.13.3", "esbuild": "0.20.2", "eslint": "^8.57.0", @@ -695,27 +697,30 @@ } }, "node_modules/@electron/get": { - "version": "1.14.1", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", "license": "MIT", "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", - "got": "^9.6.0", + "got": "^11.8.5", "progress": "^2.0.3", "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "engines": { - "node": ">=8.6" + "node": ">=12" }, "optionalDependencies": { - "global-agent": "^3.0.0", - "global-tunnel-ng": "^2.7.1" + "global-agent": "^3.0.0" } }, "node_modules/@electron/get/node_modules/semver": { "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -816,7 +821,9 @@ } }, "node_modules/@electron/remote": { - "version": "2.0.8", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@electron/remote/-/remote-2.1.3.tgz", + "integrity": "sha512-XlpxC8S4ttj/v2d+PKp9na/3Ev8bV7YWNL7Cw5b9MAWgTphEml7iYgbc7V0r9D6yDOfOkj06bchZgOZdlWJGNA==", "license": "MIT", "peerDependencies": { "electron": ">= 13.0.0" @@ -1110,6 +1117,12 @@ "node": ">= 10" } }, + "node_modules/@fparchive/multi-zip-reader": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@fparchive/multi-zip-reader/-/multi-zip-reader-1.0.5.tgz", + "integrity": "sha512-1i3SkdCWhVT++EiviJwhweUYbpaOE6APJyfWGz3dp8OFycCsvzdoDwzJXruMbeDaJN+XEjgekju6RCS9To/nhg==", + "license": "MIT" + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -2216,102 +2229,17 @@ "url": "https://github.com/kayahr/jest-electron-runner?sponsor=1" } }, - "node_modules/@kayahr/jest-electron-runner/node_modules/@electron/get": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/@electron/remote": { - "version": "2.0.9", - "dev": true, - "license": "MIT", - "peerDependencies": { - "electron": ">= 13.0.0" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@kayahr/jest-electron-runner/node_modules/@types/node": { - "version": "16.18.12", + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", "dev": true, "license": "MIT" }, - "node_modules/@kayahr/jest-electron-runner/node_modules/cacheable-request": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/decompress-response": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/defer-to-connect": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/@kayahr/jest-electron-runner/node_modules/electron": { "version": "22.3.27", + "resolved": "https://registry.npmjs.org/electron/-/electron-22.3.27.tgz", + "integrity": "sha512-7Rht21vHqj4ZFRnKuZdFqZFsvMBCmDqmjetiMqPtF+TmTBiGne1mnstVXOA/SRGhN2Qy5gY5bznJKpiqogjM8A==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -2327,133 +2255,6 @@ "node": ">= 12.20.55" } }, - "node_modules/@kayahr/jest-electron-runner/node_modules/extract-zip": { - "version": "2.0.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/get-stream": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/got": { - "version": "11.8.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/keyv": { - "version": "4.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/mimic-response": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/normalize-url": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/p-cancelable": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/responselike": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@kayahr/jest-electron-runner/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@kayahr/jest-electron-runner/node_modules/uuid": { "version": "9.0.0", "dev": true, @@ -3318,167 +3119,6 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/@mole-inc/bin-wrapper/node_modules/@sindresorhus/is": { - "version": "4.6.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@mole-inc/bin-wrapper/node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@mole-inc/bin-wrapper/node_modules/cacheable-request": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@mole-inc/bin-wrapper/node_modules/decompress-response": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mole-inc/bin-wrapper/node_modules/defer-to-connect": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/@mole-inc/bin-wrapper/node_modules/get-stream": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mole-inc/bin-wrapper/node_modules/got": { - "version": "11.8.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/@mole-inc/bin-wrapper/node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@mole-inc/bin-wrapper/node_modules/keyv": { - "version": "4.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/@mole-inc/bin-wrapper/node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@mole-inc/bin-wrapper/node_modules/mimic-response": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mole-inc/bin-wrapper/node_modules/normalize-url": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mole-inc/bin-wrapper/node_modules/p-cancelable": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@mole-inc/bin-wrapper/node_modules/responselike": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "dev": true, @@ -3586,10 +3226,15 @@ "license": "MIT" }, "node_modules/@sindresorhus/is": { - "version": "0.14.0", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, "node_modules/@sinonjs/commons": { @@ -4041,13 +3686,15 @@ } }, "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "license": "MIT", "dependencies": { - "defer-to-connect": "^1.0.1" + "defer-to-connect": "^2.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/@tokenizer/token": { @@ -4093,6 +3740,16 @@ "@types/estree": "*" } }, + "node_modules/@types/adm-zip": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@types/adm-zip/-/adm-zip-0.5.7.tgz", + "integrity": "sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/babel__core": { "version": "7.20.0", "dev": true, @@ -4132,7 +3789,6 @@ }, "node_modules/@types/cacheable-request": { "version": "6.0.3", - "dev": true, "license": "MIT", "dependencies": { "@types/http-cache-semantics": "*", @@ -4254,7 +3910,6 @@ }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", - "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { @@ -4303,7 +3958,6 @@ }, "node_modules/@types/keyv": { "version": "3.1.4", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -4346,12 +4000,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "18.19.75", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.75.tgz", - "integrity": "sha512-UIksWtThob6ZVSyxcOqCLOUNg/dyO1Qvx4McgeuhrEtHTLFTf7BBhEazaE4K806FGTPtzd/2sE90qn4fVr7cyw==", + "version": "22.13.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.14.tgz", + "integrity": "sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==", "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.20.0" } }, "node_modules/@types/node-7z": { @@ -4451,7 +4105,6 @@ }, "node_modules/@types/responselike": { "version": "1.0.0", - "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -4516,7 +4169,6 @@ }, "node_modules/@types/yauzl": { "version": "2.10.0", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -6261,6 +5913,9 @@ }, "node_modules/boolean": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "license": "MIT", "optional": true }, @@ -6397,6 +6052,7 @@ }, "node_modules/buffer-from": { "version": "1.1.1", + "dev": true, "license": "MIT" }, "node_modules/builder-util": { @@ -6652,44 +6308,25 @@ }, "node_modules/cacheable-lookup": { "version": "5.0.4", - "dev": true, "license": "MIT", "engines": { "node": ">=10.6.0" } }, "node_modules/cacheable-request": { - "version": "6.1.0", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "license": "MIT", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", + "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "license": "MIT", "engines": { "node": ">=8" } @@ -7049,10 +6686,15 @@ } }, "node_modules/clone-response": { - "version": "1.0.2", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/clone-stats": { @@ -7274,6 +6916,7 @@ }, "node_modules/concat-stream": { "version": "1.6.2", + "dev": true, "engines": [ "node >= 0.8" ], @@ -7285,15 +6928,6 @@ "typedarray": "^0.0.6" } }, - "node_modules/config-chain": { - "version": "1.1.13", - "license": "MIT", - "optional": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, "node_modules/config-file-ts": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", @@ -7831,13 +7465,30 @@ } }, "node_modules/decompress-response": { - "version": "3.3.0", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "license": "MIT", "dependencies": { - "mimic-response": "^1.0.0" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/dedent": { @@ -7914,8 +7565,13 @@ } }, "node_modules/defer-to-connect": { - "version": "1.1.3", - "license": "MIT" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/define-data-property": { "version": "1.1.4", @@ -8045,6 +7701,8 @@ }, "node_modules/detect-node": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT", "optional": true }, @@ -8221,10 +7879,6 @@ "version": "0.1.2", "license": "MIT" }, - "node_modules/duplexer3": { - "version": "0.1.4", - "license": "BSD-3-Clause" - }, "node_modules/duplexify": { "version": "3.7.1", "dev": true, @@ -8284,19 +7938,21 @@ } }, "node_modules/electron": { - "version": "19.1.9", + "version": "37.3.0", + "resolved": "https://registry.npmjs.org/electron/-/electron-37.3.0.tgz", + "integrity": "sha512-cPOPUD26DwCh+PZ9q+gMyVBvdBN75SnekI6u5zcOeoLVIXQpzrCm1ewz9BcrkWkVW7oOtfQAEo1G1SffvXrSSw==", "hasInstallScript": true, "license": "MIT", "dependencies": { - "@electron/get": "^1.14.1", - "@types/node": "^16.11.26", - "extract-zip": "^1.0.3" + "@electron/get": "^2.0.0", + "@types/node": "^22.7.7", + "extract-zip": "^2.0.1" }, "bin": { "electron": "cli.js" }, "engines": { - "node": ">= 8.6" + "node": ">= 12.20.55" } }, "node_modules/electron-builder": { @@ -8731,10 +8387,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/electron/node_modules/@types/node": { - "version": "16.11.46", - "license": "MIT" - }, "node_modules/emittery": { "version": "0.13.1", "dev": true, @@ -8750,14 +8402,6 @@ "version": "8.0.0", "license": "MIT" }, - "node_modules/encodeurl": { - "version": "1.0.2", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "license": "MIT", @@ -8767,6 +8411,8 @@ }, "node_modules/env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "license": "MIT", "engines": { "node": ">=6" @@ -8977,6 +8623,8 @@ }, "node_modules/es6-error": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "license": "MIT", "optional": true }, @@ -10342,23 +9990,23 @@ } }, "node_modules/extract-zip": { - "version": "1.7.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "license": "BSD-2-Clause", "dependencies": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", + "debug": "^4.1.1", + "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "bin": { "extract-zip": "cli.js" - } - }, - "node_modules/extract-zip/node_modules/debug": { - "version": "2.6.9", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" } }, "node_modules/extsprintf": { @@ -10715,23 +10363,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/flat-cache/node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/flat-cache/node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", @@ -11111,13 +10742,18 @@ } }, "node_modules/get-stream": { - "version": "4.1.0", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "license": "MIT", "dependencies": { "pump": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { @@ -11341,6 +10977,8 @@ }, "node_modules/global-agent": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", "license": "BSD-3-Clause", "optional": true, "dependencies": { @@ -11383,20 +11021,6 @@ "node": ">=0.10.0" } }, - "node_modules/global-tunnel-ng": { - "version": "2.7.1", - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "encodeurl": "^1.0.2", - "lodash": "^4.17.10", - "npm-conf": "^1.1.3", - "tunnel": "^0.0.6" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -11484,23 +11108,28 @@ } }, "node_modules/got": { - "version": "9.6.0", + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "license": "MIT", "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" }, "engines": { - "node": ">=8.6" + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, "node_modules/graceful-fs": { @@ -12111,7 +11740,9 @@ "license": "MIT" }, "node_modules/http-cache-semantics": { - "version": "4.1.1", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", "license": "BSD-2-Clause" }, "node_modules/http-proxy-agent": { @@ -12144,7 +11775,6 @@ }, "node_modules/http2-wrapper": { "version": "1.0.3", - "dev": true, "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", @@ -12294,7 +11924,7 @@ }, "node_modules/ini": { "version": "1.3.8", - "devOptional": true, + "dev": true, "license": "ISC" }, "node_modules/inline-style-parser": { @@ -15574,7 +15204,9 @@ } }, "node_modules/json-buffer": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "license": "MIT" }, "node_modules/json-parse-even-better-errors": { @@ -15666,10 +15298,12 @@ "license": "MIT" }, "node_modules/keyv": { - "version": "3.1.0", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "license": "MIT", "dependencies": { - "json-buffer": "3.0.0" + "json-buffer": "3.0.1" } }, "node_modules/kind-of": { @@ -15975,10 +15609,12 @@ } }, "node_modules/lowercase-keys": { - "version": "1.0.1", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/lru-cache": { @@ -16121,6 +15757,8 @@ }, "node_modules/matcher": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", "license": "MIT", "optional": true, "dependencies": { @@ -16132,6 +15770,8 @@ }, "node_modules/matcher/node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", "optional": true, "engines": { @@ -20272,6 +19912,8 @@ }, "node_modules/mimic-response": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "license": "MIT", "engines": { "node": ">=4" @@ -20351,18 +19993,9 @@ "node": ">=0.10.0" } }, - "node_modules/mkdirp": { - "version": "0.5.5", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/ms": { "version": "2.0.0", + "dev": true, "license": "MIT" }, "node_modules/mute-stdout": { @@ -20535,10 +20168,15 @@ } }, "node_modules/normalize-url": { - "version": "4.5.1", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/now-and-later": { @@ -20552,18 +20190,6 @@ "node": ">= 0.10" } }, - "node_modules/npm-conf": { - "version": "1.1.3", - "license": "MIT", - "optional": true, - "dependencies": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "dev": true, @@ -20884,10 +20510,12 @@ } }, "node_modules/p-cancelable": { - "version": "1.1.0", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/p-finally": { @@ -21189,14 +20817,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "3.0.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, "node_modules/pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", @@ -21302,13 +20922,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prepend-http": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/pretty-format": { "version": "27.5.1", "dev": true, @@ -21361,6 +20974,8 @@ }, "node_modules/progress": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -21408,11 +21023,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/proto-list": { - "version": "1.2.4", - "license": "ISC", - "optional": true - }, "node_modules/proxy-from-env": { "version": "1.1.0", "license": "MIT" @@ -21510,7 +21120,6 @@ }, "node_modules/quick-lru": { "version": "5.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -22619,7 +22228,6 @@ }, "node_modules/resolve-alpn": { "version": "1.2.1", - "dev": true, "license": "MIT" }, "node_modules/resolve-cwd": { @@ -22692,10 +22300,15 @@ } }, "node_modules/responselike": { - "version": "1.0.2", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "license": "MIT", "dependencies": { - "lowercase-keys": "^1.0.0" + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ret": { @@ -22743,6 +22356,8 @@ }, "node_modules/roarr": { "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", "license": "BSD-3-Clause", "optional": true, "dependencies": { @@ -22758,7 +22373,9 @@ } }, "node_modules/roarr/node_modules/sprintf-js": { - "version": "1.1.2", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "license": "BSD-3-Clause", "optional": true }, @@ -22915,6 +22532,8 @@ }, "node_modules/semver-compare": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "license": "MIT", "optional": true }, @@ -22961,6 +22580,8 @@ }, "node_modules/serialize-error": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", "license": "MIT", "optional": true, "dependencies": { @@ -23856,6 +23477,8 @@ }, "node_modules/sumchecker": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", "license": "Apache-2.0", "dependencies": { "debug": "^4.1.0" @@ -24240,13 +23863,6 @@ "node": ">=0.10.0" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/to-regex": { "version": "3.0.2", "dev": true, @@ -24658,14 +24274,6 @@ "dev": true, "license": "0BSD" }, - "node_modules/tunnel": { - "version": "0.0.6", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, "node_modules/tunnel-agent": { "version": "0.6.0", "dev": true, @@ -24710,6 +24318,8 @@ }, "node_modules/type-fest": { "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "license": "(MIT OR CC0-1.0)", "optional": true, "engines": { @@ -24798,6 +24408,7 @@ }, "node_modules/typedarray": { "version": "0.0.6", + "dev": true, "license": "MIT" }, "node_modules/typesafe-actions": { @@ -24997,9 +24608,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "license": "MIT" }, "node_modules/unified": { @@ -25276,16 +24887,6 @@ "dev": true, "license": "MIT" }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/use": { "version": "3.1.1", "dev": true, diff --git a/package.json b/package.json index ab53187a5..bb2301d5b 100644 --- a/package.json +++ b/package.json @@ -29,11 +29,12 @@ }, "license": "MIT", "dependencies": { - "@electron/remote": "2.0.8", + "@electron/remote": "2.1.3", "@fortawesome/fontawesome-svg-core": "1.2.36", "@fortawesome/free-solid-svg-icons": "5.15.4", "@fortawesome/react-fontawesome": "0.1.18", "@fparchive/flashpoint-archive": "0.11.2", + "@fparchive/multi-zip-reader": "^1.0.5", "@mdx-js/mdx": "^3.1.0", "@mdx-js/react": "^3.1.0", "@reduxjs/toolkit": "^2.2.6", @@ -85,6 +86,7 @@ "@stylistic/eslint-plugin": "^2.3.0", "@swc/cli": "0.3.12", "@swc/core": "1.5.5", + "@types/adm-zip": "^0.5.7", "@types/dns-packet": "^5.6.5", "@types/eslint__js": "^8.42.3", "@types/follow-redirects": "1.8.0", @@ -93,7 +95,7 @@ "@types/lodash": "^4.14.192", "@types/mime": "2.0.1", "@types/minimist": "^1.2.2", - "@types/node": "18.19.75", + "@types/node": "22.13.14", "@types/ps-tree": "1.1.2", "@types/react": "17.0.2", "@types/react-color": "3.0.1", @@ -109,7 +111,7 @@ "chokidar": "^3.5.3", "coveralls": "3.1.0", "cross-env": "7.0.2", - "electron": "19.1.9", + "electron": "^37.3.0", "electron-builder": "24.13.3", "esbuild": "0.20.2", "eslint": "^8.57.0", diff --git a/src/back/GameLauncher.ts b/src/back/GameLauncher.ts index 4e347f495..6513be0e1 100644 --- a/src/back/GameLauncher.ts +++ b/src/back/GameLauncher.ts @@ -557,6 +557,44 @@ async function handleGameDataParams(opts: LaunchBaseOpts, serverOverride?: strin const tempPath = path.join(opts.fpPath, '.temp', 'extract'); await fs.ensureDir(tempPath); const destPath = path.join(opts.fpPath, opts.htdocsPath); + + // If the game data isn't on disk, try and retrieve from archived data + if (!fs.existsSync(gameDataPath)) { + // Check archive data + const ultPath = fixSlashes(path.join('Flashpoint Ultimate', path.relative(opts.fpPath, gameDataPath))); + try { + const stream = await opts.state.archiveData.readFileStream(ultPath); + if (stream === null) { + // No data in zip file? + } else { + // Save zip to data folder + const writer = fs.createWriteStream(gameDataPath); + + // Pipe the stream to the file + stream.pipe(writer); + + // Wait for finish + await new Promise((resolve, reject) => { + writer.on('finish', () => { + resolve(); + }); + writer.on('error', (err) => { + reject(err); + }); + stream.on('error', (err) => { + writer.destroy(); + reject(err); + }); + }); + } + } catch (e: any) { + if (e.code !== 'ENOENT') { + log.error('Launcher', `Failed to extract game data from archive: ${e}`); + } + } + } + + // If the game data exists, do it from disk log.debug('Launcher', `Extracting game data from "${gameDataPath}" to "${tempPath}"`); await extractFullPromise([gameDataPath, tempPath, { $bin: opts.sevenZipPath }]) .catch((err) => { @@ -564,6 +602,7 @@ async function handleGameDataParams(opts: LaunchBaseOpts, serverOverride?: strin log.error('Launcher', `Failed to extract game data: ${err}`); throw err; }); + const contentFolder = path.join(tempPath, 'content'); // Move contents of contentFolder to destPath log.debug('Launcher', `Moving extracted game data from "${contentFolder}" to "${destPath}"`); diff --git a/src/back/extensions/ApiImplementation.ts b/src/back/extensions/ApiImplementation.ts index 8cb0c2be0..4547120e7 100644 --- a/src/back/extensions/ApiImplementation.ts +++ b/src/back/extensions/ApiImplementation.ts @@ -112,6 +112,18 @@ export function createApiFactory(extId: string, extManifest: IExtensionManifest, state.socketServer.broadcast(BackOut.FOCUS_WINDOW); }; + const extArchiveData: typeof flashpoint.archiveData = { + readFile: (filePath) => { + return state.archiveData.readFile(filePath); + }, + readFileStream: (filePath) => { + return state.archiveData.readFileStream(filePath); + }, + getZipDataOffset: (filePath) => { + return state.archiveData.getZipDataOffset(filePath); + } + }; + // Log Namespace const extLog: typeof flashpoint.log = { trace: (message: string) => addExtLog(newExtLog(extManifest, message, log.trace)), @@ -660,6 +672,7 @@ export function createApiFactory(extId: string, extManifest: IExtensionManifest, focusWindow: focusWindow, // Namespaces + archiveData: extArchiveData, log: extLog, commands: extCommands, curations: extCurations, diff --git a/src/back/index.ts b/src/back/index.ts index 646023876..6c371afe4 100644 --- a/src/back/index.ts +++ b/src/back/index.ts @@ -2,6 +2,7 @@ import { ILogEntry, LogLevel } from '@shared/Log/interface'; import { Theme } from '@shared/ThemeFile'; import { createErrorProxy, deepCopy, + fixSlashes, removeFileExtension, stringifyArray } from '@shared/Util'; @@ -75,6 +76,7 @@ import { awaitDialog } from './util/dialog'; import { saveCurationFpfssInfo } from './curate/fpfss'; import { axios } from './dns'; import { Downloader } from './Downloader'; +import { MultiZipReader } from '@fparchive/multi-zip-reader'; export const VERBOSE = { enabled: false @@ -210,6 +212,7 @@ const state: BackState = { resolveDialogEvents: new EventEmitter(), downloadController: new InstancedAbortController(), shortcuts: {}, + archiveData: new MultiZipReader(), }; main(); @@ -396,6 +399,21 @@ async function prepForInit(message: any): Promise { console.log('Back - Loaded Preferences'); + // Load archive data + console.log('Back - Indexing Archive Data'); + const startTimeArchivedData = performance.now(); + const archiveDataPath = path.join(state.config.flashpointPath, 'Data', 'ArchiveData'); + state.archiveData = new MultiZipReader(); + await state.archiveData.loadDirectory(archiveDataPath); + const endTimeArchivedData = performance.now(); + + let indexTotal = 0; + for (const source of state.archiveData.sources) { + indexTotal += Object.keys(source.data).length; + } + + log.debug('Launcher', `Indexed ${indexTotal.toLocaleString()} Archived Data Files in ${Math.floor(endTimeArchivedData - startTimeArchivedData)}ms`); + // Hook into stdout for logging const realWrite = process.stdout.write.bind(process.stdout); process.stdout.write = ((string: any, encodingOrCb: any, cb: any) => { @@ -1277,7 +1295,33 @@ async function onFileServerRequestImages(pathname: string, url: URL, req: http.I res.writeHead(404); res.end(); } else { - // File missing + // File missing, try archive next + const ultPath = fixSlashes(path.join('Flashpoint Ultimate', path.relative(state.config.flashpointPath, filePath))); + console.log(ultPath); + try { + const stream = await state.archiveData.readFileStream(ultPath); + if (stream !== null) { + stream.on('error', error => { + console.warn(`File server failed to stream archived data file. ${error}`); + stream.destroy(); // Calling "destroy" inside the "error" event seems like it could case an endless loop (although it hasn't thus far) + if (!res.writableEnded) { res.end(); } + }); + stream.pipe(res); + return; + } else { + res.writeHead(204); + res.end(); + return; + } + } catch (e: any) { + if (e.code !== 'ENOENT') { + log.error('Launcher', `Error reading file from archive data: ${e}`); + res.writeHead(500); + res.end(); + return; + } + } + if (!state.preferences.onDemandImages) { // Not downloading new files res.writeHead(404); @@ -1641,4 +1685,4 @@ export async function databaseReady(): Promise { }; waitForDb(); }); -} \ No newline at end of file +} diff --git a/src/back/responses.ts b/src/back/responses.ts index ee529f42f..284ba3ac9 100644 --- a/src/back/responses.ts +++ b/src/back/responses.ts @@ -9,7 +9,7 @@ import { } from '@fparchive/flashpoint-archive'; import { LogLevel } from '@shared/Log/interface'; import { MetaEditFile, MetaEditMeta } from '@shared/MetaEdit'; -import { deepCopy, downloadFile, padEnd } from '@shared/Util'; +import { deepCopy, downloadFile, fixSlashes, padEnd } from '@shared/Util'; import { BackIn, BackInit, @@ -1062,16 +1062,22 @@ export function registerRequestCallbacks(state: BackState, init: () => Promise; + archiveData: MultiZipReader; } export type BackQueryChache = { diff --git a/src/back/util/misc.ts b/src/back/util/misc.ts index 45049c343..e72b4a0f6 100644 --- a/src/back/util/misc.ts +++ b/src/back/util/misc.ts @@ -21,7 +21,6 @@ import * as path from 'path'; import * as kill from 'tree-kill'; import { promisify } from 'util'; import { uuid } from './uuid'; -import { GameSearch, parseUserSearchInput } from '@fparchive/flashpoint-archive'; const unlink = promisify(fs.unlink); diff --git a/typings/flashpoint-launcher.d.ts b/typings/flashpoint-launcher.d.ts index c27db3435..fbede8cca 100644 --- a/typings/flashpoint-launcher.d.ts +++ b/typings/flashpoint-launcher.d.ts @@ -21,6 +21,7 @@ declare module 'flashpoint-launcher' { import { Readable } from 'stream'; + import { ReadStream } from 'fs'; /** Version of the Flashpoint Launcher */ const version: string; @@ -193,6 +194,21 @@ declare module 'flashpoint-launcher' { }>; } + namespace archiveData { + function readFile(filePath: string): Promise; + function readFileStream(filePath: string): Promise; + function getZipDataOffset(filePath: string): Promise; + } + + type ZipDataOffset = { + filePath: string; + crc32: number; + offset: number; + compressionMethod: number; // 0 = Store, 8 = Deflate + compressedLength: number; + length: number; + } + /** Collection of Game related API functions */ namespace games { // Platforms @@ -1232,7 +1248,7 @@ declare module 'flashpoint-launcher' { stepProgress: number; text: string; } - + type DownloadTask = { status: DownloadTaskStatus; game: Game; @@ -1574,7 +1590,7 @@ declare module 'flashpoint-launcher' { export type DialogState = { id: string; mdx?: boolean; - textAlign?: 'left' | 'center' | 'right'; + textAlign?: 'left' | 'center' | 'right'; largeMessage?: boolean; userCanCancel?: boolean; message: string;