From 3905395e9e53c6f54ceaf7d1ea695e5f102e4816 Mon Sep 17 00:00:00 2001 From: Miles <461045745@qq.com> Date: Mon, 20 Nov 2023 21:15:06 +0800 Subject: [PATCH 1/9] Update ci.yml --- .github/workflows/ci.yml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c938a83..6e7f3a4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,8 +9,6 @@ on: paths-ignore: - '.github/**' - '!.github/workflows/ci.yml' - - '!.github/workflows/typechecking.yml' - - '!.github/workflows/tests.yml' - '!.github/workflows/release.yml' - '**.md' - .editorconfig @@ -21,8 +19,6 @@ on: paths-ignore: - '.github/**' - '!.github/workflows/ci.yml' - - '!.github/workflows/typechecking.yml' - - '!.github/workflows/tests.yml' - '!.github/workflows/release.yml' - '**.md' - .editorconfig @@ -35,15 +31,11 @@ concurrency: cancel-in-progress: true jobs: - typechecking: - uses: ./.github/workflows/typechecking.yml - tests: - uses: ./.github/workflows/tests.yml draft_release: permissions: contents: write # Allows this job to create releases with: dry-run: ${{ github.event_name != 'push' || github.ref_name != 'main' }} - needs: [ typechecking, tests ] + needs: [] uses: ./.github/workflows/release.yml From cd2a93e123a3a08c8119e887bb4f064442c8878d Mon Sep 17 00:00:00 2001 From: Miles <461045745@qq.com> Date: Mon, 20 Nov 2023 21:18:34 +0800 Subject: [PATCH 2/9] Update release.yml --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6cb41af..54e05e7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -30,7 +30,7 @@ jobs: strategy: fail-fast: true matrix: - os: [ macos-latest, ubuntu-latest, windows-latest ] + os: [ windows-latest ] runs-on: ${{ matrix.os }} From f9edd951c5ab2afb38f70ee7989b98705e2add19 Mon Sep 17 00:00:00 2001 From: zmzimpl Date: Mon, 20 Nov 2023 21:49:57 +0800 Subject: [PATCH 3/9] release test --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index b8a8a8b..be8d30d 100644 --- a/package.json +++ b/package.json @@ -11,13 +11,13 @@ "main": "packages/main/dist/index.cjs", "scripts": { "build:native-addon": "cd ./packages/main/src/native-addon && node-gyp configure && node-gyp build", - "build": "npm run rebuild && npm run build:main && npm run build:preload && npm run build:renderer", + "build": "npm run build:main && npm run build:preload && npm run build:renderer", "build:main": "cd ./packages/main && vite build", "build:preload": "cd ./packages/preload && vite build", "build:renderer": "cd ./packages/renderer && vite build", "rebuild": "electron-rebuild -f -w ./node_modules/.bin/electron-rebuild.cmd", - "compile": "npm run rebuild && cross-env MODE=production npm run build && electron-builder build --config .electron-builder.config.js --dir --config.asar=false", - "publish": "npm run rebuild && cross-env MODE=production npm run build && electron-builder build --config .electron-builder.config.js --config.asar=false", + "compile": "cross-env MODE=production npm run build && electron-builder build --config .electron-builder.config.js --dir --config.asar=false", + "publish": "cross-env MODE=production npm run build && electron-builder build --config .electron-builder.config.js --config.asar=false", "test": "npm run test:main && npm run test:preload && npm run test:renderer && npm run test:e2e", "test:e2e": "npm run build && vitest run", "test:main": "vitest run -r packages/main --passWithNoTests", @@ -29,7 +29,7 @@ "typecheck:preload": "tsc --noEmit -p packages/preload/tsconfig.json", "typecheck:renderer": "tsc --noEmit -p packages/renderer/tsconfig.json", "typecheck": "npm run typecheck:main && npm run typecheck:preload && npm run typecheck:renderer", - "postinstall": "cross-env ELECTRON_RUN_AS_NODE=1 electron scripts/update-electron-vendors.mjs", + "postinstall": "electron-builder install-app-deps && cross-env ELECTRON_RUN_AS_NODE=1 electron scripts/update-electron-vendors.mjs", "format": "npx prettier --write \"**/*.{js,mjs,cjs,ts,mts,cts,vue,json}\"" }, "devDependencies": { From c4acfd84d047e71fc861a62d57e88a63fb579c2b Mon Sep 17 00:00:00 2001 From: zmzimpl Date: Tue, 21 Nov 2023 11:31:51 +0800 Subject: [PATCH 4/9] fix package native addon path error --- .electron-builder.config.js | 14 ++++++-------- .github/workflows/release.yml | 2 +- README.md | 1 + package.json | 6 ++---- packages/main/src/index.ts | 1 + packages/main/src/sync/tile.ts | 19 +++++++++++++------ scripts/watch.mjs | 1 + 7 files changed, 25 insertions(+), 19 deletions(-) diff --git a/.electron-builder.config.js b/.electron-builder.config.js index a304251..525fd3f 100644 --- a/.electron-builder.config.js +++ b/.electron-builder.config.js @@ -10,7 +10,7 @@ */ module.exports = async function () { const {getVersion} = await import('./version/getVersion.mjs'); - + console.log(process.env.MODE); return { productName: 'chrome-power-beta', directories: { @@ -18,17 +18,15 @@ module.exports = async function () { buildResources: 'buildResources', }, files: ['packages/**/dist/**', 'packages/**/assets/**', 'migrations'], - extraResources: { - "from": "packages/main/src/native-addon/build/Release/", - "to": "app/packages/main/native-addon/build/Release/", - "filter": [ - "*.node" - ] + extraResources: { + from: 'packages/main/src/native-addon/build/Release/', + to: 'app.asar.unpacked/node_modules/window-addon/', + filter: ['*.node'], }, extraMetadata: { version: getVersion(), }, - + asarUnpack: ['**/*.node'], nsis: { oneClick: false, allowElevation: true, diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 54e05e7..758aefa 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -56,7 +56,7 @@ jobs: retry_wait_seconds: 15 retry_on: error shell: 'bash' - command: npx --no-install electron-builder --config .electron-builder.config.js --publish ${{ inputs.dry-run && 'never' || 'always' }} + command: ./node_modules/.bin/electron-builder --config .electron-builder.config.js --publish ${{ inputs.dry-run && 'never' || 'always' }} env: # Code Signing params # See https://www.electron.build/code-signing diff --git a/README.md b/README.md index 7082b51..8ddfb72 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ Follow the steps below to start using this software: ## Todo +- [ ] Mutiple Languages Support - [ ] Synchronization - [ ] Cookies Import - [ ] Extensions Management diff --git a/package.json b/package.json index be8d30d..8a892b8 100644 --- a/package.json +++ b/package.json @@ -15,9 +15,8 @@ "build:main": "cd ./packages/main && vite build", "build:preload": "cd ./packages/preload && vite build", "build:renderer": "cd ./packages/renderer && vite build", - "rebuild": "electron-rebuild -f -w ./node_modules/.bin/electron-rebuild.cmd", "compile": "cross-env MODE=production npm run build && electron-builder build --config .electron-builder.config.js --dir --config.asar=false", - "publish": "cross-env MODE=production npm run build && electron-builder build --config .electron-builder.config.js --config.asar=false", + "publish": "cross-env MODE=production npm run build && node_modules\\.bin\\electron-builder --config .electron-builder.config.js --publish never", "test": "npm run test:main && npm run test:preload && npm run test:renderer && npm run test:e2e", "test:e2e": "npm run build && vitest run", "test:main": "vitest run -r packages/main --passWithNoTests", @@ -29,11 +28,10 @@ "typecheck:preload": "tsc --noEmit -p packages/preload/tsconfig.json", "typecheck:renderer": "tsc --noEmit -p packages/renderer/tsconfig.json", "typecheck": "npm run typecheck:main && npm run typecheck:preload && npm run typecheck:renderer", - "postinstall": "electron-builder install-app-deps && cross-env ELECTRON_RUN_AS_NODE=1 electron scripts/update-electron-vendors.mjs", + "postinstall": "node_modules\\.bin\\electron-builder install-app-deps && cross-env ELECTRON_RUN_AS_NODE=1 electron scripts/update-electron-vendors.mjs", "format": "npx prettier --write \"**/*.{js,mjs,cjs,ts,mts,cts,vue,json}\"" }, "devDependencies": { - "@electron/rebuild": "^3.3.0", "@iconify/react": "^4.1.1", "@types/lodash": "^4.14.199", "@types/node": "18.17.19", diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts index 862fca9..5be6510 100644 --- a/packages/main/src/index.ts +++ b/packages/main/src/index.ts @@ -93,6 +93,7 @@ app * if you compile production app without publishing it to distribution server. * Like `npm run compile` does. It's ok 😅 */ +console.log(import.meta.env); logger.info(`env, ${import.meta.env.PROD ? 'true' : 'false'}`); if (import.meta.env.PROD) { app diff --git a/packages/main/src/sync/tile.ts b/packages/main/src/sync/tile.ts index 7abe110..ddb4b03 100644 --- a/packages/main/src/sync/tile.ts +++ b/packages/main/src/sync/tile.ts @@ -1,16 +1,23 @@ import type {SafeAny} from '../../../shared/types/db'; let windowAddon: unknown; - -console.log(process.env.NODE_ENV); -if (process.env.NODE_ENV === 'production') { - windowAddon = require('../native-addon/build/Release/window-addon.node'); -} else { - const path = require('path'); +import * as path from 'path'; +import {createLogger} from '../../../shared/utils/logger'; +const logger = createLogger('Tile'); +logger.warn(`process.env.MODE${process.env.MODE}`); +if (process.env.MODE === 'development') { windowAddon = require(path.join( __dirname, '../src/native-addon/build/Release/window-addon.node', )); +} else { + windowAddon = require(path.join( + process.resourcesPath, + 'app.asar.unpacked', + 'node_modules', + 'window-addon', + 'window-addon.node', + )); } export const tileWindows = async () => { (windowAddon as unknown as SafeAny)!.tileChromeWindows(); diff --git a/scripts/watch.mjs b/scripts/watch.mjs index 17d0f5d..66bd4d2 100644 --- a/scripts/watch.mjs +++ b/scripts/watch.mjs @@ -5,6 +5,7 @@ import electronPath from 'electron'; import {spawn} from 'child_process'; /** @type 'production' | 'development'' */ +console.log(process.env.MODE); const mode = (process.env.MODE = process.env.MODE || 'development'); /** @type {import('vite').LogLevel} */ From 576e687bc7f0cb9e59ecb8788c125217fd8f26cb Mon Sep 17 00:00:00 2001 From: zmzimpl Date: Tue, 21 Nov 2023 21:03:41 +0800 Subject: [PATCH 5/9] fix ua detected by creepjs --- .electron-builder.config.js | 18 +- package-lock.json | 1258 +---------------- packages/main/src/fingerprint/index.ts | 83 +- packages/main/src/index.ts | 3 +- packages/main/src/mainWindow.ts | 2 +- packages/main/src/sync/tile.ts | 3 - .../src/components/navigation/index.css | 2 +- .../renderer/src/pages/settings/index.tsx | 1 - packages/renderer/src/pages/windows/index.tsx | 2 +- scripts/watch.mjs | 1 - 10 files changed, 114 insertions(+), 1259 deletions(-) diff --git a/.electron-builder.config.js b/.electron-builder.config.js index 525fd3f..4d1174e 100644 --- a/.electron-builder.config.js +++ b/.electron-builder.config.js @@ -10,7 +10,6 @@ */ module.exports = async function () { const {getVersion} = await import('./version/getVersion.mjs'); - console.log(process.env.MODE); return { productName: 'chrome-power-beta', directories: { @@ -18,11 +17,18 @@ module.exports = async function () { buildResources: 'buildResources', }, files: ['packages/**/dist/**', 'packages/**/assets/**', 'migrations'], - extraResources: { - from: 'packages/main/src/native-addon/build/Release/', - to: 'app.asar.unpacked/node_modules/window-addon/', - filter: ['*.node'], - }, + extraResources: [ + { + from: 'packages/main/src/native-addon/build/Release/', + to: 'app.asar.unpacked/node_modules/window-addon/', + filter: ['*.node'], + }, + { + from: 'packages/main/src/fingerprint/fingerprint-injector/', + to: 'app.asar.unpacked/node_modules/fingerprint-injector/', + filter: ['*.js'], + }, + ], extraMetadata: { version: getVersion(), }, diff --git a/package-lock.json b/package-lock.json index de2ff9e..abf2733 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,6 @@ "xlsx": "^0.19.3" }, "devDependencies": { - "@electron/rebuild": "^3.3.0", "@iconify/react": "^4.1.1", "@types/lodash": "^4.14.199", "@types/node": "18.17.19", @@ -867,441 +866,6 @@ "node": ">= 10.0.0" } }, - "node_modules/@electron/rebuild": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.3.0.tgz", - "integrity": "sha512-S1vgpzIOS1wCJmsYjdLz97MTUV6UTLcMk/HE3w90HYtVxvW+PQdwxLbgsrECX2bysqcnmM5a0K6mXj/gwVgYtQ==", - "dev": true, - "dependencies": { - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "detect-libc": "^2.0.1", - "fs-extra": "^10.0.0", - "got": "^11.7.0", - "node-abi": "^3.45.0", - "node-api-version": "^0.1.4", - "node-gyp": "^9.0.0", - "ora": "^5.1.0", - "semver": "^7.3.5", - "tar": "^6.0.5", - "yargs": "^17.0.1" - }, - "bin": { - "electron-rebuild": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@electron/rebuild/node_modules/@malept/cross-spawn-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/@electron/rebuild/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@electron/rebuild/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/rebuild/node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@electron/rebuild/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@electron/rebuild/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/rebuild/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/rebuild/node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/rebuild/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@electron/rebuild/node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/@electron/rebuild/node_modules/node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/@electron/rebuild/node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@electron/rebuild/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@electron/rebuild/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@electron/rebuild/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@electron/universal": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz", @@ -1756,7 +1320,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "devOptional": true + "optional": true }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.11", @@ -3498,7 +3062,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "devOptional": true, + "optional": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -3969,31 +3533,6 @@ "node": ">=8" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -4549,30 +4088,6 @@ "node": ">=6" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", - "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-truncate": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", @@ -4603,15 +4118,6 @@ "node": ">=12" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -4959,18 +4465,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -6519,7 +6013,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "devOptional": true, + "optional": true, "dependencies": { "ms": "^2.0.0" } @@ -6638,7 +6132,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "devOptional": true + "optional": true }, "node_modules/inflight": { "version": "1.0.6", @@ -6744,15 +6238,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -6800,18 +6285,6 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -7202,22 +6675,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/logform": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", @@ -7410,15 +6867,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -7698,40 +7146,19 @@ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node_modules/node-abi": { - "version": "3.51.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.51.0.tgz", - "integrity": "sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" + "node": ">= 0.4.0" } }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, "node_modules/node-addon-api": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==" }, - "node_modules/node-api-version": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.1.4.tgz", - "integrity": "sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - } - }, "node_modules/node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -11045,21 +10472,6 @@ "fn.name": "1.x.x" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -11077,29 +10489,6 @@ "node": ">= 0.8.0" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -11644,7 +11033,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "devOptional": true + "optional": true }, "node_modules/promise-retry": { "version": "2.0.1", @@ -12669,19 +12058,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -14451,15 +13827,6 @@ "node": ">=10.13.0" } }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -15411,257 +14778,23 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.1.0.tgz", "integrity": "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", - "promise-retry": "^2.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "@electron/osx-sign": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", - "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", - "dev": true, - "requires": { - "compare-version": "^0.1.2", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "isbinaryfile": "^4.0.8", - "minimist": "^1.2.6", - "plist": "^3.0.5" - }, - "dependencies": { - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "@electron/rebuild": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.3.0.tgz", - "integrity": "sha512-S1vgpzIOS1wCJmsYjdLz97MTUV6UTLcMk/HE3w90HYtVxvW+PQdwxLbgsrECX2bysqcnmM5a0K6mXj/gwVgYtQ==", - "dev": true, - "requires": { - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "detect-libc": "^2.0.1", - "fs-extra": "^10.0.0", - "got": "^11.7.0", - "node-abi": "^3.45.0", - "node-api-version": "^0.1.4", - "node-gyp": "^9.0.0", - "ora": "^5.1.0", - "semver": "^7.3.5", - "tar": "^6.0.5", - "yargs": "^17.0.1" - }, - "dependencies": { - "@malept/cross-spawn-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "dependencies": { - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - } - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "fs-extra": "^9.0.1", + "promise-retry": "^2.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { - "agent-base": "6", - "debug": "4" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, "jsonfile": { @@ -15674,159 +14807,59 @@ "universalify": "^2.0.0" } }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true - }, - "make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - } - }, - "node-gyp": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", - "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - } - }, - "nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "requires": { - "abbrev": "^1.0.0" - } - }, - "npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + } + } + }, + "@electron/osx-sign": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", + "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "dev": true, + "requires": { + "compare-version": "^0.1.2", + "debug": "^4.3.4", + "fs-extra": "^10.0.0", + "isbinaryfile": "^4.0.8", + "minimist": "^1.2.6", + "plist": "^3.0.5" + }, + "dependencies": { + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dev": true, "requires": { - "minipass": "^3.1.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } }, - "unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "requires": { - "unique-slug": "^3.0.0" - } + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true }, - "unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { - "imurmurhash": "^0.1.4" + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" } }, "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true } } @@ -16060,7 +15093,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "devOptional": true + "optional": true }, "@humanwhocodes/config-array": { "version": "0.11.11", @@ -17393,7 +16426,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "devOptional": true, + "optional": true, "requires": { "humanize-ms": "^1.2.1" } @@ -17752,30 +16785,6 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -18173,21 +17182,6 @@ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", - "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", - "dev": true - }, "cli-truncate": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", @@ -18209,12 +17203,6 @@ "wrap-ansi": "^7.0.0" } }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - }, "clone-response": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", @@ -18485,15 +17473,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, "defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -19692,7 +18671,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "devOptional": true, + "optional": true, "requires": { "ms": "^2.0.0" } @@ -19771,7 +18750,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "devOptional": true + "optional": true }, "inflight": { "version": "1.0.6", @@ -19853,12 +18832,6 @@ "is-extglob": "^2.1.1" } }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, "is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -19894,12 +18867,6 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -20191,16 +19158,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, "logform": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", @@ -20346,12 +19303,6 @@ "mime-db": "1.51.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -20571,29 +19522,11 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, - "node-abi": { - "version": "3.51.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.51.0.tgz", - "integrity": "sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, "node-addon-api": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==" }, - "node-api-version": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.1.4.tgz", - "integrity": "sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, "node-fetch": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", @@ -22725,15 +21658,6 @@ "fn.name": "1.x.x" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, "optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -22748,23 +21672,6 @@ "type-check": "^0.4.0" } }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - }, "p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -23129,7 +22036,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "devOptional": true + "optional": true }, "promise-retry": { "version": "2.0.1", @@ -23846,16 +22753,6 @@ "lowercase-keys": "^2.0.0" } }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -25161,15 +24058,6 @@ "graceful-fs": "^4.1.2" } }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, "webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/packages/main/src/fingerprint/index.ts b/packages/main/src/fingerprint/index.ts index 8ca6f42..ae0d71b 100644 --- a/packages/main/src/fingerprint/index.ts +++ b/packages/main/src/fingerprint/index.ts @@ -36,7 +36,16 @@ const getPublicIP = async () => { }; const attachFingerprintToPuppeteer = async (page: Page, ipInfo: IP, fingerprint: SafeAny) => { + logger.info('set fingerprint'); const {userAgent, userAgentData} = fingerprint?.fingerprint?.navigator || {}; + if (userAgent) { + await page.setUserAgent(userAgent, userAgentData); + const client = await page.target().createCDPSession(); + await client.send('Network.setUserAgentOverride', { + userAgent: userAgent, + userAgentMetadata: userAgentData, + }); + } page.on('framenavigated', async _msg => { const title = await page.title(); if (!title.includes('By ChromePower')) { @@ -44,71 +53,18 @@ const attachFingerprintToPuppeteer = async (page: Page, ipInfo: IP, fingerprint: document.title = title + ' By ChromePower'; }, title); } - if (userAgent) { - await page.setUserAgent(userAgent, userAgentData); - const client = await page.target().createCDPSession(); - await client.send('Network.setUserAgentOverride', { - userAgent: userAgent, - }); - } + await page.setGeolocation({latitude: ipInfo.ll[0], longitude: ipInfo.ll[1]}); await page.emulateTimezone(ipInfo.timeZone); }); await page.evaluateOnNewDocument( 'navigator.mediaDevices.getUserMedia = navigator.webkitGetUserMedia = navigator.mozGetUserMedia = navigator.getUserMedia = webkitRTCPeerConnection = RTCPeerConnection = MediaStreamTrack = undefined;', ); - await page.evaluateOnNewDocument( - (userAgent, userAgentData) => { - // 将 userAgentData 对象转换为字符串 - const userAgentDataString = JSON.stringify(userAgentData); - const modifyWorker = (originalWorker: SafeAny) => { - return function (scriptURL: SafeAny, options: SafeAny) { - const modifiedCode = ` - // 修改 navigator 对象的代码 - const originalNavigator = navigator; - navigator = new Proxy(originalNavigator, { - get(target, prop) { - if (prop === 'userAgent') { - return '${userAgent}'; - } - if (prop === 'platform') { - return '${userAgentData.platform}'; - } - if (prop === 'userAgentData') { - // 将 userAgentDataString 转换回对象 - return JSON.parse('${userAgentDataString}'); - } - // 可以继续添加其他属性的处理 - return target[prop]; - } - }); - `; - - const blob = new Blob([modifiedCode + `importScripts('${scriptURL}');`], { - type: 'application/javascript', - }); - const blobURL = URL.createObjectURL(blob); - return new originalWorker(blobURL, options); - }; - }; - - (window.Worker as SafeAny) = modifyWorker(window.Worker); - (window.SharedWorker as SafeAny) = modifyWorker(window.SharedWorker); - - const originalRegister = navigator.serviceWorker.register; - navigator.serviceWorker.register = function (scriptURL, options) { - return originalRegister.call(this, scriptURL, options); - }; - }, - userAgent, - userAgentData, - ); }; async function connectBrowser(port: number, ipInfo: IP, fingerprint: SafeAny) { const browserURL = `http://${HOST}:${port}`; const browser = await puppeteer.connect({browserURL, defaultViewport: null}); - // const injector = new FingerprintInjector(); browser.on('targetcreated', async target => { const newPage = await target.page(); @@ -117,22 +73,31 @@ async function connectBrowser(port: number, ipInfo: IP, fingerprint: SafeAny) { } }); const pages = await browser.pages(); + console.log(pages[0].url()); const page = - pages.length && pages[0].url() === 'about:blank' ? pages[0] : await browser.newPage(); + pages.length && + (pages[0].url() === 'about:blank' || + !pages[0].url() || + pages[0].url() === 'chrome://new-tab-page/') + ? pages[0] + : await browser.newPage(); try { - await page.goto('https://ip.me'); + await attachFingerprintToPuppeteer(page, ipInfo, fingerprint); + await page.goto('https://abrahamjuliot.github.io/creepjs/'); } catch (error) { logger.error(error); } } -const fetchWindowFingerprint = async (id: number) => { +const fetchWindowFingerprint = async (id: number, profileId: string) => { try { const {data: fingerprint} = await api.get('/power-api/fingerprints/window', { params: { windowId: id, + profileId: profileId, }, }); + console.log(fingerprint); return fingerprint; } catch (error) { logger.error(error); @@ -164,7 +129,8 @@ export async function openFingerprintWindow(id: number) { const localIp = await getPublicIP(); ipInfo = await getProxyInfo(localIp, 'ip2location'); } - const fingerprint = await fetchWindowFingerprint(id); + const fingerprint = await fetchWindowFingerprint(id, windowData.profile_id); + console.log(fingerprint?.fingerprint?.navigator?.userAgent); if (chromePath) { const chromePort = await portscanner.findAPortNotInUse(9222, 10222); let finalProxy; @@ -182,6 +148,7 @@ export async function openFingerprintWindow(id: number) { const launchParamter = [ `--remote-debugging-port=${chromePort}`, `--user-data-dir=${windowDataDir}`, + `--user-agent=${fingerprint?.fingerprint?.navigator?.userAgent}`, ]; if (finalProxy) { diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts index 5be6510..e521fa7 100644 --- a/packages/main/src/index.ts +++ b/packages/main/src/index.ts @@ -93,8 +93,7 @@ app * if you compile production app without publishing it to distribution server. * Like `npm run compile` does. It's ok 😅 */ -console.log(import.meta.env); -logger.info(`env, ${import.meta.env.PROD ? 'true' : 'false'}`); +logger.info(`env, is prod:, ${import.meta.env.PROD ? 'true' : 'false'}`); if (import.meta.env.PROD) { app .whenReady() diff --git a/packages/main/src/mainWindow.ts b/packages/main/src/mainWindow.ts index afdcac5..087899a 100644 --- a/packages/main/src/mainWindow.ts +++ b/packages/main/src/mainWindow.ts @@ -3,7 +3,7 @@ import {join, resolve} from 'node:path'; async function createWindow() { const browserWindow = new BrowserWindow({ - width: 1920, + width: import.meta.env.DEV ? 1920 : 1600, height: 930, minWidth: 920, minHeight: 700, diff --git a/packages/main/src/sync/tile.ts b/packages/main/src/sync/tile.ts index ddb4b03..e2435d2 100644 --- a/packages/main/src/sync/tile.ts +++ b/packages/main/src/sync/tile.ts @@ -2,9 +2,6 @@ import type {SafeAny} from '../../../shared/types/db'; let windowAddon: unknown; import * as path from 'path'; -import {createLogger} from '../../../shared/utils/logger'; -const logger = createLogger('Tile'); -logger.warn(`process.env.MODE${process.env.MODE}`); if (process.env.MODE === 'development') { windowAddon = require(path.join( __dirname, diff --git a/packages/renderer/src/components/navigation/index.css b/packages/renderer/src/components/navigation/index.css index d52e3a3..6eb3e94 100644 --- a/packages/renderer/src/components/navigation/index.css +++ b/packages/renderer/src/components/navigation/index.css @@ -1,7 +1,7 @@ .membership { position: absolute; - bottom: 8px; + bottom: 0px; height: 70px; width: calc(100% - 16px); margin: 8px; diff --git a/packages/renderer/src/pages/settings/index.tsx b/packages/renderer/src/pages/settings/index.tsx index 41e5f78..c74cc7f 100644 --- a/packages/renderer/src/pages/settings/index.tsx +++ b/packages/renderer/src/pages/settings/index.tsx @@ -22,7 +22,6 @@ const Settings = () => { const handleChoosePath = async () => { const path = await CommonBridge.choosePath(); handleFormValueChange({profileCachePath: path}); - console.log(path); }; const handleFormValueChange = (changed: SettingOptions) => { diff --git a/packages/renderer/src/pages/windows/index.tsx b/packages/renderer/src/pages/windows/index.tsx index c6885a4..1031041 100644 --- a/packages/renderer/src/pages/windows/index.tsx +++ b/packages/renderer/src/pages/windows/index.tsx @@ -182,7 +182,7 @@ const Windows = () => { title: 'Action', key: 'operation', fixed: 'right', - width: 100, + width: 110, align: 'center', render: (_, recorder) => (

)} @@ -146,18 +150,18 @@ const App = () => { className="font-semibold leading-6" onClick={() => setView(views[2])} > - Forgot your password? + {t('account_forgot_password')}

- Don't have an account?{' '} + {t('account_do_not_have')}{' '}

@@ -170,7 +174,7 @@ const App = () => { className="font-semibold leading-6" onClick={() => setView(views[0])} > - Sign In + {t('account_sign_in')}

diff --git a/packages/renderer/src/components/header/index.tsx b/packages/renderer/src/components/header/index.tsx index bc31d88..0f10fe5 100644 --- a/packages/renderer/src/components/header/index.tsx +++ b/packages/renderer/src/components/header/index.tsx @@ -12,10 +12,12 @@ import logo from '../../../assets/logo.png'; import {supabase} from '../../../../shared/interfaces/supabaseClient'; import {Icon} from '@iconify/react'; import {useNavigate} from 'react-router-dom'; +import {useTranslation} from 'react-i18next'; const {Header: AntdHeader} = Layout; export default function Header() { + const {t, i18n} = useTranslation(); const [isMaximized, setIsMaximized] = useState(false); const navigate = useNavigate(); const checkIfMaximized = async () => { @@ -31,14 +33,34 @@ export default function Header() { const items: MenuProps['items'] = [ { - label: 'Settings', + label: t('header_settings'), key: 'settings', }, + { + label: t('header_language'), + key: 'language', + children: [ + { + label: 'English', + key: 'en', + onClick: () => { + i18n.changeLanguage('en'); + }, + }, + { + label: '简体中文', + key: 'zh-cn', + onClick: () => { + i18n.changeLanguage('zh'); + }, + }, + ], + }, { type: 'divider', }, { - label: 'Sign out', + label: t('header_sign_out'), key: 'signout', }, ]; diff --git a/packages/renderer/src/components/navigation/index.tsx b/packages/renderer/src/components/navigation/index.tsx index d5a3dc5..8b7c1eb 100644 --- a/packages/renderer/src/components/navigation/index.tsx +++ b/packages/renderer/src/components/navigation/index.tsx @@ -1,6 +1,6 @@ import {Button, Menu, type MenuProps, Row, Col} from 'antd'; import type {MenuInfo} from 'rc-menu/lib/interface'; -import {routes} from '/@/routes'; +import {useRoutes} from '/@/routes'; import {useLocation, useNavigate} from 'react-router-dom'; import {PlusCircleOutlined} from '@ant-design/icons'; import type {RootState} from '/@/store'; @@ -9,6 +9,7 @@ import {useEffect} from 'react'; import './index.css'; import Link from 'antd/es/typography/Link'; import React from 'react'; +import { t } from 'i18next'; export interface MembershipOptions { expiredAt?: string; @@ -19,10 +20,12 @@ export interface MembershipOptions { } export default function Navigation() { + const routes = useRoutes(); const navigate = useNavigate(); const location = useLocation(); const membership = useSelector((state: RootState) => state.user.membership); const [formattedMembership, setFormattedMembership] = React.useState(); + const [menuItems, setMenuItems] = React.useState([]); const dateFormater = (date: string) => { if (!date) return; @@ -39,17 +42,19 @@ export default function Navigation() { }); }, [membership]); - const menuItems: MenuProps['items'] = routes - .filter(r => !r.invisible) - .map(route => { - return { - key: route.path, - icon: route.icon, - label: route.name, - }; - }); - - menuItems.splice(3, 0, {type: 'divider'}); + useEffect(() => { + const menuItemsTemp: MenuProps['items'] = routes + .filter(r => !r.invisible) + .map(route => { + return { + key: route.path, + icon: route.icon, + label: route.name, + }; + }); + menuItemsTemp.splice(3, 0, {type: 'divider'}); + setMenuItems(menuItemsTemp); + }, [routes]); const onItemClicked = (info: MenuInfo) => { navigate(info.key); @@ -67,7 +72,7 @@ export default function Navigation() { }} icon={} > - New Window + {t('new_window')} - {formattedMembership.expiredAt ? 'Renew' : 'Upgrade'} + {formattedMembership.expiredAt ? t('membership_renew') : t('membership_upgrade')} @@ -104,7 +109,7 @@ export default function Navigation() { span={10} className="text-xs" > -
Windows
+
{t('membership_window_count')}
document.body, }; diff --git a/packages/renderer/src/i18n.ts b/packages/renderer/src/i18n.ts new file mode 100644 index 0000000..fdea32e --- /dev/null +++ b/packages/renderer/src/i18n.ts @@ -0,0 +1,204 @@ +import i18n from 'i18next'; +import {initReactI18next} from 'react-i18next'; +import LanguageDetector from 'i18next-browser-languagedetector'; + +i18n + .use(LanguageDetector) + .use(initReactI18next) + .init({ + resources: { + en: { + translation: { + account_already_have: 'Account already have an account?', + account_sign_in: 'Sign in', + account_sign_up: 'Sign up', + account_sign_out: 'Sign out', + account_forgot_password: 'Forgot password?', + account_reset_password: 'Reset password', + account_do_not_have: "Don't have an account?", + sign_in: 'Sign in', + sign_up: 'Sign up', + sign_out: 'Sign out', + forgot_password: 'Forgot password', + forgotten_password_desc: 'Enter your email and we will send you a link to reset your password.', + update_password: 'Update password', + + new_window: 'New window', + edit_window: 'Edit window', + + window_open: 'Open', + window_close: 'Close', + window_edit: 'Edit', + window_delete: 'Delete', + window_proxy_setting: 'Proxy setting', + window_running: 'Running', + window_column_profile_id: 'Profile ID', + window_column_proxy: 'Proxy', + window_column_group: 'Group', + window_column_remark: 'Remark', + window_column_name: 'Name', + window_column_tags: 'Tags', + window_column_last_open: 'Last open', + window_column_created_at: 'Created at', + window_column_action: 'Action', + window_edit_form_name: 'Name', + window_edit_form_remark: 'Remark', + window_edit_form_group: 'Group', + window_edit_form_proxy: 'Proxy', + window_edit_form_tags: 'Tags', + + proxy_check: 'Check', + proxy_new_proxy: 'New proxy', + proxy_edit: 'Edit', + proxy_delete: 'Delete', + proxy_column_type: 'Proxy Type', + proxy_column_status: 'Status', + proxy_column_country: 'IP Country', + proxy_column_remark: 'Remark', + proxy_column_checker: 'IP Checker', + proxy_import_tip: `Instructions: + 1. If the proxy type is not specified, it will default to HTTP type. + 2. Only HTTP and SOCKS5 proxy types are supported. + 3. Enter one proxy per line. + 4. Only IPv4 addresses are supported for the host. + Input format (IPv4 only): + 192.168.0.1:8000{remark} + 192.168.0.1:8000:proxy_username:proxy_password{remark} + socks5://192.168.0.1:8000{remark} + socks5://192.168.0.1:8000:proxy_username:proxy_password{remark}`, + proxy_check_all: 'Check all', + proxy_total: 'Total', + proxy_import_column_type: 'Type', + proxy_import_column_host: 'Host', + proxy_import_column_port: 'Port', + proxy_import_column_username: 'Username', + proxy_import_column_password: 'Password', + proxy_import_column_remark: 'Remark', + proxy_import_column_status: 'Status', + + + tile_windows: 'Tile window', + + settings_cache_path: 'Cache path', + settings_choose_cache_path: 'Choose path', + + footer_ok: 'OK', + footer_cancel: 'Cancel', + + new_proxy: 'New proxy', + + menu_windows: 'Windows', + menu_proxy: 'Proxy', + menu_settings: 'Settings', + menu_sync: 'Sync', + + membership_renew: 'Renew', + membership_upgrade: 'Upgrade', + membership_window_count: 'Windows', + + header_language: 'Language', + header_settings: 'Settings', + header_sign_out: 'Sign out', + }, + }, + zh: { + translation: { + account_already_have: '已有账号?', + account_sign_in: '登录', + account_sign_up: '注册', + account_sign_out: '退出', + account_forgot_password: '忘记密码?', + account_reset_password: '重置密码', + account_do_not_have: '没有账号?', + sign_in: '登录', + sign_up: '注册', + sign_out: '退出', + forgot_password: '忘记密码', + forgotten_password_desc: '输入您的电子邮件,我们将向您发送重置密码的链接。', + update_password: '更新密码', + + new_window: '新建窗口', + edit_window: '编辑窗口', + + window_open: '打开', + window_close: '关闭', + window_edit: '编辑', + window_delete: '删除', + window_proxy_setting: '代理设置', + window_running: '运行中', + window_column_profile_id: '缓存目录', + window_column_proxy: '代理', + window_column_group: '分组', + window_column_remark: '备注', + window_column_name: '名称', + window_column_tags: '标签', + window_column_last_open: '最后打开', + window_column_created_at: '创建时间', + window_column_action: '操作', + window_edit_form_name: '名称', + window_edit_form_remark: '备注', + window_edit_form_group: '分组', + window_edit_form_proxy: '代理', + window_edit_form_tags: '标签', + + proxy_check: '检查', + proxy_new_proxy: '新建代理', + proxy_edit: '编辑', + proxy_delete: '删除', + proxy_column_type: '代理类型', + proxy_column_status: '状态', + proxy_column_country: 'IP 地区', + proxy_column_remark: '备注', + proxy_column_checker: '检查方式', + proxy_import_tip: `说明 + 1. 如果未指定代理类型,则默认为 HTTP 类型。 + 2. 仅支持 HTTP 和 SOCKS5 代理类型。 + 3. 每行输入一个代理。 + 4. 主机只支持 IPv4 地址。 + 输入格式(仅限 IPv4): + 192.168.0.1:8000{remark} + 192.168.0.1:8000:proxy_username:proxy_password{remark} + socks5://192.168.0.1:8000{remark} + socks5://192.168.0.1:8000:proxy_username:proxy_password{remark}`, + proxy_check_all: '检查全部', + proxy_total: '总数', + proxy_import_column_type: '类型', + proxy_import_column_host: '主机', + proxy_import_column_port: '端口', + proxy_import_column_username: '用户名', + proxy_import_column_password: '密码', + proxy_import_column_remark: '备注', + proxy_import_column_status: '状态', + + tile_windows: '平铺窗口', + + settings_cache_path: '缓存目录', + settings_choose_cache_path: '选择路径', + + footer_ok: '确定', + footer_cancel: '取消', + + new_proxy: '新建代理', + + menu_windows: '窗口管理', + menu_proxy: '代理设置', + menu_sync: '同步操作', + menu_settings: '设置', + + membership_renew: '续期', + membership_upgrade: '升级', + membership_window_count: '窗口数', + + header_settings: '设置', + header_language: '语言', + header_sign_out: '退出登录', + }, + }, + }, + fallbackLng: 'zh', + interpolation: { + escapeValue: false, + }, + }); + +export default i18n; diff --git a/packages/renderer/src/index.tsx b/packages/renderer/src/index.tsx index 51b42d6..270caa2 100644 --- a/packages/renderer/src/index.tsx +++ b/packages/renderer/src/index.tsx @@ -10,6 +10,7 @@ import 'dayjs/locale/zh-cn'; import enUS from 'antd/locale/en_US'; import {Provider} from 'react-redux'; import {store} from './store'; +import './i18n'; const rootContainer = document.getElementById('app'); diff --git a/packages/renderer/src/pages/proxy/import/index.tsx b/packages/renderer/src/pages/proxy/import/index.tsx index bb8d928..9848a6a 100644 --- a/packages/renderer/src/pages/proxy/import/index.tsx +++ b/packages/renderer/src/pages/proxy/import/index.tsx @@ -8,6 +8,7 @@ import type {ColumnsType} from 'antd/es/table'; import {ProxyBridge} from '#preload'; import _ from 'lodash'; import {PIN_URL} from '../../../../../shared/constants'; +import {useTranslation} from 'react-i18next'; const {Text} = Typography; @@ -25,9 +26,9 @@ interface ProxyImportProps { const ProxyImportFooter = ({proxies}: {proxies: DB.Proxy[]}) => { const navigate = useNavigate(); + const {t} = useTranslation(); const [messageApi, contextHolder] = message.useMessage(MESSAGE_CONFIG); const [loading, setLoading] = useState(false); - const back = () => { history.back(); }; @@ -68,14 +69,14 @@ const ProxyImportFooter = ({proxies}: {proxies: DB.Proxy[]}) => { className="w-20" onClick={() => handleOk()} > - OK + {t('footer_ok')} @@ -85,45 +86,45 @@ const ProxyImportFooter = ({proxies}: {proxies: DB.Proxy[]}) => { const ProxyImport = () => { const OFFSET = 624; + const {t} = useTranslation(); const [importData, setImportData] = useState([]); const [inputValue, setInputValue] = useState(''); const [tableScrollY, setTableScrollY] = useState(window.innerHeight - OFFSET); const [checking, setChecking] = useState(false); const columns: ColumnsType = [ { - title: 'Type', - width: 80, + title: t('proxy_import_column_type'), + width: 120, dataIndex: 'type', }, { - title: 'Host', - width: 120, + title: t('proxy_import_column_host'), + width: 160, dataIndex: 'host', }, { - title: 'Port', + title: t('proxy_import_column_port'), width: 80, dataIndex: 'port', }, { - title: 'Username', - width: 120, + title: t('proxy_import_column_username'), + width: 160, dataIndex: 'username', }, { - title: 'Password', - width: 120, + title: t('proxy_import_column_password'), + width: 160, dataIndex: 'password', }, { - title: 'Remark', - width: 180, + title: t('proxy_import_column_remark'), dataIndex: 'remark', }, { - title: 'Status', + title: t('proxy_import_column_status'), key: 'status', - width: 200, + width: 280, render: (_, recorder) => ( {PIN_URL?.map((m, index: number) => ( @@ -270,26 +271,17 @@ const ProxyImport = () => { - {`Instructions: -1. If the proxy type is not specified, it will default to HTTP type. -2. Only HTTP and SOCKS5 proxy types are supported. -3. Enter one proxy per line. -4. Only IPv4 addresses are supported for the host. - -Input format (IPv4 only): -192.168.0.1:8000{remark} -192.168.0.1:8000:proxy_username:proxy_password{remark} -socks5://192.168.0.1:8000{remark} -socks5://192.168.0.1:8000:proxy_username:proxy_password{remark}` + {t('proxy_import_tip') .split('\n') .map((item, index) => { - return {item}; + return {item}; })} @@ -312,9 +304,9 @@ socks5://192.168.0.1:8000:proxy_username:proxy_password{remark}` loading={checking} onClick={() => testAll()} > - Test All + {t('proxy_check_all')} - {`Total: ${importData.length}`} + {`${t('proxy_total')}: ${importData.length}`} { + const {t} = useTranslation(); const OFFSET = 266; const [searchValue, setSearchValue] = useState(''); const [tableScrollY, setTableScrollY] = useState(window.innerHeight - OFFSET); @@ -63,6 +65,7 @@ const Proxy = () => { const [updateCheckResult, setUpdateCheckResult] = useState(''); const navigate = useNavigate(); + const moreActionDropdownItems: MenuProps['items'] = [ // { // key: 'export', @@ -75,7 +78,7 @@ const Proxy = () => { { key: 'delete', danger: true, - label: 'Delete', + label: t('proxy_delete'), icon: , }, ]; @@ -83,7 +86,7 @@ const Proxy = () => { const recorderDropdownItems: MenuProps['items'] = [ { key: 'update', - label: 'Update', + label: t('proxy_edit'), icon: , }, { @@ -92,7 +95,7 @@ const Proxy = () => { { key: 'delete', danger: true, - label: 'Delete', + label: t('proxy_delete'), icon: , }, ]; @@ -119,13 +122,13 @@ const Proxy = () => { key: 'ip', }, { - title: 'Proxy Type', + title: t('proxy_column_type'), dataIndex: 'proxy_type', key: 'proxy_type', width: 80, }, { - title: 'Status', + title: t('proxy_column_status'), key: 'status', width: 200, render: (_, recorder) => ( @@ -142,7 +145,7 @@ const Proxy = () => { ), }, { - title: 'IP Contry', + title: t('proxy_column_country'), dataIndex: 'ip_country', key: 'ip_country', width: 100, @@ -153,13 +156,13 @@ const Proxy = () => { ), }, { - title: 'Remark', + title: t('proxy_column_remark'), dataIndex: 'remark', key: 'remark', width: 150, }, { - title: 'IP Checker', + title: t('proxy_column_checker'), dataIndex: 'ip_checker', key: 'ip_checker', width: 150, @@ -417,7 +420,7 @@ const Proxy = () => { onClick={() => checkProxy()} type="primary" > - Check + {t('proxy_check')} { onClick={() => newProxy()} type="primary" > - New Proxy + {t('proxy_new_proxy')} { const [formValue, setFormValue] = useState({profileCachePath: ''}); const [form] = Form.useForm(); + const {t} = useTranslation(); useEffect(() => { fetchSettings(); @@ -49,7 +51,7 @@ const Settings = () => { onValuesChange={handleFormValueChange} > @@ -62,7 +64,7 @@ const Settings = () => { type="default" onClick={handleChoosePath} > - Choose Path + {t('settings_choose_cache_path')} @@ -74,7 +76,7 @@ const Settings = () => { className="w-20" onClick={() => handleSave(formValue)} > - Save + {t('footer_ok')} diff --git a/packages/renderer/src/pages/sync/index.tsx b/packages/renderer/src/pages/sync/index.tsx index a82e835..b801470 100644 --- a/packages/renderer/src/pages/sync/index.tsx +++ b/packages/renderer/src/pages/sync/index.tsx @@ -1,7 +1,9 @@ import {Button, Card} from 'antd'; import {SyncBridge} from '#preload'; +import { useTranslation } from 'react-i18next'; const Sync = () => { + const {t} = useTranslation(); const handleTileWindows = () => { SyncBridge.tileWindows(); }; @@ -18,7 +20,7 @@ const Sync = () => { type="primary" onClick={handleTileWindows} > - Tile Windows + {t('tile_windows')} diff --git a/packages/renderer/src/pages/windows/components/edit-footer/index.tsx b/packages/renderer/src/pages/windows/components/edit-footer/index.tsx index ca186e8..a8455c0 100644 --- a/packages/renderer/src/pages/windows/components/edit-footer/index.tsx +++ b/packages/renderer/src/pages/windows/components/edit-footer/index.tsx @@ -8,6 +8,7 @@ import {useDispatch} from 'react-redux'; import {useState} from 'react'; import {useNavigate} from 'react-router-dom'; import api from '../../../../../../shared/api/api'; +import { useTranslation } from 'react-i18next'; const WindowDetailFooter = ({ currentTab, @@ -22,6 +23,7 @@ const WindowDetailFooter = ({ const [messageApi, contextHolder] = message.useMessage(MESSAGE_CONFIG); const [loading, setLoading] = useState(false); const dispatch = useDispatch(); + const {t} = useTranslation(); const back = () => { history.back(); @@ -93,7 +95,7 @@ const WindowDetailFooter = ({ className="w-20" onClick={() => handleOk()} > - OK + {t('footer_ok')} )} diff --git a/packages/renderer/src/pages/windows/components/edit-form/index.tsx b/packages/renderer/src/pages/windows/components/edit-form/index.tsx index 9e6d6ff..9486d99 100644 --- a/packages/renderer/src/pages/windows/components/edit-form/index.tsx +++ b/packages/renderer/src/pages/windows/components/edit-form/index.tsx @@ -4,6 +4,7 @@ import {useEffect, useState} from 'react'; import type {DB} from '../../../../../../shared/types/db'; import {GroupBridge, TagBridge, ProxyBridge} from '#preload'; import {TAG_COLORS} from '/@/constants'; +import { useTranslation } from 'react-i18next'; const {TextArea} = Input; @@ -18,6 +19,7 @@ const WindowEditForm = ({ const [groups, setGroups] = useState([]); const [tags, setTags] = useState([]); const [proxies, setProxies] = useState([]); + const {t} = useTranslation(); useEffect(() => { if (JSON.stringify(formValue) === '{}') { @@ -56,6 +58,7 @@ const WindowEditForm = ({ return false; } }; + const onAddTag = async (name: string) => { const createdIds = await TagBridge?.create({ name, @@ -85,27 +88,26 @@ const WindowEditForm = ({ labelCol={{span: 6}} > - label="Name" + label={t('window_edit_form_name')} name="name" > - + name="group_id" - label="Group" + label={t('window_edit_form_group')} > name="tags" - label="Tags" + label={t('window_edit_form_tags')} > @@ -139,17 +140,16 @@ const WindowEditForm = ({ name="remark" - label="Remark" + label={t('window_edit_form_remark')} >