diff --git a/.erb/configs/webpack.config.base.ts b/.erb/configs/webpack.config.base.ts index 101006c..f29ed17 100644 --- a/.erb/configs/webpack.config.base.ts +++ b/.erb/configs/webpack.config.base.ts @@ -1,7 +1,3 @@ -/** - * Base webpack config used across other specific configs - */ - import webpack from 'webpack'; import TsconfigPathsPlugins from 'tsconfig-paths-webpack-plugin'; import webpackPaths from './webpack.paths'; @@ -20,7 +16,6 @@ const configuration: webpack.Configuration = { use: { loader: 'ts-loader', options: { - // Remove this line to enable type checking in webpack builds transpileOnly: true, compilerOptions: { module: 'nodenext', @@ -34,18 +29,22 @@ const configuration: webpack.Configuration = { output: { path: webpackPaths.srcPath, - // https://github.com/webpack/webpack/issues/1114 library: { type: 'commonjs2' }, }, - /** - * Determine the array of extensions that should be used to resolve modules. - */ resolve: { extensions: ['.js', '.jsx', '.json', '.ts', '.tsx'], modules: [webpackPaths.srcPath, 'node_modules'], - // There is no need to add aliases here, the paths in tsconfig get mirrored plugins: [new TsconfigPathsPlugins()], + + // Новые настройки + extensionAlias: { + '.js': ['.js', '.mjs'], + }, + fullySpecified: false, + alias: { + 'undici/lib/core/util': 'undici/lib/core/util.js', + }, }, plugins: [new webpack.EnvironmentPlugin({ NODE_ENV: 'production' })], diff --git a/package-lock.json b/package-lock.json index da16c7f..bbde183 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,17 +12,26 @@ "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@mui/material": "^7.2.0", + "@xmcl/core": "^2.14.1", + "@xmcl/installer": "^6.1.0", "electron-debug": "^4.1.0", "electron-log": "^5.3.2", "electron-updater": "^6.3.9", + "find-java-home": "^2.0.0", + "https-browserify": "^1.0.0", + "path-browserify": "^1.0.1", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router-dom": "^7.3.0" + "react-router-dom": "^7.3.0", + "stream-browserify": "^3.0.0", + "undici": "^7.11.0", + "util": "^0.12.5" }, "devDependencies": { "@electron/rebuild": "^3.7.1", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", "@svgr/webpack": "^8.1.0", + "@swc/core": "^1.12.9", "@teamsupercell/typings-for-css-modules-loader": "^2.5.2", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", @@ -4399,6 +4408,232 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@swc/core": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.12.9.tgz", + "integrity": "sha512-O+LfT2JlVMsIMWG9x+rdxg8GzpzeGtCZQfXV7cKc1PjIKUkLFf1QJ7okuseA4f/9vncu37dQ2ZcRrPKy0Ndd5g==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.23" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.12.9", + "@swc/core-darwin-x64": "1.12.9", + "@swc/core-linux-arm-gnueabihf": "1.12.9", + "@swc/core-linux-arm64-gnu": "1.12.9", + "@swc/core-linux-arm64-musl": "1.12.9", + "@swc/core-linux-x64-gnu": "1.12.9", + "@swc/core-linux-x64-musl": "1.12.9", + "@swc/core-win32-arm64-msvc": "1.12.9", + "@swc/core-win32-ia32-msvc": "1.12.9", + "@swc/core-win32-x64-msvc": "1.12.9" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.12.9.tgz", + "integrity": "sha512-GACFEp4nD6V+TZNR2JwbMZRHB+Yyvp14FrcmB6UCUYmhuNWjkxi+CLnEvdbuiKyQYv0zA+TRpCHZ+whEs6gwfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.12.9.tgz", + "integrity": "sha512-hv2kls7Ilkm2EpeJz+I9MCil7pGS3z55ZAgZfxklEuYsxpICycxeH+RNRv4EraggN44ms+FWCjtZFu0LGg2V3g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.12.9.tgz", + "integrity": "sha512-od9tDPiG+wMU9wKtd6y3nYJdNqgDOyLdgRRcrj1/hrbHoUPOM8wZQZdwQYGarw63iLXGgsw7t5HAF9Yc51ilFA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.12.9.tgz", + "integrity": "sha512-6qx1ka9LHcLzxIgn2Mros+CZLkHK2TawlXzi/h7DJeNnzi8F1Hw0Yzjp8WimxNCg6s2n+o3jnmin1oXB7gg8rw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.12.9.tgz", + "integrity": "sha512-yghFZWKPVVGbUdqiD7ft23G0JX6YFGDJPz9YbLLAwGuKZ9th3/jlWoQDAw1Naci31LQhVC+oIji6ozihSuwB2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.12.9.tgz", + "integrity": "sha512-SFUxyhWLZRNL8QmgGNqdi2Q43PNyFVkRZ2zIif30SOGFSxnxcf2JNeSeBgKIGVgaLSuk6xFVVCtJ3KIeaStgRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.12.9.tgz", + "integrity": "sha512-9FB0wM+6idCGTI20YsBNBg9xSWtkDBymnpaTCsZM3qDc0l4uOpJMqbfWhQvp17x7r/ulZfb2QY8RDvQmCL6AcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.12.9.tgz", + "integrity": "sha512-zHOusMVbOH9ik5RtRrMiGzLpKwxrPXgXkBm3SbUCa65HAdjV33NZ0/R9Rv1uPESALtEl2tzMYLUxYA5ECFDFhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.12.9.tgz", + "integrity": "sha512-aWZf0PqE0ot7tCuhAjRkDFf41AzzSQO0x2xRfTbnhpROp57BRJ/N5eee1VULO/UA2PIJRG7GKQky5bSGBYlFug==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.12.9.tgz", + "integrity": "sha512-C25fYftXOras3P3anSUeXXIpxmEkdAcsIL9yrr0j1xepTZ/yKwpnQ6g3coj8UXdeJy4GTVlR6+Ow/QiBgZQNOg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.23", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz", + "integrity": "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, "node_modules/@szmarczak/http-timer": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", @@ -4834,7 +5069,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", - "dev": true, "license": "MIT" }, "node_modules/@types/http-errors": { @@ -4981,7 +5215,6 @@ "version": "22.13.10", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.20.0" @@ -5205,9 +5438,7 @@ "version": "2.10.3", "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, "license": "MIT", - "optional": true, "dependencies": { "@types/node": "*" } @@ -5634,6 +5865,113 @@ } } }, + "node_modules/@xmcl/asm": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@xmcl/asm/-/asm-1.0.1.tgz", + "integrity": "sha512-7vCVgm1E1IZ2cujiitFk9550Vgu2XAOn1ff90di638fMmTK0XkFMXKsSR/nGZmYKt+XiTMI/0B3TvreqbVjOug==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@xmcl/core": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/@xmcl/core/-/core-2.14.1.tgz", + "integrity": "sha512-oaaanDX1AG9/eHS6gxg/oYOxKn7bQMcOHFBF7i/gBk/AlhEB72lIkAxssoJZ2zggAz7p1gNNsNCt7ialrhWSkQ==", + "license": "MIT", + "dependencies": { + "@xmcl/unzip": "2.1.2" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@xmcl/file-transfer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@xmcl/file-transfer/-/file-transfer-2.0.2.tgz", + "integrity": "sha512-4HZ18relTy2HKB0YPVzWzrGs5Bb74yvMvi6qwl+IYoPqJdUV4xLySGxY7xfTEff5Ct/cy74ZbvqaDFYly0L8Rw==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.1", + "http-cache-semantics": "^4.1.1", + "undici": "7.2.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@xmcl/file-transfer/node_modules/undici": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.2.3.tgz", + "integrity": "sha512-2oSLHaDalSt2/O/wHA9M+/ZPAOcU2yrSP/cdBYJ+YxZskiPYDSqHbysLSlD7gq3JMqOoJI5O31RVU3BxX/MnAA==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/@xmcl/forge-site-parser": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/@xmcl/forge-site-parser/-/forge-site-parser-2.0.9.tgz", + "integrity": "sha512-OHKG2KYE+F6TSeOQmymuGoqEifxbJb3w3X/hmxMNeqtewiYukJldPmKO559ZFnZnOuMQEnr+X0dMbTQwWs5dFg==", + "license": "MIT", + "dependencies": { + "node-html-parser": "^6.1.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@xmcl/installer": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@xmcl/installer/-/installer-6.1.0.tgz", + "integrity": "sha512-m52Zl5945+ggc/y8unr9i2A0TY7vHwKJEdjvIeSqIPJuWMl57HBOgsi0JUFN3HRlHQOFC4aj+Yw5gt/2PFhv4A==", + "license": "MIT", + "dependencies": { + "@xmcl/asm": "1.0.1", + "@xmcl/core": "2.14.1", + "@xmcl/file-transfer": "2.0.2", + "@xmcl/forge-site-parser": "2.0.9", + "@xmcl/task": "4.1.1", + "@xmcl/unzip": "2.1.2", + "undici": "7.2.3", + "yauzl": "^2.10.0", + "yazl": "^2.5.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@xmcl/installer/node_modules/undici": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.2.3.tgz", + "integrity": "sha512-2oSLHaDalSt2/O/wHA9M+/ZPAOcU2yrSP/cdBYJ+YxZskiPYDSqHbysLSlD7gq3JMqOoJI5O31RVU3BxX/MnAA==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/@xmcl/task": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@xmcl/task/-/task-4.1.1.tgz", + "integrity": "sha512-UdTf37uBG26hx3UW8oDM5TFTodV0CMTgUKOQu5XGMc2iVEKXuC5rUgVMf6Av7aDAxbgb5LedK/5Ik1lDP9CRRA==", + "license": "MIT" + }, + "node_modules/@xmcl/unzip": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@xmcl/unzip/-/unzip-2.1.2.tgz", + "integrity": "sha512-Lm/eg/e0/p+sfj/RT2QDpsBAf39DZqQ3+XvX1JXZPb64wnjwOf8CGU1WPv6BseEcJ5CMOpm0s2NyrEQD04y0UQ==", + "license": "MIT", + "dependencies": { + "@types/yauzl": "^2.10.0", + "yauzl": "^2.10.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "yauzl": "^2.10.0" + } + }, "node_modules/@xmldom/xmldom": { "version": "0.8.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", @@ -6467,7 +6805,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" @@ -6875,7 +7212,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, "license": "ISC" }, "node_modules/boolean": { @@ -7004,7 +7340,6 @@ "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, "license": "MIT", "engines": { "node": "*" @@ -7289,7 +7624,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", @@ -7308,7 +7642,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -7322,7 +7655,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -8289,7 +8621,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">= 6" @@ -8691,7 +9022,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -9023,7 +9353,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, "funding": [ { "type": "github", @@ -9121,7 +9450,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -9444,7 +9772,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -9571,7 +9898,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -9581,7 +9907,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -9626,7 +9951,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -11538,7 +11862,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, "license": "MIT", "dependencies": { "pend": "~1.2.0" @@ -11669,6 +11992,25 @@ "dev": true, "license": "MIT" }, + "node_modules/find-java-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-java-home/-/find-java-home-2.0.0.tgz", + "integrity": "sha512-m4Cf5WM5Y9UupofsLgcJuY5oFXVfVnfHx43pg3HJoVdtY2PN4Wfs7ex9svf7W7eLTP+6wmyBToaqGOCffHBHVA==", + "license": "Apache-2.0", + "dependencies": { + "which": "~1.0.5", + "winreg": "~1.2.2" + } + }, + "node_modules/find-java-home/node_modules/which": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "integrity": "sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==", + "license": "ISC", + "bin": { + "which": "bin/which" + } + }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -11766,7 +12108,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7" @@ -11985,7 +12326,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -12020,7 +12360,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -12213,7 +12552,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -12328,7 +12666,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -12357,7 +12694,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -12370,7 +12706,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -12405,7 +12740,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, "license": "MIT", "bin": { "he": "bin/he" @@ -12648,7 +12982,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true, "license": "BSD-2-Clause" }, "node_modules/http-deceiver": { @@ -12751,6 +13084,12 @@ "node": ">=10.19.0" } }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "license": "MIT" + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -12999,7 +13338,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, "license": "ISC" }, "node_modules/internal-slot": { @@ -13051,6 +13389,22 @@ "node": ">= 10" } }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -13155,7 +13509,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -13293,7 +13646,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", @@ -13457,7 +13809,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -13553,7 +13904,6 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" @@ -15457,7 +15807,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -15970,6 +16319,75 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/node-html-parser": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", + "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, + "node_modules/node-html-parser/node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/node-html-parser/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/node-html-parser/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/node-html-parser/node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -16057,7 +16475,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" @@ -16524,6 +16941,12 @@ "tslib": "^2.0.3" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -16629,7 +17052,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, "license": "MIT" }, "node_modules/picocolors": { @@ -16759,7 +17181,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -17806,7 +18227,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.3", @@ -18431,7 +18851,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -18469,7 +18888,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -18940,7 +19358,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -19403,11 +19820,20 @@ "node": ">= 0.8" } }, + "node_modules/stream-browserify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", + "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" @@ -20695,11 +21121,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.11.0.tgz", + "integrity": "sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true, "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -20948,11 +21382,23 @@ "dev": true, "license": "(WTFPL OR MIT)" }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, "license": "MIT" }, "node_modules/utila": { @@ -21577,7 +22023,6 @@ "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", @@ -21612,6 +22057,12 @@ "dev": true, "license": "MIT" }, + "node_modules/winreg": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/winreg/-/winreg-1.2.5.tgz", + "integrity": "sha512-uf7tHf+tw0B1y+x+mKTLHkykBgK2KMs3g+KlzmyMbLvICSHQyB/xOFjTT8qZ3oeTFyU7Bbj4FzXitGG6jvKhYw==", + "license": "BSD-2-Clause" + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -21795,13 +22246,21 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 2e5c0ee..44822e2 100644 --- a/package.json +++ b/package.json @@ -105,17 +105,26 @@ "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@mui/material": "^7.2.0", + "@xmcl/core": "^2.14.1", + "@xmcl/installer": "^6.1.0", "electron-debug": "^4.1.0", "electron-log": "^5.3.2", "electron-updater": "^6.3.9", + "find-java-home": "^2.0.0", + "https-browserify": "^1.0.0", + "path-browserify": "^1.0.1", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-router-dom": "^7.3.0" + "react-router-dom": "^7.3.0", + "stream-browserify": "^3.0.0", + "undici": "^7.11.0", + "util": "^0.12.5" }, "devDependencies": { "@electron/rebuild": "^3.7.1", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.15", "@svgr/webpack": "^8.1.0", + "@swc/core": "^1.12.9", "@teamsupercell/typings-for-css-modules-loader": "^2.5.2", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.2.0", diff --git a/src/main/main.ts b/src/main/main.ts index 81e492b..8151469 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -14,6 +14,121 @@ import { autoUpdater } from 'electron-updater'; import log from 'electron-log'; import MenuBuilder from './menu'; import { resolveHtmlPath } from './util'; +import fs from 'fs'; +import https from 'https'; +import extract from 'extract-zip'; +import { launch, Version, diagnose } from '@xmcl/core'; +import { execSync } from 'child_process'; +import { + installDependencies, + installFabric, + getFabricLoaders, + getVersionList, + install, + installTask, + installDependenciesTask, +} from '@xmcl/installer'; +import { Task } from '@xmcl/task'; +// import findJavaHome from 'find-java-home'; + +// Функция для поиска Java +async function findJava(): Promise { + return new Promise((resolve, reject) => { + try { + // 1. Сначала проверяем переменную JAVA_HOME + if (process.env.JAVA_HOME) { + const javaPath = path.join( + process.env.JAVA_HOME, + 'bin', + 'java' + (process.platform === 'win32' ? '.exe' : ''), + ); + if (fs.existsSync(javaPath)) { + return resolve(javaPath); + } + } + + // 2. Проверяем стандартные пути установки в зависимости от платформы + const checkPaths: string[] = []; + + if (process.platform === 'win32') { + // Windows + const programFiles = process.env['ProgramFiles'] || 'C:\\Program Files'; + const programFilesX86 = + process.env['ProgramFiles(x86)'] || 'C:\\Program Files (x86)'; + + // JDK пути + [ + 'Java', + 'AdoptOpenJDK', + 'Eclipse Adoptium', + 'BellSoft', + 'Zulu', + 'Amazon Corretto', + ].forEach((vendor) => { + checkPaths.push(path.join(programFiles, vendor)); + checkPaths.push(path.join(programFilesX86, vendor)); + }); + } else if (process.platform === 'darwin') { + // macOS + checkPaths.push('/Library/Java/JavaVirtualMachines'); + checkPaths.push('/System/Library/Java/JavaVirtualMachines'); + checkPaths.push('/usr/libexec/java_home'); + } else { + // Linux + checkPaths.push('/usr/lib/jvm'); + checkPaths.push('/usr/java'); + checkPaths.push('/opt/java'); + } + + // Проверяем каждый путь + for (const basePath of checkPaths) { + if (fs.existsSync(basePath)) { + try { + // Находим подпапки с JDK/JRE + const entries = fs.readdirSync(basePath, { withFileTypes: true }); + for (const entry of entries) { + if (entry.isDirectory()) { + // Проверяем наличие исполняемого файла java в bin + const javaPath = path.join( + basePath, + entry.name, + 'bin', + 'java' + (process.platform === 'win32' ? '.exe' : ''), + ); + + if (fs.existsSync(javaPath)) { + return resolve(javaPath); + } + } + } + } catch (err) { + console.error(`Ошибка при сканировании ${basePath}:`, err); + } + } + } + + // 3. Пробуем найти java в PATH через команду which/where + try { + const command = + process.platform === 'win32' ? 'where java' : 'which java'; + const javaPath = execSync(command).toString().trim(); + + if (javaPath && fs.existsSync(javaPath)) { + return resolve(javaPath); + } + } catch (err) { + console.error('Ошибка при поиске java через PATH:', err); + } + + // Если Java не найдена, выдаем ошибку + reject( + new Error('Java не найдена. Установите Java и повторите попытку.'), + ); + } catch (error) { + reject(error); + } + }); +} class AppUpdater { constructor() { @@ -43,6 +158,354 @@ if (isDebug) { require('electron-debug').default(); } +// Minecraft + +const COMFORT_DOWNLOAD_URL = + 'https://github.com/DIKER0K/Comfort/releases/latest/download/Comfort.zip'; +const GITHUB_API_RELEASE_URL = + 'https://api.github.com/repos/DIKER0K/Comfort/releases/latest'; +const COMFORT_VERSION_FILE = 'comfort_version.txt'; + +async function getLatestReleaseVersion(): Promise { + try { + const response = await fetch(GITHUB_API_RELEASE_URL); + const data = await response.json(); + return data.tag_name || '0.0.0'; + } catch (error) { + console.error('Failed to fetch latest version:', error); + return '0.0.0'; + } +} + +// Модифицируем обработчик IPC +ipcMain.handle('download-and-extract', async (event) => { + try { + const appPath = path.dirname(app.getPath('exe')); + const minecraftDir = path.join(appPath, '.minecraft'); + const versionsDir = path.join(minecraftDir, 'versions'); + const versionFilePath = path.join(minecraftDir, COMFORT_VERSION_FILE); + + // Получаем текущую и последнюю версии + const latestVersion = await getLatestReleaseVersion(); + let currentVersion = ''; + + // Проверяем текущую версию, если файл существует + if (fs.existsSync(versionFilePath)) { + currentVersion = fs.readFileSync(versionFilePath, 'utf-8').trim(); + } + + // Проверяем, нужно ли обновление + if (currentVersion === latestVersion) { + return { success: true, updated: false, version: currentVersion }; + } + + const tempDir = path.join(appPath, 'temp'); + + // Создаем/очищаем временную директорию + if (fs.existsSync(tempDir)) { + fs.rmSync(tempDir, { recursive: true }); + } + fs.mkdirSync(tempDir, { recursive: true }); + + const zipPath = path.join(tempDir, 'Comfort.zip'); + + // Скачиваем файл + await downloadFile(COMFORT_DOWNLOAD_URL, zipPath, (progress) => { + event.sender.send('download-progress', progress); + }); + + // Проверяем архив + const fileStats = fs.statSync(zipPath); + if (fileStats.size < 1024) { + throw new Error('Downloaded file is too small, likely corrupted'); + } + + // Создаем папку versions если её нет + if (!fs.existsSync(versionsDir)) { + fs.mkdirSync(versionsDir, { recursive: true }); + } + + // Распаковываем архив напрямую в папку versions + await extract(zipPath, { dir: versionsDir }); + fs.unlinkSync(zipPath); + + // Сохраняем новую версию + fs.writeFileSync(versionFilePath, latestVersion); + + // Удаляем временную директорию + fs.rmSync(tempDir, { recursive: true }); + + // После распаковки архива и перед запуском + const versionsContents = fs.readdirSync(versionsDir); + console.log('Доступные версии:', versionsContents); + + return { success: true, updated: true, version: latestVersion }; + } catch (error) { + console.error('Error in download-and-extract:', error); + throw error; + } +}); + +async function downloadFile( + url: string, + dest: string, + progressCallback: (progress: number) => void, +): Promise { + return new Promise((resolve, reject) => { + const file = fs.createWriteStream(dest); + let downloadedSize = 0; + let totalSize = 0; + let redirectCount = 0; + + const makeRequest = (requestUrl: string) => { + https + .get(requestUrl, (response) => { + // Обрабатываем редиректы + if (response.statusCode === 301 || response.statusCode === 302) { + if (redirectCount++ > 5) { + reject(new Error('Too many redirects')); + return; + } + makeRequest(response.headers.location!); + return; + } + + if (response.statusCode !== 200) { + reject(new Error(`Server returned ${response.statusCode}`)); + return; + } + + totalSize = parseInt(response.headers['content-length'] || '0', 10); + + response.on('data', (chunk) => { + downloadedSize += chunk.length; + const progress = Math.round((downloadedSize / totalSize) * 100); + progressCallback(progress); + }); + + response.pipe(file); + + file.on('finish', () => { + file.close(); + // Проверяем, что файл скачан полностью + if (downloadedSize !== totalSize && totalSize > 0) { + fs.unlink(dest, () => { + reject(new Error('File download incomplete')); + }); + return; + } + resolve(); + }); + }) + .on('error', (err) => { + fs.unlink(dest, () => reject(err)); + }); + }; + + makeRequest(url); + }); +} + +ipcMain.handle('launch-minecraft', async (event) => { + try { + const baseVersion = '1.21.4'; + const appPath = path.dirname(app.getPath('exe')); + const minecraftDir = path.join(appPath, '.minecraft'); + const versionsDir = path.join(minecraftDir, 'versions'); + + // Определяем версию для запуска + const versionsContents = fs.readdirSync(versionsDir); + console.log('Доступные версии:', versionsContents); + + // Найти версию Comfort или версию с Fabric + let versionToLaunch = ''; + if (versionsContents.includes('1.21.4-fabric0.16.14')) { + // Использовать стандартную версию Fabric вместо Comfort + versionToLaunch = '1.21.4-fabric0.16.14'; + } else if (versionsContents.includes('Comfort')) { + versionToLaunch = 'Comfort'; + } else { + // Запасной вариант + versionToLaunch = '1.21.4'; + } + + console.log('Запускаем версию:', versionToLaunch); + + // Находим путь к Java + event.sender.send('installation-status', { + step: 'java', + message: 'Поиск Java...', + }); + const javaPath = await findJava(); + + // 1. Получаем список версий и устанавливаем ванильный Minecraft + event.sender.send('installation-status', { + step: 'minecraft-list', + message: 'Получение списка версий Minecraft...', + }); + const versionList = await getVersionList(); + const minecraftVersion = versionList.versions.find( + (v) => v.id === baseVersion, + ); + if (!minecraftVersion) { + throw new Error(`Minecraft версия ${baseVersion} не найдена`); + } + + // Устанавливаем базовую версию Minecraft + event.sender.send('installation-status', { + step: 'minecraft-install', + message: `Установка Minecraft ${baseVersion}...`, + }); + + // Переименовываем переменную, чтобы избежать конфликта с функцией + const installMcTask = installTask(minecraftVersion, minecraftDir, { + skipRevalidate: true, // Пропускать повторную проверку + }); + await installMcTask.startAndWait({ + onStart(task) { + event.sender.send('installation-status', { + step: `minecraft-install.${task.path}`, + message: `Начало: ${task.name || task.path}`, + }); + }, + onUpdate(task) { + // Убираем неиспользуемый параметр chunkSize + // Обновляем общий прогресс + const percentage = + Math.round((installMcTask.progress / installMcTask.total) * 100) || 0; + + event.sender.send('download-progress', percentage); + event.sender.send('installation-status', { + step: `minecraft-install.${task.path}`, + message: `Прогресс ${task.name || task.path}: ${percentage}% (${installMcTask.progress}/${installMcTask.total})`, + }); + }, + onFailed(task, error: Error) { + // Добавляем типизацию + event.sender.send('installation-status', { + step: `minecraft-install.${task.path}`, + message: `Ошибка: ${error.message}`, + }); + console.error(`Ошибка при установке ${task.path}:`, error); + }, + onSucceed(task) { + // Убираем неиспользуемый параметр result + event.sender.send('installation-status', { + step: `minecraft-install.${task.path}`, + message: `Завершено: ${task.name || task.path}`, + }); + }, + }); + + // 2. Устанавливаем Fabric + event.sender.send('installation-status', { + step: 'fabric-list', + message: 'Получение списка версий Fabric...', + }); + const fabricVersions = await getFabricLoaders(); + const fabricVersion = fabricVersions[0]; // Последняя версия + + if (!fabricVersion) { + throw new Error(`Не найдены версии Fabric`); + } + + event.sender.send('installation-status', { + step: 'fabric-install', + message: `Установка Fabric ${fabricVersion.version}...`, + }); + await installFabric({ + minecraftVersion: baseVersion, + version: fabricVersion.version, + minecraft: minecraftDir, + }); + + // 3. Используем идентификатор Fabric-версии + const fabricVersionId = `${baseVersion}-fabric${fabricVersion.version}`; + + // 4. Разрешаем и устанавливаем зависимости + event.sender.send('installation-status', { + step: 'version-parse', + message: 'Подготовка версии...', + }); + const resolvedVersion = await Version.parse(minecraftDir, fabricVersionId); + + event.sender.send('installation-status', { + step: 'dependencies', + message: 'Установка библиотек и ресурсов...', + }); + const depsTask = installDependenciesTask(resolvedVersion, { + assetsDownloadConcurrency: 4, + skipRevalidate: true, + prevalidSizeOnly: true, + checksumValidatorResolver: (checksum) => ({ + validate: async () => { + /* void */ + }, + }), + }); + + await depsTask.startAndWait({ + onStart(task) { + event.sender.send('installation-status', { + step: `dependencies.${task.path}`, + message: `Начало: ${task.name || task.path}`, + }); + }, + onUpdate(task, chunkSize) { + const percentage = + Math.round((depsTask.progress / depsTask.total) * 100) || 0; + + event.sender.send('download-progress', percentage); + event.sender.send('installation-status', { + step: `dependencies.${task.path}`, + message: `Установка ${task.name || task.path}: ${percentage}%`, + }); + }, + onFailed(task, error) { + event.sender.send('installation-status', { + step: `dependencies.${task.path}`, + message: `Ошибка: ${error.message}`, + }); + }, + onSucceed(task, result) { + event.sender.send('installation-status', { + step: `dependencies.${task.path}`, + message: `Завершено: ${task.name || task.path}`, + }); + }, + }); + + // 5. Запускаем Minecraft + event.sender.send('installation-status', { + step: 'launch', + message: 'Запуск игры...', + }); + const comfortDir = path.join(versionsDir, 'Comfort'); + const proc = await launch({ + // Используем папку Comfort для всех сохранений/модов/конфигов + gamePath: comfortDir, + // Указываем путь к библиотекам и ассетам + resourcePath: minecraftDir, + javaPath, + version: '1.21.4-fabric0.16.14', + extraJVMArgs: ['-Dlog4j2.formatMsgNoLookups=true'], + }); + + // Логирование + proc.stdout?.on('data', (data) => { + console.log(`Minecraft stdout: ${data}`); + }); + proc.stderr?.on('data', (data) => { + console.error(`Minecraft stderr: ${data}`); + }); + + return { success: true, pid: proc.pid }; + } catch (error) { + console.error('Ошибка при запуске Minecraft:', error); + throw error; + } +}); + const installExtensions = async () => { const installer = require('electron-devtools-installer'); const forceDownload = !!process.env.UPGRADE_EXTENSIONS; diff --git a/src/main/preload.ts b/src/main/preload.ts index 9133a79..a5460ed 100644 --- a/src/main/preload.ts +++ b/src/main/preload.ts @@ -1,8 +1,10 @@ -// Disable no-unused-vars, broken for spread args -/* eslint no-unused-vars: off */ import { contextBridge, ipcRenderer, IpcRendererEvent } from 'electron'; -export type Channels = 'ipc-example'; +export type Channels = + | 'ipc-example' + | 'download-progress' + | 'launch-minecraft' + | 'installation-status'; const electronHandler = { ipcRenderer: { @@ -21,6 +23,9 @@ const electronHandler = { once(channel: Channels, func: (...args: unknown[]) => void) { ipcRenderer.once(channel, (_event, ...args) => func(...args)); }, + invoke(channel: string, ...args: unknown[]) { + return ipcRenderer.invoke(channel, ...args); + }, }, }; diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 1247173..6d9b1ef 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -5,7 +5,7 @@ import { Navigate, } from 'react-router-dom'; import Login from './pages/Login'; -import Dashboard from './pages/Dashboard'; +import LaunchPage from './pages/LaunchPage'; import { ReactNode, useEffect, useState } from 'react'; import './App.css'; @@ -66,7 +66,7 @@ const App = () => { path="/" element={ - + } /> diff --git a/src/renderer/pages/Dashboard.tsx b/src/renderer/pages/Dashboard.tsx deleted file mode 100644 index 47c858c..0000000 --- a/src/renderer/pages/Dashboard.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Box, Typography, Button } from '@mui/material'; -import { useEffect } from 'react'; -import { useNavigate } from 'react-router-dom'; - -const Dashboard = () => { - const navigate = useNavigate(); - - useEffect(() => { - // Проверяем авторизацию при монтировании компонента - const savedConfig = localStorage.getItem('launcher_config'); - if (!savedConfig || !JSON.parse(savedConfig).accessToken) { - navigate('/login'); - } - }, [navigate]); - - const handleLogout = () => { - localStorage.removeItem('launcher_config'); - navigate('/login'); - }; - - return ( - - Добро пожаловать в лаунчер - - - ); -}; - -export default Dashboard; diff --git a/src/renderer/pages/LaunchPage.tsx b/src/renderer/pages/LaunchPage.tsx new file mode 100644 index 0000000..dccbbca --- /dev/null +++ b/src/renderer/pages/LaunchPage.tsx @@ -0,0 +1,166 @@ +import { Box, Typography, Button, Snackbar, Alert } from '@mui/material'; +import { useEffect, useState } from 'react'; +import { useNavigate } from 'react-router-dom'; + +declare global { + interface Window { + electron: { + ipcRenderer: { + invoke(channel: string, ...args: unknown[]): Promise; + on(channel: string, func: (...args: unknown[]) => void): void; + removeAllListeners(channel: string): void; + }; + }; + } +} + +const LaunchPage = () => { + const navigate = useNavigate(); + const [isDownloading, setIsDownloading] = useState(false); + const [downloadProgress, setDownloadProgress] = useState(0); + const [installStatus, setInstallStatus] = useState(''); + const [notification, setNotification] = useState<{ + open: boolean; + message: string; + severity: 'success' | 'error' | 'info'; + }>({ open: false, message: '', severity: 'info' }); + const [installStep, setInstallStep] = useState(''); + const [installMessage, setInstallMessage] = useState(''); + + useEffect(() => { + const savedConfig = localStorage.getItem('launcher_config'); + if (!savedConfig || !JSON.parse(savedConfig).accessToken) { + navigate('/login'); + } + + window.electron.ipcRenderer.on('download-progress', (progress: any) => { + setDownloadProgress(progress as number); + }); + + // Добавляем слушатель для статуса установки + window.electron.ipcRenderer.on('installation-progress', (data: any) => { + setInstallStatus((data as { status: string }).status); + }); + + // Обновляем слушатель для статуса установки + window.electron.ipcRenderer.on('installation-status', (data: any) => { + const { step, message } = data as { step: string; message: string }; + setInstallStep(step); + setInstallMessage(message); + }); + + return () => { + window.electron.ipcRenderer.removeAllListeners('download-progress'); + window.electron.ipcRenderer.removeAllListeners('installation-progress'); + window.electron.ipcRenderer.removeAllListeners('installation-status'); + }; + }, [navigate]); + + const handleLogout = () => { + localStorage.removeItem('launcher_config'); + navigate('/login'); + }; + + const showNotification = ( + message: string, + severity: 'success' | 'error' | 'info', + ) => { + setNotification({ open: true, message, severity }); + }; + + const handleCloseNotification = () => { + setNotification({ ...notification, open: false }); + }; + + const handleLaunchMinecraft = async () => { + try { + setIsDownloading(true); + setDownloadProgress(0); + + // Сначала проверяем и обновляем файлы + const downloadResult = await window.electron.ipcRenderer.invoke( + 'download-and-extract', + ); + + if (downloadResult?.success) { + if (downloadResult.updated) { + showNotification( + `Сборка успешно обновлена до версии ${downloadResult.version}`, + 'success', + ); + } else { + showNotification( + `Установлена актуальная версия сборки ${downloadResult.version}`, + 'info', + ); + } + + // Затем запускаем Minecraft + const launchResult = + await window.electron.ipcRenderer.invoke('launch-minecraft'); + + if (launchResult?.success) { + showNotification('Minecraft успешно запущен!', 'success'); + } + } + } catch (error) { + console.error('Error:', error); + showNotification(`Ошибка: ${error.message}`, 'error'); + } finally { + setIsDownloading(false); + } + }; + + return ( + + + Добро пожаловать в лаунчер + + + {isDownloading ? ( + + Загрузка и установка: {downloadProgress}% + {installMessage && ( + + {installMessage} + + )} + {installStep && ( + + Шаг: {installStep} + + )} + + ) : ( + + )} + + + + + + {notification.message} + + + + ); +}; + +export default LaunchPage;