From 702d3ad713c005028c889dc292996ad2b1bb28e3 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 26 Sep 2024 14:56:28 +0200 Subject: [PATCH 01/58] 1.0.9 --- .../templates-selection-plugin.tsx | 2 +- apps/remixdesktop/package.json | 2 +- apps/remixdesktop/src/main.ts | 19 +++++++++++++------ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/templates-selection/templates-selection-plugin.tsx b/apps/remix-ide/src/app/plugins/templates-selection/templates-selection-plugin.tsx index 943021b3ae9..a2519990e01 100644 --- a/apps/remix-ide/src/app/plugins/templates-selection/templates-selection-plugin.tsx +++ b/apps/remix-ide/src/app/plugins/templates-selection/templates-selection-plugin.tsx @@ -136,7 +136,7 @@ export class TemplatesSelectionPlugin extends ViewPlugin { ([]); export const createWindow = async (dir?: string): Promise => { + // reize factor + let resizeFactor = 0.8 + // if the window is too small the size is 100% + if( screen.getPrimaryDisplay().size.width < 2560 || screen.getPrimaryDisplay().size.height < 1440) { + resizeFactor = 1 + } + const width = screen.getPrimaryDisplay().size.width * resizeFactor + const height = screen.getPrimaryDisplay().size.height * resizeFactor + // Create the browser window. const mainWindow = new BrowserWindow({ - width: (isE2E ? 2560 : screen.getPrimaryDisplay().size.width * 0.8), - height: (isE2E ? 1140 : screen.getPrimaryDisplay().size.height * 0.8), + width: (isE2E ? 2560 : width), + height: (isE2E ? 1140 : height), frame: true, webPreferences: { preload: path.join(__dirname, 'preload.js') @@ -100,12 +109,10 @@ app.on('activate', () => { }); const showAbout = () => { - - void dialog.showMessageBox({ title: `About Remix`, - message: `Remix`, - detail: `Remix`, + message: `The Native IDE for Web3 Development.`, + detail: `Remix Desktop version ${app.getVersion()}`, buttons: [], }); }; From 2cf3b5c056fbc388cb4728f0114028ba9b2e6689 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 31 Oct 2024 08:09:11 +0100 Subject: [PATCH 02/58] fix workspace name position --- .../workspace/src/lib/components/electron-menu.tsx | 2 +- .../src/lib/components/electron-workspace-name.tsx | 13 ++++++++++--- .../workspace/src/lib/remix-ui-workspace.tsx | 4 ++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/libs/remix-ui/workspace/src/lib/components/electron-menu.tsx b/libs/remix-ui/workspace/src/lib/components/electron-menu.tsx index eee53344f7b..51294ccbaf2 100644 --- a/libs/remix-ui/workspace/src/lib/components/electron-menu.tsx +++ b/libs/remix-ui/workspace/src/lib/components/electron-menu.tsx @@ -44,7 +44,7 @@ export const ElectronMenu = () => { >
{ await openFolderElectron(folder) }} className="pl-2 recentfolder_name pr-2">{lastFolderName(folder)} - { await openFolderElectron(folder) }} data-id={{ folder }} className="recentfolder_path pr-2">{folder} + { await openFolderElectron(folder) }} data-id={`recent_folder_${folder}`} className="recentfolder_path pr-2">{folder} { global.dispatchRemoveRecentFolder(folder) diff --git a/libs/remix-ui/workspace/src/lib/components/electron-workspace-name.tsx b/libs/remix-ui/workspace/src/lib/components/electron-workspace-name.tsx index 8d7983f094b..0df2e312c90 100644 --- a/libs/remix-ui/workspace/src/lib/components/electron-workspace-name.tsx +++ b/libs/remix-ui/workspace/src/lib/components/electron-workspace-name.tsx @@ -23,14 +23,21 @@ export const ElectronWorkspaceName = (props: ElectronWorkspaceNameProps) => { return ( (dir === undefined || dir === '') ? <> : -
+
-
{parsePath()}
+
{parsePath()}
{
) -} +} \ No newline at end of file diff --git a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx index 25e27183b58..ec2cffe87a6 100644 --- a/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx +++ b/libs/remix-ui/workspace/src/lib/remix-ui-workspace.tsx @@ -1052,7 +1052,7 @@ export function Workspace() { {selectedWorkspace && selectedWorkspace.name === 'code-sample' && - ):null} + ):}
From 623bfd33b68d8512ecc29d8790a33e625e9bbf40 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 31 Oct 2024 08:27:33 +0100 Subject: [PATCH 03/58] git status fix --- apps/remix-ide/src/app/plugins/git.tsx | 6 +- apps/remixdesktop/package-lock.json | 14684 ---------------- .../src/lib/plugins/dgitplugin-api.ts | 11 + libs/remix-api/src/lib/remix-api.ts | 2 + .../app/src/lib/remix-app/actions/app.ts | 10 +- .../app/src/lib/remix-app/interface/index.ts | 5 +- .../app/src/lib/remix-app/reducer/app.ts | 20 +- .../app/src/lib/remix-app/state/app.ts | 3 + libs/remix-ui/git/src/components/gitui.tsx | 10 +- libs/remix-ui/git/src/lib/gitactions.ts | 2 +- libs/remix-ui/git/src/lib/listeners.ts | 7 +- .../src/lib/components/gitStatus.tsx | 69 +- .../workspace/src/lib/actions/workspace.ts | 2 +- .../src/lib/components/file-explorer.tsx | 2 +- 14 files changed, 84 insertions(+), 14749 deletions(-) delete mode 100644 apps/remixdesktop/package-lock.json create mode 100644 libs/remix-api/src/lib/plugins/dgitplugin-api.ts diff --git a/apps/remix-ide/src/app/plugins/git.tsx b/apps/remix-ide/src/app/plugins/git.tsx index 6ffa0f08352..b3fe6738d01 100644 --- a/apps/remix-ide/src/app/plugins/git.tsx +++ b/apps/remix-ide/src/app/plugins/git.tsx @@ -8,7 +8,7 @@ const profile = { name: 'dgit', displayName: 'Git', desciption: 'Git plugin for Remix', - methods: ['pull', 'track', 'diff', 'clone', 'open'], + methods: ['open', 'init'], events: [''], version: packageJson.version, maintainedBy: 'Remix', @@ -34,6 +34,10 @@ export class GitPlugin extends ViewPlugin { this.emit('openPanel', panel) } + async init() { + this.emit('init') + } + render() { return
} diff --git a/apps/remixdesktop/package-lock.json b/apps/remixdesktop/package-lock.json deleted file mode 100644 index 23260c12b1a..00000000000 --- a/apps/remixdesktop/package-lock.json +++ /dev/null @@ -1,14684 +0,0 @@ -{ - "name": "remixdesktop", - "version": "1.0.5-insiders", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "remixdesktop", - "version": "1.0.5-insiders", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@nlux/react": "^2.17.1", - "@remix-project/remix-url-resolver": "^0.0.65", - "@remixproject/engine": "0.3.43", - "@remixproject/engine-electron": "0.3.43", - "@remixproject/plugin": "0.3.43", - "@remixproject/plugin-api": "^0.3.43", - "@remixproject/plugin-electron": "0.3.43", - "@vscode/ripgrep": "^1.15.6", - "add": "^2.0.6", - "axios": "^1.6.8", - "byline": "^5.0.0", - "chokidar": "^3.5.3", - "create-require": "^1.1.1", - "electron-updater": "^6.1.8", - "esm": "^3.2.25", - "express": "^4.19.2", - "i": "^0.3.7", - "isomorphic-git": "^1.24.2", - "matomo-tracker": "^2.2.4", - "node-pty": "^0.10.1", - "npm": "^10.8.1", - "semver": "^7.5.4" - }, - "devDependencies": { - "@electron/notarize": "^2.3.0", - "@types/byline": "^4.2.35", - "@types/express": "^4.17.21", - "@types/nightwatch": "^2.3.23", - "@xenova/transformers": "^2.17.2", - "chromedriver": "116", - "cross-env": "^7.0.3", - "deep-equal": "^2.2.3", - "electron": "^26.0.0", - "electron-builder": "24.9.1", - "electron-devtools-installer": "^3.2.0", - "nightwatch": "2.3", - "node-fetch": "2.6.1", - "onnxruntime-web": "^1.18.0", - "selenium-standalone": "^9.3.1", - "typescript": "^5.1.3", - "yarn": "^1.22.21" - }, - "optionalDependencies": { - "@remix-project/remix-ws-templates": "^1.0.27" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@electron/asar": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.8.tgz", - "integrity": "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@electron/get": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", - "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@electron/get/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@electron/get/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@electron/get/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@electron/notarize": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.3.0.tgz", - "integrity": "sha512-EiTBU0BwE7HZZjAG1fFWQaiQpCuPrVGn7jPss1kUjD6eTTdXXd29RiZqEqkgN7xqt/Pgn4g3I7Saqovanrfj3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/notarize/node_modules/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, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/notarize/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, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@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, - "license": "BSD-2-Clause", - "dependencies": { - "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" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@electron/osx-sign/node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/@electron/osx-sign/node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/@electron/universal": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz", - "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@electron/asar": "^3.2.1", - "@malept/cross-spawn-promise": "^1.1.0", - "debug": "^4.3.1", - "dir-compare": "^3.0.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@electron/universal/node_modules/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, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@electron/universal/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, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@erebos/bzz": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@erebos/bzz/-/bzz-0.13.0.tgz", - "integrity": "sha512-ETjXxeNzT7wGofz0CcrNEc/dLeLg0DALuxpMymrzK+AvLvP8PZUfiFn+tZoupSMGaLldfSLJXweOfs3BimVaRg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.3" - } - }, - "node_modules/@erebos/bzz-node": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@erebos/bzz-node/-/bzz-node-0.13.0.tgz", - "integrity": "sha512-Mmo9awJG/Agj6lPqicj8VRdUELoT9pP2xIVniaoUqIMMZkf+lswXFylkyH578ZCNaehyZTTttaXS5WA+T9UVyA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.3", - "@erebos/bzz": "^0.13.0", - "form-data": "^3.0.0", - "node-fetch": "^2.6.0", - "tar-stream": "^2.1.0" - } - }, - "node_modules/@erebos/bzz-node/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@erebos/bzz-node/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "license": "MIT", - "optional": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", - "license": "MPL-2.0", - "optional": true, - "bin": { - "rlp": "bin/rlp" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "license": "MPL-2.0", - "optional": true, - "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/util": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", - "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", - "license": "MPL-2.0", - "optional": true, - "dependencies": { - "@ethereumjs/rlp": "^4.0.1", - "ethereum-cryptography": "^2.0.0", - "micro-ftch": "^0.3.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "node_modules/@ethersproject/providers/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "node_modules/@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@huggingface/jinja": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.2.2.tgz", - "integrity": "sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA==", - "dev": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "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" - } - ], - "license": "Apache-2.0", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@malept/flatpak-bundler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "tmp-promise": "^3.0.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@malept/flatpak-bundler/node_modules/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, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@malept/flatpak-bundler/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, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@nightwatch/chai": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nightwatch/chai/-/chai-5.0.2.tgz", - "integrity": "sha512-yzILJFCcE75OPoRfBlJ80Y3Ky06ljsdrK4Ld92yhmM477vxO2GEguwnd+ldl7pdSYTcg1gSJ1bPPQrA+/Hrn+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "4.0.1", - "loupe": "2.3.4", - "pathval": "1.1.1", - "type-detect": "4.0.8" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@nlux/core": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/@nlux/core/-/core-2.17.1.tgz", - "integrity": "sha512-hIvOnuENVqWaIg5Co4JtFmHph7Sp0Nj+QixOMdOW9Ou7CjU7HK+maB5koLoayNL64B+wHTtgPN7zBrB8NCSPXw==" - }, - "node_modules/@nlux/react": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/@nlux/react/-/react-2.17.1.tgz", - "integrity": "sha512-/t6qDAHIefg1vGIthLOtkQxbI4Sh/aL7/eqVuhcoC1w/8NqnvVxwfxR0mkshcIVrKSwHI8Yjav5edZ2yeRBqMw==", - "dependencies": { - "@nlux/core": "2.17.1" - }, - "peerDependencies": { - "react": "^18", - "react-dom": "^18" - } - }, - "node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@noble/hashes": "1.3.1" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@openzeppelin/contracts": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", - "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==", - "license": "MIT", - "optional": true - }, - "node_modules/@openzeppelin/wizard": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/wizard/-/wizard-0.1.1.tgz", - "integrity": "sha512-AGyvn3PIh1vCgAEoRKAXKhtlk4fkA8AHE7G4PyzLnYcASClYCWpSf43WLJCs6S/LORvTZADX1flvF8x2LciJIg==", - "license": "MIT", - "optional": true, - "dependencies": { - "array.prototype.flatmap": "^1.2.4" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "dev": true - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "dev": true - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "dev": true - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "dev": true - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dev": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "dev": true - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "dev": true - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "dev": true - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "dev": true - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "dev": true - }, - "node_modules/@remix-project/remix-url-resolver": { - "version": "0.0.65", - "resolved": "https://registry.npmjs.org/@remix-project/remix-url-resolver/-/remix-url-resolver-0.0.65.tgz", - "integrity": "sha512-KsBX5QriY6WV+cFuRWR+xkQVE490ZqQJSt9mtx5K4ua3y4M3rRvl4tG5nfCSo4bPxXnVglErSw7HOZtJM6JHvA==", - "license": "MIT", - "dependencies": { - "@erebos/bzz-node": "^0.13.0", - "axios": "1.2.2", - "url": "^0.11.0", - "valid-url": "^1.0.9" - } - }, - "node_modules/@remix-project/remix-url-resolver/node_modules/axios": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.2.tgz", - "integrity": "sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/@remix-project/remix-ws-templates": { - "version": "1.0.27", - "resolved": "https://registry.npmjs.org/@remix-project/remix-ws-templates/-/remix-ws-templates-1.0.27.tgz", - "integrity": "sha512-ATGZQlRaWtPfYcxviZ6l+TFDOILUTowU4tvo1AxlziGWg3HOrcdgYZmD0/SWy/gYlZa3T51r9ey7qtkm3ZQqIA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@openzeppelin/contracts": "^4.7.3", - "@openzeppelin/wizard": "^0.1.1", - "ethers": "^5.4.2", - "web3": "^1.5.1" - } - }, - "node_modules/@remixproject/engine": { - "version": "0.3.43", - "resolved": "https://registry.npmjs.org/@remixproject/engine/-/engine-0.3.43.tgz", - "integrity": "sha512-BKmLVdtkPUQ56yZuRsU7CxS0TgJe4b7P9RoqdBW0Udy1w8oUJsWmlmKchCLXD+/t+12jPyk4sulRN8N9YOFBAw==", - "license": "MIT", - "dependencies": { - "@remixproject/plugin-api": "0.3.43", - "@remixproject/plugin-utils": "0.3.43" - } - }, - "node_modules/@remixproject/engine-electron": { - "version": "0.3.43", - "resolved": "https://registry.npmjs.org/@remixproject/engine-electron/-/engine-electron-0.3.43.tgz", - "integrity": "sha512-k1Lcg67tlPiBFJwKhBRT9bDMyZuYWDdUXZOHKX8BGPZ0lS1ZQDrH4uN2QE2EFGIiCxeArcNzQ7MZ5iEo763eUA==", - "license": "MIT", - "dependencies": { - "@remixproject/engine": "0.3.43", - "@remixproject/plugin-api": "0.3.43", - "@remixproject/plugin-utils": "0.3.43" - } - }, - "node_modules/@remixproject/engine-electron/node_modules/@remixproject/plugin-api": { - "version": "0.3.43", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.43.tgz", - "integrity": "sha512-qgwq3UQAW9JKsFv47m0E7plNNEWL4CFbqoLGbfsfwuZTd/V7HhaMc1my5dxOObW+RKExyvFNFSEvEp7HoHFsWg==", - "license": "MIT", - "dependencies": { - "@remixproject/plugin-utils": "0.3.43" - } - }, - "node_modules/@remixproject/engine/node_modules/@remixproject/plugin-api": { - "version": "0.3.43", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.43.tgz", - "integrity": "sha512-qgwq3UQAW9JKsFv47m0E7plNNEWL4CFbqoLGbfsfwuZTd/V7HhaMc1my5dxOObW+RKExyvFNFSEvEp7HoHFsWg==", - "license": "MIT", - "dependencies": { - "@remixproject/plugin-utils": "0.3.43" - } - }, - "node_modules/@remixproject/plugin": { - "version": "0.3.43", - "resolved": "https://registry.npmjs.org/@remixproject/plugin/-/plugin-0.3.43.tgz", - "integrity": "sha512-uO0wQ9kP982QTJIlGUXXeOjLG1qG64UN5kDopTcMbplzT5vXlMRV64FY8zEqSXtl+sdqKBFLXrwmb+AUNU0MTA==", - "license": "MIT", - "dependencies": { - "@remixproject/plugin-api": "0.3.43", - "@remixproject/plugin-utils": "0.3.43", - "events": "3.2.0" - } - }, - "node_modules/@remixproject/plugin-api": { - "version": "0.3.208", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.208.tgz", - "integrity": "sha512-11hFxABBrEzE4fgcDblWqxLAh5ARH2tBADgh9KNk+y7LUV7aQ7OZf4KiZ2US+uKiSC6497iu/uLHbWBTeRqlVA==", - "license": "MIT", - "dependencies": { - "@remixproject/plugin-utils": "0.3.208" - } - }, - "node_modules/@remixproject/plugin-api/node_modules/@remixproject/plugin-utils": { - "version": "0.3.208", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-utils/-/plugin-utils-0.3.208.tgz", - "integrity": "sha512-PjEK+ty6X14ud3h2U/XH8BBbqwLF3CwduOxHCXfCG0KarR4FwuSfocWQfGlASeDFmPzyV1aMGn//U6xZ03O42Q==", - "license": "MIT", - "dependencies": { - "tslib": "2.0.1" - } - }, - "node_modules/@remixproject/plugin-electron": { - "version": "0.3.43", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-electron/-/plugin-electron-0.3.43.tgz", - "integrity": "sha512-uv44xjmkTsC/o4xnMEBml6NxrMeq95aOR3FFY8MnZkKvnWOKC94SE5AYuHOAvt+FBrnar2f58+IYpBJAIkYyaQ==", - "license": "MIT", - "dependencies": { - "@remixproject/engine": "0.3.43", - "@remixproject/plugin": "0.3.43", - "@remixproject/plugin-api": "0.3.43", - "@remixproject/plugin-utils": "0.3.43" - } - }, - "node_modules/@remixproject/plugin-electron/node_modules/@remixproject/plugin-api": { - "version": "0.3.43", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.43.tgz", - "integrity": "sha512-qgwq3UQAW9JKsFv47m0E7plNNEWL4CFbqoLGbfsfwuZTd/V7HhaMc1my5dxOObW+RKExyvFNFSEvEp7HoHFsWg==", - "license": "MIT", - "dependencies": { - "@remixproject/plugin-utils": "0.3.43" - } - }, - "node_modules/@remixproject/plugin-utils": { - "version": "0.3.43", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-utils/-/plugin-utils-0.3.43.tgz", - "integrity": "sha512-FB2Dz0/+TQ+D9AdINfsu38qHEsUVIDpaDCaXY76suDkSUudoHcGrC5TbpaV/xMUbMMma2dcLp629vBNnA5Cd0w==", - "license": "MIT", - "dependencies": { - "tslib": "2.0.1" - } - }, - "node_modules/@remixproject/plugin/node_modules/@remixproject/plugin-api": { - "version": "0.3.43", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.43.tgz", - "integrity": "sha512-qgwq3UQAW9JKsFv47m0E7plNNEWL4CFbqoLGbfsfwuZTd/V7HhaMc1my5dxOObW+RKExyvFNFSEvEp7HoHFsWg==", - "license": "MIT", - "dependencies": { - "@remixproject/plugin-utils": "0.3.43" - } - }, - "node_modules/@scure/base": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", - "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", - "license": "MIT", - "optional": true, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", - "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", - "license": "MIT", - "optional": true, - "dependencies": { - "@noble/curves": "~1.1.0", - "@noble/hashes": "~1.3.1", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@testim/chrome-version": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.4.tgz", - "integrity": "sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-wT1B4iIO82ecXkdN6waCK8Ou7E71WU+mP1osDA5Q8c6Ur+ozU2vIKUIhSpUr6uE5L2YHocKS1Z2jG2fBC1YVeg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/byline": { - "version": "4.2.35", - "resolved": "https://registry.npmjs.org/@types/byline/-/byline-4.2.35.tgz", - "integrity": "sha512-YRfEGhvLQrA1/ixrJ95/vqin4J+hc0OIHH89rWGE2q0Tn9Jy6BhPZTiCLV1X39VJMOoq8UCUUFN+WD+gnmBjhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/chai": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", - "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.41", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz", - "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.4.tgz", - "integrity": "sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/nightwatch": { - "version": "2.3.30", - "resolved": "https://registry.npmjs.org/@types/nightwatch/-/nightwatch-2.3.30.tgz", - "integrity": "sha512-TiVGKR9mORwx0nN3ylonXp2IobpQoZxwV63IjABYkxsEpNauHL8GU9kmceEThjqDUigKaeh6aPOqepwC4bwCfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "*", - "@types/selenium-webdriver": "*", - "devtools-protocol": "^0.0.1025565" - } - }, - "node_modules/@types/node": { - "version": "20.3.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.2.tgz", - "integrity": "sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4HCoGwR3221nOc7G0Z/6KgTNGgaaFGkbGrtUJsB+zlKX2LBVjFHHIUkieMBgHHXgBH5Gq6dZHJKdBYdtlhBQvw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/secp256k1": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.5.tgz", - "integrity": "sha512-aIonTBMErtE3T9MxDvTZRzcrT/mCqpEZBw3CCY/i+oG9n57N/+7obBkhFgavUAIrX21bU0LHg1XRgtaLdelBhA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/selenium-webdriver": { - "version": "4.1.21", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.21.tgz", - "integrity": "sha512-QGURnImvxYlIQz5DVhvHdqpYNLBjhJ2Vm+cnQI2G9QZzkWlZm0LkLcvDcHp+qE6N2KBz4CeuvXgPO7W3XQ0Tyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ws": "*" - } - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/send/node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/verror": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", - "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/@vscode/ripgrep": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/@vscode/ripgrep/-/ripgrep-1.15.6.tgz", - "integrity": "sha512-mCtfHqZ/g+75qDDeIPB9ST1xyJDaJornaSujuRKkB0SMZ6FMVtuKUdvvvOITR+DcKo5KOwUVuOUUpt75jOY+Yw==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "https-proxy-agent": "^7.0.2", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/@vscode/ripgrep/node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@vscode/ripgrep/node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@xenova/transformers": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/@xenova/transformers/-/transformers-2.17.2.tgz", - "integrity": "sha512-lZmHqzrVIkSvZdKZEx7IYY51TK0WDrC8eR0c5IMnBsO8di8are1zzw8BlLhyO2TklZKLN5UffNGs1IJwT6oOqQ==", - "dev": true, - "dependencies": { - "@huggingface/jinja": "^0.2.2", - "onnxruntime-web": "1.14.0", - "sharp": "^0.32.0" - }, - "optionalDependencies": { - "onnxruntime-node": "1.14.0" - } - }, - "node_modules/@xenova/transformers/node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "node_modules/@xenova/transformers/node_modules/onnxruntime-web": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz", - "integrity": "sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw==", - "dev": true, - "dependencies": { - "flatbuffers": "^1.12.0", - "guid-typescript": "^1.0.9", - "long": "^4.0.0", - "onnx-proto": "^4.0.4", - "onnxruntime-common": "~1.14.0", - "platform": "^1.3.6" - } - }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/7zip-bin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", - "license": "MIT", - "optional": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/add": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/add/-/add-2.0.6.tgz", - "integrity": "sha512-j5QzrmsokwWWp6kUcJQySpbG+xfOBqqKnup3OIk1pz+kB/80SLorZ9V8zHFLO92Lcd+hbvq8bT+zOGoPkmBV0Q==", - "license": "MIT" - }, - "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", - "license": "MIT", - "optional": true - }, - "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, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansi-to-html": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", - "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^2.2.0" - }, - "bin": { - "ansi-to-html": "bin/ansi-to-html" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/app-builder-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", - "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", - "dev": true, - "license": "MIT" - }, - "node_modules/app-builder-lib": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.9.1.tgz", - "integrity": "sha512-Q1nYxZcio4r+W72cnIRVYofEAyjBd3mG47o+zms8HlD51zWtA/YxJb01Jei5F+jkWhge/PTQK+uldsPh6d0/4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "2.1.0", - "@electron/osx-sign": "1.0.5", - "@electron/universal": "1.4.1", - "@malept/flatpak-bundler": "^0.4.0", - "@types/fs-extra": "9.0.13", - "7zip-bin": "~5.2.0", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "24.8.1", - "builder-util-runtime": "9.2.3", - "chromium-pickle-js": "^0.2.0", - "debug": "^4.3.4", - "ejs": "^3.1.8", - "electron-publish": "24.8.1", - "form-data": "^4.0.0", - "fs-extra": "^10.1.0", - "hosted-git-info": "^4.1.0", - "is-ci": "^3.0.0", - "isbinaryfile": "^5.0.0", - "js-yaml": "^4.1.0", - "lazy-val": "^1.0.5", - "minimatch": "^5.1.1", - "read-config-file": "6.3.2", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.8", - "tar": "^6.1.12", - "temp-file": "^3.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/app-builder-lib/node_modules/@electron/notarize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.1.0.tgz", - "integrity": "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/app-builder-lib/node_modules/@electron/notarize/node_modules/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, - "license": "MIT", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/app-builder-lib/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, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/app-builder-lib/node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/app-builder-lib/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, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/app-builder-lib/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, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "license": "MIT", - "optional": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "license": "MIT", - "optional": true - }, - "node_modules/async-lock": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.0.tgz", - "integrity": "sha512-coglx5yIWuetakm3/1dsX9hxCNox22h7+V80RQOu2XUUMidtArxKoZoOtHUPuR84SycKTXzgGzAUR5hJxujyJQ==", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "license": "MIT", - "optional": true - }, - "node_modules/axe-core": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.3.tgz", - "integrity": "sha512-d5ZQHPSPkF9Tw+yfyDcRoUOc4g/8UloJJe5J8m4L5+c7AtDdjDLRxew/knnI4CxvtdxEUVgWz4x3OIQUIFiMfw==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/bare-events": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", - "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", - "dev": true, - "optional": true - }, - "node_modules/bare-fs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", - "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", - "dev": true, - "optional": true, - "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" - } - }, - "node_modules/bare-os": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", - "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", - "dev": true, - "optional": true - }, - "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", - "dev": true, - "optional": true, - "dependencies": { - "bare-os": "^2.1.0" - } - }, - "node_modules/bare-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", - "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", - "dev": true, - "optional": true, - "dependencies": { - "streamx": "^2.18.0" - } - }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", - "license": "MIT", - "optional": true - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "license": "MIT", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "license": "MIT", - "engines": { - "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==", - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", - "license": "MIT", - "optional": true - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "^3.5.5" - } - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", - "license": "MIT", - "optional": true - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "license": "MIT", - "optional": true - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true, - "license": "ISC" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "license": "MIT", - "optional": true, - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "license": "MIT", - "optional": true, - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "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": "*" - } - }, - "node_modules/buffer-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", - "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==", - "license": "MIT", - "optional": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "license": "MIT", - "optional": true - }, - "node_modules/bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/builder-util": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.8.1.tgz", - "integrity": "sha512-ibmQ4BnnqCnJTNrdmdNlnhF48kfqhNzSeqFMXHLIl+o9/yhn6QfOaVrloZ9YUu3m0k3rexvlT5wcki6LWpjTZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/debug": "^4.1.6", - "7zip-bin": "~5.2.0", - "app-builder-bin": "4.0.0", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.3", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "debug": "^4.3.4", - "fs-extra": "^10.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-ci": "^3.0.0", - "js-yaml": "^4.1.0", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" - } - }, - "node_modules/builder-util-runtime": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz", - "integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/chai-nightwatch": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/chai-nightwatch/-/chai-nightwatch-0.5.3.tgz", - "integrity": "sha512-38ixH/mqpY6IwnZkz6xPqx8aB5/KVR+j6VPugcir3EGOsphnWXrPH/mUt8Jp+ninL6ghY0AaJDQ10hSfCPGy/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "1.1.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chromedriver": { - "version": "116.0.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-116.0.0.tgz", - "integrity": "sha512-/TQaRn+RUAYnVqy5Vx8VtU8DvtWosU8QLM2u7BoNM5h55PRQPXF/onHAehEi8Sj/CehdKqH50NFdiumQAUr0DQ==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@testim/chrome-version": "^1.1.3", - "axios": "^1.4.0", - "compare-versions": "^6.0.0", - "extract-zip": "^2.0.1", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^1.1.0", - "tcp-port-used": "^1.0.1" - }, - "bin": { - "chromedriver": "bin/chromedriver" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "engines": { - "node": ">=4.0.0", - "npm": ">=3.0.0" - } - }, - "node_modules/cids/node_modules/multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "license": "MIT", - "optional": true, - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/cids/node_modules/multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.6.0", - "varint": "^5.0.0" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==", - "license": "MIT", - "optional": true - }, - "node_modules/clean-git-ref": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", - "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", - "license": "Apache-2.0" - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "dev": true, - "license": "MIT", - "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", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "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, - "license": "MIT", - "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", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/compare-versions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.0.tgz", - "integrity": "sha512-LNZQXhqUvqUTotpZ00qLSaify3b4VFD588aRr8MKFw4CMUr98ytzCW5wDH5qx/DEY5kCDXcbcRuCqL0szEf2tg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/config-file-ts": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", - "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^10.3.10", - "typescript": "^5.3.3" - } - }, - "node_modules/config-file-ts/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, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/config-file-ts/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/config-file-ts/node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", - "license": "ISC", - "optional": true, - "dependencies": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "license": "MIT", - "optional": true - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "optional": true, - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "license": "MIT", - "optional": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "license": "MIT", - "optional": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "license": "MIT", - "optional": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-fetch/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "license": "ISC", - "optional": true, - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/d/node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "license": "ISC", - "optional": true - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "license": "MIT", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.0.1.tgz", - "integrity": "sha512-D/Oxqobjr+kxaHsgiQBZq9b6iAWdEj5W/JdJm8deNduAPc9CwXQ3BJJCuEqlrPXcy45iOMkGPZ0T81Dnz7UDCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "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", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/devtools-protocol": { - "version": "0.0.1025565", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1025565.tgz", - "integrity": "sha512-0s5sbGQR/EfYQhd8EpZgphpndsv+CufTlaeUyA6vYXCA0H5kMAsHCS/cHtUFWoKJCO125hpoKicQCfpxRj4oqw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff3": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", - "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", - "license": "MIT" - }, - "node_modules/dir-compare": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", - "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-equal": "^1.0.0", - "minimatch": "^3.0.4" - } - }, - "node_modules/dmg-builder": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.9.1.tgz", - "integrity": "sha512-huC+O6hvHd24Ubj3cy2GMiGLe2xGFKN3klqVMLAdcbB6SWMd1yPSdZvV8W1O01ICzCCRlZDHiv4VrNUgnPUfbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "app-builder-lib": "24.9.1", - "builder-util": "24.8.1", - "builder-util-runtime": "9.2.3", - "fs-extra": "^10.1.0", - "iconv-lite": "^0.6.2", - "js-yaml": "^4.1.0" - }, - "optionalDependencies": { - "dmg-license": "^1.0.11" - } - }, - "node_modules/dmg-builder/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dmg-license": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", - "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.7", - "plist": "^3.0.4", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - }, - "bin": { - "dmg-license": "bin/dmg-license.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", - "optional": true - }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "license": "MIT", - "optional": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz", - "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron": { - "version": "26.6.7", - "resolved": "https://registry.npmjs.org/electron/-/electron-26.6.7.tgz", - "integrity": "sha512-2iG08Q2KAPTBlxPqEB3qmVUqDdmcPAvgGhiULggkeoLTznhg5yqkOJPe+Hpuc176i4gjsQVTpK7zbhq21Y3FoQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^18.11.18", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "node_modules/electron-builder": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.9.1.tgz", - "integrity": "sha512-v7BuakDuY6sKMUYM8mfQGrwyjBpZ/ObaqnenU0H+igEL10nc6ht049rsCw2HghRBdEwJxGIBuzs3jbEhNaMDmg==", - "dev": true, - "license": "MIT", - "dependencies": { - "app-builder-lib": "24.9.1", - "builder-util": "24.8.1", - "builder-util-runtime": "9.2.3", - "chalk": "^4.1.2", - "dmg-builder": "24.9.1", - "fs-extra": "^10.1.0", - "is-ci": "^3.0.0", - "lazy-val": "^1.0.5", - "read-config-file": "6.3.2", - "simple-update-notifier": "2.0.0", - "yargs": "^17.6.2" - }, - "bin": { - "electron-builder": "cli.js", - "install-app-deps": "install-app-deps.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/electron-devtools-installer": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.2.0.tgz", - "integrity": "sha512-t3UczsYugm4OAbqvdImMCImIMVdFzJAHgbwHpkl5jmfu1izVgUcP/mnrPqJIpEeCK1uZGpt+yHgWEN+9EwoYhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "rimraf": "^3.0.2", - "semver": "^7.2.1", - "tslib": "^2.1.0", - "unzip-crx-3": "^0.2.0" - } - }, - "node_modules/electron-devtools-installer/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true, - "license": "0BSD" - }, - "node_modules/electron-publish": { - "version": "24.8.1", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.8.1.tgz", - "integrity": "sha512-IFNXkdxMVzUdweoLJNXSupXkqnvgbrn3J4vognuOY06LaS/m0xvfFYIf+o1CM8if6DuWYWoQFKPcWZt/FUjZPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/fs-extra": "^9.0.11", - "builder-util": "24.8.1", - "builder-util-runtime": "9.2.3", - "chalk": "^4.1.2", - "fs-extra": "^10.1.0", - "lazy-val": "^1.0.5", - "mime": "^2.5.2" - } - }, - "node_modules/electron-publish/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/electron-updater": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.1.8.tgz", - "integrity": "sha512-hhOTfaFAd6wRHAfUaBhnAOYc+ymSGCWJLtFkw4xJqOvtpHmIdNHnXDV9m1MHC+A6q08Abx4Ykgyz/R5DGKNAMQ==", - "license": "MIT", - "dependencies": { - "builder-util-runtime": "9.2.3", - "fs-extra": "^10.1.0", - "js-yaml": "^4.1.0", - "lazy-val": "^1.0.5", - "lodash.escaperegexp": "^4.1.2", - "lodash.isequal": "^4.5.0", - "semver": "^7.3.8", - "tiny-typed-emitter": "^2.1.0" - } - }, - "node_modules/electron/node_modules/@types/node": { - "version": "18.16.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.18.tgz", - "integrity": "sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "license": "MIT", - "optional": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "license": "MIT", - "optional": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-abstract/node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "license": "MIT", - "optional": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-define-property/node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-errors": { - "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" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "license": "MIT", - "optional": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.63", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.63.tgz", - "integrity": "sha512-hUCZd2Byj/mNKjfP9jXrdVZ62B8KuA/VoK7X8nUh5qT+AxDmcbvZz041oDVZdbIN1qW6XY9VDNwzkvKnZvK2TQ==", - "hasInstallScript": true, - "license": "ISC", - "optional": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "license": "MIT", - "optional": true, - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "license": "MIT", - "optional": true - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "license": "ISC", - "optional": true, - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "license": "ISC", - "optional": true, - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", - "license": "ISC", - "optional": true, - "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - } - }, - "node_modules/eth-ens-namehash/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "license": "MIT", - "optional": true - }, - "node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/eth-lib/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "license": "MIT", - "optional": true - }, - "node_modules/ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "license": "MIT", - "optional": true, - "dependencies": { - "js-sha3": "^0.8.0" - } - }, - "node_modules/ethereum-cryptography": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", - "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", - "license": "MIT", - "optional": true, - "dependencies": { - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@scure/bip32": "1.3.1", - "@scure/bip39": "1.2.1" - } - }, - "node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "license": "MPL-2.0", - "optional": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "license": "MIT", - "optional": true - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "license": "MIT", - "optional": true, - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", - "license": "MIT", - "optional": true - }, - "node_modules/events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "license": "MIT", - "optional": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "license": "ISC", - "optional": true, - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT", - "optional": true - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "optional": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/fd-slicer": { - "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" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/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, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/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, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/find-process": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", - "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "commander": "^5.1.0", - "debug": "^4.1.1" - }, - "bin": { - "find-process": "bin/find-process.js" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fkill": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/fkill/-/fkill-7.2.1.tgz", - "integrity": "sha512-eN9cmsIlRdq06wu3m01OOEgQf5Xh/M7REm0jfZ4eL3V3XisjXzfRq3iyqtKS+FhO6wB36FvWRiRGdeSx5KpLAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.1.0", - "arrify": "^2.0.1", - "execa": "^5.0.0", - "pid-port": "^0.1.0", - "process-exists": "^4.0.0", - "ps-list": "^7.2.0", - "taskkill": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flatbuffers": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz", - "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", - "license": "MIT", - "optional": true - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-extra/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "devOptional": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description/node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "license": "MIT", - "optional": true - }, - "node_modules/get-symbol-description/node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "license": "MIT", - "optional": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "license": "MIT", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "license": "MIT", - "optional": true, - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "license": "MIT", - "optional": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globalthis/node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "license": "MIT", - "optional": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.x" - } - }, - "node_modules/guid-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", - "dev": true - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "license": "ISC", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "license": "MIT", - "optional": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "devOptional": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-property-descriptors/node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "license": "MIT" - }, - "node_modules/has-property-descriptors/node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has/node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "license": "MIT" - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "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" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "license": "MIT", - "optional": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/http-cache-semantics": { - "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==", - "devOptional": true, - "license": "BSD-2-Clause" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==", - "license": "ISC", - "optional": true - }, - "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, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "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, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/i": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", - "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/iconv-corefoundation": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", - "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "cli-truncate": "^2.1.0", - "node-addon-api": "^1.6.3" - }, - "engines": { - "node": "^8.11.2 || >=10" - } - }, - "node_modules/iconv-corefoundation/node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "license": "MIT", - "optional": true, - "dependencies": { - "punycode": "2.1.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/idna-uts46-hx/node_modules/punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", - "license": "MIT", - "optional": true - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "license": "MIT", - "optional": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-port-reachable": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-3.1.0.tgz", - "integrity": "sha512-vjc0SSRNZ32s9SbZBzGaiP6YVB+xglLShhgZD/FHMZUXBvQWaV9CtzgeVhjccFJrI6RAMV+LX7NYxueW/A8W5A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "license": "MIT", - "optional": true - }, - "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, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset/node_modules/define-data-property": { - "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", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset/node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset/node_modules/has-property-descriptors": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset/node_modules/set-function-length": { - "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", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is2": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", - "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "ip-regex": "^4.1.0", - "is-url": "^1.2.4" - }, - "engines": { - "node": ">=v0.10.0" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/isbinaryfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", - "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/isomorphic-git": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.24.2.tgz", - "integrity": "sha512-J3TU97JENWUnOgpVMwaRP9a3OQXJq/8fCIzA4yrJ7+ko1IPJwXCYeA69CeC8GtHeBVhcOQrbZGw6fpIpz54Vpw==", - "license": "MIT", - "dependencies": { - "async-lock": "^1.1.0", - "clean-git-ref": "^2.0.1", - "crc-32": "^1.2.0", - "diff3": "0.0.3", - "ignore": "^5.1.4", - "minimisted": "^2.0.0", - "pako": "^1.0.10", - "pify": "^4.0.1", - "readable-stream": "^3.4.0", - "sha.js": "^2.4.9", - "simple-get": "^4.0.1" - }, - "bin": { - "isogit": "cli.cjs" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "license": "MIT", - "optional": true - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "license": "MIT", - "optional": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "peer": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "license": "MIT", - "optional": true - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "license": "(AFL-2.1 OR BSD-3-Clause)", - "optional": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC", - "optional": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "devOptional": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "license": "MIT", - "optional": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jsprim/node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "optional": true - }, - "node_modules/jsprim/node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/jsprim/node_modules/verror/node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "optional": true - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dev": true, - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/keccak": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/lazy-val": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==", - "license": "MIT" - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha512-RHShTDnPKP7aWxlvXKiDT6IX2jCs6YZLCtNhOru/OX2Q/tzX295vVBK5oX1ECtN+2r86S0Ogy8ykP1sgCZAN0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash._arrayeach": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "integrity": "sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "node_modules/lodash._baseclone": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", - "integrity": "sha512-1K0dntf2dFQ5my0WoGKkduewR6+pTNaqX03kvs45y7G5bzl4B3kTR4hDfJIc2aCQDeLyQHhS280tc814m1QC1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash._arraycopy": "^3.0.0", - "lodash._arrayeach": "^3.0.0", - "lodash._baseassign": "^3.0.0", - "lodash._basefor": "^3.0.0", - "lodash.isarray": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "node_modules/lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash._basefor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", - "integrity": "sha512-6bc3b8grkpMgDcVJv9JYZAk/mHgcqMljzm7OsbmcE2FGUMmmLQTPHlh/dFqR8LA0GQ7z4K67JSotVKu5058v1A==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.clone": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-3.0.3.tgz", - "integrity": "sha512-yVYPpFTdZDCLG2p07gVRTvcwN5X04oj2hu4gG6r0fer58JA08wAVxXzWM+CmmxO2bzOH8u8BkZTZqgX6juVF7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash._baseclone": "^3.0.0", - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0" - } - }, - "node_modules/lodash.defaultsdeep": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", - "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.escape": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", - "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "license": "MIT" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "license": "MIT" - }, - "node_modules/lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "node_modules/lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "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, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "peer": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/matomo-tracker": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/matomo-tracker/-/matomo-tracker-2.2.4.tgz", - "integrity": "sha512-7fDy4wRhDQ1dnSxVqmnVqmmos9ACKag0fCBtBD3/Qeoqks7MFqXcO35nfS6S8xU/IXNf7534q/4Gx8fuWKYW6A==", - "license": "MIT", - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "license": "MIT", - "optional": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "license": "MIT" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micro-ftch": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", - "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", - "license": "MIT", - "optional": true - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "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, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "optional": true, - "dependencies": { - "dom-walk": "^0.1.0" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC", - "optional": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", - "license": "MIT", - "optional": true - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimisted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", - "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5" - } - }, - "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "license": "ISC", - "optional": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/minipass/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC", - "optional": true - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "node_modules/mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", - "license": "ISC", - "optional": true, - "dependencies": { - "mkdirp": "*" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mkdirp-promise/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "optional": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mkpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-1.0.0.tgz", - "integrity": "sha512-PbNHr7Y/9Y/2P5pKFv5XOGBfNQqZ+fdiHWcuf7swLACN5ZW5LU7J5tMU8LSBjpluAxAxKYGD9nnaIbdRy9+m1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/yargs/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/mock-fs": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", - "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==", - "license": "MIT", - "optional": true - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "license": "MIT" - }, - "node_modules/multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "license": "MIT", - "optional": true, - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "license": "MIT", - "optional": true, - "dependencies": { - "varint": "^5.0.0" - } - }, - "node_modules/multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" - } - }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "license": "MIT" - }, - "node_modules/nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==", - "license": "MIT", - "optional": true - }, - "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "license": "ISC", - "optional": true - }, - "node_modules/nightwatch": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/nightwatch/-/nightwatch-2.3.9.tgz", - "integrity": "sha512-yjcri3URaV7bKCbTXJK0k7heBZ9OOGpuPdur4hQAxoODx/XuKVV53rtc7a/W4MZ39GhzepHKJCtelvrEu6nJeQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nightwatch/chai": "5.0.2", - "ansi-to-html": "0.7.2", - "assertion-error": "1.1.0", - "boxen": "5.1.2", - "chai-nightwatch": "0.5.3", - "ci-info": "3.3.0", - "didyoumean": "1.2.2", - "dotenv": "10.0.0", - "ejs": "3.1.8", - "envinfo": "7.8.1", - "fs-extra": "^10.1.0", - "glob": "^7.2.3", - "lodash.clone": "3.0.3", - "lodash.defaultsdeep": "4.6.1", - "lodash.escape": "4.0.1", - "lodash.merge": "4.6.2", - "minimatch": "3.1.2", - "minimist": "1.2.6", - "mkpath": "1.0.0", - "mocha": "9.2.2", - "nightwatch-axe-verbose": "2.0.3", - "open": "8.4.0", - "ora": "5.4.1", - "selenium-webdriver": "4.3.1", - "semver": "7.3.5", - "stacktrace-parser": "0.1.10", - "strip-ansi": "6.0.1", - "uuid": "8.3.2" - }, - "bin": { - "nightwatch": "bin/nightwatch" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@cucumber/cucumber": "*", - "chromedriver": "*", - "geckodriver": "*" - }, - "peerDependenciesMeta": { - "@cucumber/cucumber": { - "optional": true - }, - "chromedriver": { - "optional": true - }, - "geckodriver": { - "optional": true - } - } - }, - "node_modules/nightwatch-axe-verbose": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/nightwatch-axe-verbose/-/nightwatch-axe-verbose-2.0.3.tgz", - "integrity": "sha512-VxwYTXmdbWZ4GRxgAc0/6uZ1nDQ5/xnXUipLrxoUsLxrh9OjNmAwqlMsIlQN8o33XwbjGm+o9ikan5erYGEOFQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "axe-core": "^4.4.3" - } - }, - "node_modules/nightwatch/node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/nightwatch/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi": { - "version": "3.65.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", - "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", - "license": "MIT", - "optional": true - }, - "node_modules/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", - "license": "MIT", - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-pty": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-0.10.1.tgz", - "integrity": "sha512-JTdtUS0Im/yRsWJSx7yiW9rtpfmxqxolrtnyKwPLI+6XqTAPW/O2MjS8FYL4I5TsMbH2lVgDb2VMjp+9LoQGNg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "nan": "^2.14.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm": { - "version": "10.8.1", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.8.1.tgz", - "integrity": "sha512-Dp1C6SvSMYQI7YHq/y2l94uvI+59Eqbu1EpuKQHQ8p16txXRuRit5gH3Lnaagk2aXDIjg/Iru9pd05bnneKgdw==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/promise-spawn", - "@npmcli/redact", - "@npmcli/run-script", - "@sigstore/tuf", - "abbrev", - "archy", - "cacache", - "chalk", - "ci-info", - "cli-columns", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "ms", - "node-gyp", - "nopt", - "normalize-package-data", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "semver", - "spdx-expression-parse", - "ssri", - "supports-color", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^7.5.3", - "@npmcli/config": "^8.3.3", - "@npmcli/fs": "^3.1.1", - "@npmcli/map-workspaces": "^3.0.6", - "@npmcli/package-json": "^5.1.1", - "@npmcli/promise-spawn": "^7.0.2", - "@npmcli/redact": "^2.0.0", - "@npmcli/run-script": "^8.1.0", - "@sigstore/tuf": "^2.3.4", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^18.0.3", - "chalk": "^5.3.0", - "ci-info": "^4.0.0", - "cli-columns": "^4.0.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.3", - "glob": "^10.4.1", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^7.0.2", - "ini": "^4.1.3", - "init-package-json": "^6.0.3", - "is-cidr": "^5.1.0", - "json-parse-even-better-errors": "^3.0.2", - "libnpmaccess": "^8.0.6", - "libnpmdiff": "^6.1.3", - "libnpmexec": "^8.1.2", - "libnpmfund": "^5.0.11", - "libnpmhook": "^10.0.5", - "libnpmorg": "^6.0.6", - "libnpmpack": "^7.0.3", - "libnpmpublish": "^9.0.9", - "libnpmsearch": "^7.0.6", - "libnpmteam": "^6.0.5", - "libnpmversion": "^6.0.3", - "make-fetch-happen": "^13.0.1", - "minimatch": "^9.0.4", - "minipass": "^7.1.1", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^10.1.0", - "nopt": "^7.2.1", - "normalize-package-data": "^6.0.1", - "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.3.0", - "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.1", - "npm-profile": "^10.0.0", - "npm-registry-fetch": "^17.0.1", - "npm-user-validate": "^2.0.1", - "p-map": "^4.0.0", - "pacote": "^18.0.6", - "parse-conflict-json": "^3.0.1", - "proc-log": "^4.2.0", - "qrcode-terminal": "^0.12.0", - "read": "^3.0.1", - "semver": "^7.6.2", - "spdx-expression-parse": "^4.0.0", - "ssri": "^10.0.6", - "supports-color": "^9.4.0", - "tar": "^6.2.1", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.1", - "which": "^4.0.0", - "write-file-atomic": "^5.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", - "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", - "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.5.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.1", - "@npmcli/installed-package-contents": "^2.1.0", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^7.1.1", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.1.0", - "@npmcli/query": "^3.1.0", - "@npmcli/redact": "^2.0.0", - "@npmcli/run-script": "^8.1.0", - "bin-links": "^4.0.4", - "cacache": "^18.0.3", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^7.0.2", - "json-parse-even-better-errors": "^3.0.2", - "json-stringify-nice": "^1.1.4", - "lru-cache": "^10.2.2", - "minimatch": "^9.0.4", - "nopt": "^7.2.1", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^11.0.2", - "npm-pick-manifest": "^9.0.1", - "npm-registry-fetch": "^17.0.1", - "pacote": "^18.0.6", - "parse-conflict-json": "^3.0.0", - "proc-log": "^4.2.0", - "proggy": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^3.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.6", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.3.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", - "ci-info": "^4.0.0", - "ini": "^4.1.2", - "nopt": "^7.2.1", - "proc-log": "^4.2.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^4.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", - "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", - "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz", - "integrity": "sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^18.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^18.0.0", - "proc-log": "^4.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", - "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "5.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^4.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", - "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz", - "integrity": "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/redact": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", - "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "proc-log": "^4.0.0", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", - "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/core": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", - "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", - "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/sign": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", - "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "make-fetch-happen": "^13.0.1", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", - "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.3.2", - "tuf-js": "^2.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/verify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", - "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.1.0", - "@sigstore/protobuf-specs": "^0.3.2" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", - "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tufjs/models": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", - "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bin-links": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz", - "integrity": "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/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==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "18.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ci-info": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/cidr-regex/-/cidr-regex-4.1.1.tgz", - "integrity": "sha512-ekKcVp+iRB9zlKFXyx7io7nINgb0oRjgRdXNEodp1OuxRui8FXr/CA40Tz1voWUp9DPPrMyQKy01vJhDo4N1lw==", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^5.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-4.0.0.tgz", - "integrity": "sha512-XW2Vg+w+L9on9wtwKpyzluIPCWXjaBahI7mTcYjx+BVIYD9c3yqcv/yKC7CmdCZat4rq2yiE1UMSJC5ivKfMtQ==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", - "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/npm/node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "10.4.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hasown": { - "version": "2.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", - "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "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==", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", - "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-6.0.3.tgz", - "integrity": "sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/package-json": "^5.0.0", - "npm-package-arg": "^11.0.0", - "promzard": "^1.0.0", - "read": "^3.0.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", - "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-cidr/-/is-cidr-5.1.0.tgz", - "integrity": "sha512-OkVS+Ht2ssF27d48gZdB+ho1yND1VbkJRKKS6Pc1/Cw7uqkd9IOJg8/bTwBDQL6tfBhSdguPRnlGiE8pU/X5NQ==", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^4.1.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.13.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/jackspeak": { - "version": "3.1.2", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/npm/node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", - "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", - "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", - "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-8.0.6.tgz", - "integrity": "sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^17.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.1.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.5.3", - "@npmcli/installed-package-contents": "^2.1.0", - "binary-extensions": "^2.3.0", - "diff": "^5.1.0", - "minimatch": "^9.0.4", - "npm-package-arg": "^11.0.2", - "pacote": "^18.0.6", - "tar": "^6.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "8.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.5.3", - "@npmcli/run-script": "^8.1.0", - "ci-info": "^4.0.0", - "npm-package-arg": "^11.0.2", - "pacote": "^18.0.6", - "proc-log": "^4.2.0", - "read": "^3.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.11", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.5.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/libnpmhook/-/libnpmhook-10.0.5.tgz", - "integrity": "sha512-XulT+N/s3o9oFlIq6pGRv3OG2qR1NVRbVQOKLchycDwyf16RZA3oXbeEgs2H3oE7hRZPUMBZqsalQXMMPal3cQ==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^17.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/libnpmorg/-/libnpmorg-6.0.6.tgz", - "integrity": "sha512-4MVxsAS4H2z7su/sU0GsrirfBm4ssfqPRSDvoZ8qmRw58kEWJ0qE0cQ2VilRlFgCWKzKPhfoPeyNPyxBTnOusA==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^17.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "7.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.5.3", - "@npmcli/run-script": "^8.1.0", - "npm-package-arg": "^11.0.2", - "pacote": "^18.0.6" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-9.0.9.tgz", - "integrity": "sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ci-info": "^4.0.0", - "normalize-package-data": "^6.0.1", - "npm-package-arg": "^11.0.2", - "npm-registry-fetch": "^17.0.1", - "proc-log": "^4.2.0", - "semver": "^7.3.7", - "sigstore": "^2.2.0", - "ssri": "^10.0.6" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/libnpmsearch/-/libnpmsearch-7.0.6.tgz", - "integrity": "sha512-PmiER4bgiIqN9OjBtgPn2/PxwU+OdJWtLBFM+vewOrn4VmaNAHSUKDt/wxOOkZSDLyMICVUBp61Ji1+XxhSrKw==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^17.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/libnpmteam/-/libnpmteam-6.0.5.tgz", - "integrity": "sha512-iJW4Cq42GMqMwZEV+Mx8ZLj0Np5kGXQ9P/BAekHjIpYC1v3/vJqbmfJkzkwFvGxEhUotmx+xpLChZCDJ7c3rxA==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^17.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/libnpmversion/-/libnpmversion-6.0.3.tgz", - "integrity": "sha512-Kjk1anQ9sPn7E/qF1jXumItvr2OA1914tYWkSTXH9G2rYoY+Ol1+KNrWfGeje2aBvFfKlt4VeKdCfM3yxMXNBw==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.7", - "@npmcli/run-script": "^8.1.0", - "json-parse-even-better-errors": "^3.0.2", - "proc-log": "^4.2.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "10.2.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", - "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "9.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "10.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/proc-log": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "6.0.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-5.0.0.tgz", - "integrity": "sha512-EkXrzat7zERmUhHaoren1YhTxFwsOu5jypE84k6632SXTHcQE1z8V51GC6GVZt8LxkC+tbBcKMUBZAgk8SUSbw==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", - "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", - "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "11.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^4.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", - "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^6.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "9.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/npm-profile/-/npm-profile-10.0.0.tgz", - "integrity": "sha512-DXnge3nHYnEnPxmVd/kPmgcXKXwVUqFihGnU+EJUiu5mIOs3awq6zEm0rRp3kSQNhFsoqdLu8L1TIfRyeBOCog==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^17.0.1", - "proc-log": "^4.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "17.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/redact": "^2.0.0", - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-user-validate/-/npm-user-validate-2.0.1.tgz", - "integrity": "sha512-d17PKaF2h8LSGFl5j4b1gHOJt1fgH7YUcCm1kNSJvaLWWKXlBsuUvx0bBEkr0qhsVA9XP5LtRZ83hdlhm2QkgA==", - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "18.0.6", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", - "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/package-json": "^5.1.0", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^8.0.0", - "cacache": "^18.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^17.0.0", - "proc-log": "^4.0.0", - "promise-retry": "^2.0.1", - "sigstore": "^2.2.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "bin/index.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", - "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", - "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/proggy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/proggy/-/proggy-2.0.0.tgz", - "integrity": "sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.1.tgz", - "integrity": "sha512-utl+0x8gIDasV5X+PI5qWEPqH6fJS0pFtQ/4gZ95xfEFb/89dmh+/b895TbFDBLiafBvxD/PGTKfvxl4kH/pQg==", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.2.tgz", - "integrity": "sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.12.0.tgz", - "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/read/-/read-3.0.1.tgz", - "integrity": "sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", - "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "inBundle": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/sigstore": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", - "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.3.2", - "@sigstore/core": "^1.0.0", - "@sigstore/protobuf-specs": "^0.3.2", - "@sigstore/sign": "^2.3.2", - "@sigstore/tuf": "^2.3.4", - "@sigstore/verify": "^1.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.8.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "8.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-correct/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", - "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/npm/node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz", - "integrity": "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/treeverse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", - "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/tuf-js": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", - "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "2.0.1", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/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==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", - "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", - "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/which/node_modules/isexe": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/npm/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "inBundle": true, - "license": "ISC" - }, - "node_modules/number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "license": "MIT", - "optional": true - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is/node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is/node_modules/define-data-property": { - "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", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is/node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is/node_modules/has-property-descriptors": { - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is/node_modules/set-function-length": { - "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", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "license": "BSD", - "optional": true, - "dependencies": { - "http-https": "^1.0.0" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "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, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onnx-proto": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/onnx-proto/-/onnx-proto-4.0.4.tgz", - "integrity": "sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA==", - "dev": true, - "dependencies": { - "protobufjs": "^6.8.8" - } - }, - "node_modules/onnx-proto/node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, - "node_modules/onnx-proto/node_modules/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/onnxruntime-common": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz", - "integrity": "sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew==", - "dev": true - }, - "node_modules/onnxruntime-node": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz", - "integrity": "sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w==", - "dev": true, - "optional": true, - "os": [ - "win32", - "darwin", - "linux" - ], - "dependencies": { - "onnxruntime-common": "~1.14.0" - } - }, - "node_modules/onnxruntime-web": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.18.0.tgz", - "integrity": "sha512-o1UKj4ABIj1gmG7ae0RKJ3/GT+3yoF0RRpfDfeoe0huzRW4FDRLfbkDETmdFAvnJEXuYDE0YT+hhkia0352StQ==", - "dev": true, - "dependencies": { - "flatbuffers": "^1.12.0", - "guid-typescript": "^1.0.9", - "long": "^5.2.3", - "onnxruntime-common": "1.18.0", - "platform": "^1.3.6", - "protobufjs": "^7.2.4" - } - }, - "node_modules/onnxruntime-web/node_modules/onnxruntime-common": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.18.0.tgz", - "integrity": "sha512-lufrSzX6QdKrktAELG5x5VkBpapbCeS3dQwrXbN0eD9rHvU0yAWl7Ztju9FvgAKWvwd/teEKJNj3OwM6eTZh3Q==", - "dev": true - }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "license": "MIT", - "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", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==", - "license": "MIT", - "optional": true - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "license": "MIT" - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "license": "MIT", - "optional": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/pend": { - "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/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT", - "optional": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pid-port": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pid-port/-/pid-port-0.1.1.tgz", - "integrity": "sha512-boqPJtSgZC6KOgXKNPC+/XR3xwVtpOtaLa7JLcdf8jfVe0ZM2TwllBXxxLUO8GQbOLJ4/hEtf2+L1QCKbaoHUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", - "dev": true - }, - "node_modules/plist": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", - "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", - "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/prebuild-install/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-exists": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/process-exists/-/process-exists-4.1.0.tgz", - "integrity": "sha512-BBJoiorUKoP2AuM5q/yKwIfT1YWRHsaxjW+Ayu9erLhqKOfnXzzVVML0XTYoQZuI1YvcWKmc1dh06DEy4+KzfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ps-list": "^6.3.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/process-exists/node_modules/ps-list": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-6.3.0.tgz", - "integrity": "sha512-qau0czUSB0fzSlBOQt0bo+I2v6R+xiQdj78e1BR/Qjfl5OHWJ/urXi8+ilw1eHe+5hSeDI1wrwVTgDp2wst4oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/protobufjs": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.2.tgz", - "integrity": "sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/ps-list": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-7.2.0.tgz", - "integrity": "sha512-v4Bl6I3f2kJfr5o80ShABNHAokIgY+wFDTQfE+X3zWYgSGQOCBeYptLZUpoOALBqO5EawmDN/tjTldJesd0ujQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "license": "MIT", - "optional": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "license": "MIT", - "optional": true, - "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", - "dev": true, - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/read-config-file": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", - "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "config-file-ts": "^0.2.4", - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/read-config-file/node_modules/dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=10" - } - }, - "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==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "license": "MIT", - "optional": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "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, - "license": "MIT", - "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", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "license": "MIT", - "optional": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "license": "MPL-2.0", - "optional": true, - "dependencies": { - "bn.js": "^5.2.0" - }, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "license": "ISC" - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "license": "MIT", - "optional": true - }, - "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/selenium-standalone": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-9.3.1.tgz", - "integrity": "sha512-M/nHs/fbzCEr3370/ZlUXx8+Ia2aGbx5gSgONUn0ooCcFx8ScmouIWCp/Wms8dUTDiivC8F4WzXYRSCMIdiglw==", - "dev": true, - "license": "MIT", - "dependencies": { - "axios": "^0.27.2", - "commander": "^8.3.0", - "cross-spawn": "^7.0.3", - "debug": "^4.3.1", - "execa": "^5.1.1", - "find-process": "^1.4.7", - "fkill": "^7.2.1", - "got": "^11.8.6", - "is-port-reachable": "^3.0.0", - "lodash.mapvalues": "^4.6.0", - "lodash.merge": "^4.6.2", - "md5": "^2.3.0", - "minimist": "^1.2.5", - "mkdirp": "^2.1.3", - "progress": "2.0.3", - "tar-stream": "3.1.6", - "which": "^2.0.2", - "yauzl": "^2.10.0" - }, - "bin": { - "selenium-standalone": "bin/selenium-standalone" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/selenium-standalone/node_modules/axios": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", - "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "node_modules/selenium-standalone/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/selenium-standalone/node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/selenium-standalone/node_modules/mkdirp": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", - "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/selenium-webdriver": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.3.1.tgz", - "integrity": "sha512-TjH/ls1WKRQoFEHcqtn6UtwcLnA3yvx08v9cSSFYvyhp8hJWRtbe9ae2I8uXPisEZ2EaGKKoxBZ4EHv0BJM15g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "jszip": "^3.10.0", - "tmp": "^0.2.1", - "ws": ">=8.7.0" - }, - "engines": { - "node": ">= 10.15.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "license": "MIT", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "license": "MIT", - "optional": true, - "dependencies": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/sharp": { - "version": "0.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/sharp/node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true, - "license": "BSD-3-Clause", - "optional": true - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", - "dev": true, - "dependencies": { - "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-hex-prefixed": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/swarm-js": { - "version": "0.1.42", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", - "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^11.8.5", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - } - }, - "node_modules/swarm-js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "license": "MIT", - "optional": true - }, - "node_modules/swarm-js/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC", - "optional": true - }, - "node_modules/swarm-js/node_modules/eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/swarm-js/node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "license": "MIT", - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/swarm-js/node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/swarm-js/node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "minipass": "^2.9.0" - } - }, - "node_modules/swarm-js/node_modules/tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "license": "ISC", - "optional": true, - "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "engines": { - "node": ">=4.5" - } - }, - "node_modules/swarm-js/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/swarm-js/node_modules/ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "license": "MIT", - "optional": true, - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - }, - "node_modules/swarm-js/node_modules/ws/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT", - "optional": true - }, - "node_modules/swarm-js/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "license": "ISC", - "optional": true - }, - "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" - } - }, - "node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/taskkill": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/taskkill/-/taskkill-3.1.0.tgz", - "integrity": "sha512-5KcOFzPvd1nGFVrmB7H4+QAWVjYOf//+QTbOj0GpXbqtqbKGWVczG+rq6VhXAtdtlKLTs16NAmHRyF5vbggQ2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "arrify": "^2.0.1", - "execa": "^3.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/taskkill/node_modules/execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": "^8.12.0 || >=9.7.0" - } - }, - "node_modules/taskkill/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/tcp-port-used": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", - "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4.3.1", - "is2": "^2.0.6" - } - }, - "node_modules/tcp-port-used/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" - } - }, - "node_modules/text-decoder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", - "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", - "dev": true, - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tiny-typed-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", - "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==", - "license": "MIT" - }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "optional": true - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", - "license": "0BSD" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "license": "Unlicense", - "optional": true - }, - "node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "license": "ISC", - "optional": true - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "license": "MIT", - "optional": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "license": "MIT", - "optional": true - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "license": "MIT", - "optional": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unzip-crx-3": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", - "integrity": "sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "jszip": "^3.1.0", - "mkdirp": "^0.5.1", - "yaku": "^0.16.6" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "devOptional": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", - "license": "MIT", - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.11.2" - } - }, - "node_modules/url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==", - "license": "MIT", - "optional": true - }, - "node_modules/url/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "license": "MIT" - }, - "node_modules/url/node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "license": "MIT", - "optional": true - }, - "node_modules/utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", - "dev": true, - "license": "WTFPL" - }, - "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", - "optional": true, - "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==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" - }, - "node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==", - "license": "MIT", - "optional": true - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.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, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web3": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.3.tgz", - "integrity": "sha512-DgUdOOqC/gTqW+VQl1EdPxrVRPB66xVNtuZ5KD4adVBtko87hkgM8BTZ0lZ8IbUfnQk6DyjcDujMiH3oszllAw==", - "hasInstallScript": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "web3-bzz": "1.10.3", - "web3-core": "1.10.3", - "web3-eth": "1.10.3", - "web3-eth-personal": "1.10.3", - "web3-net": "1.10.3", - "web3-shh": "1.10.3", - "web3-utils": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-bzz": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.3.tgz", - "integrity": "sha512-XDIRsTwekdBXtFytMpHBuun4cK4x0ZMIDXSoo1UVYp+oMyZj07c7gf7tNQY5qZ/sN+CJIas4ilhN25VJcjSijQ==", - "hasInstallScript": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-bzz/node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "license": "MIT", - "optional": true, - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/web3-bzz/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "license": "MIT", - "optional": true - }, - "node_modules/web3-bzz/node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/web3-bzz/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/web3-bzz/node_modules/got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", - "license": "MIT", - "optional": true, - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/web3-bzz/node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/web3-bzz/node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/web3-bzz/node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/web3-core": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.3.tgz", - "integrity": "sha512-Vbk0/vUNZxJlz3RFjAhNNt7qTpX8yE3dn3uFxfX5OHbuon5u65YEOd3civ/aQNW745N0vGUlHFNxxmn+sG9DIw==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@types/bn.js": "^5.1.1", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.10.3", - "web3-core-method": "1.10.3", - "web3-core-requestmanager": "1.10.3", - "web3-utils": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-helpers": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.3.tgz", - "integrity": "sha512-Yv7dQC3B9ipOc5sWm3VAz1ys70Izfzb8n9rSiQYIPjpqtJM+3V4EeK6ghzNR6CO2es0+Yu9CtCkw0h8gQhrTxA==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "web3-eth-iban": "1.10.3", - "web3-utils": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-method": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.3.tgz", - "integrity": "sha512-VZ/Dmml4NBmb0ep5PTSg9oqKoBtG0/YoMPei/bq/tUdlhB2dMB79sbeJPwx592uaV0Vpk7VltrrrBv5hTM1y4Q==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.10.3", - "web3-core-promievent": "1.10.3", - "web3-core-subscriptions": "1.10.3", - "web3-utils": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-promievent": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.3.tgz", - "integrity": "sha512-HgjY+TkuLm5uTwUtaAfkTgRx/NzMxvVradCi02gy17NxDVdg/p6svBHcp037vcNpkuGeFznFJgULP+s2hdVgUQ==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-requestmanager": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.3.tgz", - "integrity": "sha512-VT9sKJfgM2yBOIxOXeXiDuFMP4pxzF6FT+y8KTLqhDFHkbG3XRe42Vm97mB/IvLQCJOmokEjl3ps8yP1kbggyw==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "util": "^0.12.5", - "web3-core-helpers": "1.10.3", - "web3-providers-http": "1.10.3", - "web3-providers-ipc": "1.10.3", - "web3-providers-ws": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-subscriptions": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.3.tgz", - "integrity": "sha512-KW0Mc8sgn70WadZu7RjQ4H5sNDJ5Lx8JMI3BWos+f2rW0foegOCyWhRu33W1s6ntXnqeBUw5rRCXZRlA3z+HNA==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "license": "MIT", - "optional": true - }, - "node_modules/web3-eth": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.3.tgz", - "integrity": "sha512-Uk1U2qGiif2mIG8iKu23/EQJ2ksB1BQXy3wF3RvFuyxt8Ft9OEpmGlO7wOtAyJdoKzD5vcul19bJpPcWSAYZhA==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "web3-core": "1.10.3", - "web3-core-helpers": "1.10.3", - "web3-core-method": "1.10.3", - "web3-core-subscriptions": "1.10.3", - "web3-eth-abi": "1.10.3", - "web3-eth-accounts": "1.10.3", - "web3-eth-contract": "1.10.3", - "web3-eth-ens": "1.10.3", - "web3-eth-iban": "1.10.3", - "web3-eth-personal": "1.10.3", - "web3-net": "1.10.3", - "web3-utils": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-abi": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.3.tgz", - "integrity": "sha512-O8EvV67uhq0OiCMekqYsDtb6FzfYzMXT7VMHowF8HV6qLZXCGTdB/NH4nJrEh2mFtEwVdS6AmLFJAQd2kVyoMQ==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-accounts": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.3.tgz", - "integrity": "sha512-8MipGgwusDVgn7NwKOmpeo3gxzzd+SmwcWeBdpXknuyDiZSQy9tXe+E9LeFGrmys/8mLLYP79n3jSbiTyv+6pQ==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@ethereumjs/common": "2.6.5", - "@ethereumjs/tx": "3.5.2", - "@ethereumjs/util": "^8.1.0", - "eth-lib": "0.2.8", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.10.3", - "web3-core-helpers": "1.10.3", - "web3-core-method": "1.10.3", - "web3-utils": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/web3-eth-contract": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.3.tgz", - "integrity": "sha512-Y2CW61dCCyY4IoUMD4JsEQWrILX4FJWDWC/Txx/pr3K/+fGsBGvS9kWQN5EsVXOp4g7HoFOfVh9Lf7BmVVSRmg==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@types/bn.js": "^5.1.1", - "web3-core": "1.10.3", - "web3-core-helpers": "1.10.3", - "web3-core-method": "1.10.3", - "web3-core-promievent": "1.10.3", - "web3-core-subscriptions": "1.10.3", - "web3-eth-abi": "1.10.3", - "web3-utils": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-ens": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.3.tgz", - "integrity": "sha512-hR+odRDXGqKemw1GFniKBEXpjYwLgttTES+bc7BfTeoUyUZXbyDHe5ifC+h+vpzxh4oS0TnfcIoarK0Z9tFSiQ==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.10.3", - "web3-core-helpers": "1.10.3", - "web3-core-promievent": "1.10.3", - "web3-eth-abi": "1.10.3", - "web3-eth-contract": "1.10.3", - "web3-utils": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-iban": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.3.tgz", - "integrity": "sha512-ZCfOjYKAjaX2TGI8uif5ah+J3BYFuo+47JOIV1RIz2l7kD9VfnxvRH5UiQDRyMALQC7KFd2hUqIEtHklapNyKA==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-personal": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.3.tgz", - "integrity": "sha512-avrQ6yWdADIvuNQcFZXmGLCEzulQa76hUOuVywN7O3cklB4nFc/Gp3yTvD3bOAaE7DhjLQfhUTCzXL7WMxVTsw==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.10.3", - "web3-core-helpers": "1.10.3", - "web3-core-method": "1.10.3", - "web3-net": "1.10.3", - "web3-utils": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-personal/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "license": "MIT", - "optional": true - }, - "node_modules/web3-net": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.3.tgz", - "integrity": "sha512-IoSr33235qVoI1vtKssPUigJU9Fc/Ph0T9CgRi15sx+itysmvtlmXMNoyd6Xrgm9LuM4CIhxz7yDzH93B79IFg==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "web3-core": "1.10.3", - "web3-core-method": "1.10.3", - "web3-utils": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-providers-http": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.3.tgz", - "integrity": "sha512-6dAgsHR3MxJ0Qyu3QLFlQEelTapVfWNTu5F45FYh8t7Y03T1/o+YAkVxsbY5AdmD+y5bXG/XPJ4q8tjL6MgZHw==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "abortcontroller-polyfill": "^1.7.5", - "cross-fetch": "^4.0.0", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-providers-ipc": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.3.tgz", - "integrity": "sha512-vP5WIGT8FLnGRfswTxNs9rMfS1vCbMezj/zHbBe/zB9GauBRTYVrUo2H/hVrhLg8Ut7AbsKZ+tCJ4mAwpKi2hA==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-providers-ws": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.3.tgz", - "integrity": "sha512-/filBXRl48INxsh6AuCcsy4v5ndnTZ/p6bl67kmO9aK1wffv7CT++DrtclDtVMeDGCgB3van+hEf9xTAVXur7Q==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.3", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.3.tgz", - "integrity": "sha512-cAZ60CPvs9azdwMSQ/PSUdyV4PEtaW5edAZhu3rCXf6XxQRliBboic+AvwUvB6j3eswY50VGa5FygfVmJ1JVng==", - "hasInstallScript": true, - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "web3-core": "1.10.3", - "web3-core-method": "1.10.3", - "web3-core-subscriptions": "1.10.3", - "web3-net": "1.10.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-utils": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.3.tgz", - "integrity": "sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==", - "license": "LGPL-3.0", - "optional": true, - "dependencies": { - "@ethereumjs/util": "^8.1.0", - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereum-cryptography": "^2.1.2", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "optional": true - }, - "node_modules/websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/websocket/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/websocket/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "optional": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "optional": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "license": "MIT", - "optional": true, - "dependencies": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "node_modules/xhr-request-promise": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", - "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", - "license": "MIT", - "optional": true, - "dependencies": { - "xhr-request": "^1.1.0" - } - }, - "node_modules/xhr-request/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "license": "MIT", - "optional": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/xhr-request/node_modules/simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", - "license": "MIT", - "optional": true, - "dependencies": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.32" - } - }, - "node_modules/yaku": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/yaku/-/yaku-0.16.7.tgz", - "integrity": "sha512-Syu3IB3rZvKvYk7yTiyl1bo/jiEFaaStrgv1V2TIJTqYPStSMQVO8EQjg/z+DRzLq/4LIIharNT3iH1hylEIRw==", - "dev": true, - "license": "MIT" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yarn": { - "version": "1.22.21", - "resolved": "https://registry.npmjs.org/yarn/-/yarn-1.22.21.tgz", - "integrity": "sha512-ynXaJsADJ9JiZ84zU25XkPGOvVMmZ5b7tmTSpKURYwgELdjucAOydqIOrOfTxVYcNXe91xvLZwcRh68SR3liCg==", - "dev": true, - "hasInstallScript": true, - "license": "BSD-2-Clause", - "bin": { - "yarn": "bin/yarn.js", - "yarnpkg": "bin/yarn.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/yauzl": { - "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/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/libs/remix-api/src/lib/plugins/dgitplugin-api.ts b/libs/remix-api/src/lib/plugins/dgitplugin-api.ts new file mode 100644 index 00000000000..092e9c7f32b --- /dev/null +++ b/libs/remix-api/src/lib/plugins/dgitplugin-api.ts @@ -0,0 +1,11 @@ +import { StatusEvents } from "@remixproject/plugin-utils" + +export interface IDgitPlugin { + events: { + } & StatusEvents, + methods: { + open(panel: string): Promise, + init(): Promise + } +} + diff --git a/libs/remix-api/src/lib/remix-api.ts b/libs/remix-api/src/lib/remix-api.ts index fa052bdd034..87c3df42a52 100644 --- a/libs/remix-api/src/lib/remix-api.ts +++ b/libs/remix-api/src/lib/remix-api.ts @@ -15,10 +15,12 @@ import { ILayoutApi } from "./plugins/layout-api" import { IMatomoApi } from "./plugins/matomo-api" import { IRemixAI } from "./plugins/remixai-api" import { IRemixAID } from "./plugins/remixAIDesktop-api" +import { IDgitPlugin } from "./plugins/dgitplugin-api" export interface ICustomRemixApi extends IRemixApi { dgitApi: IGitApi + dgit: IDgitPlugin config: IConfigApi notification: INotificationApi settings: ISettings diff --git a/libs/remix-ui/app/src/lib/remix-app/actions/app.ts b/libs/remix-ui/app/src/lib/remix-app/actions/app.ts index 9822635e1e3..716d351e940 100644 --- a/libs/remix-ui/app/src/lib/remix-app/actions/app.ts +++ b/libs/remix-ui/app/src/lib/remix-app/actions/app.ts @@ -1,4 +1,4 @@ -import { GitHubUser } from '@remix-api'; +import { branch, GitHubUser } from '@remix-api'; import { AppModal } from '../interface' type ActionMap = { @@ -14,10 +14,16 @@ type ActionMap = { export const enum appActionTypes { setGitHubUser = 'SET_GITHUB_USER', + setCurrentBranch = 'SET_CURRENT_BRANCH', + setNeedsGitInit = 'SET_NEEDS_GIT_INIT', + setCanUseGit = 'SET_CAN_USE_GIT', } type AppPayload = { - [appActionTypes.setGitHubUser]: GitHubUser + [appActionTypes.setGitHubUser]: GitHubUser, + [appActionTypes.setCurrentBranch]: branch, + [appActionTypes.setNeedsGitInit]: boolean, + [appActionTypes.setCanUseGit]: boolean, } export type AppAction = ActionMap[keyof ActionMap< diff --git a/libs/remix-ui/app/src/lib/remix-app/interface/index.ts b/libs/remix-ui/app/src/lib/remix-app/interface/index.ts index adefcf2a2bf..0c146c98f79 100644 --- a/libs/remix-ui/app/src/lib/remix-app/interface/index.ts +++ b/libs/remix-ui/app/src/lib/remix-app/interface/index.ts @@ -1,4 +1,4 @@ -import { GitHubUser } from '@remix-api' +import { branch, GitHubUser } from '@remix-api' import { AppModalCancelTypes, ModalTypes } from '../types' export type ValidationResult = { @@ -49,5 +49,8 @@ export interface forceChoiceModal { export interface AppState { gitHubUser: GitHubUser + currentBranch: branch + needsGitInit: boolean + canUseGit: boolean } diff --git a/libs/remix-ui/app/src/lib/remix-app/reducer/app.ts b/libs/remix-ui/app/src/lib/remix-app/reducer/app.ts index 2fce1a56cf6..6dd37603bca 100644 --- a/libs/remix-ui/app/src/lib/remix-app/reducer/app.ts +++ b/libs/remix-ui/app/src/lib/remix-app/reducer/app.ts @@ -3,11 +3,29 @@ import { AppState } from "../interface"; export const appReducer = (state: AppState, action: AppAction): AppState => { switch (action.type) { - case appActionTypes.setGitHubUser:{ + case appActionTypes.setGitHubUser: { return { ...state, gitHubUser: action.payload } } + case appActionTypes.setCurrentBranch: { + return { + ...state, + currentBranch: action.payload + } + } + case appActionTypes.setNeedsGitInit: { + return { + ...state, + needsGitInit: action.payload + } + } + case appActionTypes.setCanUseGit: { + return { + ...state, + canUseGit: action.payload + } + } } } \ No newline at end of file diff --git a/libs/remix-ui/app/src/lib/remix-app/state/app.ts b/libs/remix-ui/app/src/lib/remix-app/state/app.ts index 1e76098bdc2..8086b75c9cc 100644 --- a/libs/remix-ui/app/src/lib/remix-app/state/app.ts +++ b/libs/remix-ui/app/src/lib/remix-app/state/app.ts @@ -3,4 +3,7 @@ import { AppState } from "../interface"; export const appInitialState: AppState = { gitHubUser: {} as GitHubUser, + currentBranch: null, + needsGitInit: true, + canUseGit: false } \ No newline at end of file diff --git a/libs/remix-ui/git/src/components/gitui.tsx b/libs/remix-ui/git/src/components/gitui.tsx index b7444e0b8db..7bf1af96327 100644 --- a/libs/remix-ui/git/src/components/gitui.tsx +++ b/libs/remix-ui/git/src/components/gitui.tsx @@ -31,7 +31,7 @@ import { GitHubCredentials } from './panels/githubcredentials' import { Setup } from './panels/setup' import { Init } from './panels/init' import { Disabled } from './disabled' -import { AppContext, appPlatformTypes, platformContext } from '@remix-ui/app' +import { appActionTypes, AppContext, appPlatformTypes, platformContext } from '@remix-ui/app' import { Version } from './panels/version' export const gitPluginContext = React.createContext(defaultGitState) @@ -113,14 +113,20 @@ export const GitUI = (props: IGitUi) => { }) let needsInit = false - if (!(gitState.currentBranch && gitState.currentBranch.name !== '') && gitState.currentHead === '') { + if (!(gitState.currentBranch && gitState.currentBranch.name !== '') && (!gitState.currentHead || gitState.currentHead === '')) { needsInit = true } setNeedsInit(needsInit) + appContext.appStateDispatch({ type: appActionTypes.setNeedsGitInit, payload: needsInit }) + appContext.appStateDispatch({ type: appActionTypes.setCurrentBranch, payload: gitState.currentBranch || null }) }, [gitState.gitHubUser, gitState.currentBranch, gitState.remotes, gitState.gitHubAccessToken, gitState.currentHead]) + useEffect(() => { + appContext.appStateDispatch({ type: appActionTypes.setCanUseGit, payload: gitState.canUseApp }) + },[gitState.canUseApp]) + useEffect(() => { const panelName = Object.keys(gitUIPanels) .filter(k => gitUIPanels[k] === activePanel); diff --git a/libs/remix-ui/git/src/lib/gitactions.ts b/libs/remix-ui/git/src/lib/gitactions.ts index f7e549de2ca..adb04df5dba 100644 --- a/libs/remix-ui/git/src/lib/gitactions.ts +++ b/libs/remix-ui/git/src/lib/gitactions.ts @@ -41,7 +41,7 @@ export const setPlugin = (p: Plugin, dispatcher: React.Dispatch { await sendToMatomo(gitMatomoEventTypes.INIT) - await plugin.call('dgitApi', "init"); + await plugin.call('dgitApi', 'init'); dispatch(setTimestamp(Date.now())) await getBranches(); } diff --git a/libs/remix-ui/git/src/lib/listeners.ts b/libs/remix-ui/git/src/lib/listeners.ts index 42f450c058d..028cfa6a7bb 100644 --- a/libs/remix-ui/git/src/lib/listeners.ts +++ b/libs/remix-ui/git/src/lib/listeners.ts @@ -3,7 +3,7 @@ import React from "react"; import { setCanUseApp, setLoading, setRepoName, setGItHubToken, setLog, setGitHubUser, setUserEmails, setTimestamp, setDesktopWorkingDir, setVersion } from "../state/gitpayload"; import { gitActionDispatch, gitUIPanels, storage } from "../types"; import { Plugin } from "@remixproject/engine"; -import { getBranches, getFileStatusMatrix, loadGitHubUserFromToken, getRemotes, gitlog, setPlugin, setStorage } from "./gitactions"; +import { getBranches, getFileStatusMatrix, loadGitHubUserFromToken, getRemotes, gitlog, setPlugin, setStorage, init } from "./gitactions"; import { Profile } from "@remixproject/plugin-utils"; import { CustomRemixApi } from "@remix-api"; import { statusChanged } from "./pluginActions"; @@ -200,10 +200,13 @@ export const setCallBacks = (viewPlugin: Plugin, gitDispatcher: React.Dispatch { - setAtivePanel(panel) }) + plugin.on('dgit' as any, 'init', async () => { + init() + }) + callBackEnabled = true; } diff --git a/libs/remix-ui/statusbar/src/lib/components/gitStatus.tsx b/libs/remix-ui/statusbar/src/lib/components/gitStatus.tsx index 79f207806c2..fd4a9e5c63a 100644 --- a/libs/remix-ui/statusbar/src/lib/components/gitStatus.tsx +++ b/libs/remix-ui/statusbar/src/lib/components/gitStatus.tsx @@ -1,8 +1,9 @@ -import React, { useEffect, Dispatch, useState } from 'react' +import React, { useEffect, Dispatch, useState, useContext } from 'react' // eslint-disable-next-line @nrwl/nx/enforce-module-boundaries import { StatusBar } from 'apps/remix-ide/src/app/components/status-bar' import '../../css/statusbar.css' import { CustomTooltip } from '@remix-ui/helper' +import { AppContext } from '@remix-ui/app' export interface GitStatusProps { plugin: StatusBar @@ -11,70 +12,32 @@ export interface GitStatusProps { } export default function GitStatus({ plugin, gitBranchName, setGitBranchName }: GitStatusProps) { - const [isLocalHost, setIsLocalHost] = useState(false) + const appContext = useContext(AppContext) - useEffect(() => { - plugin.on('filePanel', 'setWorkspace', async (workspace) => { - const isGit = await plugin.call('fileManager', 'isGitRepo') - setIsLocalHost(workspace.isLocalhost) - if (isGit) { - setGitBranchName(workspace.name) - } else { - setGitBranchName('Not a git repo') - } - }) - plugin.on('filePanel', 'workspaceInitializationCompleted', async () => { - const isGit = await plugin.call('fileManager', 'isGitRepo') - if (isGit) { - const workspace = localStorage.getItem('currentWorkspace') - setGitBranchName(workspace) - } else { - setGitBranchName('Not a git repo') - } - }) - plugin.on('dgitApi', 'init', async () => { - const isGit = await plugin.call('fileManager', 'isGitRepo') - if (isGit) { - const workspace = localStorage.getItem('currentWorkspace') - setGitBranchName(workspace) - } - }) - - }, []) - - const lightDgitUp = async () => { - const isActive = await plugin.call('manager', 'isActive', 'dgit') - const isGit = await plugin.call('fileManager', 'isGitRepo') - if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit') - if (gitBranchName.length > 0 && isGit) { - plugin.verticalIcons.select('dgit') - } + const openDgit = async () => { + plugin.verticalIcons.select('dgit') } const initializeNewGitRepo = async () => { - if (isLocalHost === false) { - const isActive = await plugin.call('manager', 'isActive', 'dgit') - if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit') - await plugin.call('dgitApi', 'init') - ;(window as any)._paq.push('trackEvent', 'statusbar', 'initNewRepo') - } + await plugin.call('dgit', 'init') + await plugin.call('matomo', 'track', ['trackEvent', 'statusBar', 'initNewRepo']); } - const checkBranchName = ()=> { - return gitBranchName && gitBranchName !== 'Not a git repo' && gitBranchName.length > 0 - } + if (!appContext.appState.canUseGit) return null + return (
await lightDgitUp()} + onClick={async () => await openDgit()} > - {checkBranchName() && isLocalHost === false ? - : Initialize as git repo} - {checkBranchName() && isLocalHost === false && {gitBranchName}} - {checkBranchName() && isLocalHost === false && } + {!appContext.appState.needsGitInit ? + : Initialize as git repo} + {!appContext.appState.needsGitInit && appContext.appState.currentBranch && + await openDgit()} className="ml-1">{appContext.appState.currentBranch.name} + }
) diff --git a/libs/remix-ui/workspace/src/lib/actions/workspace.ts b/libs/remix-ui/workspace/src/lib/actions/workspace.ts index dbd6ba738fa..e60869e61df 100644 --- a/libs/remix-ui/workspace/src/lib/actions/workspace.ts +++ b/libs/remix-ui/workspace/src/lib/actions/workspace.ts @@ -167,7 +167,7 @@ export const createWorkspace = async ( // commit the template as first commit plugin.call('notification', 'toast', 'Creating initial git commit ...') - await dgitPlugin.call('dgitApi', 'init') + await dgitPlugin.call('dgit', 'init') if (!isEmpty) await loadWorkspacePreset(workspaceTemplateName, opts) const status = await dgitPlugin.call('dgitApi', 'status', { ref: 'HEAD' }) diff --git a/libs/remix-ui/workspace/src/lib/components/file-explorer.tsx b/libs/remix-ui/workspace/src/lib/components/file-explorer.tsx index 21e318b4ead..d95ea5667e3 100644 --- a/libs/remix-ui/workspace/src/lib/components/file-explorer.tsx +++ b/libs/remix-ui/workspace/src/lib/components/file-explorer.tsx @@ -584,7 +584,7 @@ export const FileExplorer = (props: FileExplorerProps) => { const handleGitInit = async () => { const isActive = await plugin.call('manager', 'isActive', 'dgit') if (!isActive) await plugin.call('manager', 'activatePlugin', 'dgit') - await plugin.call('dgitApi', 'init') + await plugin.call('dgit', 'init') } return ( From 07515d9518ab1c935f0f5949870505487287a599 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Sun, 15 Dec 2024 11:57:31 +0100 Subject: [PATCH 04/58] desktop metamask --- apps/remix-ide/src/app.js | 17 ++ .../src/app/components/status-bar.tsx | 26 ++- .../src/app/plugins/desktop-client.ts | 66 +++++++ .../app/plugins/electron/desktopHostPlugin.ts | 28 +++ .../src/app/providers/injected-provider.tsx | 1 + .../src/app/providers/remix-web-provider.tsx | 79 ++++++++ apps/remix-ide/src/app/tabs/web3-provider.js | 6 +- apps/remix-ide/src/app/udapp/run-tab.tsx | 2 + apps/remix-ide/src/blockchain/blockchain.tsx | 2 +- apps/remix-ide/src/remixAppManager.js | 3 +- apps/remixdesktop/package.json | 5 +- apps/remixdesktop/src/engine.ts | 3 + apps/remixdesktop/src/lib/server.ts | 158 ++++++++++++++++ apps/remixdesktop/src/plugins/desktopHost.ts | 49 +++++ apps/remixdesktop/src/preload.ts | 2 +- apps/remixdesktop/yarn.lock | 45 ++--- .../src/lib/plugins/desktop-client.ts | 13 ++ .../src/lib/plugins/web3-provider.ts | 12 ++ libs/remix-api/src/lib/remix-api.ts | 4 + libs/remix-api/src/lib/types/rpc.ts | 18 ++ .../app/src/lib/remix-app/actions/app.ts | 2 + .../app/src/lib/remix-app/interface/index.ts | 1 + .../app/src/lib/remix-app/reducer/app.ts | 58 +++--- .../app/src/lib/remix-app/state/app.ts | 3 +- .../panel/src/lib/main/main-panel.tsx | 7 +- .../run-tab/src/lib/components/settingsUI.tsx | 8 +- libs/remix-ui/run-tab/src/lib/run-tab.tsx | 173 +++++++++--------- .../src/lib/components/desktopStatus.tsx | 31 ++++ .../src/lib/remixui-statusbar-panel.tsx | 10 +- libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx | 11 +- .../src/lib/remix-ui-terminal-wrapper.tsx | 7 +- .../src/lib/remix-ui-vertical-icons-panel.tsx | 9 +- package.json | 4 +- yarn.lock | 16 +- 34 files changed, 709 insertions(+), 170 deletions(-) create mode 100644 apps/remix-ide/src/app/plugins/desktop-client.ts create mode 100644 apps/remix-ide/src/app/plugins/electron/desktopHostPlugin.ts create mode 100644 apps/remix-ide/src/app/providers/remix-web-provider.tsx create mode 100644 apps/remixdesktop/src/lib/server.ts create mode 100644 apps/remixdesktop/src/plugins/desktopHost.ts create mode 100644 libs/remix-api/src/lib/plugins/desktop-client.ts create mode 100644 libs/remix-api/src/lib/plugins/web3-provider.ts create mode 100644 libs/remix-api/src/lib/types/rpc.ts create mode 100644 libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index ab3b9ff2464..1b9e36f69f8 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -69,6 +69,9 @@ import { HardhatHandleDesktop } from './app/plugins/electron/hardhatPlugin' import { circomPlugin } from './app/plugins/electron/circomElectronPlugin' import { GitPlugin } from './app/plugins/git' import { Matomo } from './app/plugins/matomo' +import { DesktopClient } from './app/plugins/desktop-client' +import { DesktopHost } from './app/plugins/electron/desktopHostPlugin' +import { RemixWebProvider } from './app/providers/remix-web-provider' import { TemplatesSelectionPlugin } from './app/plugins/templates-selection/templates-selection-plugin' @@ -425,6 +428,14 @@ class AppComponent { this.engine.register([appUpdater]) const remixAIDesktop = new remixAIDesktopPlugin() this.engine.register([remixAIDesktop]) + const desktopHost = new DesktopHost() + this.engine.register([desktopHost]) + const remixWebProvider = new RemixWebProvider(blockchain) + this.engine.register([remixWebProvider]) + } else{ + //---- desktop client + const desktopClient = new DesktopClient() + this.engine.register([desktopClient]) } const compilerloader = isElectron() ? new compilerLoaderPluginDesktop() : new compilerLoaderPlugin() @@ -660,6 +671,12 @@ class AppComponent { // activate solidity plugin this.appManager.activatePlugin(['solidity', 'udapp', 'deploy-libraries', 'link-libraries', 'openzeppelin-proxy', 'scriptRunnerBridge']) + + if(!isElectron()){ + + }else{ + this.appManager.activatePlugin(['desktopHost']) + } } } diff --git a/apps/remix-ide/src/app/components/status-bar.tsx b/apps/remix-ide/src/app/components/status-bar.tsx index c264fdd4341..2f6c2816e83 100644 --- a/apps/remix-ide/src/app/components/status-bar.tsx +++ b/apps/remix-ide/src/app/components/status-bar.tsx @@ -8,6 +8,7 @@ import { RemixUIStatusBar } from '@remix-ui/statusbar' import { FilePanelType } from '@remix-ui/workspace' import { VerticalIcons } from './vertical-icons' import { CustomRemixApi } from '@remix-api' +import { AppAction, appActionTypes } from '@remix-ui/app' const statusBarProfile: PluginProfile = { name: 'statusBar', @@ -22,7 +23,8 @@ export class StatusBar extends Plugin implements StatusBarI events: EventEmitter filePanelPlugin: FilePanelType verticalIcons: VerticalIcons - dispatch: React.Dispatch = () => {} + dispatch: React.Dispatch = () => { } + appStateDispatch: React.Dispatch = () => { } currentWorkspaceName: string = '' isGitRepo: boolean = false isAiActive: boolean = false @@ -79,6 +81,22 @@ export class StatusBar extends Plugin implements StatusBarI this.on('settings', 'copilotChoiceChanged', (isAiActive: boolean) => { this.isAiActive = isAiActive }) + this.on('desktopClient', 'connected', (isConnected: boolean) => { + + console.log('Connected to desktop client?', isConnected) + + this.appStateDispatch({ + type: appActionTypes.setConnectedToDesktop, + payload: isConnected + }) + if (isConnected) { + this.appStateDispatch({ + type: appActionTypes.setShowPopupPanel, + payload: false + }) + } + + }) this.renderComponent() } @@ -86,6 +104,10 @@ export class StatusBar extends Plugin implements StatusBarI this.dispatch = dispatch } + setAppStateDispatch(appStateDispatch: React.Dispatch) { + this.appStateDispatch = appStateDispatch + } + renderComponent() { this.dispatch({ plugins: this, @@ -99,7 +121,7 @@ export class StatusBar extends Plugin implements StatusBarI render() { return (
- +
) } diff --git a/apps/remix-ide/src/app/plugins/desktop-client.ts b/apps/remix-ide/src/app/plugins/desktop-client.ts new file mode 100644 index 00000000000..305c8bb48ac --- /dev/null +++ b/apps/remix-ide/src/app/plugins/desktop-client.ts @@ -0,0 +1,66 @@ +/* eslint-disable prefer-const */ +import React from 'react' +import { Plugin } from '@remixproject/engine' +import { CustomRemixApi } from '@remix-api' + +const _paq = (window._paq = window._paq || []) + +const profile = { + name: 'desktopClient', + displayName: 'desktopClient', + description: '', + methods: ['init', 'sendAsync'], + events: ['connected'], + maintainedBy: 'Remix' +} + +export class DesktopClient extends Plugin { + constructor() { + super(profile) + } + + onActivation() { + console.log('DesktopClient activated') + _paq.push(['trackEvent', 'plugin', 'activated', 'DesktopClient']) + this.connectToWebSocket() + } + + onDeactivation() { + } + + async connectToWebSocket() { + const ws = new WebSocket('ws://localhost:8546') + ws.onopen = () => { + console.log('Connected to server'); + this.emit('connected', true) + this.call('menuicons', 'select', 'udapp') + this.call('manager', 'activatePlugin', 'environmentExplorer').then(() => this.call('tabs' as any, 'focus', 'environmentExplorer')) + }; + + ws.onmessage = async (event) => { + console.log('Message from server:', event.data); + const result = await this.call('web3Provider', 'sendAsync', JSON.parse(event.data)) + console.log('Result:', result) + ws.send(JSON.stringify(result)) + return result + }; + + ws.onclose = () => { + console.log('Disconnected from server'); + this.emit('connected', false) + }; + + ws.onerror = (error) => { + console.error('WebSocket error:', error); + }; + } + + async init() { + + } + + async sendAsync(payload: any) { + + } + +} \ No newline at end of file diff --git a/apps/remix-ide/src/app/plugins/electron/desktopHostPlugin.ts b/apps/remix-ide/src/app/plugins/electron/desktopHostPlugin.ts new file mode 100644 index 00000000000..663e5160620 --- /dev/null +++ b/apps/remix-ide/src/app/plugins/electron/desktopHostPlugin.ts @@ -0,0 +1,28 @@ +/* eslint-disable prefer-const */ +import React from 'react' +import { Plugin } from '@remixproject/engine' +import { ElectronPlugin } from '@remixproject/engine-electron' + +const _paq = (window._paq = window._paq || []) + +const profile = { + name: 'desktopHost', + displayName: '', + description: '', + methods: ['getIsConnected'], + events: ['connected'], + maintainedBy: 'Remix' +} + +export class DesktopHost extends ElectronPlugin { + + constructor() { + super(profile) + } + + onActivation() { + console.log('DesktopHost activated') + _paq.push(['trackEvent', 'plugin', 'activated', 'DesktopHost']) + } + +} \ No newline at end of file diff --git a/apps/remix-ide/src/app/providers/injected-provider.tsx b/apps/remix-ide/src/app/providers/injected-provider.tsx index 70634f9594c..f5589d0640c 100644 --- a/apps/remix-ide/src/app/providers/injected-provider.tsx +++ b/apps/remix-ide/src/app/providers/injected-provider.tsx @@ -76,6 +76,7 @@ export abstract class InjectedProvider extends Plugin implements IProvider { } sendAsync(data: JsonDataRequest): Promise { + console.log('sendAsync', data) return new Promise((resolve, reject) => { this.sendAsyncInternal(data, resolve, reject) }) diff --git a/apps/remix-ide/src/app/providers/remix-web-provider.tsx b/apps/remix-ide/src/app/providers/remix-web-provider.tsx new file mode 100644 index 00000000000..64ba2a066c5 --- /dev/null +++ b/apps/remix-ide/src/app/providers/remix-web-provider.tsx @@ -0,0 +1,79 @@ +import * as packageJson from '../../../../../package.json' +import React, { useContext } from 'react' // eslint-disable-line +import { FormattedMessage } from 'react-intl' +import { AbstractProvider } from './abstract-provider' +import { AppContext, AppModal, ModalTypes } from '@remix-ui/app' +import { ethers } from 'ethers' + +const profile = { + name: 'remix-web-provider', + displayName: 'Remix web & MetaMask', + kind: 'provider', + description: 'MetaMask', + methods: ['sendAsync', 'init'], + version: packageJson.version +} + +export class RemixWebProvider extends AbstractProvider { + + constructor(blockchain) { + super(profile, blockchain, 'http://127.0.0.1:8545') + } + + async init() { + + const isConnected = await this.call('desktopHost', 'getIsConnected') + + if(isConnected) { + this.provider = new ethers.providers.JsonRpcProvider(this.defaultUrl) + return { + nodeUrl: this.defaultUrl + } + } + + await ((): Promise => { + return new Promise((resolve, reject) => { + const modalContent: AppModal = { + id: this.profile.name, + title: this.profile.displayName, + message: this.body(), + modalType: ModalTypes.confirm, + okLabel: 'Connect', + cancelLabel: 'Cancel', + + okFn: (value: string) => { + setTimeout(() => resolve(value), 0) + }, + cancelFn: () => { + setTimeout(() => reject(new Error('Canceled')), 0) + }, + hideFn: () => { + setTimeout(() => reject(new Error('Hide')), 0) + }, + } + this.call('notification', 'modal', modalContent) + }) + })() + this.provider = new ethers.providers.JsonRpcProvider(this.defaultUrl) + return { + nodeUrl: this.defaultUrl + } + } + + body() { + return ( + <> +
You can deploy and run transactions in the environment of Remix on the web.
+
This enables you to use MetaMask if you have it installed.
+
Click here to open Remix in 'Desktop Connect Mode'
+
And connect to any network there you want to use here.
+ + + Remix on the web in Desktop Connect Mode + + +
After that click 'Connect'
+ + ) + } +} diff --git a/apps/remix-ide/src/app/tabs/web3-provider.js b/apps/remix-ide/src/app/tabs/web3-provider.js index 39e5543c2e6..e27045ef11d 100644 --- a/apps/remix-ide/src/app/tabs/web3-provider.js +++ b/apps/remix-ide/src/app/tabs/web3-provider.js @@ -28,13 +28,14 @@ export class Web3ProviderModule extends Plugin { Should be taken carefully and probably not be release as it is now. */ sendAsync(payload) { - + console.log('global web3 provider', payload) return new Promise((resolve, reject) => { this.askUserPermission('sendAsync', `Calling ${payload.method} with parameters ${JSON.stringify(payload.params, replacer, '\t')}`).then( async (result) => { if (result) { const provider = this.blockchain.web3().currentProvider const resultFn = async (error, message) => { + console.log('resultFn', error, message) if (error) { // Handle 'The method "debug_traceTransaction" does not exist / is not available.' error if(error.message && error.code && error.code === -32601) { @@ -49,6 +50,7 @@ export class Web3ProviderModule extends Plugin { } if (payload.method === 'eth_sendTransaction') { if (payload.params.length && !payload.params[0].to && message.result) { + console.log('waiting for receipt', message.result) setTimeout(async () => { const receipt = await this.tryTillReceiptAvailable(message.result) if (!receipt.contractAddress) { @@ -57,6 +59,7 @@ export class Web3ProviderModule extends Plugin { } const contractAddressStr = addressToString(receipt.contractAddress) const contractData = await this.call('compilerArtefacts', 'getContractDataFromAddress', contractAddressStr) + console.log('contractData', contractData) if (contractData) { const data = await this.call('compilerArtefacts', 'getCompilerAbstract', contractData.file) const contractObject = { @@ -99,6 +102,7 @@ export class Web3ProviderModule extends Plugin { async tryTillReceiptAvailable(txhash) { try { + console.log('tryTillReceiptAvailable', txhash) const receipt = await this.call('blockchain', 'getTransactionReceipt', txhash) if (receipt) return receipt } catch (e) { diff --git a/apps/remix-ide/src/app/udapp/run-tab.tsx b/apps/remix-ide/src/app/udapp/run-tab.tsx index b17d95b9c6a..35350f5fd7f 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.tsx +++ b/apps/remix-ide/src/app/udapp/run-tab.tsx @@ -151,6 +151,7 @@ export class RunTab extends ViewPlugin { 'vm-custom-fork': 'Deploy to a fork of a custom network in the in-browser virtual machine.', 'walletconnect': 'Deploy using WalletConnect.', 'basic-http-provider': 'Deploy to a Custom local network.', + 'remix-web-provider': 'Deploy through the Remix MetaMask browser extension.', 'hardhat-provider': 'Deploy to the local Hardhat dev chain.', 'ganache-provider': 'Deploy to the local Ganache dev chain.', 'foundry-provider': 'Deploy to the local Foundry dev chain.', @@ -262,6 +263,7 @@ export class RunTab extends ViewPlugin { // external provider await addProvider(10, 'basic-http-provider', 'Custom - External Http Provider', false, false) + await addProvider(11, 'remix-web-provider', 'Remix web ( Metamask )', false, false) await addProvider(20, 'hardhat-provider', 'Dev - Hardhat Provider', false, false) await addProvider(21, 'ganache-provider', 'Dev - Ganache Provider', false, false) await addProvider(22, 'foundry-provider', 'Dev - Foundry Provider', false, false) diff --git a/apps/remix-ide/src/blockchain/blockchain.tsx b/apps/remix-ide/src/blockchain/blockchain.tsx index 6ccbaed7aca..5ad7e5f2428 100644 --- a/apps/remix-ide/src/blockchain/blockchain.tsx +++ b/apps/remix-ide/src/blockchain/blockchain.tsx @@ -114,7 +114,7 @@ export class Blockchain extends Plugin { this.networkcallid = 0 this.networkStatus = { network: { name: ' - ', id: ' - ' } } this.registeredPluginEvents = [] - this.defaultPinnedProviders = ['vm-cancun', 'vm-mainnet-fork', 'walletconnect', 'injected-MetaMask', 'basic-http-provider', 'hardhat-provider', 'foundry-provider'] + this.defaultPinnedProviders = ['vm-cancun', 'vm-mainnet-fork', 'walletconnect', 'injected-MetaMask', 'remix-web-provider', 'hardhat-provider', 'foundry-provider'] this.pinnedProviders = [] this.setupEvents() this.setupProviders() diff --git a/apps/remix-ide/src/remixAppManager.js b/apps/remix-ide/src/remixAppManager.js index c514350909d..6dc4957b594 100644 --- a/apps/remix-ide/src/remixAppManager.js +++ b/apps/remix-ide/src/remixAppManager.js @@ -149,7 +149,8 @@ export function isNative(name) { 'templateSelection', 'walletconnect', 'contract-verification', - 'popupPanel' + 'popupPanel', + 'desktopClient' ] return nativePlugins.includes(name) || requiredModules.includes(name) || isInjectedProvider(name) || isVM(name) || isScriptRunner(name) } diff --git a/apps/remixdesktop/package.json b/apps/remixdesktop/package.json index 9020b130fcb..42ab0cf8303 100644 --- a/apps/remixdesktop/package.json +++ b/apps/remixdesktop/package.json @@ -70,18 +70,21 @@ "@remixproject/plugin": "0.3.43", "@remixproject/plugin-api": "^0.3.43", "@remixproject/plugin-electron": "0.3.43", + "@types/ws": "^8.5.13", "@vscode/ripgrep": "^1.15.6", "add": "^2.0.6", "axios": "^1.7.4", "byline": "^5.0.0", "chokidar": "^3.5.3", + "cors": "^2.8.5", "electron-updater": "^6.1.8", "express": "^4.20.0", "isomorphic-git": "^1.24.2", "matomo-tracker": "^2.2.4", "node-pty": "^1.0.0", "octokit": "^3.1.2", - "semver": "^7.5.4" + "semver": "^7.5.4", + "ws": "^8.18.0" }, "optionalDependencies": { "@remix-project/remix-ws-templates": "^1.0.27" diff --git a/apps/remixdesktop/src/engine.ts b/apps/remixdesktop/src/engine.ts index 7c573a752fb..1549241b919 100644 --- a/apps/remixdesktop/src/engine.ts +++ b/apps/remixdesktop/src/engine.ts @@ -16,6 +16,7 @@ import { FoundryPlugin } from './plugins/foundryPlugin'; import { HardhatPlugin } from './plugins/hardhatPlugin'; import { CircomElectronPlugin } from './plugins/circomElectronBasePlugin'; import { isE2E } from './main'; +import { DesktopHostPlugin } from './plugins/desktopHost'; const engine = new Engine() const appManager = new PluginManager() @@ -32,6 +33,7 @@ const foundryPlugin = new FoundryPlugin() const hardhatPlugin = new HardhatPlugin() const remixAIDesktopPlugin = new RemixAIDesktopPlugin() const circomPlugin = new CircomElectronPlugin() +const desktopHostPlugin = new DesktopHostPlugin() engine.register(appManager) engine.register(fsPlugin) @@ -47,6 +49,7 @@ engine.register(appUpdaterPlugin) engine.register(hardhatPlugin) engine.register(remixAIDesktopPlugin) engine.register(circomPlugin) +engine.register(desktopHostPlugin) appManager.activatePlugin('electronconfig') appManager.activatePlugin('fs') diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts new file mode 100644 index 00000000000..64c6baada8a --- /dev/null +++ b/apps/remixdesktop/src/lib/server.ts @@ -0,0 +1,158 @@ +import * as http from 'http'; +import { WebSocketServer, WebSocket } from 'ws'; +import cors from 'cors'; +import EventEmitter from 'events'; + +// Forwarding WebSocket client +let connectedWebSocket: WebSocket | null = null; + +// Helper function to send JSON responses +const sendResponse = (response: http.ServerResponse, data: any, statusCode = 200) => { + response.writeHead(statusCode, { 'Content-Type': 'application/json' }); + response.end(JSON.stringify(data)); +}; + +// Handle incoming JSON-RPC requests and forward to WebSocket client +const handleRequest = async ( + method: string, + params: any[], + id: any +): Promise => { + if (!connectedWebSocket || connectedWebSocket.readyState !== WebSocket.OPEN) { + throw new Error('No active WebSocket connection to forward request'); + } + + // Create the JSON-RPC payload + const jsonRpcPayload = { + jsonrpc: '2.0', + method, + params, + id, + }; + + // Send the payload to the WebSocket client and wait for response + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => reject(new Error('Timeout waiting for WebSocket response')), 240000); // 10 seconds timeout + + connectedWebSocket && connectedWebSocket.once('message', (data: string) => { + + if (Buffer.isBuffer(data)) { + data = data.toString('utf-8'); + } + + clearTimeout(timeout); + try { + const response = JSON.parse(data); + if (response.id === id) { + //console.log('response from WebSocket client:', response); + resolve(response.result); + } else { + console.log('ignore response from WebSocket client:', data); + //reject(new Error('Invalid response ID')); + } + } catch (error) { + reject(error); + } + }); + + connectedWebSocket && connectedWebSocket.send(JSON.stringify(jsonRpcPayload), (err) => { + if (err) { + clearTimeout(timeout); + reject(err); + } + }); + }); +}; + +export const startRPCServer = (eventEmitter: EventEmitter) => { + + // Create the HTTP server with CORS + const httpServer = http.createServer(async (req, res) => { + // Add CORS headers + const corsOptions = { + origin: '*', // Allow all origins; adjust as needed for your application + methods: 'POST', + allowedHeaders: ['Content-Type'], + }; + + cors(corsOptions)(req as any, res as any, async () => { + if (req.method === 'POST' && req.url === '/') { + let body = ''; + req.on('data', (chunk) => (body += chunk.toString())); + req.on('end', async () => { + try { + const jsonRpcRequest = JSON.parse(body); + + if ( + jsonRpcRequest.jsonrpc !== '2.0' || + !jsonRpcRequest.method || + typeof jsonRpcRequest.method !== 'string' + ) { + throw new Error('Invalid JSON-RPC request'); + } + + const result = await handleRequest( + jsonRpcRequest.method, + jsonRpcRequest.params || [], + jsonRpcRequest.id + ); + + const jsonResponse = { + jsonrpc: '2.0', + result: result, + id: jsonRpcRequest.id, + }; + sendResponse(res, jsonResponse); + } catch (error) { + const jsonResponse = { + jsonrpc: '2.0', + error: { + code: -32600, + message: (error as any).message, + }, + id: null, + }; + sendResponse(res, jsonResponse, 400); + } + }); + } else { + sendResponse(res, { error: 'Only POST requests are allowed' }, 405); + } + }); + }); + + // Create the WebSocket server + const wsServer = new WebSocketServer({ port: 8546 }); // WebSocket server on port 8546 + + wsServer.on('connection', (ws) => { + console.log('WebSocket client connected'); + if (connectedWebSocket?.OPEN) { + console.log(connectedWebSocket.url) + connectedWebSocket.removeAllListeners() + connectedWebSocket.close() + } + + connectedWebSocket = ws; + eventEmitter.emit('connected', true); + + ws.on('close', () => { + console.log('WebSocket client disconnected'); + connectedWebSocket = null; + eventEmitter.emit('connected', false); + }); + + ws.on('error', (error) => { + console.error('WebSocket error:', error.message); + connectedWebSocket = null; + eventEmitter.emit('connected', false); + }); + }); + + // Start the HTTP server + const HTTP_PORT = 8545; // Default Ethereum JSON-RPC port + const webserver = httpServer.listen(HTTP_PORT, () => { + console.log(`Ethereum RPC server running on http://localhost:` + JSON.stringify((webserver.address() as any).port)); + console.log(`WebSocket server running on ws://localhost:` + JSON.stringify((wsServer.address() as any).port)); + }); + +} diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts new file mode 100644 index 00000000000..f211f474519 --- /dev/null +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -0,0 +1,49 @@ +import { ElectronBasePlugin, ElectronBasePluginClient } from "@remixproject/plugin-electron" +import { Profile } from "@remixproject/plugin-utils" +import { startRPCServer } from "../lib/server" +import EventEmitter from "events" + +const profile = { + displayName: 'desktopHost', + name: 'desktopHost', + description: 'desktopHost', +} + +const eventEmitter = new EventEmitter() +let isConnected = false + +export class DesktopHostPlugin extends ElectronBasePlugin { + clients: DesktopHostPluginClient[] = [] + constructor() { + super(profile, clientProfile, DesktopHostPluginClient) + this.methods = [...super.methods] + this.startServer() + eventEmitter.on('connected', (payload) => { + console.log('connected', payload) + isConnected = payload + }) + } + + async startServer(): Promise { + console.log('desktopHost activated') + startRPCServer(eventEmitter) + } +} + +const clientProfile: Profile = { + name: 'desktopHost', + displayName: 'desktopHost', + description: 'desktopHost', + methods: ['getIsConnected'], +} + +export class DesktopHostPluginClient extends ElectronBasePluginClient { + constructor(webContentsId: number, profile: Profile) { + super(webContentsId, profile) + } + + getIsConnected() { + console.log('getIsConnected', isConnected) + return isConnected + } +} \ No newline at end of file diff --git a/apps/remixdesktop/src/preload.ts b/apps/remixdesktop/src/preload.ts index 6eb9d717441..366352b7f3d 100644 --- a/apps/remixdesktop/src/preload.ts +++ b/apps/remixdesktop/src/preload.ts @@ -6,7 +6,7 @@ console.log('preload.ts', new Date().toLocaleTimeString()) /* preload script needs statically defined API for each plugin */ -const exposedPLugins = ['fs', 'git', 'xterm', 'isogit', 'electronconfig', 'electronTemplates', 'ripgrep', 'compilerloader', 'appUpdater', 'slither', 'foundry', 'hardhat', 'remixAID', 'circom'] +const exposedPLugins = ['fs', 'git', 'xterm', 'isogit', 'electronconfig', 'electronTemplates', 'ripgrep', 'compilerloader', 'appUpdater', 'slither', 'foundry', 'hardhat', 'remixAID', 'circom', 'desktopHost'] let webContentsId: number | undefined diff --git a/apps/remixdesktop/yarn.lock b/apps/remixdesktop/yarn.lock index a8b2472ae03..5ad67b68d7e 100644 --- a/apps/remixdesktop/yarn.lock +++ b/apps/remixdesktop/yarn.lock @@ -1348,6 +1348,13 @@ dependencies: "@types/node" "*" +"@types/ws@^8.5.13": + version "8.5.13" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" + integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== + dependencies: + "@types/node" "*" + "@types/yauzl@^2.9.1": version "2.10.0" resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz" @@ -2483,7 +2490,7 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cors@^2.8.1: +cors@^2.8.1, cors@^2.8.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== @@ -6441,16 +6448,7 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6509,14 +6507,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -7464,16 +7455,7 @@ workerpool@6.2.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -7515,6 +7497,11 @@ ws@^3.0.0: safe-buffer "~5.1.0" ultron "~1.1.0" +ws@^8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + xhr-request-promise@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" diff --git a/libs/remix-api/src/lib/plugins/desktop-client.ts b/libs/remix-api/src/lib/plugins/desktop-client.ts new file mode 100644 index 00000000000..78a4284209e --- /dev/null +++ b/libs/remix-api/src/lib/plugins/desktop-client.ts @@ -0,0 +1,13 @@ +import { StatusEvents } from '@remixproject/plugin-utils' +import { JsonDataRequest, JsonDataResult } from '../types/rpc' + +export interface IDesktopClient { + events: { + connected: (connected: boolean) => void, + } & StatusEvents + methods: { + init(): void + sendAsync(payload: JsonDataRequest): Promise + } + +} diff --git a/libs/remix-api/src/lib/plugins/web3-provider.ts b/libs/remix-api/src/lib/plugins/web3-provider.ts new file mode 100644 index 00000000000..ac92ddad944 --- /dev/null +++ b/libs/remix-api/src/lib/plugins/web3-provider.ts @@ -0,0 +1,12 @@ +import { StatusEvents } from '@remixproject/plugin-utils' +import { JsonDataRequest, JsonDataResult } from '../types/rpc' + +export interface IWeb3Provider { + events: { + } & StatusEvents + methods: { + init(): void + sendAsync(payload: JsonDataRequest): Promise + } + +} diff --git a/libs/remix-api/src/lib/remix-api.ts b/libs/remix-api/src/lib/remix-api.ts index 36d7fbf6a04..ba786e23d51 100644 --- a/libs/remix-api/src/lib/remix-api.ts +++ b/libs/remix-api/src/lib/remix-api.ts @@ -18,6 +18,8 @@ import { IRemixAID } from "./plugins/remixAIDesktop-api" import { IMenuIconsApi } from "./plugins/menuicons-api" import { IDgitPlugin } from "./plugins/dgitplugin-api" import { IPopupPanelAPI } from "./plugins/popuppanel-api" +import { IDesktopClient } from "./plugins/desktop-client" +import { IWeb3Provider } from "./plugins/web3-provider" export interface ICustomRemixApi extends IRemixApi { popupPanel: IPopupPanelAPI @@ -39,6 +41,8 @@ export interface ICustomRemixApi extends IRemixApi { menuicons: IMenuIconsApi remixAI: IRemixAI, remixAID: IRemixAID + desktopClient: IDesktopClient + web3Provider: IWeb3Provider } diff --git a/libs/remix-api/src/lib/types/rpc.ts b/libs/remix-api/src/lib/types/rpc.ts new file mode 100644 index 00000000000..3b22420408e --- /dev/null +++ b/libs/remix-api/src/lib/types/rpc.ts @@ -0,0 +1,18 @@ +export type JsonDataRequest = { + id: number + jsonrpc: string // version + method: string + params: Array + } + + export type JsonDataResult = { + id: number + jsonrpc: string // version + result?: any + error?: { + code: number, + message: string + data?: string + } + errorData?: any + } \ No newline at end of file diff --git a/libs/remix-ui/app/src/lib/remix-app/actions/app.ts b/libs/remix-ui/app/src/lib/remix-app/actions/app.ts index 246b10cad09..28cc2fbbacd 100644 --- a/libs/remix-ui/app/src/lib/remix-app/actions/app.ts +++ b/libs/remix-ui/app/src/lib/remix-app/actions/app.ts @@ -18,6 +18,7 @@ export const enum appActionTypes { setNeedsGitInit = 'SET_NEEDS_GIT_INIT', setCanUseGit = 'SET_CAN_USE_GIT', setShowPopupPanel = 'SET_SHOW_POPUP_PANEL', + setConnectedToDesktop = 'SET_CONNECTED_TO_DESKTOP', } type AppPayload = { @@ -26,6 +27,7 @@ type AppPayload = { [appActionTypes.setNeedsGitInit]: boolean, [appActionTypes.setCanUseGit]: boolean, [appActionTypes.setShowPopupPanel]: boolean, + [appActionTypes.setConnectedToDesktop]: boolean, } export type AppAction = ActionMap[keyof ActionMap< diff --git a/libs/remix-ui/app/src/lib/remix-app/interface/index.ts b/libs/remix-ui/app/src/lib/remix-app/interface/index.ts index 531c2764d0a..4bede79c24a 100644 --- a/libs/remix-ui/app/src/lib/remix-app/interface/index.ts +++ b/libs/remix-ui/app/src/lib/remix-app/interface/index.ts @@ -53,5 +53,6 @@ export interface AppState { needsGitInit: boolean canUseGit: boolean showPopupPanel: boolean + connectedToDesktop: boolean } diff --git a/libs/remix-ui/app/src/lib/remix-app/reducer/app.ts b/libs/remix-ui/app/src/lib/remix-app/reducer/app.ts index 39d61cab75c..abe232c1fce 100644 --- a/libs/remix-ui/app/src/lib/remix-app/reducer/app.ts +++ b/libs/remix-ui/app/src/lib/remix-app/reducer/app.ts @@ -3,36 +3,44 @@ import { AppState } from "../interface"; export const appReducer = (state: AppState, action: AppAction): AppState => { switch (action.type) { - case appActionTypes.setGitHubUser: { - return { - ...state, - gitHubUser: action.payload + case appActionTypes.setGitHubUser: { + return { + ...state, + gitHubUser: action.payload + } } - } - case appActionTypes.setCurrentBranch: { - return { - ...state, - currentBranch: action.payload + case appActionTypes.setCurrentBranch: { + return { + ...state, + currentBranch: action.payload + } } - } - case appActionTypes.setNeedsGitInit: { - return { - ...state, - needsGitInit: action.payload + case appActionTypes.setNeedsGitInit: { + return { + ...state, + needsGitInit: action.payload + } } - } - case appActionTypes.setCanUseGit: { - return { - ...state, - canUseGit: action.payload + case appActionTypes.setCanUseGit: { + return { + ...state, + canUseGit: action.payload + } } - } - case appActionTypes.setShowPopupPanel: { - return { - ...state, - showPopupPanel: action.payload + case appActionTypes.setShowPopupPanel: { + return { + ...state, + showPopupPanel: action.payload + } + } + + case appActionTypes.setConnectedToDesktop: { + console.log('setConnectedToDesktop', action.payload) + return { + ...state, + connectedToDesktop: action.payload + } } - } } } \ No newline at end of file diff --git a/libs/remix-ui/app/src/lib/remix-app/state/app.ts b/libs/remix-ui/app/src/lib/remix-app/state/app.ts index 708b22301ac..07cab4c521b 100644 --- a/libs/remix-ui/app/src/lib/remix-app/state/app.ts +++ b/libs/remix-ui/app/src/lib/remix-app/state/app.ts @@ -6,5 +6,6 @@ export const appInitialState: AppState = { currentBranch: null, needsGitInit: true, canUseGit: false, - showPopupPanel: false + showPopupPanel: false, + connectedToDesktop: false } \ No newline at end of file diff --git a/libs/remix-ui/panel/src/lib/main/main-panel.tsx b/libs/remix-ui/panel/src/lib/main/main-panel.tsx index 0786a644fdc..9de2fb6706a 100644 --- a/libs/remix-ui/panel/src/lib/main/main-panel.tsx +++ b/libs/remix-ui/panel/src/lib/main/main-panel.tsx @@ -1,9 +1,9 @@ /* eslint-disable no-unused-expressions */ -import React, {useContext, useEffect, useRef, useState} from 'react' // eslint-disable-line +import React, { useContext, useEffect, useRef, useState } from 'react' // eslint-disable-line import DragBar from '../dragbar/dragbar' import RemixUIPanelPlugin from '../plugins/panel-plugin' import { PluginRecord } from '../types' -import { appPlatformTypes, platformContext } from '@remix-ui/app' +import { AppContext, appPlatformTypes, platformContext } from '@remix-ui/app' import './main-panel.css' export type RemixUIMainPanelProps = { @@ -18,6 +18,7 @@ const RemixUIMainPanel = (props: RemixUIMainPanelProps) => { const mainPanelRef = useRef(null) const tabsRef = useRef(null) const terminalRef = useRef(null) + const appContext = useContext(AppContext) const refs = [tabsRef, editorRef, mainPanelRef, terminalRef] @@ -29,7 +30,7 @@ const RemixUIMainPanel = (props: RemixUIMainPanelProps) => { profile: panel.plugin.profile, active: panel.active, view: panel.plugin.profile.name === 'tabs' ? panel.plugin.renderTabsbar() : panel.plugin.render(), - class: panel.plugin.profile.name + '-wrap ' + (panel.minimized ? 'minimized ' : ' ') + ((platform === appPlatformTypes.desktop)? 'desktop' : ''), + class: panel.plugin.profile.name + '-wrap ' + (panel.minimized ? 'minimized ' : ' ') + ((platform === appPlatformTypes.desktop) ? 'desktop' : ''), minimized: panel.minimized, pinned: panel.pinned }) diff --git a/libs/remix-ui/run-tab/src/lib/components/settingsUI.tsx b/libs/remix-ui/run-tab/src/lib/components/settingsUI.tsx index 12a7da58dd7..66646b2b1fc 100644 --- a/libs/remix-ui/run-tab/src/lib/components/settingsUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/settingsUI.tsx @@ -1,14 +1,16 @@ // eslint-disable-next-line no-use-before-define -import React, { useEffect } from 'react' +import React, { useContext, useEffect } from 'react' import { SettingsProps } from '../types' import { EnvironmentUI } from './environment' import { NetworkUI } from './network' import { AccountUI } from './account' import { GasLimitUI } from './gasLimit' import { ValueUI } from './value' +import { AppContext } from '@remix-ui/app' export function SettingsUI(props: SettingsProps) { // this._deps.config.events.on('settings/personal-mode_changed', this.onPersonalChange.bind(this)) + const appContext = useContext(AppContext) return (
@@ -28,8 +30,8 @@ export function SettingsUI(props: SettingsProps) { signMessageWithAddress={props.signMessageWithAddress} passphrase={props.passphrase} /> - - + {appContext.appState.connectedToDesktop === false ? + <> : null}
) } diff --git a/libs/remix-ui/run-tab/src/lib/run-tab.tsx b/libs/remix-ui/run-tab/src/lib/run-tab.tsx index c6eb716af69..79d3b46137e 100644 --- a/libs/remix-ui/run-tab/src/lib/run-tab.tsx +++ b/libs/remix-ui/run-tab/src/lib/run-tab.tsx @@ -1,5 +1,5 @@ // eslint-disable-next-line no-use-before-define -import React, { Fragment, useCallback, useEffect, useReducer, useState } from 'react' +import React, { Fragment, useCallback, useContext, useEffect, useReducer, useState } from 'react' import semver from 'semver' import { FormattedMessage } from 'react-intl' import { ModalDialog } from '@remix-ui/modal-dialog' @@ -57,6 +57,7 @@ import { MainnetPrompt } from './components/mainnet' import { ScenarioPrompt } from './components/scenario' import { setIpfsCheckedState, setRemixDActivated } from './actions/payload' import { ChainCompatibleInfo, getCompatibleChain, getCompatibleChains, HardFork, isChainCompatible, isChainCompatibleWithAnyFork } from './actions/evmmap' +import { AppContext } from '@remix-ui/app' export type CheckStatus = 'Passed' | 'Failed' | 'Not Found' @@ -67,9 +68,9 @@ export function RunTabUI(props: RunTabProps) { title: '', message: '', okLabel: '', - okFn: () => {}, + okFn: () => { }, cancelLabel: '', - cancelFn: () => {} + cancelFn: () => { } }) const [modals, setModals] = useState([]) const [focusToaster, setFocusToaster] = useState('') @@ -87,8 +88,9 @@ export function RunTabUI(props: RunTabProps) { const [runTab, dispatch] = useReducer(runTabReducer, initialState) const REACT_API = { runTab } const currentfile = plugin.config.get('currentFile') - const [solcVersion, setSolcVersion] = useState<{version: string, canReceive: boolean}>({ version: '', canReceive: true }) + const [solcVersion, setSolcVersion] = useState<{ version: string, canReceive: boolean }>({ version: '', canReceive: true }) const [evmCheckComplete, setEvmCheckComplete] = useState(false) + const appContext = useContext(AppContext) const getVersion = () => { let version = '0.8.25' @@ -141,7 +143,7 @@ export function RunTabUI(props: RunTabProps) { return 'Not Found' } else { if (!IsCompatible) { - //show modal + //show modal plugin.call('notification', 'modal', { id: 'evm-chainId-incompatible', title: 'Incompatible EVM for the selected chain', @@ -157,7 +159,7 @@ export function RunTabUI(props: RunTabProps) { okLabel: 'Switch EVM and Recompile', cancelLabel: 'Cancel', okFn: () => checkEvmChainCompatibilityOkFunction(chain), - cancelFn: () => {} + cancelFn: () => { } }) return 'Failed' } else { @@ -370,84 +372,87 @@ export function RunTabUI(props: RunTabProps) { signMessageWithAddress={signMessage} passphrase={runTab.passphrase} /> - - - { - const { metadata, abi, object } = instance.contractData; - plugin.call('quick-dapp', 'edit', { - address: instance.address, - abi: abi, - name: instance.name, - network: runTab.networkName, - devdoc: object.devdoc, - methodIdentifiers: object.evm.methodIdentifiers, - solcVersion: JSON.parse(metadata).compiler.version, - }) - }} - /> + {!appContext.appState.connectedToDesktop && ( + <> + + + { + const { metadata, abi, object } = instance.contractData; + plugin.call('quick-dapp', 'edit', { + address: instance.address, + abi: abi, + name: instance.name, + network: runTab.networkName, + devdoc: object.devdoc, + methodIdentifiers: object.evm.methodIdentifiers, + solcVersion: JSON.parse(metadata).compiler.version, + }) + }} + /> + )} diff --git a/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx b/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx new file mode 100644 index 00000000000..31c29100e73 --- /dev/null +++ b/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx @@ -0,0 +1,31 @@ +import React, { useEffect, Dispatch, useState, useContext } from 'react' +// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries +import { StatusBar } from 'apps/remix-ide/src/app/components/status-bar' +import '../../css/statusbar.css' +import { CustomTooltip } from '@remix-ui/helper' +import { AppContext } from '@remix-ui/app' + +export interface DesktopStatusProps { + plugin: StatusBar +} + +export default function DesktopStatus({ plugin }: DesktopStatusProps) { + const appContext = useContext(AppContext) + + useEffect(() => { + console.log('DesktopStatus', appContext.appState) + }, [appContext.appState]) + + return ( +
+ {appContext.appState.connectedToDesktop === true ? + <> + + Desktop Connect Mode + + :null} +
+ ) +} diff --git a/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx b/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx index 22b1dac3907..5da09cd8728 100644 --- a/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx +++ b/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx @@ -9,7 +9,8 @@ import axios from 'axios' import { StatusBar } from 'apps/remix-ide/src/app/components/status-bar' import { StatusBarContextProvider } from '../contexts/statusbarcontext' import DidYouKnow from './components/didYouKnow' -import { appPlatformTypes, platformContext } from '@remix-ui/app' +import { AppContext, appPlatformTypes, platformContext } from '@remix-ui/app' +import DesktopStatus from './components/desktopStatus' export interface RemixUIStatusBarProps { statusBarPlugin: StatusBar @@ -45,6 +46,7 @@ export function RemixUIStatusBar({ statusBarPlugin }: RemixUIStatusBarProps) { const dismiss = useDismiss(context) const role = useRole(context) const { getReferenceProps, getFloatingProps } = useInteractions([click, dismiss, role]) + const appContext = useContext(AppContext) useEffect(() => { const abortController = new AbortController() @@ -67,6 +69,11 @@ export function RemixUIStatusBar({ statusBarPlugin }: RemixUIStatusBarProps) { return aiActive } + if(platform !== appPlatformTypes.desktop && appContext.appState.connectedToDesktop === true) { + return (<>
+
) + } + return ( <> @@ -96,6 +103,7 @@ export function RemixUIStatusBar({ statusBarPlugin }: RemixUIStatusBarProps) { +
diff --git a/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx index 2471cf00f93..c490787b33e 100644 --- a/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx +++ b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx @@ -1,11 +1,12 @@ import { fileDecoration, FileDecorationIcons } from '@remix-ui/file-decorators' import { CustomTooltip } from '@remix-ui/helper' import { Plugin } from '@remixproject/engine' -import React, { useState, useRef, useEffect, useReducer } from 'react' // eslint-disable-line +import React, { useState, useRef, useEffect, useReducer, useContext } from 'react' // eslint-disable-line import { FormattedMessage } from 'react-intl' import { Tab, Tabs, TabList, TabPanel } from 'react-tabs' import './remix-ui-tabs.css' import { values } from 'lodash' +import { AppContext } from '@remix-ui/app' const _paq = (window._paq = window._paq || []) /* eslint-disable-next-line */ @@ -76,6 +77,7 @@ export const TabsUI = (props: TabsUIProps) => { const [ai_switch, setAI_switch] = useState(false) const tabs = useRef(props.tabs) tabs.current = props.tabs // we do this to pass the tabs list to the onReady callbacks + const appContext = useContext(AppContext) useEffect(() => { if (props.tabs[tabsState.selectedIndex]) { @@ -182,7 +184,12 @@ export const TabsUI = (props: TabsUIProps) => { } return ( -
+
{ const [terminalState, dispatch] = useReducer(registerCommandReducer, initialState) const [xtermState, dispatchXterm] = useReducer(xtermReducer, xTerminInitialState) const platform = useContext(platformContext) + const appContext = useContext(AppContext) const providerState = { terminalState, dispatch, @@ -18,6 +19,10 @@ export const RemixUITerminalWrapper = (props: RemixUiTerminalProps) => { dispatchXterm } + if(appContext.appState.connectedToDesktop === true) { + return <> + } + return (<> diff --git a/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx b/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx index 108052d4824..3c5e14c3ef6 100644 --- a/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx +++ b/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx @@ -6,7 +6,7 @@ import Home from './components/Home' import { verticalScrollReducer } from './reducers/verticalScrollReducer' import { Chevron } from './components/Chevron' import { IconRecord } from './types' -import { onLineContext } from '@remix-ui/app' +import { AppContext, onLineContext } from '@remix-ui/app' import { CustomTooltip } from '@remix-ui/helper' import { Registry } from '@remix-project/remix-lib' @@ -27,6 +27,7 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic const [activateScroll, dispatchScrollAction] = useReducer(verticalScrollReducer, initialState) const [theme, setTheme] = useState('dark') const online = useContext(onLineContext) + const appContext = useContext(AppContext) const evaluateScrollability = () => { dispatchScrollAction({ @@ -82,7 +83,7 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic > p.isRequired && p.profile.name !== 'pluginManager')} + icons={icons.filter((p) => p.profile.name==='udapp' || (!appContext.appState.connectedToDesktop && p.isRequired && p.profile.name !== 'pluginManager'))} verticalIconsPlugin={verticalIconsPlugin} itemContextAction={itemContextAction} /> @@ -104,7 +105,7 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic { - return !p.isRequired && p.profile.name !== 'settings' + return !appContext.appState.connectedToDesktop && !p.isRequired && p.profile.name !== 'settings' })} verticalIconsPlugin={verticalIconsPlugin} itemContextAction={itemContextAction} @@ -116,7 +117,7 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic ) : null } p.profile.name === 'settings' || p.profile.name === 'pluginManager')} + icons={icons.filter((p) => !appContext.appState.connectedToDesktop && ( p.profile.name === 'settings' || p.profile.name === 'pluginManager'))} verticalIconsPlugin={verticalIconsPlugin} itemContextAction={itemContextAction} /> diff --git a/package.json b/package.json index 6da9934fcf8..5f8b27c0937 100644 --- a/package.json +++ b/package.json @@ -217,7 +217,7 @@ "tslib": "^2.3.0", "web3": "^4.1.0", "winston": "^3.3.3", - "ws": "^8.17.1", + "ws": "^8.18.0", "xterm": "^5.2.1", "xterm-addon-search": "^0.12.0" }, @@ -275,7 +275,7 @@ "@types/request": "^2.48.7", "@types/semver": "^7.3.10", "@types/tape": "^4.13.0", - "@types/ws": "^7.2.4", + "@types/ws": "^8.5.13", "@typescript-eslint/eslint-plugin": "^5.40.1", "@typescript-eslint/parser": "^5.40.1", "@uniswap/v2-core": "^1.0.1", diff --git a/yarn.lock b/yarn.lock index 32b59035345..76439c0a2ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7915,13 +7915,6 @@ dependencies: "@types/node" "*" -"@types/ws@^7.2.4": - version "7.4.7" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" - integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== - dependencies: - "@types/node" "*" - "@types/ws@^8.0.0": version "8.5.10" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" @@ -7929,6 +7922,13 @@ dependencies: "@types/node" "*" +"@types/ws@^8.5.13": + version "8.5.13" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.13.tgz#6414c280875e2691d0d1e080b05addbf5cb91e20" + integrity sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "20.2.1" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" @@ -32043,7 +32043,7 @@ ws@8.5.0: resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== -ws@>=8.7.0, ws@^8.12.0, ws@^8.13.0, ws@^8.15.0, ws@^8.17.1, ws@^8.4.2, ws@^8.8.1: +ws@>=8.7.0, ws@^8.12.0, ws@^8.13.0, ws@^8.15.0, ws@^8.18.0, ws@^8.4.2, ws@^8.8.1: version "8.18.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== From 8a32bf49915aeef9a16401daaf68bbe183adc274 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 18 Dec 2024 11:59:21 +0100 Subject: [PATCH 05/58] add tab to terminal --- .../lib/components/remix-ui-terminal-bar.tsx | 2 +- .../remix-ui-terminal-menu-buttons.tsx | 25 +++++++++++++------ .../src/lib/remix-ui-terminal-wrapper.tsx | 2 +- .../src/components/transactions.tsx | 0 libs/remix-ui/transactions/src/index.ts | 0 libs/remix-ui/xterm/src/lib/actions/index.ts | 2 +- .../remix-ui-terminal-menu-xterm.tsx | 2 +- .../lib/components/remix-ui-xterminals.tsx | 8 +++--- libs/remix-ui/xterm/src/lib/reducer/index.ts | 10 +++++++- libs/remix-ui/xterm/src/lib/types/index.ts | 2 ++ 10 files changed, 36 insertions(+), 17 deletions(-) create mode 100644 libs/remix-ui/transactions/src/components/transactions.tsx create mode 100644 libs/remix-ui/transactions/src/index.ts diff --git a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx index a51bb33e613..2b4a81b3b1c 100644 --- a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx +++ b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx @@ -31,7 +31,7 @@ export const RemixUITerminalBar = (props: RemixUiTerminalProps) => { {platform === appPlatformTypes.desktop ?
- {xtermState.showOutput? : } + {xtermState.selectedTerminalTab === 'output' ? : }
: } diff --git a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx index 826528759fe..9ad215d1de0 100644 --- a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx +++ b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx @@ -8,35 +8,44 @@ export const RemixUITerminalMenuButtons = (props: RemixUiTerminalProps) => { function selectOutput(event: any): void { props.plugin.call('layout', 'minimize', props.plugin.profile.name, false) - dispatchXterm({ type: 'SHOW_OUTPUT', payload: true }) + dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'output' }) dispatch({ type: SET_OPEN, payload: true }) } - const showTerminal = async(event: any): Promise => { + const showTerminal = async (event: any): Promise => { props.plugin.call('layout', 'minimize', props.plugin.profile.name, false) - if ( xtermState.terminals.length === 0) { + if (xtermState.terminals.length === 0) { const start_time = Date.now() const pid = await props.plugin.call('xterm', 'createTerminal', xtermState.workingDir, null) const end_time = Date.now() console.log(`createTerminal took ${end_time - start_time} ms`) dispatchXterm({ type: 'HIDE_ALL_TERMINALS', payload: null }) - dispatchXterm({ type: 'SHOW_OUTPUT', payload: false }) + dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'xterm' }) dispatchXterm({ type: 'ADD_TERMINAL', payload: { pid, queue: '', timeStamp: Date.now(), ref: null, hidden: false } }) } else { - dispatchXterm({ type: 'SHOW_OUTPUT', payload: false }) + dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'xterm' }) } dispatch({ type: SET_OPEN, payload: true }) } + const showTransactions = async (event: any): Promise => { + dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'transactions' }) + } + return (
- - +
) } \ No newline at end of file diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx b/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx index def49c52377..ae21f160f57 100644 --- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx +++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx @@ -29,7 +29,7 @@ export const RemixUITerminalWrapper = (props: RemixUiTerminalProps) => { {platform !== appPlatformTypes.desktop && } {platform === appPlatformTypes.desktop && <> - + } diff --git a/libs/remix-ui/transactions/src/components/transactions.tsx b/libs/remix-ui/transactions/src/components/transactions.tsx new file mode 100644 index 00000000000..e69de29bb2d diff --git a/libs/remix-ui/transactions/src/index.ts b/libs/remix-ui/transactions/src/index.ts new file mode 100644 index 00000000000..e69de29bb2d diff --git a/libs/remix-ui/xterm/src/lib/actions/index.ts b/libs/remix-ui/xterm/src/lib/actions/index.ts index 5489af6206b..5e81f5fc39e 100644 --- a/libs/remix-ui/xterm/src/lib/actions/index.ts +++ b/libs/remix-ui/xterm/src/lib/actions/index.ts @@ -3,7 +3,7 @@ import { Plugin } from "@remixproject/engine" export const createTerminal = async (shell: string = '', plugin: Plugin, workingDir: string, dispatch: React.Dispatch) => { const pid = await plugin.call('xterm', 'createTerminal', workingDir, shell) - dispatch({ type: 'SHOW_OUTPUT', payload: false }) + dispatch({ type: 'SET_TERMINAL_TAB', payload: 'xterm' }) dispatch({ type: 'HIDE_ALL_TERMINALS', payload: null }) dispatch({ type: 'ADD_TERMINAL', payload: { pid, queue: '', timeStamp: Date.now(), ref: null, hidden: false } }) diff --git a/libs/remix-ui/xterm/src/lib/components/remix-ui-terminal-menu-xterm.tsx b/libs/remix-ui/xterm/src/lib/components/remix-ui-terminal-menu-xterm.tsx index 49a5d2e36cb..8eb0a022774 100644 --- a/libs/remix-ui/xterm/src/lib/components/remix-ui-terminal-menu-xterm.tsx +++ b/libs/remix-ui/xterm/src/lib/components/remix-ui-terminal-menu-xterm.tsx @@ -26,7 +26,7 @@ export const RemixUIXtermMenu = (props: RemixUiTerminalProps) => { } return (<> -
+
onCreateTerminal()}> }> diff --git a/libs/remix-ui/xterm/src/lib/components/remix-ui-xterminals.tsx b/libs/remix-ui/xterm/src/lib/components/remix-ui-xterminals.tsx index 7dbcedaaf82..b28011813cd 100644 --- a/libs/remix-ui/xterm/src/lib/components/remix-ui-xterminals.tsx +++ b/libs/remix-ui/xterm/src/lib/components/remix-ui-xterminals.tsx @@ -40,7 +40,7 @@ export const RemixUiXterminals = (props: RemixUiXterminalsProps) => { plugin.on('xterm', 'new', async () => { const pid = await plugin.call('xterm', 'createTerminal', workingDir, null) dispatchXterm({ type: 'HIDE_ALL_TERMINALS', payload: null }) - dispatchXterm({ type: 'SHOW_OUTPUT', payload: false }) + dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'xterm' }) dispatchXterm({ type: 'ADD_TERMINAL', payload: { pid, queue: '', timeStamp: Date.now(), ref: null, hidden: false } }) }) @@ -80,7 +80,7 @@ export const RemixUiXterminals = (props: RemixUiXterminalsProps) => { useEffect(() => { setTerminals(xtermState.terminals) if (xtermState.terminals.length === 0) { - dispatchXterm({ type: 'SHOW_OUTPUT', payload: true }) + dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'output' }) } }, [xtermState.terminals]) @@ -139,9 +139,9 @@ export const RemixUiXterminals = (props: RemixUiXterminalsProps) => { } return (<> - {
+ {
<> - {
+ {
{terminals.map((xtermState) => { return (
diff --git a/libs/remix-ui/xterm/src/lib/reducer/index.ts b/libs/remix-ui/xterm/src/lib/reducer/index.ts index a96d2185234..cf038787992 100644 --- a/libs/remix-ui/xterm/src/lib/reducer/index.ts +++ b/libs/remix-ui/xterm/src/lib/reducer/index.ts @@ -5,7 +5,8 @@ export const xTerminInitialState: xTerminalUiState = { terminals: [], shells: [], showOutput: true, - workingDir: '' + workingDir: '', + selectedTerminalTab: 'output' } export const xtermReducer = (state = xTerminInitialState, action: Actions) => { @@ -59,6 +60,13 @@ export const xtermReducer = (state = xTerminInitialState, action: Actions) => { ...state, showOutput: action.payload } + + case 'SET_TERMINAL_TAB': + return { + ...state, + selectedTerminalTab: action.payload + } + case 'SET_WORKING_DIR': return { ...state, diff --git a/libs/remix-ui/xterm/src/lib/types/index.ts b/libs/remix-ui/xterm/src/lib/types/index.ts index 170441acb95..b9fcbaed260 100644 --- a/libs/remix-ui/xterm/src/lib/types/index.ts +++ b/libs/remix-ui/xterm/src/lib/types/index.ts @@ -13,6 +13,7 @@ export interface xTerminalUiState { shells: string[] showOutput: boolean workingDir: string + selectedTerminalTab: 'output' | 'xterm' | 'transactions' } export interface ActionPayloadTypes { @@ -26,6 +27,7 @@ export interface ActionPayloadTypes { ADD_SHELLS: string[], SHOW_OUTPUT: boolean SET_WORKING_DIR: string + SET_TERMINAL_TAB: 'output' | 'xterm' | 'transactions' } export interface Action { From 2cb247ff2c04110958dfff96690307b38625e4ef Mon Sep 17 00:00:00 2001 From: filip mertens Date: Sun, 22 Dec 2024 10:32:48 +0100 Subject: [PATCH 06/58] use plugin as connector --- .../app/plugins/electron/desktopHostPlugin.ts | 2 +- apps/remix-ide/src/app/udapp/run-tab.tsx | 4 + apps/remix-ide/src/blockchain/blockchain.tsx | 2 +- apps/remixdesktop/package.json | 10 +- apps/remixdesktop/src/lib/server.ts | 31 ++-- apps/remixdesktop/src/plugins/desktopHost.ts | 22 ++- apps/remixdesktop/src/types/index.ts | 15 ++ apps/remixdesktop/yarn.lock | 74 +++++----- .../src/components/terminal-transactions.tsx | 47 ++++++ .../terminal-transactions/src/index.ts | 1 + .../lib/components/remix-ui-terminal-bar.tsx | 10 +- .../remix-ui-terminal-menu-buttons.tsx | 18 ++- .../src/lib/remix-ui-terminal-wrapper.tsx | 19 ++- .../src/components/transactions.tsx | 0 libs/remix-ui/transactions/src/index.ts | 0 .../lib/components/remix-ui-xterminals.tsx | 4 +- package.json | 18 +-- tsconfig.paths.json | 3 + yarn.lock | 134 +++++++++--------- 19 files changed, 266 insertions(+), 148 deletions(-) create mode 100644 libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx create mode 100644 libs/remix-ui/terminal-transactions/src/index.ts delete mode 100644 libs/remix-ui/transactions/src/components/transactions.tsx delete mode 100644 libs/remix-ui/transactions/src/index.ts diff --git a/apps/remix-ide/src/app/plugins/electron/desktopHostPlugin.ts b/apps/remix-ide/src/app/plugins/electron/desktopHostPlugin.ts index 663e5160620..f8b831d8ec5 100644 --- a/apps/remix-ide/src/app/plugins/electron/desktopHostPlugin.ts +++ b/apps/remix-ide/src/app/plugins/electron/desktopHostPlugin.ts @@ -9,7 +9,7 @@ const profile = { name: 'desktopHost', displayName: '', description: '', - methods: ['getIsConnected'], + methods: [], events: ['connected'], maintainedBy: 'Remix' } diff --git a/apps/remix-ide/src/app/udapp/run-tab.tsx b/apps/remix-ide/src/app/udapp/run-tab.tsx index 777ccf85886..0e24b341911 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.tsx +++ b/apps/remix-ide/src/app/udapp/run-tab.tsx @@ -149,6 +149,7 @@ export class RunTab extends ViewPlugin { 'vm-sepolia-fork': 'Deploy to a fork of the Sepolia testnet in the in-browser virtual machine.', 'vm-custom-fork': 'Deploy to a fork of a custom network in the in-browser virtual machine.', 'walletconnect': 'Deploy using WalletConnect.', + 'desktopHost': 'Deploy using web metamask.', 'basic-http-provider': 'Deploy to a Custom local network.', 'remix-web-provider': 'Deploy through the Remix MetaMask browser extension.', 'hardhat-provider': 'Deploy to the local Hardhat dev chain.', @@ -301,6 +302,9 @@ export class RunTab extends ViewPlugin { // wallet connect await addProvider(6, 'walletconnect', 'WalletConnect', false, false, false) + // desktop host + await addProvider(12, 'desktopHost', 'Remix on the web', false, false, false) + // external provider await addProvider(10, 'basic-http-provider', 'Custom - External Http Provider', false, false, false) await addProvider(11, 'remix-web-provider', 'Remix web ( Metamask )', false, false, false) diff --git a/apps/remix-ide/src/blockchain/blockchain.tsx b/apps/remix-ide/src/blockchain/blockchain.tsx index 7d4521de2f6..9ac1d28be30 100644 --- a/apps/remix-ide/src/blockchain/blockchain.tsx +++ b/apps/remix-ide/src/blockchain/blockchain.tsx @@ -115,7 +115,7 @@ export class Blockchain extends Plugin { this.networkcallid = 0 this.networkStatus = { network: { name: ' - ', id: ' - ' } } this.registeredPluginEvents = [] - this.defaultPinnedProviders = ['vm-cancun', 'vm-mainnet-fork', 'walletconnect', 'injected-MetaMask', 'remix-web-provider', 'hardhat-provider', 'foundry-provider'] + this.defaultPinnedProviders = ['desktopHost', 'vm-cancun', 'vm-mainnet-fork', 'walletconnect', 'injected-MetaMask', 'remix-web-provider', 'hardhat-provider', 'foundry-provider'] this.pinnedProviders = [] this.setupEvents() this.setupProviders() diff --git a/apps/remixdesktop/package.json b/apps/remixdesktop/package.json index 42ab0cf8303..5ddcfef1eff 100644 --- a/apps/remixdesktop/package.json +++ b/apps/remixdesktop/package.json @@ -65,11 +65,11 @@ }, "dependencies": { "@remix-project/remix-url-resolver": "^0.0.65", - "@remixproject/engine": "0.3.43", - "@remixproject/engine-electron": "0.3.43", - "@remixproject/plugin": "0.3.43", - "@remixproject/plugin-api": "^0.3.43", - "@remixproject/plugin-electron": "0.3.43", + "@remixproject/engine": "0.3.44", + "@remixproject/engine-electron": "0.3.44", + "@remixproject/plugin": "0.3.44", + "@remixproject/plugin-api": "^0.3.44", + "@remixproject/plugin-electron": "0.3.44", "@types/ws": "^8.5.13", "@vscode/ripgrep": "^1.15.6", "add": "^2.0.6", diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index 64c6baada8a..a418fd172d1 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -2,6 +2,8 @@ import * as http from 'http'; import { WebSocketServer, WebSocket } from 'ws'; import cors from 'cors'; import EventEmitter from 'events'; +import { RequestArguments } from '../types'; +import { json } from 'stream/consumers'; // Forwarding WebSocket client let connectedWebSocket: WebSocket | null = null; @@ -13,23 +15,13 @@ const sendResponse = (response: http.ServerResponse, data: any, statusCode = 200 }; // Handle incoming JSON-RPC requests and forward to WebSocket client -const handleRequest = async ( - method: string, - params: any[], - id: any +export const handleRequest = async ( + jsonRpcPayload: RequestArguments ): Promise => { if (!connectedWebSocket || connectedWebSocket.readyState !== WebSocket.OPEN) { throw new Error('No active WebSocket connection to forward request'); } - // Create the JSON-RPC payload - const jsonRpcPayload = { - jsonrpc: '2.0', - method, - params, - id, - }; - // Send the payload to the WebSocket client and wait for response return new Promise((resolve, reject) => { const timeout = setTimeout(() => reject(new Error('Timeout waiting for WebSocket response')), 240000); // 10 seconds timeout @@ -43,7 +35,7 @@ const handleRequest = async ( clearTimeout(timeout); try { const response = JSON.parse(data); - if (response.id === id) { + if (response.id === jsonRpcPayload.id) { //console.log('response from WebSocket client:', response); resolve(response.result); } else { @@ -91,11 +83,12 @@ export const startRPCServer = (eventEmitter: EventEmitter) => { throw new Error('Invalid JSON-RPC request'); } - const result = await handleRequest( - jsonRpcRequest.method, - jsonRpcRequest.params || [], - jsonRpcRequest.id - ); + const result = await handleRequest({ + method: jsonRpcRequest.method, + jsonrpc: '2.0', + params: jsonRpcRequest.params || [], + id: jsonRpcRequest.id + }); const jsonResponse = { jsonrpc: '2.0', @@ -131,7 +124,7 @@ export const startRPCServer = (eventEmitter: EventEmitter) => { connectedWebSocket.removeAllListeners() connectedWebSocket.close() } - + connectedWebSocket = ws; eventEmitter.emit('connected', true); diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index f211f474519..4498e7d7733 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -1,7 +1,9 @@ import { ElectronBasePlugin, ElectronBasePluginClient } from "@remixproject/plugin-electron" import { Profile } from "@remixproject/plugin-utils" -import { startRPCServer } from "../lib/server" +import { handleRequest, startRPCServer } from "../lib/server" import EventEmitter from "events" +import { shell } from "electron" +import { RequestArguments } from "../types" const profile = { displayName: 'desktopHost', @@ -34,7 +36,8 @@ const clientProfile: Profile = { name: 'desktopHost', displayName: 'desktopHost', description: 'desktopHost', - methods: ['getIsConnected'], + methods: ['getIsConnected', 'sendAsync', 'init'], + kind: 'provider', } export class DesktopHostPluginClient extends ElectronBasePluginClient { @@ -46,4 +49,19 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { console.log('getIsConnected', isConnected) return isConnected } + + async init() { + console.log('initializing destkophost plugin...') + if(!isConnected) + await shell.openExternal('http://localhost:8080/?activate=udapp,desktopClient') + // wait for the connection + while (!isConnected) { + await new Promise(resolve => setTimeout(resolve, 1000)) + } + } + + async sendAsync(data: RequestArguments) { + console.log('SEND ASYNC', data) + return handleRequest(data) + } } \ No newline at end of file diff --git a/apps/remixdesktop/src/types/index.ts b/apps/remixdesktop/src/types/index.ts index e69de29bb2d..e696f99ed4e 100644 --- a/apps/remixdesktop/src/types/index.ts +++ b/apps/remixdesktop/src/types/index.ts @@ -0,0 +1,15 @@ + +export interface RequestArguments { + jsonrpc: '2.0' + readonly method: string + readonly params?: readonly unknown[] | object + readonly id?: string +} + +export type Chain = { + chainId: number + name: string + currency: string + explorerUrl: string + rpcUrl: string +} \ No newline at end of file diff --git a/apps/remixdesktop/yarn.lock b/apps/remixdesktop/yarn.lock index 5ad67b68d7e..c22f2851a79 100644 --- a/apps/remixdesktop/yarn.lock +++ b/apps/remixdesktop/yarn.lock @@ -982,46 +982,46 @@ ethers "^5.4.2" web3 "^1.5.1" -"@remixproject/engine-electron@0.3.43": - version "0.3.43" - resolved "https://registry.yarnpkg.com/@remixproject/engine-electron/-/engine-electron-0.3.43.tgz#37fe98c6ef2deb6de80db60882608714d6e25274" - integrity sha512-k1Lcg67tlPiBFJwKhBRT9bDMyZuYWDdUXZOHKX8BGPZ0lS1ZQDrH4uN2QE2EFGIiCxeArcNzQ7MZ5iEo763eUA== +"@remixproject/engine-electron@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/engine-electron/-/engine-electron-0.3.44.tgz#fd01d74b8ce1f637db4096168382bd4f34917b09" + integrity sha512-dqLh1Cg1Sx4hfrHShfAHVyAainL4iHzskOd29+gmvPGtX5J5uf5WyIuEkpj14FH40P8szxECYNIXH1XRQPJRrQ== dependencies: - "@remixproject/engine" "0.3.43" - "@remixproject/plugin-api" "0.3.43" - "@remixproject/plugin-utils" "0.3.43" + "@remixproject/engine" "0.3.44" + "@remixproject/plugin-api" "0.3.44" + "@remixproject/plugin-utils" "0.3.44" -"@remixproject/engine@0.3.43": - version "0.3.43" - resolved "https://registry.yarnpkg.com/@remixproject/engine/-/engine-0.3.43.tgz#deceb8398a034d33f741f9de38b233ab616720a4" - integrity sha512-BKmLVdtkPUQ56yZuRsU7CxS0TgJe4b7P9RoqdBW0Udy1w8oUJsWmlmKchCLXD+/t+12jPyk4sulRN8N9YOFBAw== +"@remixproject/engine@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/engine/-/engine-0.3.44.tgz#fafe15bae1f02feed731f406ece131547b07c4f9" + integrity sha512-mwq4wBN+wE5Bdjm0nXOpIm/810dSPYEPlQEn6K2buV5DfzPaRewSgxCuAlLTeoITk5Vg1O/NX+VAesLixv79/g== dependencies: - "@remixproject/plugin-api" "0.3.43" - "@remixproject/plugin-utils" "0.3.43" + "@remixproject/plugin-api" "0.3.44" + "@remixproject/plugin-utils" "0.3.44" -"@remixproject/plugin-api@0.3.43": - version "0.3.43" - resolved "https://registry.yarnpkg.com/@remixproject/plugin-api/-/plugin-api-0.3.43.tgz#68ce6799a8e6e22961b82f46a7a52b1d7a4a765c" - integrity sha512-qgwq3UQAW9JKsFv47m0E7plNNEWL4CFbqoLGbfsfwuZTd/V7HhaMc1my5dxOObW+RKExyvFNFSEvEp7HoHFsWg== +"@remixproject/plugin-api@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/plugin-api/-/plugin-api-0.3.44.tgz#fcc2dcae5140c781e0b916b563d650968c7cb78d" + integrity sha512-Sx/8AhwlfSl/JA2DTIF1SPDkEz+iwDqfTLNBT6zUVSSkCwqM7SbO7UZZZA8YJK1mP8+t6M0ZDDCwDQmCtGOPnw== dependencies: - "@remixproject/plugin-utils" "0.3.43" + "@remixproject/plugin-utils" "0.3.44" -"@remixproject/plugin-api@^0.3.43": +"@remixproject/plugin-api@^0.3.44": version "0.3.208" resolved "https://registry.yarnpkg.com/@remixproject/plugin-api/-/plugin-api-0.3.208.tgz#28505b84ec06c84e04ca1bf7cfa51109c178c06b" integrity sha512-11hFxABBrEzE4fgcDblWqxLAh5ARH2tBADgh9KNk+y7LUV7aQ7OZf4KiZ2US+uKiSC6497iu/uLHbWBTeRqlVA== dependencies: "@remixproject/plugin-utils" "0.3.208" -"@remixproject/plugin-electron@0.3.43": - version "0.3.43" - resolved "https://registry.yarnpkg.com/@remixproject/plugin-electron/-/plugin-electron-0.3.43.tgz#6c621c413745ce785f9973baea109debe3def00a" - integrity sha512-uv44xjmkTsC/o4xnMEBml6NxrMeq95aOR3FFY8MnZkKvnWOKC94SE5AYuHOAvt+FBrnar2f58+IYpBJAIkYyaQ== +"@remixproject/plugin-electron@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/plugin-electron/-/plugin-electron-0.3.44.tgz#050378779aa2a8979c0e77497633ec0922b29703" + integrity sha512-3ofuttt7xsPKe3royKuEaN0PgKIS8zMY5vHQTx3+8PqAx3DCcCRn9Xd7qQl/mFNEDxjjOgLrRw2Q2P8NQs7DEQ== dependencies: - "@remixproject/engine" "0.3.43" - "@remixproject/plugin" "0.3.43" - "@remixproject/plugin-api" "0.3.43" - "@remixproject/plugin-utils" "0.3.43" + "@remixproject/engine" "0.3.44" + "@remixproject/plugin" "0.3.44" + "@remixproject/plugin-api" "0.3.44" + "@remixproject/plugin-utils" "0.3.44" "@remixproject/plugin-utils@0.3.208": version "0.3.208" @@ -1030,20 +1030,20 @@ dependencies: tslib "2.0.1" -"@remixproject/plugin-utils@0.3.43": - version "0.3.43" - resolved "https://registry.yarnpkg.com/@remixproject/plugin-utils/-/plugin-utils-0.3.43.tgz#53206666135a360c88bfde11568c31341c9d961f" - integrity sha512-FB2Dz0/+TQ+D9AdINfsu38qHEsUVIDpaDCaXY76suDkSUudoHcGrC5TbpaV/xMUbMMma2dcLp629vBNnA5Cd0w== +"@remixproject/plugin-utils@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/plugin-utils/-/plugin-utils-0.3.44.tgz#fdaa978f1c10331b68e67bef9e636c7d19069c27" + integrity sha512-DX4vcbEplMFLE6SZ10wBMBQ6ntT9rEsPfajlhSnmZYyMpmuP0RHQLopNHsL+DxuHpOJM+hXFNEdORhWrgIQ3Kw== dependencies: tslib "2.0.1" -"@remixproject/plugin@0.3.43": - version "0.3.43" - resolved "https://registry.yarnpkg.com/@remixproject/plugin/-/plugin-0.3.43.tgz#c7397b8e44ab6627a290c3716985439482eb4f4a" - integrity sha512-uO0wQ9kP982QTJIlGUXXeOjLG1qG64UN5kDopTcMbplzT5vXlMRV64FY8zEqSXtl+sdqKBFLXrwmb+AUNU0MTA== +"@remixproject/plugin@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/plugin/-/plugin-0.3.44.tgz#9a82e93641c7627b2f9d0ee23754d78870adc91d" + integrity sha512-pkGCLfvcZwItHD4xA1ZnQtKsgffiYymqx0cSDcPAHm4i5x7S80vJ3BVjJm/CT/gyBXP8qF5SFGP6RjveFm7haQ== dependencies: - "@remixproject/plugin-api" "0.3.43" - "@remixproject/plugin-utils" "0.3.43" + "@remixproject/plugin-api" "0.3.44" + "@remixproject/plugin-utils" "0.3.44" events "3.2.0" "@scure/base@~1.1.0": diff --git a/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx b/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx new file mode 100644 index 00000000000..d791622b08b --- /dev/null +++ b/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx @@ -0,0 +1,47 @@ +import { TerminalContext } from '@remix-ui/terminal' +import { Plugin } from '@remixproject/engine' +import { PluginQueueItem } from '@remixproject/plugin-utils/src/lib/tools/queue'; +import React, { useState, useEffect, useContext } from 'react' // eslint-disable-line + +export interface TerminalTransactionsProps { + plugin: Plugin +} + +const pluginsToWatch = ['injected-metamask', 'remix-web-provider', 'web3Provider']; + +interface queue { + pluginName: string, + queue: PluginQueueItem[] +} + +export const TerminalTransactions = (props: TerminalTransactionsProps) => { + + const { xtermState, dispatchXterm } = useContext(TerminalContext) + const [queues, setQueues] = useState([]) + + useEffect(() => { + + pluginsToWatch.forEach(pluginName => { + props.plugin.on(pluginName, 'queue', (data: any) => { + console.log('plugin', pluginName, 'queue', data); + setQueues(queues => [...queues.filter(queue => queue.pluginName !== pluginName), { pluginName, queue: data }]); + }); + }); + return () => { + pluginsToWatch.forEach(pluginName => { + props.plugin.off(pluginName, 'queue'); + }); + }; + }, [props.plugin]); + +return (<> +
+ {queues.map((queue, index) => { + return
+
{queue.queue.map((item, i) =>
{item && (item as any).args && (item as any).args[0] && (item as any).args[0].method}
)}
+
+ })} +
+) + +} \ No newline at end of file diff --git a/libs/remix-ui/terminal-transactions/src/index.ts b/libs/remix-ui/terminal-transactions/src/index.ts new file mode 100644 index 00000000000..055a9b0730e --- /dev/null +++ b/libs/remix-ui/terminal-transactions/src/index.ts @@ -0,0 +1 @@ +export * from './components/terminal-transactions' \ No newline at end of file diff --git a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx index 2b4a81b3b1c..4ca46e91435 100644 --- a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx +++ b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx @@ -1,4 +1,4 @@ -import { appPlatformTypes, platformContext } from '@remix-ui/app' +import { AppContext, appPlatformTypes, platformContext } from '@remix-ui/app' import { CustomTooltip } from '@remix-ui/helper' import React, { useState, useEffect, useRef, useContext } from 'react' // eslint-disable-line import { FormattedMessage, useIntl } from 'react-intl' @@ -13,6 +13,7 @@ import { RemixUITerminalMenuButtons } from './remix-ui-terminal-menu-buttons' export const RemixUITerminalBar = (props: RemixUiTerminalProps) => { const { terminalState, xtermState } = useContext(TerminalContext) const platform = useContext(platformContext) + const appContext = useContext(AppContext) const intl = useIntl() const terminalMenu = useRef(null) @@ -28,6 +29,13 @@ export const RemixUITerminalBar = (props: RemixUiTerminalProps) => { data-id="terminalToggleMenu" > + {appContext.appState.connectedToDesktop ? +
+ + +
: null + + } {platform === appPlatformTypes.desktop ?
diff --git a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx index 9ad215d1de0..5256d150e20 100644 --- a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx +++ b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx @@ -1,3 +1,4 @@ +import { AppContext } from '@remix-ui/app' import React, { useContext, useEffect } from 'react' // eslint-disable-line import { TerminalContext } from '../context' import { RemixUiTerminalProps, SET_OPEN } from '../types/terminalTypes' @@ -5,6 +6,7 @@ import './remix-ui-terminal-menu-buttons.css' export const RemixUITerminalMenuButtons = (props: RemixUiTerminalProps) => { const { xtermState, dispatchXterm, terminalState, dispatch } = useContext(TerminalContext) + const appContext = useContext(AppContext) function selectOutput(event: any): void { props.plugin.call('layout', 'minimize', props.plugin.profile.name, false) @@ -32,6 +34,20 @@ export const RemixUITerminalMenuButtons = (props: RemixUiTerminalProps) => { dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'transactions' }) } + if (appContext.appState.connectedToDesktop) { + + return ( +
+ + +
+ ) + } + return (
) diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx b/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx index ae21f160f57..c62b6078a59 100644 --- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx +++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx @@ -1,6 +1,7 @@ import { AppContext, appPlatformTypes, platformContext } from '@remix-ui/app' import { RemixUiXterminals, xTerminInitialState, xtermReducer } from '@remix-ui/xterm' -import React, { useContext, useReducer } from 'react' // eslint-disable-line +import { TerminalTransactions } from 'libs/remix-ui/terminal-transactions/src' +import React, { useContext, useEffect, useReducer } from 'react' // eslint-disable-line import { RemixUITerminalBar } from './components/remix-ui-terminal-bar' import { TerminalContext } from './context' import { initialState, registerCommandReducer } from './reducers/terminalReducer' @@ -19,8 +20,19 @@ export const RemixUITerminalWrapper = (props: RemixUiTerminalProps) => { dispatchXterm } - if(appContext.appState.connectedToDesktop === true) { - return <> + useEffect(() => { + if (appContext.appState.connectedToDesktop === true) { + dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'transactions' }) + } + },[appContext.appState.connectedToDesktop]) + + if (appContext.appState.connectedToDesktop === true) { + return <> + + + + + } return (<> @@ -31,6 +43,7 @@ export const RemixUITerminalWrapper = (props: RemixUiTerminalProps) => { <> + } diff --git a/libs/remix-ui/transactions/src/components/transactions.tsx b/libs/remix-ui/transactions/src/components/transactions.tsx deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libs/remix-ui/transactions/src/index.ts b/libs/remix-ui/transactions/src/index.ts deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libs/remix-ui/xterm/src/lib/components/remix-ui-xterminals.tsx b/libs/remix-ui/xterm/src/lib/components/remix-ui-xterminals.tsx index b28011813cd..207238a08a3 100644 --- a/libs/remix-ui/xterm/src/lib/components/remix-ui-xterminals.tsx +++ b/libs/remix-ui/xterm/src/lib/components/remix-ui-xterminals.tsx @@ -139,9 +139,9 @@ export const RemixUiXterminals = (props: RemixUiXterminalsProps) => { } return (<> - {
+ {
<> - {
+ {
{terminals.map((xtermState) => { return (
diff --git a/package.json b/package.json index 5f8b27c0937..18a10050abf 100644 --- a/package.json +++ b/package.json @@ -114,15 +114,15 @@ "@openzeppelin/upgrades-core": "^1.30.0", "@openzeppelin/wizard": "0.4.0", "@reduxjs/toolkit": "^2.0.1", - "@remixproject/engine": "0.3.42", - "@remixproject/engine-electron": "0.3.42", - "@remixproject/engine-web": "0.3.42", - "@remixproject/plugin": "0.3.42", - "@remixproject/plugin-api": "0.3.42", - "@remixproject/plugin-electron": "0.3.42", - "@remixproject/plugin-utils": "0.3.42", - "@remixproject/plugin-webview": "0.3.42", - "@remixproject/plugin-ws": "0.3.42", + "@remixproject/engine": "0.3.44", + "@remixproject/engine-electron": "0.3.44", + "@remixproject/engine-web": "0.3.44", + "@remixproject/plugin": "0.3.44", + "@remixproject/plugin-api": "0.3.44", + "@remixproject/plugin-electron": "0.3.44", + "@remixproject/plugin-utils": "0.3.44", + "@remixproject/plugin-webview": "0.3.44", + "@remixproject/plugin-ws": "0.3.44", "@ricarso/react-image-magnifiers": "^1.9.0", "@types/nightwatch": "^2.3.1", "@web3modal/ethers5": "^4.0.1", diff --git a/tsconfig.paths.json b/tsconfig.paths.json index 7e5cec001f4..5d5f8b219c0 100644 --- a/tsconfig.paths.json +++ b/tsconfig.paths.json @@ -175,6 +175,9 @@ "@remix-ui/xterm": [ "libs/remix-ui/xterm/src/index.ts" ], + "@remix-ui/terminal-transactions": [ + "libs/remix-ui/erminal-transactions/src/index.ts" + ], "@remix-ui/remix-ai": [ "libs/remix-ui/remix-ai/src/index.ts" ], diff --git a/yarn.lock b/yarn.lock index 76439c0a2ec..ffe4387345d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6563,82 +6563,82 @@ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.14.0.tgz#9bc39a5a3a71b81bdb310eba6def5bc3966695b7" integrity sha512-WOHih+ClN7N8oHk9N4JUiMxQJmRVaOxcg8w7F/oHUXzJt920ekASLI/7cYX8XkntDWRhLZtsk6LbGrkgOAvi5A== -"@remixproject/engine-electron@0.3.42": - version "0.3.42" - resolved "https://registry.yarnpkg.com/@remixproject/engine-electron/-/engine-electron-0.3.42.tgz#12328f762f3a2969a55abda58c9f3307143bb03b" - integrity sha512-rtvHtNPfAUUxDEFeHd2Wm6M7ee6Tx8uDhprgA9PRxiL3WjJg39PVTCm6X4Y3hpPdiqFvC56cTW30q5Fsg8X8dQ== - dependencies: - "@remixproject/engine" "0.3.42" - "@remixproject/plugin-api" "0.3.42" - "@remixproject/plugin-utils" "0.3.42" - -"@remixproject/engine-web@0.3.42": - version "0.3.42" - resolved "https://registry.yarnpkg.com/@remixproject/engine-web/-/engine-web-0.3.42.tgz#1221666a43d33c73119df97e6f65ab908fc2e80d" - integrity sha512-FtKfXOLY3mxHtkgdEKargup17N4w9Qqniiwxec5193zO6nR0wlBz5fB8ClKUp3V1boiQAg7fEOJv01QZ4UUTgw== - dependencies: - "@remixproject/engine" "0.3.42" - "@remixproject/plugin-api" "0.3.42" - "@remixproject/plugin-utils" "0.3.42" - -"@remixproject/engine@0.3.42": - version "0.3.42" - resolved "https://registry.yarnpkg.com/@remixproject/engine/-/engine-0.3.42.tgz#30606ea9c6b6d16a14eb71480ad450e82bac18dd" - integrity sha512-5t0H7SLxzyy03FAm7OSVLaiufrOYRinICAY3LRZDIqTu2wWeNQ/MTuBsfzBv0erzq8F/07rRyksbaPQdeQKoOw== - dependencies: - "@remixproject/plugin-api" "0.3.42" - "@remixproject/plugin-utils" "0.3.42" - -"@remixproject/plugin-api@0.3.42": - version "0.3.42" - resolved "https://registry.yarnpkg.com/@remixproject/plugin-api/-/plugin-api-0.3.42.tgz#c64d8b75a139d4e5cc342861d288d638818a8081" - integrity sha512-q1YLSAeluuTaLZDO2iwn3k3wW4Ii/FFVMt/5IoB8bId7pWLyVe4C+QtntrIpoRnfa8D1Hi6XEE3Sq0l5W2knMQ== - dependencies: - "@remixproject/plugin-utils" "0.3.42" - -"@remixproject/plugin-electron@0.3.42": - version "0.3.42" - resolved "https://registry.yarnpkg.com/@remixproject/plugin-electron/-/plugin-electron-0.3.42.tgz#e3a230593c5ec5d9f88ef6e6bb5a8a0d0c52e6ed" - integrity sha512-Raa/A6raZ79VRAh4GYPxD74ZXy4W1JqocnR23AV/WVVjefF/5EsmjBFyCGJLFW9cN53+QeB968T3VFNBjHtaUQ== - dependencies: - "@remixproject/engine" "0.3.42" - "@remixproject/plugin" "0.3.42" - "@remixproject/plugin-api" "0.3.42" - "@remixproject/plugin-utils" "0.3.42" - -"@remixproject/plugin-utils@0.3.42": - version "0.3.42" - resolved "https://registry.yarnpkg.com/@remixproject/plugin-utils/-/plugin-utils-0.3.42.tgz#4ac4b4aaa15e14f1a905236645a4813a63b00c9c" - integrity sha512-4SkvanwKTxZ7iffTkjwxFqqXo9XLl1swc4SIyW02WrzXAOYPKZ8Vj48N1CIcTA+HqZtnoKAHlQklYcegDtL2sw== +"@remixproject/engine-electron@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/engine-electron/-/engine-electron-0.3.44.tgz#fd01d74b8ce1f637db4096168382bd4f34917b09" + integrity sha512-dqLh1Cg1Sx4hfrHShfAHVyAainL4iHzskOd29+gmvPGtX5J5uf5WyIuEkpj14FH40P8szxECYNIXH1XRQPJRrQ== + dependencies: + "@remixproject/engine" "0.3.44" + "@remixproject/plugin-api" "0.3.44" + "@remixproject/plugin-utils" "0.3.44" + +"@remixproject/engine-web@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/engine-web/-/engine-web-0.3.44.tgz#7722a7bc5ac8863f919dcd80c37259431bf33331" + integrity sha512-vTOPHa5pqpllqJ67ONp/RK43xGAeocZ23RAe7zZ+YIEEC6cGs2WjTBB++MKVB/AK5icps9AvFuI26nlqGkSk9A== + dependencies: + "@remixproject/engine" "0.3.44" + "@remixproject/plugin-api" "0.3.44" + "@remixproject/plugin-utils" "0.3.44" + +"@remixproject/engine@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/engine/-/engine-0.3.44.tgz#fafe15bae1f02feed731f406ece131547b07c4f9" + integrity sha512-mwq4wBN+wE5Bdjm0nXOpIm/810dSPYEPlQEn6K2buV5DfzPaRewSgxCuAlLTeoITk5Vg1O/NX+VAesLixv79/g== + dependencies: + "@remixproject/plugin-api" "0.3.44" + "@remixproject/plugin-utils" "0.3.44" + +"@remixproject/plugin-api@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/plugin-api/-/plugin-api-0.3.44.tgz#fcc2dcae5140c781e0b916b563d650968c7cb78d" + integrity sha512-Sx/8AhwlfSl/JA2DTIF1SPDkEz+iwDqfTLNBT6zUVSSkCwqM7SbO7UZZZA8YJK1mP8+t6M0ZDDCwDQmCtGOPnw== + dependencies: + "@remixproject/plugin-utils" "0.3.44" + +"@remixproject/plugin-electron@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/plugin-electron/-/plugin-electron-0.3.44.tgz#050378779aa2a8979c0e77497633ec0922b29703" + integrity sha512-3ofuttt7xsPKe3royKuEaN0PgKIS8zMY5vHQTx3+8PqAx3DCcCRn9Xd7qQl/mFNEDxjjOgLrRw2Q2P8NQs7DEQ== + dependencies: + "@remixproject/engine" "0.3.44" + "@remixproject/plugin" "0.3.44" + "@remixproject/plugin-api" "0.3.44" + "@remixproject/plugin-utils" "0.3.44" + +"@remixproject/plugin-utils@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/plugin-utils/-/plugin-utils-0.3.44.tgz#fdaa978f1c10331b68e67bef9e636c7d19069c27" + integrity sha512-DX4vcbEplMFLE6SZ10wBMBQ6ntT9rEsPfajlhSnmZYyMpmuP0RHQLopNHsL+DxuHpOJM+hXFNEdORhWrgIQ3Kw== dependencies: tslib "2.0.1" -"@remixproject/plugin-webview@0.3.42": - version "0.3.42" - resolved "https://registry.yarnpkg.com/@remixproject/plugin-webview/-/plugin-webview-0.3.42.tgz#08febdcd1b61e8296128fdb4130d99415e8a63dc" - integrity sha512-Do+TmHDMirXXzbuneVRWdsfUax3z4R3d+dAu2AVMO2eRkiElRUgxO9A4bcwMZNP2ETW2A5Dq9jL0qDtjyaYiXg== +"@remixproject/plugin-webview@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/plugin-webview/-/plugin-webview-0.3.44.tgz#6d923efc84ebfb7da1fbe0fcb12d6dc55bc9a9bd" + integrity sha512-QZ6GQI5mJrz+VTQjFTocTkprd6Epoytdskfo9LenSgXPvcf+zvzi66+qZSvK0xHKTLvvJWutuk1FVreGEdEVSw== dependencies: - "@remixproject/plugin" "0.3.42" - "@remixproject/plugin-api" "0.3.42" - "@remixproject/plugin-utils" "0.3.42" + "@remixproject/plugin" "0.3.44" + "@remixproject/plugin-api" "0.3.44" + "@remixproject/plugin-utils" "0.3.44" axios "^0.21.1" -"@remixproject/plugin-ws@0.3.42": - version "0.3.42" - resolved "https://registry.yarnpkg.com/@remixproject/plugin-ws/-/plugin-ws-0.3.42.tgz#5c93112445de3bfbaddd3ce04e177d66e2ebd08a" - integrity sha512-CifgiuaHWHQVTjH4O5tMBGd9ov4LW1ENBObez1xTLYEGW90EQjFHnBXBgyyMbR9vrpMtBim7unTBUZokRdT9bg== +"@remixproject/plugin-ws@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/plugin-ws/-/plugin-ws-0.3.44.tgz#37c05093163a59a90458b46de9e0c7defc7d0f58" + integrity sha512-ZSat1Xs+FfYTcRiyHCiGc8jv6r0yHX0guTZAYp/9MZHHUHwMF2Rpo4i4LfSBIJowWRfUADJEuLg/ZZsJDteQrA== dependencies: - "@remixproject/plugin" "0.3.42" - "@remixproject/plugin-api" "0.3.42" - "@remixproject/plugin-utils" "0.3.42" + "@remixproject/plugin" "0.3.44" + "@remixproject/plugin-api" "0.3.44" + "@remixproject/plugin-utils" "0.3.44" -"@remixproject/plugin@0.3.42": - version "0.3.42" - resolved "https://registry.yarnpkg.com/@remixproject/plugin/-/plugin-0.3.42.tgz#26709eedf53a7fe13717fa909eebebfd757f74bf" - integrity sha512-QhpKCnxlxuwGWxaJHpO7yW3p+GqEEA7451BMT2zeFfUs///RrkmJdG7Z56RHAmH8GaGlALrMemsg68O3K55eAQ== +"@remixproject/plugin@0.3.44": + version "0.3.44" + resolved "https://registry.yarnpkg.com/@remixproject/plugin/-/plugin-0.3.44.tgz#9a82e93641c7627b2f9d0ee23754d78870adc91d" + integrity sha512-pkGCLfvcZwItHD4xA1ZnQtKsgffiYymqx0cSDcPAHm4i5x7S80vJ3BVjJm/CT/gyBXP8qF5SFGP6RjveFm7haQ== dependencies: - "@remixproject/plugin-api" "0.3.42" - "@remixproject/plugin-utils" "0.3.42" + "@remixproject/plugin-api" "0.3.44" + "@remixproject/plugin-utils" "0.3.44" events "3.2.0" "@repeaterjs/repeater@^3.0.4": From e46bb7d7ff5d02312d7ee9aefb4656f977d5e5b0 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Mon, 23 Dec 2024 11:04:56 +0100 Subject: [PATCH 07/58] blockchain events --- apps/remix-ide/src/app.js | 2 +- apps/remix-ide/src/app/plugins/desktop-client.ts | 10 +++++++++- apps/remixdesktop/src/lib/server.ts | 14 +++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index 1b9e36f69f8..1b4b8b9f277 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -434,7 +434,7 @@ class AppComponent { this.engine.register([remixWebProvider]) } else{ //---- desktop client - const desktopClient = new DesktopClient() + const desktopClient = new DesktopClient(blockchain) this.engine.register([desktopClient]) } diff --git a/apps/remix-ide/src/app/plugins/desktop-client.ts b/apps/remix-ide/src/app/plugins/desktop-client.ts index 305c8bb48ac..b8f982173fd 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.ts +++ b/apps/remix-ide/src/app/plugins/desktop-client.ts @@ -2,6 +2,7 @@ import React from 'react' import { Plugin } from '@remixproject/engine' import { CustomRemixApi } from '@remix-api' +import { Blockchain } from '../../blockchain/blockchain' const _paq = (window._paq = window._paq || []) @@ -15,13 +16,16 @@ const profile = { } export class DesktopClient extends Plugin { - constructor() { + blockchain: Blockchain + constructor(blockchain: Blockchain) { super(profile) + this.blockchain = blockchain } onActivation() { console.log('DesktopClient activated') _paq.push(['trackEvent', 'plugin', 'activated', 'DesktopClient']) + this.connectToWebSocket() } @@ -35,6 +39,10 @@ export class DesktopClient extends Plugin { this.emit('connected', true) this.call('menuicons', 'select', 'udapp') this.call('manager', 'activatePlugin', 'environmentExplorer').then(() => this.call('tabs' as any, 'focus', 'environmentExplorer')) + this.blockchain.event.register('contextChanged', async (context) => { + console.log('Context changed:', context) + ws.send(JSON.stringify({ type: 'contextChanged', payload: context })) + }) }; ws.onmessage = async (event) => { diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index a418fd172d1..0e8ca5b5e49 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -27,11 +27,14 @@ export const handleRequest = async ( const timeout = setTimeout(() => reject(new Error('Timeout waiting for WebSocket response')), 240000); // 10 seconds timeout connectedWebSocket && connectedWebSocket.once('message', (data: string) => { - + + if (Buffer.isBuffer(data)) { data = data.toString('utf-8'); } + console.log('received message from WebSocket ONCE client:', data); + clearTimeout(timeout); try { const response = JSON.parse(data); @@ -128,6 +131,15 @@ export const startRPCServer = (eventEmitter: EventEmitter) => { connectedWebSocket = ws; eventEmitter.emit('connected', true); + ws.on('message', (data: string) => { + if (Buffer.isBuffer(data)) { + data = data.toString('utf-8'); + } + const response = JSON.parse(data); + if(response && response.type) + console.log('received message from WebSocket client:', response); + }) + ws.on('close', () => { console.log('WebSocket client disconnected'); connectedWebSocket = null; From 1c1be87dd945d81077a1afca7dbfa95fe5bef1e8 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Mon, 30 Dec 2024 07:37:25 +0100 Subject: [PATCH 08/58] focus on app after transaction --- apps/remix-ide/src/app/plugins/desktop-client.ts | 9 +++++++-- .../src/app/providers/injected-provider.tsx | 2 +- apps/remix-ide/src/app/tabs/web3-provider.js | 12 ++++++------ apps/remix-ide/src/app/udapp/run-tab.tsx | 4 ++-- apps/remixdesktop/src/lib/server.ts | 14 +++++++++----- apps/remixdesktop/src/main.ts | 13 +++++++++++++ apps/remixdesktop/src/plugins/desktopHost.ts | 9 +++++++-- .../statusbar/src/lib/components/desktopStatus.tsx | 2 +- .../src/components/terminal-transactions.tsx | 2 +- 9 files changed, 47 insertions(+), 20 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/desktop-client.ts b/apps/remix-ide/src/app/plugins/desktop-client.ts index b8f982173fd..83515d0e116 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.ts +++ b/apps/remix-ide/src/app/plugins/desktop-client.ts @@ -46,9 +46,14 @@ export class DesktopClient extends Plugin { }; ws.onmessage = async (event) => { - console.log('Message from server:', event.data); + const parsed = JSON.parse(event.data) + const result = await this.call('web3Provider', 'sendAsync', JSON.parse(event.data)) - console.log('Result:', result) + if(parsed.method === 'eth_sendTransaction') { + console.log('Message from server:', parsed); + console.log('Result:', result) + ws.send(JSON.stringify({ type: 'focus' })) + } ws.send(JSON.stringify(result)) return result }; diff --git a/apps/remix-ide/src/app/providers/injected-provider.tsx b/apps/remix-ide/src/app/providers/injected-provider.tsx index f5589d0640c..16c3d404e89 100644 --- a/apps/remix-ide/src/app/providers/injected-provider.tsx +++ b/apps/remix-ide/src/app/providers/injected-provider.tsx @@ -76,7 +76,7 @@ export abstract class InjectedProvider extends Plugin implements IProvider { } sendAsync(data: JsonDataRequest): Promise { - console.log('sendAsync', data) + //console.log('sendAsync', data) return new Promise((resolve, reject) => { this.sendAsyncInternal(data, resolve, reject) }) diff --git a/apps/remix-ide/src/app/tabs/web3-provider.js b/apps/remix-ide/src/app/tabs/web3-provider.js index e27045ef11d..c6ba9fd7685 100644 --- a/apps/remix-ide/src/app/tabs/web3-provider.js +++ b/apps/remix-ide/src/app/tabs/web3-provider.js @@ -28,14 +28,14 @@ export class Web3ProviderModule extends Plugin { Should be taken carefully and probably not be release as it is now. */ sendAsync(payload) { - console.log('global web3 provider', payload) + //console.log('global web3 provider', payload) return new Promise((resolve, reject) => { this.askUserPermission('sendAsync', `Calling ${payload.method} with parameters ${JSON.stringify(payload.params, replacer, '\t')}`).then( async (result) => { if (result) { const provider = this.blockchain.web3().currentProvider const resultFn = async (error, message) => { - console.log('resultFn', error, message) + //console.log('resultFn', error, message) if (error) { // Handle 'The method "debug_traceTransaction" does not exist / is not available.' error if(error.message && error.code && error.code === -32601) { @@ -50,16 +50,16 @@ export class Web3ProviderModule extends Plugin { } if (payload.method === 'eth_sendTransaction') { if (payload.params.length && !payload.params[0].to && message.result) { - console.log('waiting for receipt', message.result) + //console.log('waiting for receipt', message.result) setTimeout(async () => { const receipt = await this.tryTillReceiptAvailable(message.result) if (!receipt.contractAddress) { - console.log('receipt available but contract address not present', receipt) + //console.log('receipt available but contract address not present', receipt) return } const contractAddressStr = addressToString(receipt.contractAddress) const contractData = await this.call('compilerArtefacts', 'getContractDataFromAddress', contractAddressStr) - console.log('contractData', contractData) + //console.log('contractData', contractData) if (contractData) { const data = await this.call('compilerArtefacts', 'getCompilerAbstract', contractData.file) const contractObject = { @@ -102,7 +102,7 @@ export class Web3ProviderModule extends Plugin { async tryTillReceiptAvailable(txhash) { try { - console.log('tryTillReceiptAvailable', txhash) + //console.log('tryTillReceiptAvailable', txhash) const receipt = await this.call('blockchain', 'getTransactionReceipt', txhash) if (receipt) return receipt } catch (e) { diff --git a/apps/remix-ide/src/app/udapp/run-tab.tsx b/apps/remix-ide/src/app/udapp/run-tab.tsx index 0e24b341911..0e958d0d7f8 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.tsx +++ b/apps/remix-ide/src/app/udapp/run-tab.tsx @@ -303,11 +303,11 @@ export class RunTab extends ViewPlugin { await addProvider(6, 'walletconnect', 'WalletConnect', false, false, false) // desktop host - await addProvider(12, 'desktopHost', 'Remix on the web', false, false, false) + await addProvider(12, 'desktopHost', 'Remix on the web ( via plugin )', false, false, false) // external provider await addProvider(10, 'basic-http-provider', 'Custom - External Http Provider', false, false, false) - await addProvider(11, 'remix-web-provider', 'Remix web ( Metamask )', false, false, false) + await addProvider(11, 'remix-web-provider', 'Remix web RPC', false, false, false) await addProvider(20, 'hardhat-provider', 'Dev - Hardhat Provider', false, false, false) await addProvider(21, 'ganache-provider', 'Dev - Ganache Provider', false, false, false) await addProvider(22, 'foundry-provider', 'Dev - Foundry Provider', false, false, false) diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index 0e8ca5b5e49..e0db53bddff 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -33,7 +33,7 @@ export const handleRequest = async ( data = data.toString('utf-8'); } - console.log('received message from WebSocket ONCE client:', data); + //console.log('received message from WebSocket ONCE client:', data); clearTimeout(timeout); try { @@ -123,7 +123,7 @@ export const startRPCServer = (eventEmitter: EventEmitter) => { wsServer.on('connection', (ws) => { console.log('WebSocket client connected'); if (connectedWebSocket?.OPEN) { - console.log(connectedWebSocket.url) + //console.log(connectedWebSocket.url) connectedWebSocket.removeAllListeners() connectedWebSocket.close() } @@ -131,23 +131,27 @@ export const startRPCServer = (eventEmitter: EventEmitter) => { connectedWebSocket = ws; eventEmitter.emit('connected', true); + + ws.on('message', (data: string) => { if (Buffer.isBuffer(data)) { data = data.toString('utf-8'); } const response = JSON.parse(data); - if(response && response.type) + if(response && response.type) { console.log('received message from WebSocket client:', response); + eventEmitter.emit(response.type, response.payload); + } }) ws.on('close', () => { - console.log('WebSocket client disconnected'); + //console.log('WebSocket client disconnected'); connectedWebSocket = null; eventEmitter.emit('connected', false); }); ws.on('error', (error) => { - console.error('WebSocket error:', error.message); + //console.error('WebSocket error:', error.message); connectedWebSocket = null; eventEmitter.emit('connected', false); }); diff --git a/apps/remixdesktop/src/main.ts b/apps/remixdesktop/src/main.ts index 5763d874c83..2e60fcbe705 100644 --- a/apps/remixdesktop/src/main.ts +++ b/apps/remixdesktop/src/main.ts @@ -175,5 +175,18 @@ ipcMain.handle('matomo:trackEvent', async (event, data) => { } }) +ipcMain.on('focus-window', (event, windowId) => { + console.log('focus-window', windowId) + windowSet.forEach((win: BrowserWindow) => { + //if (win.id === windowId) { + if(win.isMinimized()) { + win.restore() + } + win.show() + win.focus() + // } + }) +}) + diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 4498e7d7733..e025c9b0c51 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -2,7 +2,7 @@ import { ElectronBasePlugin, ElectronBasePluginClient } from "@remixproject/plug import { Profile } from "@remixproject/plugin-utils" import { handleRequest, startRPCServer } from "../lib/server" import EventEmitter from "events" -import { shell } from "electron" +import { ipcMain, shell } from "electron" import { RequestArguments } from "../types" const profile = { @@ -24,6 +24,11 @@ export class DesktopHostPlugin extends ElectronBasePlugin { console.log('connected', payload) isConnected = payload }) + eventEmitter.on('focus', () => { + console.log('focus') + ipcMain.emit('focus-window', 0) + + }) } async startServer(): Promise { @@ -61,7 +66,7 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { } async sendAsync(data: RequestArguments) { - console.log('SEND ASYNC', data) + //console.log('SEND ASYNC', data) return handleRequest(data) } } \ No newline at end of file diff --git a/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx b/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx index 31c29100e73..b47e5cb391d 100644 --- a/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx +++ b/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx @@ -13,7 +13,7 @@ export default function DesktopStatus({ plugin }: DesktopStatusProps) { const appContext = useContext(AppContext) useEffect(() => { - console.log('DesktopStatus', appContext.appState) + //console.log('DesktopStatus', appContext.appState) }, [appContext.appState]) return ( diff --git a/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx b/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx index d791622b08b..8962fe8f34e 100644 --- a/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx +++ b/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx @@ -23,7 +23,7 @@ export const TerminalTransactions = (props: TerminalTransactionsProps) => { pluginsToWatch.forEach(pluginName => { props.plugin.on(pluginName, 'queue', (data: any) => { - console.log('plugin', pluginName, 'queue', data); + //console.log('plugin', pluginName, 'queue', data); setQueues(queues => [...queues.filter(queue => queue.pluginName !== pluginName), { pluginName, queue: data }]); }); }); From ebd4f403a40e055052367742ac5ba9b47edcccdc Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 1 Jan 2025 15:46:08 +0100 Subject: [PATCH 09/58] move to app state --- .../src/app/components/status-bar.tsx | 18 +- .../src/app/plugins/desktop-client.ts | 79 ------- .../src/app/plugins/desktop-client.tsx | 210 ++++++++++++++++++ apps/remix-ide/src/blockchain/blockchain.tsx | 2 +- apps/remixdesktop/src/plugins/desktopHost.ts | 11 +- libs/remix-api/src/index.ts | 3 +- .../src/lib/types/desktopConnection.ts | 7 + .../app/src/lib/remix-app/actions/app.ts | 5 +- .../app/src/lib/remix-app/interface/index.ts | 4 +- .../app/src/lib/remix-app/state/app.ts | 6 +- .../run-tab/src/lib/actions/account.ts | 1 + .../run-tab/src/lib/actions/events.ts | 2 +- .../run-tab/src/lib/components/settingsUI.tsx | 3 +- .../run-tab/src/lib/reducers/runTab.ts | 1 + libs/remix-ui/run-tab/src/lib/run-tab.tsx | 3 +- .../src/lib/components/desktopStatus.tsx | 21 +- .../src/lib/remixui-statusbar-panel.tsx | 3 +- libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx | 3 +- .../lib/components/remix-ui-terminal-bar.tsx | 3 +- .../remix-ui-terminal-menu-buttons.tsx | 3 +- .../src/lib/remix-ui-terminal-wrapper.tsx | 9 +- .../src/lib/remix-ui-vertical-icons-panel.tsx | 7 +- 22 files changed, 276 insertions(+), 128 deletions(-) delete mode 100644 apps/remix-ide/src/app/plugins/desktop-client.ts create mode 100644 apps/remix-ide/src/app/plugins/desktop-client.tsx create mode 100644 libs/remix-api/src/lib/types/desktopConnection.ts diff --git a/apps/remix-ide/src/app/components/status-bar.tsx b/apps/remix-ide/src/app/components/status-bar.tsx index 2f6c2816e83..adbb937009f 100644 --- a/apps/remix-ide/src/app/components/status-bar.tsx +++ b/apps/remix-ide/src/app/components/status-bar.tsx @@ -8,7 +8,7 @@ import { RemixUIStatusBar } from '@remix-ui/statusbar' import { FilePanelType } from '@remix-ui/workspace' import { VerticalIcons } from './vertical-icons' import { CustomRemixApi } from '@remix-api' -import { AppAction, appActionTypes } from '@remix-ui/app' +import { AppAction } from '@remix-ui/app' const statusBarProfile: PluginProfile = { name: 'statusBar', @@ -81,22 +81,6 @@ export class StatusBar extends Plugin implements StatusBarI this.on('settings', 'copilotChoiceChanged', (isAiActive: boolean) => { this.isAiActive = isAiActive }) - this.on('desktopClient', 'connected', (isConnected: boolean) => { - - console.log('Connected to desktop client?', isConnected) - - this.appStateDispatch({ - type: appActionTypes.setConnectedToDesktop, - payload: isConnected - }) - if (isConnected) { - this.appStateDispatch({ - type: appActionTypes.setShowPopupPanel, - payload: false - }) - } - - }) this.renderComponent() } diff --git a/apps/remix-ide/src/app/plugins/desktop-client.ts b/apps/remix-ide/src/app/plugins/desktop-client.ts deleted file mode 100644 index 83515d0e116..00000000000 --- a/apps/remix-ide/src/app/plugins/desktop-client.ts +++ /dev/null @@ -1,79 +0,0 @@ -/* eslint-disable prefer-const */ -import React from 'react' -import { Plugin } from '@remixproject/engine' -import { CustomRemixApi } from '@remix-api' -import { Blockchain } from '../../blockchain/blockchain' - -const _paq = (window._paq = window._paq || []) - -const profile = { - name: 'desktopClient', - displayName: 'desktopClient', - description: '', - methods: ['init', 'sendAsync'], - events: ['connected'], - maintainedBy: 'Remix' -} - -export class DesktopClient extends Plugin { - blockchain: Blockchain - constructor(blockchain: Blockchain) { - super(profile) - this.blockchain = blockchain - } - - onActivation() { - console.log('DesktopClient activated') - _paq.push(['trackEvent', 'plugin', 'activated', 'DesktopClient']) - - this.connectToWebSocket() - } - - onDeactivation() { - } - - async connectToWebSocket() { - const ws = new WebSocket('ws://localhost:8546') - ws.onopen = () => { - console.log('Connected to server'); - this.emit('connected', true) - this.call('menuicons', 'select', 'udapp') - this.call('manager', 'activatePlugin', 'environmentExplorer').then(() => this.call('tabs' as any, 'focus', 'environmentExplorer')) - this.blockchain.event.register('contextChanged', async (context) => { - console.log('Context changed:', context) - ws.send(JSON.stringify({ type: 'contextChanged', payload: context })) - }) - }; - - ws.onmessage = async (event) => { - const parsed = JSON.parse(event.data) - - const result = await this.call('web3Provider', 'sendAsync', JSON.parse(event.data)) - if(parsed.method === 'eth_sendTransaction') { - console.log('Message from server:', parsed); - console.log('Result:', result) - ws.send(JSON.stringify({ type: 'focus' })) - } - ws.send(JSON.stringify(result)) - return result - }; - - ws.onclose = () => { - console.log('Disconnected from server'); - this.emit('connected', false) - }; - - ws.onerror = (error) => { - console.error('WebSocket error:', error); - }; - } - - async init() { - - } - - async sendAsync(payload: any) { - - } - -} \ No newline at end of file diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx new file mode 100644 index 00000000000..913df95c310 --- /dev/null +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -0,0 +1,210 @@ +/* eslint-disable prefer-const */ +import React, { useContext, useEffect } from 'react' +import { Plugin } from '@remixproject/engine' +import { CustomRemixApi, desktopConnection, desktopConnextionType } from '@remix-api' +import { Blockchain } from '../../blockchain/blockchain' +import { AppAction, appActionTypes, AppContext, AppModal, ModalTypes } from '@remix-ui/app' +import { ViewPlugin } from '@remixproject/engine-web' +import { PluginViewWrapper } from '@remix-ui/helper' + +const _paq = (window._paq = window._paq || []) + +/* TODO: Metamask +- open metamask by default +- handle canceled transactions +- send network updates : contextChanged +- send account updates +- socket disconnect +*/ + +const profile = { + name: 'desktopClient', + displayName: 'desktopClient', + description: '', + methods: ['init', 'sendAsync'], + events: ['connected'], + maintainedBy: 'Remix', + location: 'hiddenPanel', +} + +interface DesktopClientState { + connected: desktopConnection +} + +const DesktopClientUI = (props: DesktopClientState) => { + const appContext = useContext(AppContext) + useEffect(() => { + console.log('connected', props.connected) + appContext.appStateDispatch({ + type: appActionTypes.setConnectedToDesktop, + payload: props.connected, + }) + appContext.appStateDispatch({ + type: appActionTypes.setShowPopupPanel, + payload: false, + }) + }, [props.connected]) + return ( +
+

Desktop Client

+

{props.connected}

+
+ ) +} + +export class DesktopClient extends ViewPlugin { + blockchain: Blockchain + ws: WebSocket + dispatch: React.Dispatch = () => {} + state: DesktopClientState + appStateDispatch: React.Dispatch + + constructor(blockchain: Blockchain) { + super(profile) + this.blockchain = blockchain + this.state = { + connected: desktopConnextionType.disconnected, + } + + } + + onActivation() { + console.log('DesktopClient activated') + _paq.push(['trackEvent', 'plugin', 'activated', 'DesktopClient']) + + this.connectToWebSocket() + + } + + onDeactivation() {} + + setDispatch(dispatch: React.Dispatch): void { + this.dispatch = dispatch + this.renderComponent() + } + + setAppStateDispatch(appStateDispatch: React.Dispatch) { + console.log('setAppStateDispatch', appStateDispatch) + this.appStateDispatch = appStateDispatch + } + + renderComponent() { + this.dispatch({ + ...this.state, + }) + } + + updateComponent(state: DesktopClientState) { + return ( + <> + + + ) + } + + render() { + return ( +
+ +
+ ) + } + + setConnectionState = (state: desktopConnection) => { + this.state.connected = state + + this.renderComponent() + } + + async handleNetworkStatus(context: any) { + console.log('networkStatus', context) + this.ws.send(JSON.stringify({ type: 'contextChanged', payload: null })) + } + + async checkConnection() { + console.log('Checking connection', this.ws) + if (this.ws && this.ws.readyState === this.ws.OPEN) { + console.log('OK Connected to server') + } else { + console.log('NOT Connected to server') + this.connectToWebSocket() + } + } + + async connectToWebSocket() { + this.call('menuicons', 'select', 'udapp') + this.call('manager', 'activatePlugin', 'environmentExplorer').then(() => this.call('tabs' as any, 'focus', 'environmentExplorer')) + console.log('Connecting to server') + try{ + this.ws = new WebSocket('ws://localhost:8546') + + }catch(e){ + console.error('CATCH WebSocket error:', e) + return + } + this.ws.onopen = () => { + console.log('Connected to server') + this.emit('connected', true) + this.setConnectionState(desktopConnextionType.connected) + + this.blockchain.event.register('networkStatus', this.handleNetworkStatus.bind(this)) + } + + this.ws.onmessage = async (event) => { + const parsed = JSON.parse(event.data) + + const result = await this.call('web3Provider', 'sendAsync', JSON.parse(event.data)) + if (parsed.method === 'eth_sendTransaction') { + console.log('Message from server:', parsed) + console.log('Result:', result) + this.ws.send(JSON.stringify({ type: 'focus' })) + } + this.ws.send(JSON.stringify(result)) + return result + } + + this.ws.onclose = () => { + console.log('Disconnected from server') + this.blockchain.event.unregister('networkStatus', this.handleNetworkStatus.bind(this), null) + this.ws = null + /* + const modalContent: AppModal = { + id: this.profile.name, + title: this.profile.displayName, + message: 'Connection to the desktop client has been lost. Please restart the desktop client.', + modalType: ModalTypes.confirm, + okLabel: 'Reconnect now', + cancelLabel: 'Cancel', + + okFn: () => { + this.connectToWebSocket() + }, + cancelFn: () => { + + }, + hideFn: () => { + + }, + } + + this.call('notification', 'modal' as any, modalContent) + */ + + this.emit('connected', false) + this.setConnectionState(desktopConnextionType.disconnected) + + setTimeout(() => { + this.connectToWebSocket() + }, 5000) + + } + + //this.ws.onerror = (error) => { + // console.error('WebSocket error:', error) + //} + } + + async init() {} + + async sendAsync(payload: any) {} +} diff --git a/apps/remix-ide/src/blockchain/blockchain.tsx b/apps/remix-ide/src/blockchain/blockchain.tsx index 9ac1d28be30..07996dedafe 100644 --- a/apps/remix-ide/src/blockchain/blockchain.tsx +++ b/apps/remix-ide/src/blockchain/blockchain.tsx @@ -130,7 +130,7 @@ export class Blockchain extends Plugin { onActivation() { this.active = true this.on('manager', 'pluginActivated', (plugin) => { - if (plugin && plugin.name && (plugin.name.startsWith('injected') || plugin.name === 'walletconnect')) { + if (plugin && plugin.name && (plugin.name.startsWith('injected') || plugin.name === 'walletconnect') || plugin.name === 'desktopHost') { this.registeredPluginEvents.push(plugin.name) this.on(plugin.name, 'chainChanged', () => { this.detectNetwork((error, network) => { diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index e025c9b0c51..ead7dba9956 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -27,7 +27,12 @@ export class DesktopHostPlugin extends ElectronBasePlugin { eventEmitter.on('focus', () => { console.log('focus') ipcMain.emit('focus-window', 0) - + }) + eventEmitter.on('contextChanged', (context) => { + console.log('contextChanged', context) + for(const client of this.clients) { + client.emit('chainChanged', context) + } }) } @@ -67,6 +72,8 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { async sendAsync(data: RequestArguments) { //console.log('SEND ASYNC', data) - return handleRequest(data) + const result = await handleRequest(data) + //console.log('RESULT', result) + return result } } \ No newline at end of file diff --git a/libs/remix-api/src/index.ts b/libs/remix-api/src/index.ts index 96515e169f0..bd9f5012fe4 100644 --- a/libs/remix-api/src/index.ts +++ b/libs/remix-api/src/index.ts @@ -1,2 +1,3 @@ export * from './lib/remix-api' -export * from './lib/types/git' \ No newline at end of file +export * from './lib/types/git' +export * from './lib/types/desktopConnection' \ No newline at end of file diff --git a/libs/remix-api/src/lib/types/desktopConnection.ts b/libs/remix-api/src/lib/types/desktopConnection.ts new file mode 100644 index 00000000000..0a01a3e7cdc --- /dev/null +++ b/libs/remix-api/src/lib/types/desktopConnection.ts @@ -0,0 +1,7 @@ +export const desktopConnextionType = { + connected: 'connected', + disconnected: 'disconnected', + disabled: 'disabled' +} + +export type desktopConnection = typeof desktopConnextionType[keyof typeof desktopConnextionType] \ No newline at end of file diff --git a/libs/remix-ui/app/src/lib/remix-app/actions/app.ts b/libs/remix-ui/app/src/lib/remix-app/actions/app.ts index 28cc2fbbacd..6cb33532c92 100644 --- a/libs/remix-ui/app/src/lib/remix-app/actions/app.ts +++ b/libs/remix-ui/app/src/lib/remix-app/actions/app.ts @@ -1,5 +1,4 @@ -import { branch, GitHubUser } from '@remix-api'; -import { AppModal } from '../interface' +import { branch, desktopConnection, GitHubUser } from '@remix-api'; type ActionMap = { [Key in keyof M]: M[Key] extends undefined @@ -27,7 +26,7 @@ type AppPayload = { [appActionTypes.setNeedsGitInit]: boolean, [appActionTypes.setCanUseGit]: boolean, [appActionTypes.setShowPopupPanel]: boolean, - [appActionTypes.setConnectedToDesktop]: boolean, + [appActionTypes.setConnectedToDesktop]: desktopConnection } export type AppAction = ActionMap[keyof ActionMap< diff --git a/libs/remix-ui/app/src/lib/remix-app/interface/index.ts b/libs/remix-ui/app/src/lib/remix-app/interface/index.ts index 4bede79c24a..790a693218f 100644 --- a/libs/remix-ui/app/src/lib/remix-app/interface/index.ts +++ b/libs/remix-ui/app/src/lib/remix-app/interface/index.ts @@ -1,4 +1,4 @@ -import { branch, GitHubUser } from '@remix-api' +import { branch, desktopConnection, GitHubUser } from '@remix-api' import { AppModalCancelTypes, ModalTypes } from '../types' export type ValidationResult = { @@ -53,6 +53,6 @@ export interface AppState { needsGitInit: boolean canUseGit: boolean showPopupPanel: boolean - connectedToDesktop: boolean + connectedToDesktop: desktopConnection } diff --git a/libs/remix-ui/app/src/lib/remix-app/state/app.ts b/libs/remix-ui/app/src/lib/remix-app/state/app.ts index 07cab4c521b..ac0e772c598 100644 --- a/libs/remix-ui/app/src/lib/remix-app/state/app.ts +++ b/libs/remix-ui/app/src/lib/remix-app/state/app.ts @@ -1,4 +1,4 @@ -import { GitHubUser } from "@remix-api"; +import { desktopConnextionType, GitHubUser } from "@remix-api"; import { AppState } from "../interface"; export const appInitialState: AppState = { @@ -7,5 +7,5 @@ export const appInitialState: AppState = { needsGitInit: true, canUseGit: false, showPopupPanel: false, - connectedToDesktop: false -} \ No newline at end of file + connectedToDesktop: desktopConnextionType.disabled +} \ No newline at end of file diff --git a/libs/remix-ui/run-tab/src/lib/actions/account.ts b/libs/remix-ui/run-tab/src/lib/actions/account.ts index 4d937cdc5eb..18be8490a0b 100644 --- a/libs/remix-ui/run-tab/src/lib/actions/account.ts +++ b/libs/remix-ui/run-tab/src/lib/actions/account.ts @@ -34,6 +34,7 @@ export const fillAccountsList = async (plugin: RunTab, dispatch: React.Dispatch< const selectedAddress = plugin.blockchain.getInjectedWeb3Address() if (!(Object.keys(loadedAccounts).includes(toChecksumAddress(selectedAddress)))) setAccount(dispatch, null) } + console.log('loadedAccounts', loadedAccounts) dispatch(fetchAccountsListSuccess(loadedAccounts)) } catch (e) { dispatch(fetchAccountsListFailed(e.message)) diff --git a/libs/remix-ui/run-tab/src/lib/actions/events.ts b/libs/remix-ui/run-tab/src/lib/actions/events.ts index 2e06963e11a..313fdda8c09 100644 --- a/libs/remix-ui/run-tab/src/lib/actions/events.ts +++ b/libs/remix-ui/run-tab/src/lib/actions/events.ts @@ -124,7 +124,7 @@ export const setupEvents = (plugin: RunTab) => { if (activatedPlugin.name === 'remixd') { dispatch(setRemixDActivated(true)) } else { - if (activatedPlugin && activatedPlugin.name.startsWith('injected')) { + if (activatedPlugin && (activatedPlugin.name.startsWith('injected') || activatedPlugin.name === 'desktopHost')) { plugin.on(activatedPlugin.name, 'accountsChanged', (accounts: Array) => { const accountsMap = {} accounts.map(account => { accountsMap[account] = shortenAddress(account, '0')}) diff --git a/libs/remix-ui/run-tab/src/lib/components/settingsUI.tsx b/libs/remix-ui/run-tab/src/lib/components/settingsUI.tsx index 9705ab28689..e21a2d8c889 100644 --- a/libs/remix-ui/run-tab/src/lib/components/settingsUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/settingsUI.tsx @@ -7,6 +7,7 @@ import { AccountUI } from './account' import { GasLimitUI } from './gasLimit' import { ValueUI } from './value' import { AppContext } from '@remix-ui/app' +import { desktopConnextionType } from '@remix-api' export function SettingsUI(props: SettingsProps) { // this._deps.config.events.on('settings/personal-mode_changed', this.onPersonalChange.bind(this)) @@ -38,7 +39,7 @@ export function SettingsUI(props: SettingsProps) { signMessageWithAddress={props.signMessageWithAddress} passphrase={props.passphrase} /> - {appContext.appState.connectedToDesktop === false ? + {appContext.appState.connectedToDesktop === desktopConnextionType.disabled ? <> : null}
) diff --git a/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts b/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts index 9fba9ec4470..442086513ae 100644 --- a/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts +++ b/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts @@ -158,6 +158,7 @@ export const runTabReducer = (state: RunTabState = runTabInitialState, action: A case SET_EXECUTION_ENVIRONMENT: { const payload: string = action.payload + console.log('SET_EXECUTION_ENVIRONMENT', payload) return { ...state, diff --git a/libs/remix-ui/run-tab/src/lib/run-tab.tsx b/libs/remix-ui/run-tab/src/lib/run-tab.tsx index 79d3b46137e..b9fe2ede8c1 100644 --- a/libs/remix-ui/run-tab/src/lib/run-tab.tsx +++ b/libs/remix-ui/run-tab/src/lib/run-tab.tsx @@ -58,6 +58,7 @@ import { ScenarioPrompt } from './components/scenario' import { setIpfsCheckedState, setRemixDActivated } from './actions/payload' import { ChainCompatibleInfo, getCompatibleChain, getCompatibleChains, HardFork, isChainCompatible, isChainCompatibleWithAnyFork } from './actions/evmmap' import { AppContext } from '@remix-ui/app' +import { desktopConnextionType } from '@remix-api' export type CheckStatus = 'Passed' | 'Failed' | 'Not Found' @@ -372,7 +373,7 @@ export function RunTabUI(props: RunTabProps) { signMessageWithAddress={signMessage} passphrase={runTab.passphrase} /> - {!appContext.appState.connectedToDesktop && ( + {appContext.appState.connectedToDesktop === desktopConnextionType.disabled && ( <> - {appContext.appState.connectedToDesktop === true ? +
+ {appContext.appState.connectedToDesktop === desktopConnextionType.connected ? ( <> - - Desktop Connect Mode + + Desktop Connect Mode - :null} -
+ ) : null} + {appContext.appState.connectedToDesktop === desktopConnextionType.disconnected ? ( + <> + + Desktop Connect Mode... waiting for desktop clients + + ) : null} +
) } diff --git a/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx b/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx index 5da09cd8728..23a094aa7f1 100644 --- a/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx +++ b/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx @@ -11,6 +11,7 @@ import { StatusBarContextProvider } from '../contexts/statusbarcontext' import DidYouKnow from './components/didYouKnow' import { AppContext, appPlatformTypes, platformContext } from '@remix-ui/app' import DesktopStatus from './components/desktopStatus' +import { desktopConnextionType } from '@remix-api' export interface RemixUIStatusBarProps { statusBarPlugin: StatusBar @@ -69,7 +70,7 @@ export function RemixUIStatusBar({ statusBarPlugin }: RemixUIStatusBarProps) { return aiActive } - if(platform !== appPlatformTypes.desktop && appContext.appState.connectedToDesktop === true) { + if(platform !== appPlatformTypes.desktop && appContext.appState.connectedToDesktop !== desktopConnextionType.disabled) { return (<>
) } diff --git a/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx index c490787b33e..38fc6bfbae9 100644 --- a/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx +++ b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx @@ -7,6 +7,7 @@ import { Tab, Tabs, TabList, TabPanel } from 'react-tabs' import './remix-ui-tabs.css' import { values } from 'lodash' import { AppContext } from '@remix-ui/app' +import { desktopConnextionType } from '@remix-api' const _paq = (window._paq = window._paq || []) /* eslint-disable-next-line */ @@ -186,7 +187,7 @@ export const TabsUI = (props: TabsUIProps) => { return (
diff --git a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx index 4ca46e91435..797b2fd8a86 100644 --- a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx +++ b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx @@ -9,6 +9,7 @@ import { RemixUITerminalMenu } from './remix-ui-terminal-menu' import { RemixUITerminalMenuToggle } from './remix-ui-terminal-menu-toggle' import { RemixUIXtermMenu } from '../../../../xterm/src/lib/components/remix-ui-terminal-menu-xterm' import { RemixUITerminalMenuButtons } from './remix-ui-terminal-menu-buttons' +import { desktopConnextionType } from '@remix-api' export const RemixUITerminalBar = (props: RemixUiTerminalProps) => { const { terminalState, xtermState } = useContext(TerminalContext) @@ -29,7 +30,7 @@ export const RemixUITerminalBar = (props: RemixUiTerminalProps) => { data-id="terminalToggleMenu" > - {appContext.appState.connectedToDesktop ? + {appContext.appState.connectedToDesktop !== desktopConnextionType.disabled ?
diff --git a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx index 5256d150e20..de1594627e9 100644 --- a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx +++ b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx @@ -3,6 +3,7 @@ import React, { useContext, useEffect } from 'react' // eslint-disable-line import { TerminalContext } from '../context' import { RemixUiTerminalProps, SET_OPEN } from '../types/terminalTypes' import './remix-ui-terminal-menu-buttons.css' +import { desktopConnextionType } from '@remix-api'; export const RemixUITerminalMenuButtons = (props: RemixUiTerminalProps) => { const { xtermState, dispatchXterm, terminalState, dispatch } = useContext(TerminalContext) @@ -34,7 +35,7 @@ export const RemixUITerminalMenuButtons = (props: RemixUiTerminalProps) => { dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'transactions' }) } - if (appContext.appState.connectedToDesktop) { + if (appContext.appState.connectedToDesktop === desktopConnextionType.connected) { return (
diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx b/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx index c62b6078a59..522200ab395 100644 --- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx +++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx @@ -7,6 +7,7 @@ import { TerminalContext } from './context' import { initialState, registerCommandReducer } from './reducers/terminalReducer' import RemixUiTerminal from './remix-ui-terminal' import { RemixUiTerminalProps } from './types/terminalTypes' +import { desktopConnextionType } from '@remix-api' export const RemixUITerminalWrapper = (props: RemixUiTerminalProps) => { const [terminalState, dispatch] = useReducer(registerCommandReducer, initialState) @@ -21,12 +22,16 @@ export const RemixUITerminalWrapper = (props: RemixUiTerminalProps) => { } useEffect(() => { - if (appContext.appState.connectedToDesktop === true) { + if (appContext.appState.connectedToDesktop === desktopConnextionType.connected) { dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'transactions' }) } },[appContext.appState.connectedToDesktop]) - if (appContext.appState.connectedToDesktop === true) { + if (appContext.appState.connectedToDesktop === desktopConnextionType.disconnected) { + return <> + } + + if (appContext.appState.connectedToDesktop === desktopConnextionType.connected) { return <> diff --git a/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx b/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx index 3c5e14c3ef6..b6bf6c28f74 100644 --- a/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx +++ b/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx @@ -9,6 +9,7 @@ import { IconRecord } from './types' import { AppContext, onLineContext } from '@remix-ui/app' import { CustomTooltip } from '@remix-ui/helper' import { Registry } from '@remix-project/remix-lib' +import { desktopConnextionType } from '@remix-api' export interface RemixUiVerticalIconsPanelProps { verticalIconsPlugin: Plugin @@ -83,7 +84,7 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic > p.profile.name==='udapp' || (!appContext.appState.connectedToDesktop && p.isRequired && p.profile.name !== 'pluginManager'))} + icons={icons.filter((p) => p.profile.name==='udapp' || (appContext.appState.connectedToDesktop === desktopConnextionType.disabled && p.isRequired && p.profile.name !== 'pluginManager'))} verticalIconsPlugin={verticalIconsPlugin} itemContextAction={itemContextAction} /> @@ -105,7 +106,7 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic { - return !appContext.appState.connectedToDesktop && !p.isRequired && p.profile.name !== 'settings' + return appContext.appState.connectedToDesktop === desktopConnextionType.disabled && !p.isRequired && p.profile.name !== 'settings' })} verticalIconsPlugin={verticalIconsPlugin} itemContextAction={itemContextAction} @@ -117,7 +118,7 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic ) : null } !appContext.appState.connectedToDesktop && ( p.profile.name === 'settings' || p.profile.name === 'pluginManager'))} + icons={icons.filter((p) => appContext.appState.connectedToDesktop === desktopConnextionType.disabled && ( p.profile.name === 'settings' || p.profile.name === 'pluginManager'))} verticalIconsPlugin={verticalIconsPlugin} itemContextAction={itemContextAction} /> From 0f9a3adcc0a126e63d5db840b0afa50bd4b17b78 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 1 Jan 2025 16:45:13 +0100 Subject: [PATCH 10/58] handle double connections --- .../src/app/plugins/desktop-client.tsx | 42 ++++++++++++------- apps/remixdesktop/src/lib/server.ts | 13 +++--- .../src/lib/types/desktopConnection.ts | 3 +- .../components/modals/modal-wrapper.tsx | 11 +++++ .../app/src/lib/remix-app/types/index.ts | 3 +- .../src/lib/remix-ui-modal-dialog.tsx | 2 +- .../modal-dialog/src/lib/types/index.ts | 2 +- .../src/lib/components/desktopStatus.tsx | 17 ++++++-- 8 files changed, 67 insertions(+), 26 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index 913df95c310..773cec48c64 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -32,7 +32,7 @@ interface DesktopClientState { } const DesktopClientUI = (props: DesktopClientState) => { - const appContext = useContext(AppContext) + const appContext = useContext(AppContext) useEffect(() => { console.log('connected', props.connected) appContext.appStateDispatch({ @@ -65,7 +65,6 @@ export class DesktopClient extends ViewPlugin { this.state = { connected: desktopConnextionType.disconnected, } - } onActivation() { @@ -73,7 +72,6 @@ export class DesktopClient extends ViewPlugin { _paq.push(['trackEvent', 'plugin', 'activated', 'DesktopClient']) this.connectToWebSocket() - } onDeactivation() {} @@ -135,10 +133,9 @@ export class DesktopClient extends ViewPlugin { this.call('menuicons', 'select', 'udapp') this.call('manager', 'activatePlugin', 'environmentExplorer').then(() => this.call('tabs' as any, 'focus', 'environmentExplorer')) console.log('Connecting to server') - try{ + try { this.ws = new WebSocket('ws://localhost:8546') - - }catch(e){ + } catch (e) { console.error('CATCH WebSocket error:', e) return } @@ -152,7 +149,23 @@ export class DesktopClient extends ViewPlugin { this.ws.onmessage = async (event) => { const parsed = JSON.parse(event.data) - + console.log('Message from server:', parsed) + if (parsed && parsed.type === 'error') { + if (parsed.payload === 'ALREADY_CONNECTED') { + console.log('ALREADY_CONNECTED') + this.setConnectionState(desktopConnextionType.alreadyConnected) + const modalContent: AppModal = { + id: this.profile.name, + title: 'Another tab or window is already connected.', + message: 'Another tab or window is already connected to the desktop application. Please close this tab or window.', + modalType: ModalTypes.fixed, + okLabel: null + } + + this.call('notification', 'modal' as any, modalContent) + return + } + } const result = await this.call('web3Provider', 'sendAsync', JSON.parse(event.data)) if (parsed.method === 'eth_sendTransaction') { console.log('Message from server:', parsed) @@ -189,18 +202,19 @@ export class DesktopClient extends ViewPlugin { this.call('notification', 'modal' as any, modalContent) */ - - this.emit('connected', false) - this.setConnectionState(desktopConnextionType.disconnected) - setTimeout(() => { - this.connectToWebSocket() - }, 5000) + this.emit('connected', false) + if (this.state.connected !== desktopConnextionType.alreadyConnected) { + this.setConnectionState(desktopConnextionType.disconnected) + setTimeout(() => { + this.connectToWebSocket() + }, 5000) + } } //this.ws.onerror = (error) => { - // console.error('WebSocket error:', error) + // console.error('WebSocket error:', error) //} } diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index e0db53bddff..860d004399c 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -123,9 +123,12 @@ export const startRPCServer = (eventEmitter: EventEmitter) => { wsServer.on('connection', (ws) => { console.log('WebSocket client connected'); if (connectedWebSocket?.OPEN) { + ws.send(JSON.stringify({ type: 'error', payload: 'ALREADY_CONNECTED' })); + ws.close(1000, 'Another client connected'); + return //console.log(connectedWebSocket.url) - connectedWebSocket.removeAllListeners() - connectedWebSocket.close() + //connectedWebSocket.removeAllListeners() + //connectedWebSocket.close() } connectedWebSocket = ws; @@ -133,7 +136,7 @@ export const startRPCServer = (eventEmitter: EventEmitter) => { - ws.on('message', (data: string) => { + connectedWebSocket.on('message', (data: string) => { if (Buffer.isBuffer(data)) { data = data.toString('utf-8'); } @@ -144,13 +147,13 @@ export const startRPCServer = (eventEmitter: EventEmitter) => { } }) - ws.on('close', () => { + connectedWebSocket.on('close', () => { //console.log('WebSocket client disconnected'); connectedWebSocket = null; eventEmitter.emit('connected', false); }); - ws.on('error', (error) => { + connectedWebSocket.on('error', (error) => { //console.error('WebSocket error:', error.message); connectedWebSocket = null; eventEmitter.emit('connected', false); diff --git a/libs/remix-api/src/lib/types/desktopConnection.ts b/libs/remix-api/src/lib/types/desktopConnection.ts index 0a01a3e7cdc..11a3ff60967 100644 --- a/libs/remix-api/src/lib/types/desktopConnection.ts +++ b/libs/remix-api/src/lib/types/desktopConnection.ts @@ -1,7 +1,8 @@ export const desktopConnextionType = { connected: 'connected', disconnected: 'disconnected', - disabled: 'disabled' + disabled: 'disabled', + alreadyConnected: 'alreadyConnected', } export type desktopConnection = typeof desktopConnextionType[keyof typeof desktopConnextionType] \ No newline at end of file diff --git a/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx b/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx index 5349eb2eed3..0c2e49dc72f 100644 --- a/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx @@ -117,6 +117,17 @@ const ModalWrapper = (props: ModalWrapperProps) => { message: createForm({ valid: true }) }) break + case ModalTypes.fixed: + setState({ + ...props, + okFn: null, + cancelFn: null, + okLabel: null, + cancelLabel: null, + preventBlur: true, + hideCancelIcon: true, + }) + break default: setState({ ...props, diff --git a/libs/remix-ui/app/src/lib/remix-app/types/index.ts b/libs/remix-ui/app/src/lib/remix-app/types/index.ts index 598d5d96f01..08e44f654a1 100644 --- a/libs/remix-ui/app/src/lib/remix-app/types/index.ts +++ b/libs/remix-ui/app/src/lib/remix-app/types/index.ts @@ -5,7 +5,8 @@ export const enum ModalTypes { password = 'password', default = 'default', form = 'form', - forceChoice = 'forceChoice' + forceChoice = 'forceChoice', + fixed = 'fixed' } export const enum AppModalCancelTypes { diff --git a/libs/remix-ui/modal-dialog/src/lib/remix-ui-modal-dialog.tsx b/libs/remix-ui/modal-dialog/src/lib/remix-ui-modal-dialog.tsx index ee891c3abdb..e7ab0c0907d 100644 --- a/libs/remix-ui/modal-dialog/src/lib/remix-ui-modal-dialog.tsx +++ b/libs/remix-ui/modal-dialog/src/lib/remix-ui-modal-dialog.tsx @@ -101,7 +101,7 @@ export const ModalDialog = (props: ModalDialogProps) => {
{props.title && props.title}
- {!props.showCancelIcon && ( + {!props.hideCancelIcon && ( handleHide()}> diff --git a/libs/remix-ui/modal-dialog/src/lib/types/index.ts b/libs/remix-ui/modal-dialog/src/lib/types/index.ts index 90c18ad2fe2..ee436e42b93 100644 --- a/libs/remix-ui/modal-dialog/src/lib/types/index.ts +++ b/libs/remix-ui/modal-dialog/src/lib/types/index.ts @@ -20,7 +20,7 @@ export interface ModalDialogProps { cancelFn?: (reason?: AppModalCancelTypes) => void, modalClass?: string, modalParentClass?: string - showCancelIcon?: boolean, + hideCancelIcon?: boolean, hide?: boolean, handleHide: (hideState?: boolean) => void, children?: React.ReactNode, diff --git a/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx b/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx index 7b88858d865..c69ba6cc935 100644 --- a/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx +++ b/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx @@ -18,17 +18,28 @@ export default function DesktopStatus({ plugin }: DesktopStatusProps) { }, [appContext.appState]) return ( -
+
{appContext.appState.connectedToDesktop === desktopConnextionType.connected ? ( <> - Desktop Connect Mode + Connected to the desktop application + + ) : null} + {appContext.appState.connectedToDesktop === desktopConnextionType.alreadyConnected ? ( + <> + Error: you are already connected to the desktop application in another tab or window ) : null} {appContext.appState.connectedToDesktop === desktopConnextionType.disconnected ? ( <> - Desktop Connect Mode... waiting for desktop clients + Waiting for the desktop application to connect... ) : null}
From 5c2e700be1681f8ed1cb06c68ed7026193e704a6 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 2 Jan 2025 08:46:52 +0100 Subject: [PATCH 11/58] fix sync accounts --- apps/remix-ide/src/app/plugins/desktop-client.tsx | 7 ++++--- apps/remix-ide/src/blockchain/blockchain.tsx | 3 +++ apps/remixdesktop/src/lib/server.ts | 7 ++++++- libs/remix-ui/run-tab/src/lib/actions/account.ts | 1 + libs/remix-ui/run-tab/src/lib/actions/events.ts | 7 +++++++ 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index 773cec48c64..93a49766c65 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -149,7 +149,7 @@ export class DesktopClient extends ViewPlugin { this.ws.onmessage = async (event) => { const parsed = JSON.parse(event.data) - console.log('Message from server:', parsed) + //console.log('Message from server:', parsed) if (parsed && parsed.type === 'error') { if (parsed.payload === 'ALREADY_CONNECTED') { console.log('ALREADY_CONNECTED') @@ -167,12 +167,13 @@ export class DesktopClient extends ViewPlugin { } } const result = await this.call('web3Provider', 'sendAsync', JSON.parse(event.data)) + + this.ws.send(JSON.stringify(result)) if (parsed.method === 'eth_sendTransaction') { console.log('Message from server:', parsed) console.log('Result:', result) - this.ws.send(JSON.stringify({ type: 'focus' })) + //this.ws.send(JSON.stringify({ type: 'focus' })) } - this.ws.send(JSON.stringify(result)) return result } diff --git a/apps/remix-ide/src/blockchain/blockchain.tsx b/apps/remix-ide/src/blockchain/blockchain.tsx index 07996dedafe..ea0e04e0ea6 100644 --- a/apps/remix-ide/src/blockchain/blockchain.tsx +++ b/apps/remix-ide/src/blockchain/blockchain.tsx @@ -133,9 +133,12 @@ export class Blockchain extends Plugin { if (plugin && plugin.name && (plugin.name.startsWith('injected') || plugin.name === 'walletconnect') || plugin.name === 'desktopHost') { this.registeredPluginEvents.push(plugin.name) this.on(plugin.name, 'chainChanged', () => { + console.log('blockchain chainChanged') this.detectNetwork((error, network) => { this.networkStatus = { network, error } + console.log('blockchain chainChanged', this.networkStatus) this._triggerEvent('networkStatus', [this.networkStatus]) + }) }) } diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index 860d004399c..74f4f81055b 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -39,7 +39,9 @@ export const handleRequest = async ( try { const response = JSON.parse(data); if (response.id === jsonRpcPayload.id) { - //console.log('response from WebSocket client:', response); + if(jsonRpcPayload.method === 'eth_sendTransaction') { + console.log('response from WebSocket client:', response); + } resolve(response.result); } else { console.log('ignore response from WebSocket client:', data); @@ -51,6 +53,9 @@ export const handleRequest = async ( }); connectedWebSocket && connectedWebSocket.send(JSON.stringify(jsonRpcPayload), (err) => { + if(jsonRpcPayload.method === 'eth_sendTransaction') { + console.log('sent message to WebSocket client:', jsonRpcPayload); + } if (err) { clearTimeout(timeout); reject(err); diff --git a/libs/remix-ui/run-tab/src/lib/actions/account.ts b/libs/remix-ui/run-tab/src/lib/actions/account.ts index 18be8490a0b..909e02b4abc 100644 --- a/libs/remix-ui/run-tab/src/lib/actions/account.ts +++ b/libs/remix-ui/run-tab/src/lib/actions/account.ts @@ -16,6 +16,7 @@ export const updateAccountBalances = async (plugin: RunTab, dispatch: React.Disp } export const fillAccountsList = async (plugin: RunTab, dispatch: React.Dispatch) => { + console.log('fillAccountsList') try { dispatch(fetchAccountsListRequest()) try { diff --git a/libs/remix-ui/run-tab/src/lib/actions/events.ts b/libs/remix-ui/run-tab/src/lib/actions/events.ts index 313fdda8c09..76df6a15220 100644 --- a/libs/remix-ui/run-tab/src/lib/actions/events.ts +++ b/libs/remix-ui/run-tab/src/lib/actions/events.ts @@ -38,6 +38,7 @@ export const setupEvents = (plugin: RunTab) => { }) plugin.blockchain.event.register('contextChanged', async (context) => { + console.log('contextChanged', context) dispatch(resetProxyDeployments()) if (!context.startsWith('vm')) getNetworkProxyAddresses(plugin, dispatch) if (context !== 'walletconnect') { @@ -98,6 +99,12 @@ export const setupEvents = (plugin: RunTab) => { plugin.on('truffle', 'compilationFinished', (file, source, languageVersion, data) => broadcastCompilationResult('truffle', plugin, dispatch, file, source, languageVersion, data)) + plugin.on('desktopHost', 'chainChanged', (context) => { + console.log('desktopHost chainChanged', context) + fillAccountsList(plugin, dispatch) + updateInstanceBalance(plugin, dispatch) + }) + plugin.on('udapp', 'setEnvironmentModeReducer', (env: { context: string, fork: string }, from: string) => { plugin.call('notification', 'toast', envChangeNotification(env, from)) setExecutionContext(plugin, dispatch, env) From cf59bd9edd1d149ce5a0670958c912a68ebf233f Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 2 Jan 2025 09:49:58 +0100 Subject: [PATCH 12/58] handle response errors --- apps/remixdesktop/src/lib/server.ts | 37 +++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index 74f4f81055b..bd5ba68678f 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -27,8 +27,8 @@ export const handleRequest = async ( const timeout = setTimeout(() => reject(new Error('Timeout waiting for WebSocket response')), 240000); // 10 seconds timeout connectedWebSocket && connectedWebSocket.once('message', (data: string) => { - - + + if (Buffer.isBuffer(data)) { data = data.toString('utf-8'); } @@ -39,10 +39,33 @@ export const handleRequest = async ( try { const response = JSON.parse(data); if (response.id === jsonRpcPayload.id) { - if(jsonRpcPayload.method === 'eth_sendTransaction') { + if (jsonRpcPayload.method === 'eth_sendTransaction') { console.log('response from WebSocket client:', response); } - resolve(response.result); + if (response.error) { + const error = { data: response.error }; + if (error.data && error.data.originalError && error.data.originalError.data) { + resolve({ + jsonrpc: '2.0', + error: error.data.originalError, + id: response.id + }) + } else if (error.data && error.data.message) { + resolve({ + jsonrpc: '2.0', + error: error.data && error.data, + id: response.id + }) + } else { + resolve({ + jsonrpc: '2.0', + error, + id: response.id + }) + } + } else { + resolve(response.result); + } } else { console.log('ignore response from WebSocket client:', data); //reject(new Error('Invalid response ID')); @@ -53,7 +76,7 @@ export const handleRequest = async ( }); connectedWebSocket && connectedWebSocket.send(JSON.stringify(jsonRpcPayload), (err) => { - if(jsonRpcPayload.method === 'eth_sendTransaction') { + if (jsonRpcPayload.method === 'eth_sendTransaction') { console.log('sent message to WebSocket client:', jsonRpcPayload); } if (err) { @@ -139,14 +162,14 @@ export const startRPCServer = (eventEmitter: EventEmitter) => { connectedWebSocket = ws; eventEmitter.emit('connected', true); - + connectedWebSocket.on('message', (data: string) => { if (Buffer.isBuffer(data)) { data = data.toString('utf-8'); } const response = JSON.parse(data); - if(response && response.type) { + if (response && response.type) { console.log('received message from WebSocket client:', response); eventEmitter.emit(response.type, response.payload); } From 50ca83923a4fcdeb7b96794ea072a53fc7c2bf48 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 2 Jan 2025 10:19:23 +0100 Subject: [PATCH 13/58] handle disconnection --- apps/remixdesktop/src/plugins/desktopHost.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index ead7dba9956..4fdcd0b685d 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -23,6 +23,11 @@ export class DesktopHostPlugin extends ElectronBasePlugin { eventEmitter.on('connected', (payload) => { console.log('connected', payload) isConnected = payload + if (!isConnected) { + for (const client of this.clients) { + client.disconnect() + } + } }) eventEmitter.on('focus', () => { console.log('focus') @@ -30,7 +35,7 @@ export class DesktopHostPlugin extends ElectronBasePlugin { }) eventEmitter.on('contextChanged', (context) => { console.log('contextChanged', context) - for(const client of this.clients) { + for (const client of this.clients) { client.emit('chainChanged', context) } }) @@ -62,7 +67,7 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { async init() { console.log('initializing destkophost plugin...') - if(!isConnected) + if (!isConnected) await shell.openExternal('http://localhost:8080/?activate=udapp,desktopClient') // wait for the connection while (!isConnected) { @@ -70,6 +75,13 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { } } + async disconnect() { + this.call('notification' as any, 'alert', { + id: 'Connection lost', + message: 'You have been disconnected from Remix on the web. Please select another environment for deploy & run.', + }) + } + async sendAsync(data: RequestArguments) { //console.log('SEND ASYNC', data) const result = await handleRequest(data) From 9439ef7b6fe22bf54787c962379b9100a7abe7e4 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 2 Jan 2025 10:50:40 +0100 Subject: [PATCH 14/58] focus event --- .../src/app/plugins/desktop-client.tsx | 14 ++++ apps/remix-ide/src/app/udapp/run-tab.tsx | 3 +- apps/remixdesktop/src/lib/server.ts | 69 +++---------------- apps/remixdesktop/src/plugins/desktopHost.ts | 2 +- 4 files changed, 24 insertions(+), 64 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index 93a49766c65..e2d88f169f0 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -72,6 +72,20 @@ export class DesktopClient extends ViewPlugin { _paq.push(['trackEvent', 'plugin', 'activated', 'DesktopClient']) this.connectToWebSocket() + + const modalContent: AppModal = { + id: this.profile.name, + title: 'Instructions for Metamask for Remix Desktop.', + message: ` + 1. Select the "Injected Provider - Metamask" in the environment and log in to your account. + \n2. Return to the desktop application. + \n3. You can now use the Metamask extension to sign transactions and interact with the blockchain. + \n\nPlease note that the Metamask extension must be installed in your browser.`, + modalType: ModalTypes.default, + okLabel: 'OK', + } + + this.call('notification', 'modal' as any, modalContent) } onDeactivation() {} diff --git a/apps/remix-ide/src/app/udapp/run-tab.tsx b/apps/remix-ide/src/app/udapp/run-tab.tsx index 0e958d0d7f8..4e856fb902d 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.tsx +++ b/apps/remix-ide/src/app/udapp/run-tab.tsx @@ -303,11 +303,10 @@ export class RunTab extends ViewPlugin { await addProvider(6, 'walletconnect', 'WalletConnect', false, false, false) // desktop host - await addProvider(12, 'desktopHost', 'Remix on the web ( via plugin )', false, false, false) + await addProvider(12, 'desktopHost', 'Metamask for Remix Desktop', false, false, false) // external provider await addProvider(10, 'basic-http-provider', 'Custom - External Http Provider', false, false, false) - await addProvider(11, 'remix-web-provider', 'Remix web RPC', false, false, false) await addProvider(20, 'hardhat-provider', 'Dev - Hardhat Provider', false, false, false) await addProvider(21, 'ganache-provider', 'Dev - Ganache Provider', false, false, false) await addProvider(22, 'foundry-provider', 'Dev - Foundry Provider', false, false, false) diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index bd5ba68678f..ae480237c5b 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -16,7 +16,8 @@ const sendResponse = (response: http.ServerResponse, data: any, statusCode = 200 // Handle incoming JSON-RPC requests and forward to WebSocket client export const handleRequest = async ( - jsonRpcPayload: RequestArguments + jsonRpcPayload: RequestArguments, + eventEmitter: EventEmitter ): Promise => { if (!connectedWebSocket || connectedWebSocket.readyState !== WebSocket.OPEN) { throw new Error('No active WebSocket connection to forward request'); @@ -41,6 +42,7 @@ export const handleRequest = async ( if (response.id === jsonRpcPayload.id) { if (jsonRpcPayload.method === 'eth_sendTransaction') { console.log('response from WebSocket client:', response); + eventEmitter.emit('focus') } if (response.error) { const error = { data: response.error }; @@ -89,62 +91,7 @@ export const handleRequest = async ( export const startRPCServer = (eventEmitter: EventEmitter) => { - // Create the HTTP server with CORS - const httpServer = http.createServer(async (req, res) => { - // Add CORS headers - const corsOptions = { - origin: '*', // Allow all origins; adjust as needed for your application - methods: 'POST', - allowedHeaders: ['Content-Type'], - }; - - cors(corsOptions)(req as any, res as any, async () => { - if (req.method === 'POST' && req.url === '/') { - let body = ''; - req.on('data', (chunk) => (body += chunk.toString())); - req.on('end', async () => { - try { - const jsonRpcRequest = JSON.parse(body); - - if ( - jsonRpcRequest.jsonrpc !== '2.0' || - !jsonRpcRequest.method || - typeof jsonRpcRequest.method !== 'string' - ) { - throw new Error('Invalid JSON-RPC request'); - } - - const result = await handleRequest({ - method: jsonRpcRequest.method, - jsonrpc: '2.0', - params: jsonRpcRequest.params || [], - id: jsonRpcRequest.id - }); - - const jsonResponse = { - jsonrpc: '2.0', - result: result, - id: jsonRpcRequest.id, - }; - sendResponse(res, jsonResponse); - } catch (error) { - const jsonResponse = { - jsonrpc: '2.0', - error: { - code: -32600, - message: (error as any).message, - }, - id: null, - }; - sendResponse(res, jsonResponse, 400); - } - }); - } else { - sendResponse(res, { error: 'Only POST requests are allowed' }, 405); - } - }); - }); - + // Create the WebSocket server const wsServer = new WebSocketServer({ port: 8546 }); // WebSocket server on port 8546 @@ -190,9 +137,9 @@ export const startRPCServer = (eventEmitter: EventEmitter) => { // Start the HTTP server const HTTP_PORT = 8545; // Default Ethereum JSON-RPC port - const webserver = httpServer.listen(HTTP_PORT, () => { - console.log(`Ethereum RPC server running on http://localhost:` + JSON.stringify((webserver.address() as any).port)); - console.log(`WebSocket server running on ws://localhost:` + JSON.stringify((wsServer.address() as any).port)); - }); + //const webserver = httpServer.listen(HTTP_PORT, () => { + // console.log(`Ethereum RPC server running on http://localhost:` + JSON.stringify((webserver.address() as any).port)); + console.log(`WebSocket server running on ws://localhost:` + JSON.stringify((wsServer.address() as any).port)); + //}); } diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 4fdcd0b685d..76b578777f4 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -84,7 +84,7 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { async sendAsync(data: RequestArguments) { //console.log('SEND ASYNC', data) - const result = await handleRequest(data) + const result = await handleRequest(data, eventEmitter) //console.log('RESULT', result) return result } From baa1a4c4d2e5b5c9192b700e062dfb35f41ec319 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 2 Jan 2025 11:44:06 +0100 Subject: [PATCH 15/58] start on random ports --- .../src/app/plugins/desktop-client.tsx | 10 +- apps/remixdesktop/package.json | 2 +- apps/remixdesktop/src/lib/server.ts | 57 ++++++++-- apps/remixdesktop/src/plugins/desktopHost.ts | 12 +- apps/remixdesktop/src/utils/portFinder.ts | 52 +++++++++ apps/remixdesktop/yarn.lock | 103 +++++++++++++++++- 6 files changed, 219 insertions(+), 17 deletions(-) create mode 100644 apps/remixdesktop/src/utils/portFinder.ts diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index e2d88f169f0..dc3ad453255 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -6,6 +6,7 @@ import { Blockchain } from '../../blockchain/blockchain' import { AppAction, appActionTypes, AppContext, AppModal, ModalTypes } from '@remix-ui/app' import { ViewPlugin } from '@remixproject/engine-web' import { PluginViewWrapper } from '@remix-ui/helper' +import { QueryParams } from '@remix-project/remix-lib' const _paq = (window._paq = window._paq || []) @@ -58,6 +59,8 @@ export class DesktopClient extends ViewPlugin { dispatch: React.Dispatch = () => {} state: DesktopClientState appStateDispatch: React.Dispatch + queryParams: QueryParams + params: any constructor(blockchain: Blockchain) { super(profile) @@ -65,6 +68,11 @@ export class DesktopClient extends ViewPlugin { this.state = { connected: desktopConnextionType.disconnected, } + this.queryParams = new QueryParams() + + this.params = this.queryParams.get() + console.log('DesktopClient params', this.params) + } onActivation() { @@ -148,7 +156,7 @@ export class DesktopClient extends ViewPlugin { this.call('manager', 'activatePlugin', 'environmentExplorer').then(() => this.call('tabs' as any, 'focus', 'environmentExplorer')) console.log('Connecting to server') try { - this.ws = new WebSocket('ws://localhost:8546') + this.ws = new WebSocket(`ws://localhost:${this.params.desktopClientPort}`) } catch (e) { console.error('CATCH WebSocket error:', e) return diff --git a/apps/remixdesktop/package.json b/apps/remixdesktop/package.json index 5ddcfef1eff..307db4b15f0 100644 --- a/apps/remixdesktop/package.json +++ b/apps/remixdesktop/package.json @@ -78,7 +78,7 @@ "chokidar": "^3.5.3", "cors": "^2.8.5", "electron-updater": "^6.1.8", - "express": "^4.20.0", + "express": "^4.21.2", "isomorphic-git": "^1.24.2", "matomo-tracker": "^2.2.4", "node-pty": "^1.0.0", diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index ae480237c5b..8fe9d3ea4f2 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -4,6 +4,11 @@ import cors from 'cors'; import EventEmitter from 'events'; import { RequestArguments } from '../types'; import { json } from 'stream/consumers'; +import path from 'path'; +import express from 'express' +import { findAvailablePort } from '../utils/portFinder' +import { isPackaged } from '../main'; +import { isE2ELocal } from '../main'; // Forwarding WebSocket client let connectedWebSocket: WebSocket | null = null; @@ -89,11 +94,42 @@ export const handleRequest = async ( }); }; -export const startRPCServer = (eventEmitter: EventEmitter) => { +export const startHostServer = async (eventEmitter: EventEmitter) => { - + let http_port = await findAvailablePort([49589]) + const websocket_port = await findAvailablePort([49588]) + // Create an Express server + const startServer = () => { + const server = express() + + // Serve static files from the 'remix-ide' directory + const remixPath = path.join(__dirname, 'remix-ide'); + server.use(express.static(remixPath)); + + console.log('remixPath', remixPath) + + // Serve 'index.html' at the root route + server.get('/', (req, res) => { + res.sendFile(path.join(remixPath, 'index.html')); + }); + + // Start the server + const httpServer = http.createServer(server); + httpServer.listen(http_port, () => { + const address = httpServer.address(); + if (typeof address === 'string') { + console.log(`Server started at ${address}`); + } else if (address && address.port) { + console.log(`Server started at http://localhost:${address.port}`); + } else { + + } + }); + + return httpServer; + }; // Create the WebSocket server - const wsServer = new WebSocketServer({ port: 8546 }); // WebSocket server on port 8546 + const wsServer = new WebSocketServer({ port: websocket_port }); wsServer.on('connection', (ws) => { console.log('WebSocket client connected'); @@ -135,11 +171,16 @@ export const startRPCServer = (eventEmitter: EventEmitter) => { }); }); - // Start the HTTP server - const HTTP_PORT = 8545; // Default Ethereum JSON-RPC port - //const webserver = httpServer.listen(HTTP_PORT, () => { - // console.log(`Ethereum RPC server running on http://localhost:` + JSON.stringify((webserver.address() as any).port)); + console.log(`WebSocket server running on ws://localhost:` + JSON.stringify((wsServer.address() as any).port)); - //}); + if((process.env.NODE_ENV === 'production' || isPackaged) && !isE2ELocal){ + startServer() + }else{ + http_port = 8080 + } + return { + http_port, + websocket_port + } } diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 76b578777f4..3e9f440fb81 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -1,6 +1,6 @@ import { ElectronBasePlugin, ElectronBasePluginClient } from "@remixproject/plugin-electron" import { Profile } from "@remixproject/plugin-utils" -import { handleRequest, startRPCServer } from "../lib/server" +import { handleRequest, startHostServer } from "../lib/server" import EventEmitter from "events" import { ipcMain, shell } from "electron" import { RequestArguments } from "../types" @@ -14,6 +14,11 @@ const profile = { const eventEmitter = new EventEmitter() let isConnected = false +let ports: { + http_port: number + websocket_port: number +} + export class DesktopHostPlugin extends ElectronBasePlugin { clients: DesktopHostPluginClient[] = [] constructor() { @@ -43,7 +48,8 @@ export class DesktopHostPlugin extends ElectronBasePlugin { async startServer(): Promise { console.log('desktopHost activated') - startRPCServer(eventEmitter) + ports = await startHostServer(eventEmitter) + console.log('desktopHost server started', ports) } } @@ -68,7 +74,7 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { async init() { console.log('initializing destkophost plugin...') if (!isConnected) - await shell.openExternal('http://localhost:8080/?activate=udapp,desktopClient') + await shell.openExternal(`http://localhost:${ports.http_port}/?activate=udapp,desktopClient&desktopClientPort=${ports.websocket_port}`) // wait for the connection while (!isConnected) { await new Promise(resolve => setTimeout(resolve, 1000)) diff --git a/apps/remixdesktop/src/utils/portFinder.ts b/apps/remixdesktop/src/utils/portFinder.ts new file mode 100644 index 00000000000..2f14a12658a --- /dev/null +++ b/apps/remixdesktop/src/utils/portFinder.ts @@ -0,0 +1,52 @@ +import * as net from 'net'; + +/** + * Check if a specific port is available. + * @param port - The port to check. + * @returns Promise - True if available, false otherwise. + */ +const isPortAvailable = (port: number): Promise => { + return new Promise((resolve) => { + const server = net.createServer(); + + server.once('error', () => { + resolve(false); // Port is not available + }); + + server.once('listening', () => { + server.close(); // Close the server immediately + resolve(true); // Port is available + }); + + server.listen(port); // Try to bind to the port + }); +}; + +/** + * Find an available port from the provided list, or return a random one. + * @param ports - Array of ports to check. + * @returns Promise - Available port number. + */ +export const findAvailablePort = async (ports: number[]): Promise => { + for (const port of ports) { + const available = await isPortAvailable(port); + if (available) { + console.log(`Port ${port} is available.`); + return port; + } + } + + // Fallback: find a random available port + return new Promise((resolve) => { + const server = net.createServer(); + server.listen(0, () => { + const address = server.address(); + if (typeof address === 'object' && address?.port) { + console.log(`No specified ports available. Using random port ${address.port}.`); + resolve(address.port); + } + server.close(); + }); + }); +}; + diff --git a/apps/remixdesktop/yarn.lock b/apps/remixdesktop/yarn.lock index c22f2851a79..ff5271569dc 100644 --- a/apps/remixdesktop/yarn.lock +++ b/apps/remixdesktop/yarn.lock @@ -2480,6 +2480,11 @@ cookie@0.6.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== + core-util-is@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" @@ -3423,7 +3428,7 @@ execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -express@^4.14.0, express@^4.20.0: +express@^4.14.0: version "4.20.0" resolved "https://registry.yarnpkg.com/express/-/express-4.20.0.tgz#f1d08e591fcec770c07be4767af8eb9bcfd67c48" integrity sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw== @@ -3460,6 +3465,43 @@ express@^4.14.0, express@^4.20.0: utils-merge "1.0.1" vary "~1.1.2" +express@^4.21.2: + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.7.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.3.1" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.3" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.12" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" + serve-static "1.16.2" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + ext@^1.1.2: version "1.7.0" resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" @@ -3547,6 +3589,19 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" +finalhandler@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" + integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== + dependencies: + debug "2.6.9" + encodeurl "~2.0.0" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + find-process@^1.4.7: version "1.4.7" resolved "https://registry.yarnpkg.com/find-process/-/find-process-1.4.7.tgz#8c76962259216c381ef1099371465b5b439ea121" @@ -5623,6 +5678,11 @@ path-to-regexp@0.1.10: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== + pathval@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" @@ -6221,6 +6281,16 @@ serve-static@1.16.0: parseurl "~1.3.3" send "0.18.0" +serve-static@1.16.2: + version "1.16.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" + integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== + dependencies: + encodeurl "~2.0.0" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" + servify@^0.1.12: version "0.1.12" resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" @@ -6448,7 +6518,16 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6507,7 +6586,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -7455,7 +7541,16 @@ workerpool@6.2.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== From 89e77b64414082942114fe2781e9228cddf3cb3e Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 2 Jan 2025 12:16:22 +0100 Subject: [PATCH 16/58] add logging --- .../src/app/plugins/desktop-client.tsx | 39 ++++++++++++------- .../remix-ui-terminal-menu-buttons.tsx | 5 ++- .../src/lib/remix-ui-terminal-wrapper.tsx | 6 +-- 3 files changed, 32 insertions(+), 18 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index dc3ad453255..a9c2bb8da4d 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -56,7 +56,7 @@ const DesktopClientUI = (props: DesktopClientState) => { export class DesktopClient extends ViewPlugin { blockchain: Blockchain ws: WebSocket - dispatch: React.Dispatch = () => {} + dispatch: React.Dispatch = () => { } state: DesktopClientState appStateDispatch: React.Dispatch queryParams: QueryParams @@ -69,10 +69,10 @@ export class DesktopClient extends ViewPlugin { connected: desktopConnextionType.disconnected, } this.queryParams = new QueryParams() - + this.params = this.queryParams.get() console.log('DesktopClient params', this.params) - + } onActivation() { @@ -88,15 +88,15 @@ export class DesktopClient extends ViewPlugin { 1. Select the "Injected Provider - Metamask" in the environment and log in to your account. \n2. Return to the desktop application. \n3. You can now use the Metamask extension to sign transactions and interact with the blockchain. - \n\nPlease note that the Metamask extension must be installed in your browser.`, + \n\nPlease note that the Metamask extension must be installed in your browser.`, modalType: ModalTypes.default, okLabel: 'OK', } - + this.call('notification', 'modal' as any, modalContent) } - onDeactivation() {} + onDeactivation() { } setDispatch(dispatch: React.Dispatch): void { this.dispatch = dispatch @@ -165,7 +165,10 @@ export class DesktopClient extends ViewPlugin { console.log('Connected to server') this.emit('connected', true) this.setConnectionState(desktopConnextionType.connected) - + this.call('terminal', 'log', { + value: 'Connected to the desktop application.', + type: 'info', + }) this.blockchain.event.register('networkStatus', this.handleNetworkStatus.bind(this)) } @@ -179,22 +182,32 @@ export class DesktopClient extends ViewPlugin { const modalContent: AppModal = { id: this.profile.name, title: 'Another tab or window is already connected.', - message: 'Another tab or window is already connected to the desktop application. Please close this tab or window.', + message: 'Another tab or window is already connected to the desktop application. Please close this tab or window.', modalType: ModalTypes.fixed, okLabel: null } - + this.call('notification', 'modal' as any, modalContent) return } } - const result = await this.call('web3Provider', 'sendAsync', JSON.parse(event.data)) + if (parsed.method === 'eth_sendTransaction') { + this.call('terminal', 'log', { + value: 'Transaction from desktop client: ' + event.data, + type: 'info', + }) + } + + const result = await this.call('web3Provider', 'sendAsync', parsed) this.ws.send(JSON.stringify(result)) if (parsed.method === 'eth_sendTransaction') { console.log('Message from server:', parsed) console.log('Result:', result) - //this.ws.send(JSON.stringify({ type: 'focus' })) + this.call('terminal', 'log', { + value: 'Result: ' + JSON.stringify(result), + type: 'info', + }) } return result } @@ -241,7 +254,7 @@ export class DesktopClient extends ViewPlugin { //} } - async init() {} + async init() { } - async sendAsync(payload: any) {} + async sendAsync(payload: any) { } } diff --git a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx index de1594627e9..1e0ffe06cea 100644 --- a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx +++ b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx @@ -37,6 +37,7 @@ export const RemixUITerminalMenuButtons = (props: RemixUiTerminalProps) => { if (appContext.appState.connectedToDesktop === desktopConnextionType.connected) { + return null return (
@@ -58,11 +59,11 @@ export const RemixUITerminalMenuButtons = (props: RemixUiTerminalProps) => { onClick={async (e) => await showTerminal(e)}> - + */}
) } \ No newline at end of file diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx b/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx index 522200ab395..e403bd61c7b 100644 --- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx +++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx @@ -25,7 +25,7 @@ export const RemixUITerminalWrapper = (props: RemixUiTerminalProps) => { if (appContext.appState.connectedToDesktop === desktopConnextionType.connected) { dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'transactions' }) } - },[appContext.appState.connectedToDesktop]) + }, [appContext.appState.connectedToDesktop]) if (appContext.appState.connectedToDesktop === desktopConnextionType.disconnected) { return <> @@ -35,7 +35,7 @@ export const RemixUITerminalWrapper = (props: RemixUiTerminalProps) => { return <> - + {platform !== appPlatformTypes.desktop && } } @@ -48,7 +48,7 @@ export const RemixUITerminalWrapper = (props: RemixUiTerminalProps) => { <> - + {/* */} } From 55490118a7925763854ee77b5f2b794914514ef6 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 7 Jan 2025 11:15:54 +0100 Subject: [PATCH 17/58] use cbor for messaging --- .../src/app/plugins/desktop-client.tsx | 69 +++++++++++++++++-- apps/remix-ide/src/app/udapp/run-tab.tsx | 6 +- apps/remixdesktop/package.json | 1 + apps/remixdesktop/src/lib/server.ts | 46 +++++++++---- apps/remixdesktop/src/plugins/desktopHost.ts | 2 +- apps/remixdesktop/yarn.lock | 43 ++++-------- libs/remix-lib/src/execution/txRunnerWeb3.ts | 5 ++ .../src/lib/components/ChechTxStatus.tsx | 2 +- package.json | 1 + yarn.lock | 9 ++- 10 files changed, 132 insertions(+), 52 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index a9c2bb8da4d..93f4bc2c390 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -7,6 +7,7 @@ import { AppAction, appActionTypes, AppContext, AppModal, ModalTypes } from '@re import { ViewPlugin } from '@remixproject/engine-web' import { PluginViewWrapper } from '@remix-ui/helper' import { QueryParams } from '@remix-project/remix-lib' +import cbor from 'cbor' const _paq = (window._paq = window._paq || []) @@ -138,7 +139,7 @@ export class DesktopClient extends ViewPlugin { async handleNetworkStatus(context: any) { console.log('networkStatus', context) - this.ws.send(JSON.stringify({ type: 'contextChanged', payload: null })) + this.ws.send(stringifyWithBigInt({ type: 'contextChanged', payload: null })) } async checkConnection() { @@ -157,6 +158,7 @@ export class DesktopClient extends ViewPlugin { console.log('Connecting to server') try { this.ws = new WebSocket(`ws://localhost:${this.params.desktopClientPort}`) + this.ws.binaryType = 'arraybuffer' } catch (e) { console.error('CATCH WebSocket error:', e) return @@ -174,7 +176,7 @@ export class DesktopClient extends ViewPlugin { this.ws.onmessage = async (event) => { const parsed = JSON.parse(event.data) - //console.log('Message from server:', parsed) + console.log('Message from server:', parsed.method) if (parsed && parsed.type === 'error') { if (parsed.payload === 'ALREADY_CONNECTED') { console.log('ALREADY_CONNECTED') @@ -191,17 +193,42 @@ export class DesktopClient extends ViewPlugin { return } } - if (parsed.method === 'eth_sendTransaction') { + if (parsed.method === 'eth_sendTransaction' || parsed.method === 'eth_getTransactionReceipt') { this.call('terminal', 'log', { value: 'Transaction from desktop client: ' + event.data, type: 'info', }) } + if (parsed.method === 'eth_sendTransaction' || parsed.method === 'eth_getTransactionReceipt') { + console.log('Sending message to web3:', parsed) + } + + let receipt + //const result = await this.call('web3Provider', 'sendAsync', parsed) + if (parsed.method === 'eth_getTransactionReceipt') { + let receipt = await this.tryTillReceiptAvailable(parsed.params[0]) + console.log('Receipt:', receipt) + console.log('Sending receipt back to server', parsed.params[0], receipt) + this.ws.send(stringifyWithBigInt({ + jsonrpc: '2.0', + result: receipt, + id: parsed.id, + })) + }else{ + const provider = this.blockchain.web3().currentProvider + //console.log('provider', provider) + let result = await provider.sendAsync(parsed) + if (parsed.method === 'eth_sendTransaction') { + //console.log('Result:', result) + console.log('Sending result back to server', result) + } + this.ws.send(stringifyWithBigInt(result)) + } + - const result = await this.call('web3Provider', 'sendAsync', parsed) - this.ws.send(JSON.stringify(result)) - if (parsed.method === 'eth_sendTransaction') { + /* + if (parsed.method === 'eth_sendTransaction' || parsed.method === 'eth_getTransactionReceipt') { console.log('Message from server:', parsed) console.log('Result:', result) this.call('terminal', 'log', { @@ -210,6 +237,7 @@ export class DesktopClient extends ViewPlugin { }) } return result + */ } this.ws.onclose = () => { @@ -257,4 +285,33 @@ export class DesktopClient extends ViewPlugin { async init() { } async sendAsync(payload: any) { } + + async tryTillReceiptAvailable(txhash) { + try { + //console.log('tryTillReceiptAvailable', txhash) + const receipt = await this.call('blockchain', 'getTransactionReceipt', txhash) + if (receipt) return receipt + } catch (e) { + // do nothing + } + await this.pause() + return await this.tryTillReceiptAvailable(txhash) + } + async pause() { + return new Promise((resolve, reject) => { + setTimeout(resolve, 500) + }) + } +} + + +function stringifyWithBigInt(obj) { + + return cbor.encode(obj) + console.log('stringifyWithBigInt', obj) + const r = JSON.stringify(obj, (key, value) => + typeof value === 'bigint' ? value.toString() : value + ); + console.log('stringifyWithBigInt', r) + return r } diff --git a/apps/remix-ide/src/app/udapp/run-tab.tsx b/apps/remix-ide/src/app/udapp/run-tab.tsx index 4e856fb902d..2058cbd003c 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.tsx +++ b/apps/remix-ide/src/app/udapp/run-tab.tsx @@ -302,8 +302,10 @@ export class RunTab extends ViewPlugin { // wallet connect await addProvider(6, 'walletconnect', 'WalletConnect', false, false, false) - // desktop host - await addProvider(12, 'desktopHost', 'Metamask for Remix Desktop', false, false, false) + if(isElectron()) { + // desktop host + await addProvider(12, 'desktopHost', 'Metamask for Remix Desktop', false, false, false) + } // external provider await addProvider(10, 'basic-http-provider', 'Custom - External Http Provider', false, false, false) diff --git a/apps/remixdesktop/package.json b/apps/remixdesktop/package.json index 307db4b15f0..8406dbbc452 100644 --- a/apps/remixdesktop/package.json +++ b/apps/remixdesktop/package.json @@ -75,6 +75,7 @@ "add": "^2.0.6", "axios": "^1.7.4", "byline": "^5.0.0", + "cbor": "^10.0.3", "chokidar": "^3.5.3", "cors": "^2.8.5", "electron-updater": "^6.1.8", diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index 8fe9d3ea4f2..a4a3fd07f69 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -3,12 +3,12 @@ import { WebSocketServer, WebSocket } from 'ws'; import cors from 'cors'; import EventEmitter from 'events'; import { RequestArguments } from '../types'; -import { json } from 'stream/consumers'; import path from 'path'; import express from 'express' import { findAvailablePort } from '../utils/portFinder' import { isPackaged } from '../main'; import { isE2ELocal } from '../main'; +import cbor from 'cbor'; // Forwarding WebSocket client let connectedWebSocket: WebSocket | null = null; @@ -32,20 +32,22 @@ export const handleRequest = async ( return new Promise((resolve, reject) => { const timeout = setTimeout(() => reject(new Error('Timeout waiting for WebSocket response')), 240000); // 10 seconds timeout - connectedWebSocket && connectedWebSocket.once('message', (data: string) => { + connectedWebSocket && connectedWebSocket.once('message', async (data: any) => { - if (Buffer.isBuffer(data)) { - data = data.toString('utf-8'); - } + //if (Buffer.isBuffer(data)) { + // data = data.toString('utf-8'); + //} //console.log('received message from WebSocket ONCE client:', data); clearTimeout(timeout); try { - const response = JSON.parse(data); + console.log('received message from WebSocket ONCE client:', data); + const response = parseWithBigInt(new Uint8Array(data)); + console.log('received message from WebSocket ONCE client:', response); if (response.id === jsonRpcPayload.id) { - if (jsonRpcPayload.method === 'eth_sendTransaction') { + if (jsonRpcPayload.method === 'eth_sendTransaction' || jsonRpcPayload.method === 'eth_getTransactionReceipt') { console.log('response from WebSocket client:', response); eventEmitter.emit('focus') } @@ -71,19 +73,27 @@ export const handleRequest = async ( }) } } else { + if (jsonRpcPayload.method === 'eth_sendTransaction' || jsonRpcPayload.method === 'eth_getTransactionReceipt') { + console.log('resolve response from WebSocket client:', jsonRpcPayload.method, response); + // if(jsonRpcPayload.method === 'eth_getTransactionReceipt'){ + // response.result = JSON.parse(response.result) + // } + } resolve(response.result); } } else { + console.log('ignore response from WebSocket client:', data); //reject(new Error('Invalid response ID')); } } catch (error) { + console.log('REJECT error response from WebSocket client:', error); reject(error); } }); connectedWebSocket && connectedWebSocket.send(JSON.stringify(jsonRpcPayload), (err) => { - if (jsonRpcPayload.method === 'eth_sendTransaction') { + if (jsonRpcPayload.method === 'eth_sendTransaction' || jsonRpcPayload.method === 'eth_getTransactionReceipt') { console.log('sent message to WebSocket client:', jsonRpcPayload); } if (err) { @@ -147,11 +157,11 @@ export const startHostServer = async (eventEmitter: EventEmitter) => { - connectedWebSocket.on('message', (data: string) => { - if (Buffer.isBuffer(data)) { - data = data.toString('utf-8'); - } - const response = JSON.parse(data); + connectedWebSocket.on('message', (data: any) => { + //if (Buffer.isBuffer(data)) { + // data = data.toString('utf-8'); + // } + const response = parseWithBigInt(new Uint8Array(data)); if (response && response.type) { console.log('received message from WebSocket client:', response); eventEmitter.emit(response.type, response.payload); @@ -184,3 +194,13 @@ export const startHostServer = async (eventEmitter: EventEmitter) => { websocket_port } } + + +function parseWithBigInt(json) { + return cbor.decode(json) + console.log('parseWithBigInt', json) + return JSON.parse(json, (key, value) => + typeof value === 'string' && /^\d+n?$/.test(value) ? BigInt(value) : value + ); + } + diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 3e9f440fb81..3dd3137412c 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -91,7 +91,7 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { async sendAsync(data: RequestArguments) { //console.log('SEND ASYNC', data) const result = await handleRequest(data, eventEmitter) - //console.log('RESULT', result) + //console.log('RESULT from handleRequest', data, result) return result } } \ No newline at end of file diff --git a/apps/remixdesktop/yarn.lock b/apps/remixdesktop/yarn.lock index ff5271569dc..70015cf3000 100644 --- a/apps/remixdesktop/yarn.lock +++ b/apps/remixdesktop/yarn.lock @@ -2201,6 +2201,13 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +cbor@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-10.0.3.tgz#202d79cd696f408700af51b0c9771577048a860e" + integrity sha512-72Jnj81xMsqepqdcSdf2+fflz/UDsThOHy5hj2MW5F5xzHL8Oa0KQ6I6V9CwVUPxg5pf+W9xp6W2KilaRXWWtw== + dependencies: + nofilter "^3.0.2" + chai-nightwatch@0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/chai-nightwatch/-/chai-nightwatch-0.5.3.tgz#980ecf63dde5a04e7f3524370682c7ff01178ffb" @@ -5446,6 +5453,11 @@ node-releases@^2.0.14: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +nofilter@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" @@ -6518,16 +6530,7 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -6586,14 +6589,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -7541,16 +7537,7 @@ workerpool@6.2.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== diff --git a/libs/remix-lib/src/execution/txRunnerWeb3.ts b/libs/remix-lib/src/execution/txRunnerWeb3.ts index b2c46feff45..163be3651e5 100644 --- a/libs/remix-lib/src/execution/txRunnerWeb3.ts +++ b/libs/remix-lib/src/execution/txRunnerWeb3.ts @@ -18,6 +18,7 @@ export class TxRunnerWeb3 { } async _executeTx (tx, network, txFee, api, promptCb, callback) { + console.log('executeTx', tx) if (network && network.lastBlock && network.lastBlock.baseFeePerGas) { // the sending stack (web3.js / metamask need to have the type defined) // this is to avoid the following issue: https://github.com/MetaMask/metamask-extension/issues/11824 @@ -46,6 +47,7 @@ export class TxRunnerWeb3 { const listenOnResponse = () => { // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve, reject) => { + console.log('listenOnResponse') const receipt = await tryTillReceiptAvailable(resp, this.getWeb3()) tx = await tryTillTxAvailable(resp, this.getWeb3()) currentDateTime = new Date(); @@ -80,8 +82,10 @@ export class TxRunnerWeb3 { } else { try { const res = await this.getWeb3().eth.sendTransaction(tx, null, { checkRevertBeforeSending: false, ignoreGasPricing: true }) + console.log('res', res) cb(null, res.transactionHash) } catch (e) { + console.log(e) if (!e.message) e.message = '' if (e.error) { e.message = e.message + ' ' + e.error @@ -192,6 +196,7 @@ export class TxRunnerWeb3 { async function tryTillReceiptAvailable (txhash: string, web3: Web3) { try { const receipt = await web3.eth.getTransactionReceipt(txhash) + console.log('receipt', receipt) if (receipt) { if (!receipt.to && !receipt.contractAddress) { // this is a contract creation and the receipt doesn't contain a contract address. we have to keep polling... diff --git a/libs/remix-ui/terminal/src/lib/components/ChechTxStatus.tsx b/libs/remix-ui/terminal/src/lib/components/ChechTxStatus.tsx index 1bdb22f7b4a..6e155983f26 100644 --- a/libs/remix-ui/terminal/src/lib/components/ChechTxStatus.tsx +++ b/libs/remix-ui/terminal/src/lib/components/ChechTxStatus.tsx @@ -1,7 +1,7 @@ import React from 'react' // eslint-disable-line const CheckTxStatus = ({ tx, type }) => { - if (tx.status === 1 || tx.status === '0x1' || tx.status === true) { + if (tx.status === 1 || tx.status === '0x1' || tx.status === true || tx.status === '1') { return } if (type === 'call' || type === 'unknownCall' || type === 'unknown') { diff --git a/package.json b/package.json index 18a10050abf..85da0e9a0f4 100644 --- a/package.json +++ b/package.json @@ -133,6 +133,7 @@ "bn.js": "^5.1.2", "bootstrap": "^5.2.2", "brace": "^0.8.0", + "cbor": "^10.0.3", "change-case": "^4.1.1", "chokidar": "^2.1.8", "circom_wasm": "https://github.com/remix-project-org/circom_wasm.git", diff --git a/yarn.lock b/yarn.lock index ffe4387345d..c47cafd6ea3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -11606,6 +11606,13 @@ catering@^2.0.0, catering@^2.1.0, catering@^2.1.1: resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== +cbor@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-10.0.3.tgz#202d79cd696f408700af51b0c9771577048a860e" + integrity sha512-72Jnj81xMsqepqdcSdf2+fflz/UDsThOHy5hj2MW5F5xzHL8Oa0KQ6I6V9CwVUPxg5pf+W9xp6W2KilaRXWWtw== + dependencies: + nofilter "^3.0.2" + cbor@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/cbor/-/cbor-9.0.1.tgz#b16e393d4948d44758cd54ac6151379d443b37ae" @@ -23372,7 +23379,7 @@ nodent@>=2.6.12: nodent-runtime "^3.2.1" resolve "^1.5.0" -nofilter@^3.1.0: +nofilter@^3.0.2, nofilter@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-3.1.0.tgz#c757ba68801d41ff930ba2ec55bab52ca184aa66" integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== From b04cc7595fd1a818facfdbd76d18375863744706 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 8 Jan 2025 06:02:34 +0100 Subject: [PATCH 18/58] fix grid --- apps/remix-ide/src/app.js | 3 - .../src/app/providers/remix-web-provider.tsx | 79 ------------ apps/remix-ide/src/app/udapp/run-tab.tsx | 1 - apps/remix-ide/src/blockchain/blockchain.tsx | 2 +- .../components/environment-explorer-ui.tsx | 121 +++++++++--------- .../src/lib/types/index.ts | 3 +- .../src/components/terminal-transactions.tsx | 2 +- .../src/lib/components/ChechTxStatus.tsx | 3 +- 8 files changed, 64 insertions(+), 150 deletions(-) delete mode 100644 apps/remix-ide/src/app/providers/remix-web-provider.tsx diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index 1b4b8b9f277..758910dc759 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -71,7 +71,6 @@ import { GitPlugin } from './app/plugins/git' import { Matomo } from './app/plugins/matomo' import { DesktopClient } from './app/plugins/desktop-client' import { DesktopHost } from './app/plugins/electron/desktopHostPlugin' -import { RemixWebProvider } from './app/providers/remix-web-provider' import { TemplatesSelectionPlugin } from './app/plugins/templates-selection/templates-selection-plugin' @@ -430,8 +429,6 @@ class AppComponent { this.engine.register([remixAIDesktop]) const desktopHost = new DesktopHost() this.engine.register([desktopHost]) - const remixWebProvider = new RemixWebProvider(blockchain) - this.engine.register([remixWebProvider]) } else{ //---- desktop client const desktopClient = new DesktopClient(blockchain) diff --git a/apps/remix-ide/src/app/providers/remix-web-provider.tsx b/apps/remix-ide/src/app/providers/remix-web-provider.tsx deleted file mode 100644 index 64ba2a066c5..00000000000 --- a/apps/remix-ide/src/app/providers/remix-web-provider.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import * as packageJson from '../../../../../package.json' -import React, { useContext } from 'react' // eslint-disable-line -import { FormattedMessage } from 'react-intl' -import { AbstractProvider } from './abstract-provider' -import { AppContext, AppModal, ModalTypes } from '@remix-ui/app' -import { ethers } from 'ethers' - -const profile = { - name: 'remix-web-provider', - displayName: 'Remix web & MetaMask', - kind: 'provider', - description: 'MetaMask', - methods: ['sendAsync', 'init'], - version: packageJson.version -} - -export class RemixWebProvider extends AbstractProvider { - - constructor(blockchain) { - super(profile, blockchain, 'http://127.0.0.1:8545') - } - - async init() { - - const isConnected = await this.call('desktopHost', 'getIsConnected') - - if(isConnected) { - this.provider = new ethers.providers.JsonRpcProvider(this.defaultUrl) - return { - nodeUrl: this.defaultUrl - } - } - - await ((): Promise => { - return new Promise((resolve, reject) => { - const modalContent: AppModal = { - id: this.profile.name, - title: this.profile.displayName, - message: this.body(), - modalType: ModalTypes.confirm, - okLabel: 'Connect', - cancelLabel: 'Cancel', - - okFn: (value: string) => { - setTimeout(() => resolve(value), 0) - }, - cancelFn: () => { - setTimeout(() => reject(new Error('Canceled')), 0) - }, - hideFn: () => { - setTimeout(() => reject(new Error('Hide')), 0) - }, - } - this.call('notification', 'modal', modalContent) - }) - })() - this.provider = new ethers.providers.JsonRpcProvider(this.defaultUrl) - return { - nodeUrl: this.defaultUrl - } - } - - body() { - return ( - <> -
You can deploy and run transactions in the environment of Remix on the web.
-
This enables you to use MetaMask if you have it installed.
-
Click here to open Remix in 'Desktop Connect Mode'
-
And connect to any network there you want to use here.
- - - Remix on the web in Desktop Connect Mode - - -
After that click 'Connect'
- - ) - } -} diff --git a/apps/remix-ide/src/app/udapp/run-tab.tsx b/apps/remix-ide/src/app/udapp/run-tab.tsx index 180caeb5da6..787f931b70e 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.tsx +++ b/apps/remix-ide/src/app/udapp/run-tab.tsx @@ -151,7 +151,6 @@ export class RunTab extends ViewPlugin { 'walletconnect': 'Deploy using WalletConnect.', 'desktopHost': 'Deploy using web metamask.', 'basic-http-provider': 'Deploy to a Custom local network.', - 'remix-web-provider': 'Deploy through the Remix MetaMask browser extension.', 'hardhat-provider': 'Deploy to the local Hardhat dev chain.', 'ganache-provider': 'Deploy to the local Ganache dev chain.', 'foundry-provider': 'Deploy to the local Foundry dev chain.', diff --git a/apps/remix-ide/src/blockchain/blockchain.tsx b/apps/remix-ide/src/blockchain/blockchain.tsx index d77b0b74aa9..03d10f2831b 100644 --- a/apps/remix-ide/src/blockchain/blockchain.tsx +++ b/apps/remix-ide/src/blockchain/blockchain.tsx @@ -115,7 +115,7 @@ export class Blockchain extends Plugin { this.networkcallid = 0 this.networkStatus = { network: { name: ' - ', id: ' - ' } } this.registeredPluginEvents = [] - this.defaultPinnedProviders = ['desktopHost', 'vm-cancun', 'vm-mainnet-fork', 'walletconnect', 'injected-MetaMask', 'remix-web-provider', 'hardhat-provider', 'foundry-provider'] + this.defaultPinnedProviders = ['desktopHost', 'vm-cancun', 'vm-mainnet-fork', 'walletconnect', 'injected-MetaMask', 'hardhat-provider', 'foundry-provider'] this.pinnedProviders = [] this.setupEvents() this.setupProviders() diff --git a/libs/remix-ui/environment-explorer/src/lib/components/environment-explorer-ui.tsx b/libs/remix-ui/environment-explorer/src/lib/components/environment-explorer-ui.tsx index 0bd67a5c188..bdf9758b9bd 100644 --- a/libs/remix-ui/environment-explorer/src/lib/components/environment-explorer-ui.tsx +++ b/libs/remix-ui/environment-explorer/src/lib/components/environment-explorer-ui.tsx @@ -1,21 +1,23 @@ // eslint-disable-next-line no-use-before-define -import React, { useEffect, useState } from 'react' +import React, { useContext, useEffect, useState } from 'react' import { environmentExplorerUIGridSections, environmentExplorerUIProps } from '../types' import { RemixUIGridCell, RemixUIGridSection, RemixUIGridView } from '@remix-ui/remix-ui-grid-view' import { CustomTooltip } from '@remix-ui/helper' +import { AppContext } from '@remix-ui/app' +import { desktopConnextionType } from '@remix-api' const defaultSections: environmentExplorerUIGridSections = { Injected: { title: 'Deploy using a Browser Extension.', keywords: ['Injected'], providers: [], - filterFn: (provider) => provider.isInjected + filterFn: (provider) => provider.isInjected, }, 'Remix VMs': { title: 'Deploy to an In-browser Virtual Machine.', keywords: ['Remix VMs'], providers: [], - filterFn: (provider) => provider.isVM && !provider.isForkedVM + filterFn: (provider) => provider.isVM && !provider.isForkedVM, }, 'Forked States': { title: 'Deploy to an In-browser Forked State.', @@ -26,87 +28,80 @@ const defaultSections: environmentExplorerUIGridSections = { const { latestBlock, timestamp } = JSON.parse(provider.description) return ( <> -
Latest Block: {parseInt(latestBlock)}
- -
Forked at: {(new Date(timestamp)).toDateString()}
+
+ Latest Block: + {parseInt(latestBlock)} +
+ +
+ Forked at: + {new Date(timestamp).toDateString()} +
- ) - } + + ) + }, }, 'Remix forked VMs': { title: 'Deploy to a Remix forked Virtual Machine.', keywords: ['Remix forked VMs'], providers: [], - filterFn: (provider) => provider.isForkedVM + filterFn: (provider) => provider.isForkedVM, }, - 'Externals': { + Externals: { title: 'Deploy to an external Provider.', keywords: ['Externals'], providers: [], - filterFn: (provider) => (!provider.isInjected && !provider.isVM && !provider.isForkedState && !provider.isForkedVM) + filterFn: (provider) => !provider.isInjected && !provider.isVM && !provider.isForkedState && !provider.isForkedVM, }, } export const EnvironmentExplorerUI = (props: environmentExplorerUIProps) => { - const [sections, setSections] = useState(defaultSections) const { state, pinStateCallback, profile } = props + const context = useContext(AppContext) useEffect(() => { - - setSections((prevSections) => { - const newSections = { ...prevSections } - Object.keys(newSections).forEach((section) => { - newSections[section].providers = Object.values(state.providersFlat).filter(newSections[section].filterFn) - newSections[section].id = section + console.log('context.appState.connectedToDesktop', context.appState.connectedToDesktop) + + setSections((prevSections) => { + const newSections = { ...prevSections } + Object.keys(newSections).forEach((section) => { + newSections[section].providers = Object.values(state.providersFlat).filter(newSections[section].filterFn) + newSections[section].id = section + newSections[section].hide = (context.appState.connectedToDesktop && context.appState.connectedToDesktop !== desktopConnextionType.disabled && section !== 'Injected') + }) + return newSections }) - return newSections - }) - }, [state]) + + }, [state, context]) return ( <> - - {Object.values(sections).map((section) => ( - section.providers.length > 0 && ( - - {section.providers.map(provider => ( - { - await pinStateCallback(provider, pinned) - }} - > -
{(section.descriptionFn && section.descriptionFn(provider)) || provider.description}
-
- ))} -
- ) - ))} + + {Object.values(sections).map( + (section, key) => + section.providers.length > 0 && !section.hide && ( + + {section.providers.map((provider) => ( + { + await pinStateCallback(provider, pinned) + }} + > +
{(section.descriptionFn && section.descriptionFn(provider)) || provider.description}
+
+ ))} +
+ ) + )}
) diff --git a/libs/remix-ui/environment-explorer/src/lib/types/index.ts b/libs/remix-ui/environment-explorer/src/lib/types/index.ts index 706e577eddf..51cab0ca632 100644 --- a/libs/remix-ui/environment-explorer/src/lib/types/index.ts +++ b/libs/remix-ui/environment-explorer/src/lib/types/index.ts @@ -18,7 +18,8 @@ export type environmentExplorerUIGridSection = { providers: Provider[] filterFn: (provider: Provider) => boolean descriptionFn?: (provider: Provider) => string | JSX.Element | null - id?: string + id?: string, + hide?: boolean } export type environmentExplorerUIGridSections = { diff --git a/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx b/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx index 8962fe8f34e..540b6866045 100644 --- a/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx +++ b/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx @@ -7,7 +7,7 @@ export interface TerminalTransactionsProps { plugin: Plugin } -const pluginsToWatch = ['injected-metamask', 'remix-web-provider', 'web3Provider']; +const pluginsToWatch = ['injected-metamask', 'web3Provider']; interface queue { pluginName: string, diff --git a/libs/remix-ui/terminal/src/lib/components/ChechTxStatus.tsx b/libs/remix-ui/terminal/src/lib/components/ChechTxStatus.tsx index 6e155983f26..da0b306f36b 100644 --- a/libs/remix-ui/terminal/src/lib/components/ChechTxStatus.tsx +++ b/libs/remix-ui/terminal/src/lib/components/ChechTxStatus.tsx @@ -1,7 +1,8 @@ import React from 'react' // eslint-disable-line const CheckTxStatus = ({ tx, type }) => { - if (tx.status === 1 || tx.status === '0x1' || tx.status === true || tx.status === '1') { + console.log('tx', tx) + if (tx.status === 1 || tx.status === '0x1' || tx.status === true || tx.status === '1' || tx.status === BigInt(1)) { return } if (type === 'call' || type === 'unknownCall' || type === 'unknown') { From 15d57f2b689106636bfb4790022a530ffef65acb Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 8 Jan 2025 06:14:22 +0100 Subject: [PATCH 19/58] create component --- .../lib/components/EnvironmentDropdown.tsx | 90 +++++++++++++++++++ .../src/lib/components/environment.tsx | 81 +---------------- 2 files changed, 92 insertions(+), 79 deletions(-) create mode 100644 libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx diff --git a/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx b/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx new file mode 100644 index 00000000000..a2296e51930 --- /dev/null +++ b/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx @@ -0,0 +1,90 @@ +import { CustomToggle, CustomTooltip, CustomMenu } from '@remix-ui/helper'; +import React from 'react'; +import { Dropdown } from 'react-bootstrap'; +import { FormattedMessage } from 'react-intl'; + +const EnvironmentDropdown = ({ currentProvider, isL2, bridges, handleChangeExEnv, props }) => { + return ( + + + {isL2(currentProvider && currentProvider.displayName)} + {currentProvider && currentProvider.displayName} + {currentProvider && bridges[currentProvider.displayName.substring(0, 13)] && ( + }> + + + )} + + + {props.providers.providerList.length === 0 && + + No provider pinned + + } + { (props.providers.providerList.filter((provider) => { return provider.isInjected })).map(({ name, displayName }) => ( + { + handleChangeExEnv(name) + }} + data-id={`dropdown-item-${name}`} + > + + {displayName} + + + ))} + { props.providers.providerList.filter((provider) => { return provider.isInjected }).length !== 0 && } + { (props.providers.providerList.filter((provider) => { return provider.isVM })).map(({ displayName, name }) => ( + { + handleChangeExEnv(name) + }} + data-id={`dropdown-item-${name}`} + > + + {displayName} + + + ))} + { props.providers.providerList.filter((provider) => { return provider.isVM }).length !== 0 && } + { (props.providers.providerList.filter((provider) => { return !(provider.isVM || provider.isInjected) })).map(({ displayName, name }) => ( + { + handleChangeExEnv(name) + }} + data-id={`dropdown-item-${name}`} + > + + {isL2(displayName)} + {displayName} + + + ))} + + { + props.setExecutionContext({ context: 'item-another-chain' }) + }} + data-id={`dropdown-item-another-chain`} + > + + Customize this list... + + + + + ); +}; + +export default EnvironmentDropdown; \ No newline at end of file diff --git a/libs/remix-ui/run-tab/src/lib/components/environment.tsx b/libs/remix-ui/run-tab/src/lib/components/environment.tsx index e3faf9938ef..48c515f79b3 100644 --- a/libs/remix-ui/run-tab/src/lib/components/environment.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/environment.tsx @@ -4,6 +4,7 @@ import { FormattedMessage, useIntl } from 'react-intl' import { EnvironmentProps, Provider } from '../types' import { Dropdown } from 'react-bootstrap' import { CustomMenu, CustomToggle, CustomTooltip } from '@remix-ui/helper' +import EnvironmentDropdown from './EnvironmentDropdown' const _paq = (window._paq = window._paq || []) export function EnvironmentUI(props: EnvironmentProps) { @@ -135,85 +136,7 @@ export function EnvironmentUI(props: EnvironmentProps) {
}
- - - {isL2(currentProvider && currentProvider.displayName)} - {currentProvider && currentProvider.displayName} - {currentProvider && bridges[currentProvider.displayName.substring(0, 13)] && ( - }> - - - )} - - - {props.providers.providerList.length === 0 && - - No provider pinned - - } - { (props.providers.providerList.filter((provider) => { return provider.isInjected })).map(({ name, displayName }) => ( - { - handleChangeExEnv(name) - }} - data-id={`dropdown-item-${name}`} - > - - {displayName} - - - ))} - { props.providers.providerList.filter((provider) => { return provider.isInjected }).length !== 0 && } - { (props.providers.providerList.filter((provider) => { return provider.isVM })).map(({ displayName, name }) => ( - { - handleChangeExEnv(name) - }} - data-id={`dropdown-item-${name}`} - > - - {displayName} - - - ))} - { props.providers.providerList.filter((provider) => { return provider.isVM }).length !== 0 && } - { (props.providers.providerList.filter((provider) => { return !(provider.isVM || provider.isInjected) })).map(({ displayName, name }) => ( - { - handleChangeExEnv(name) - }} - data-id={`dropdown-item-${name}`} - > - - {isL2(displayName)} - {displayName} - - - ))} - - { - props.setExecutionContext({ context: 'item-another-chain' }) - }} - data-id={`dropdown-item-another-chain`} - > - - Customize this list... - - - - +
) From 4dfee36f2830e256f58c749a604c30a40414d0cd Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 8 Jan 2025 06:21:30 +0100 Subject: [PATCH 20/58] typing --- .../src/lib/components/EnvironmentDropdown.tsx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx b/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx index a2296e51930..c68101b70e3 100644 --- a/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx @@ -2,8 +2,22 @@ import { CustomToggle, CustomTooltip, CustomMenu } from '@remix-ui/helper'; import React from 'react'; import { Dropdown } from 'react-bootstrap'; import { FormattedMessage } from 'react-intl'; +import { Provider } from '../types'; // Adjust the import path as needed -const EnvironmentDropdown = ({ currentProvider, isL2, bridges, handleChangeExEnv, props }) => { +interface EnvironmentDropdownProps { + currentProvider: Provider; + isL2: (provider: string) => boolean; + bridges: Record; + handleChangeExEnv: (name: string) => void; + props: { + providers: { + providerList: Provider[]; + }; + setExecutionContext: (executionContext: { context: string }) => void; + }; +} + +const EnvironmentDropdown: React.FC = ({ currentProvider, isL2, bridges, handleChangeExEnv, props }) => { return ( From 2cce63f4691439e58d8a8cc914ef706621875755 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 8 Jan 2025 06:25:42 +0100 Subject: [PATCH 21/58] add filter --- .../src/lib/components/EnvironmentDropdown.tsx | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx b/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx index c68101b70e3..7aa3986ef49 100644 --- a/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx @@ -9,6 +9,7 @@ interface EnvironmentDropdownProps { isL2: (provider: string) => boolean; bridges: Record; handleChangeExEnv: (name: string) => void; + filters?: (provider: Provider) => boolean; // Add filters prop props: { providers: { providerList: Provider[]; @@ -17,7 +18,11 @@ interface EnvironmentDropdownProps { }; } -const EnvironmentDropdown: React.FC = ({ currentProvider, isL2, bridges, handleChangeExEnv, props }) => { +const EnvironmentDropdown: React.FC = ({ currentProvider, isL2, bridges, handleChangeExEnv, filters, props }) => { + const applyFilters = (provider: Provider) => { + return filters ? filters(provider) : true; + }; + return ( @@ -42,7 +47,7 @@ const EnvironmentDropdown: React.FC = ({ currentProvid No provider pinned } - { (props.providers.providerList.filter((provider) => { return provider.isInjected })).map(({ name, displayName }) => ( + { (props.providers.providerList.filter((provider) => provider.isInjected && applyFilters(provider))).map(({ name, displayName }) => ( { @@ -55,8 +60,8 @@ const EnvironmentDropdown: React.FC = ({ currentProvid ))} - { props.providers.providerList.filter((provider) => { return provider.isInjected }).length !== 0 && } - { (props.providers.providerList.filter((provider) => { return provider.isVM })).map(({ displayName, name }) => ( + { props.providers.providerList.filter((provider) => provider.isInjected && applyFilters(provider)).length !== 0 && } + { (props.providers.providerList.filter((provider) => provider.isVM && applyFilters(provider))).map(({ displayName, name }) => ( { @@ -69,8 +74,8 @@ const EnvironmentDropdown: React.FC = ({ currentProvid ))} - { props.providers.providerList.filter((provider) => { return provider.isVM }).length !== 0 && } - { (props.providers.providerList.filter((provider) => { return !(provider.isVM || provider.isInjected) })).map(({ displayName, name }) => ( + { props.providers.providerList.filter((provider) => provider.isVM && applyFilters(provider)).length !== 0 && } + { (props.providers.providerList.filter((provider) => !(provider.isVM || provider.isInjected) && applyFilters(provider))).map(({ displayName, name }) => ( { From c0c9fe7b84fffb1f06423beb188483570a59bbf5 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 8 Jan 2025 06:33:24 +0100 Subject: [PATCH 22/58] add filter --- .../run-tab/src/lib/components/EnvironmentDropdown.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx b/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx index 7aa3986ef49..8128dfb7b1c 100644 --- a/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx @@ -2,14 +2,14 @@ import { CustomToggle, CustomTooltip, CustomMenu } from '@remix-ui/helper'; import React from 'react'; import { Dropdown } from 'react-bootstrap'; import { FormattedMessage } from 'react-intl'; -import { Provider } from '../types'; // Adjust the import path as needed +import { Provider } from '../types'; interface EnvironmentDropdownProps { currentProvider: Provider; isL2: (provider: string) => boolean; bridges: Record; handleChangeExEnv: (name: string) => void; - filters?: (provider: Provider) => boolean; // Add filters prop + filters?: (provider: Provider) => boolean; props: { providers: { providerList: Provider[]; @@ -18,7 +18,7 @@ interface EnvironmentDropdownProps { }; } -const EnvironmentDropdown: React.FC = ({ currentProvider, isL2, bridges, handleChangeExEnv, filters, props }) => { +const EnvironmentDropdown = ({ currentProvider, isL2, bridges, handleChangeExEnv, filters, props }: EnvironmentDropdownProps) => { const applyFilters = (provider: Provider) => { return filters ? filters(provider) : true; }; From f7c801e66d18176f5819c1b61414c14d5037ddb6 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 8 Jan 2025 06:52:47 +0100 Subject: [PATCH 23/58] filter fn --- .../src/lib/components/EnvironmentDropdown.tsx | 5 +++-- .../run-tab/src/lib/components/environment.tsx | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx b/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx index 8128dfb7b1c..ef27f2d1183 100644 --- a/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx @@ -9,7 +9,7 @@ interface EnvironmentDropdownProps { isL2: (provider: string) => boolean; bridges: Record; handleChangeExEnv: (name: string) => void; - filters?: (provider: Provider) => boolean; + filters?: ((provider: Provider) => boolean)[]; props: { providers: { providerList: Provider[]; @@ -20,7 +20,8 @@ interface EnvironmentDropdownProps { const EnvironmentDropdown = ({ currentProvider, isL2, bridges, handleChangeExEnv, filters, props }: EnvironmentDropdownProps) => { const applyFilters = (provider: Provider) => { - return filters ? filters(provider) : true; + if (!filters) return true; + return filters.every(filter => filter(provider)); }; return ( diff --git a/libs/remix-ui/run-tab/src/lib/components/environment.tsx b/libs/remix-ui/run-tab/src/lib/components/environment.tsx index 48c515f79b3..443fe151b40 100644 --- a/libs/remix-ui/run-tab/src/lib/components/environment.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/environment.tsx @@ -1,14 +1,25 @@ -// eslint-disable-next-line no-use-before-define -import React, { useRef } from 'react' +import React, { useRef, useState, useContext, useEffect } from 'react' import { FormattedMessage, useIntl } from 'react-intl' import { EnvironmentProps, Provider } from '../types' import { Dropdown } from 'react-bootstrap' import { CustomMenu, CustomToggle, CustomTooltip } from '@remix-ui/helper' import EnvironmentDropdown from './EnvironmentDropdown' +import { AppContext } from '@remix-ui/app' +import { desktopConnextionType } from '@remix-api' + const _paq = (window._paq = window._paq || []) export function EnvironmentUI(props: EnvironmentProps) { const vmStateName = useRef('') + const [filters, setFilters] = useState<((provider: Provider) => boolean)[]>([]) + const context = useContext(AppContext) // Use the AppContext + + useEffect(() => { + const filterFunction = (provider: Provider) => { + return context.appState.connectedToDesktop != desktopConnextionType.disabled ? provider.isInjected : true + } + setFilters((prevFilters) => [...prevFilters, filterFunction]) + }, [context.appState.connectedToDesktop]) Object.entries(props.providers.providerList.filter((provider) => { return provider.isVM })) Object.entries(props.providers.providerList.filter((provider) => { return provider.isInjected })) @@ -136,7 +147,7 @@ export function EnvironmentUI(props: EnvironmentProps) { }
- +
) From 6fcecc3608a43d5baef4752b76fac489a67c7340 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 8 Jan 2025 07:02:09 +0100 Subject: [PATCH 24/58] refactor --- .../src/lib/components/EnvironmentDropdown.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx b/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx index ef27f2d1183..1684a69c791 100644 --- a/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx @@ -24,6 +24,10 @@ const EnvironmentDropdown = ({ currentProvider, isL2, bridges, handleChangeExEnv return filters.every(filter => filter(provider)); }; + const injectedProviders = props.providers.providerList.filter((provider) => provider.isInjected && applyFilters(provider)); + const vmProviders = props.providers.providerList.filter((provider) => provider.isVM && applyFilters(provider)); + const otherProviders = props.providers.providerList.filter((provider) => !(provider.isVM || provider.isInjected) && applyFilters(provider)); + return ( @@ -48,7 +52,7 @@ const EnvironmentDropdown = ({ currentProvider, isL2, bridges, handleChangeExEnv No provider pinned } - { (props.providers.providerList.filter((provider) => provider.isInjected && applyFilters(provider))).map(({ name, displayName }) => ( + {injectedProviders.map(({ name, displayName }) => ( { @@ -61,8 +65,8 @@ const EnvironmentDropdown = ({ currentProvider, isL2, bridges, handleChangeExEnv ))} - { props.providers.providerList.filter((provider) => provider.isInjected && applyFilters(provider)).length !== 0 && } - { (props.providers.providerList.filter((provider) => provider.isVM && applyFilters(provider))).map(({ displayName, name }) => ( + {injectedProviders.length !== 0 && vmProviders.length !== 0 && } + {vmProviders.map(({ displayName, name }) => ( { @@ -75,8 +79,8 @@ const EnvironmentDropdown = ({ currentProvider, isL2, bridges, handleChangeExEnv ))} - { props.providers.providerList.filter((provider) => provider.isVM && applyFilters(provider)).length !== 0 && } - { (props.providers.providerList.filter((provider) => !(provider.isVM || provider.isInjected) && applyFilters(provider))).map(({ displayName, name }) => ( + {vmProviders.length !== 0 && otherProviders.length !== 0 && } + {otherProviders.map(({ displayName, name }) => ( { From 8b180b437bd6eff25a88e34483324f919410ed5d Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 8 Jan 2025 10:57:43 +0100 Subject: [PATCH 25/58] connection grid --- .../src/app/plugins/desktop-client.tsx | 148 +++++--- apps/remix-ide/src/app/udapp/run-tab.tsx | 107 +++--- apps/remix-ide/src/blockchain/blockchain.tsx | 5 +- .../src/blockchain/execution-context.js | 2 + apps/remixdesktop/src/lib/server.ts | 357 +++++++++--------- .../run-tab/src/lib/actions/account.ts | 1 + libs/remix-ui/statusbar/src/index.ts | 1 + .../src/lib/components/desktopStatus.tsx | 10 +- .../src/lib/remixui-statusbar-panel.tsx | 4 +- 9 files changed, 341 insertions(+), 294 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index 93f4bc2c390..c102745536f 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -2,12 +2,15 @@ import React, { useContext, useEffect } from 'react' import { Plugin } from '@remixproject/engine' import { CustomRemixApi, desktopConnection, desktopConnextionType } from '@remix-api' -import { Blockchain } from '../../blockchain/blockchain' +import { Blockchain, Provider } from '../../blockchain/blockchain' import { AppAction, appActionTypes, AppContext, AppModal, ModalTypes } from '@remix-ui/app' import { ViewPlugin } from '@remixproject/engine-web' import { PluginViewWrapper } from '@remix-ui/helper' import { QueryParams } from '@remix-project/remix-lib' import cbor from 'cbor' +import isElectron from 'is-electron' +import { providerLogos } from '../udapp/run-tab' +import { DesktopStatus } from '@remix-ui/statusbar' const _paq = (window._paq = window._paq || []) @@ -26,15 +29,20 @@ const profile = { methods: ['init', 'sendAsync'], events: ['connected'], maintainedBy: 'Remix', - location: 'hiddenPanel', + location: 'mainPanel', } interface DesktopClientState { connected: desktopConnection + providers: Provider[] + disableconnect: boolean, + currentContext: string } -const DesktopClientUI = (props: DesktopClientState) => { +const DesktopClientUI = (props: DesktopClientState & { onConnect: (providerName: Provider) => void }) => { const appContext = useContext(AppContext) + const { connected, providers, onConnect, disableconnect, currentContext } = props + useEffect(() => { console.log('connected', props.connected) appContext.appStateDispatch({ @@ -46,10 +54,35 @@ const DesktopClientUI = (props: DesktopClientState) => { payload: false, }) }, [props.connected]) + return (
-

Desktop Client

-

{props.connected}

+
+

MetaMask for Desktop

+
+ +
+
+ {providers && + providers.length > 0 && + providers + .filter((provider) => provider.isInjected) + .map((provider, index) => ( +
+
+
+
{providerLogos[provider.name] && providerLogos[provider.name].map((logo, index) => )}
+
{provider.displayName}
+

{provider.description}

+ +
+
+
+ ))} +
+
) } @@ -57,7 +90,7 @@ const DesktopClientUI = (props: DesktopClientState) => { export class DesktopClient extends ViewPlugin { blockchain: Blockchain ws: WebSocket - dispatch: React.Dispatch = () => { } + dispatch: React.Dispatch = () => {} state: DesktopClientState appStateDispatch: React.Dispatch queryParams: QueryParams @@ -68,12 +101,14 @@ export class DesktopClient extends ViewPlugin { this.blockchain = blockchain this.state = { connected: desktopConnextionType.disconnected, + providers: [], + disableconnect: false, + currentContext: '', } this.queryParams = new QueryParams() this.params = this.queryParams.get() console.log('DesktopClient params', this.params) - } onActivation() { @@ -82,22 +117,20 @@ export class DesktopClient extends ViewPlugin { this.connectToWebSocket() - const modalContent: AppModal = { - id: this.profile.name, - title: 'Instructions for Metamask for Remix Desktop.', - message: ` - 1. Select the "Injected Provider - Metamask" in the environment and log in to your account. - \n2. Return to the desktop application. - \n3. You can now use the Metamask extension to sign transactions and interact with the blockchain. - \n\nPlease note that the Metamask extension must be installed in your browser.`, - modalType: ModalTypes.default, - okLabel: 'OK', + const updateProviders = async () => { + const providersObj: { [key: string]: Provider } = await this.call('blockchain', 'getAllProviders') + const providers: Provider[] = Object.values(providersObj) + this.state.providers = providers + this.renderComponent() + console.log('providers', providers) } - this.call('notification', 'modal' as any, modalContent) + this.on('udapp', 'providerAdded', updateProviders) + window.addEventListener('eip6963:announceProvider', (event: CustomEvent) => updateProviders()) + if (!isElectron()) window.dispatchEvent(new Event('eip6963:requestProvider')) } - onDeactivation() { } + onDeactivation() {} setDispatch(dispatch: React.Dispatch): void { this.dispatch = dispatch @@ -115,20 +148,15 @@ export class DesktopClient extends ViewPlugin { }) } - updateComponent(state: DesktopClientState) { - return ( - <> - - - ) - } - - render() { - return ( -
- -
- ) + async handleProviderConnect(provider: Provider) { + console.log('handleProviderConnect', provider) + this.state.disableconnect = true + this.renderComponent() + this.blockchain.changeExecutionContext({ context: provider.name, fork: '' }, null, null, () => { + console.log('setFinalContext') + this.state.disableconnect = false + this.renderComponent() + }) } setConnectionState = (state: desktopConnection) => { @@ -139,6 +167,8 @@ export class DesktopClient extends ViewPlugin { async handleNetworkStatus(context: any) { console.log('networkStatus', context) + this.state.currentContext = context + this.renderComponent() this.ws.send(stringifyWithBigInt({ type: 'contextChanged', payload: null })) } @@ -152,9 +182,25 @@ export class DesktopClient extends ViewPlugin { } } + updateComponent(state: DesktopClientState) { + return ( + <> + + + ) + } + + render() { + return ( +
+ +
+ ) + } + async connectToWebSocket() { this.call('menuicons', 'select', 'udapp') - this.call('manager', 'activatePlugin', 'environmentExplorer').then(() => this.call('tabs' as any, 'focus', 'environmentExplorer')) + //this.call('manager', 'activatePlugin', 'environmentExplorer').then(() => this.call('tabs' as any, 'focus', 'environmentExplorer')) console.log('Connecting to server') try { this.ws = new WebSocket(`ws://localhost:${this.params.desktopClientPort}`) @@ -171,7 +217,7 @@ export class DesktopClient extends ViewPlugin { value: 'Connected to the desktop application.', type: 'info', }) - this.blockchain.event.register('networkStatus', this.handleNetworkStatus.bind(this)) + this.blockchain.event.register('contextChanged', this.handleNetworkStatus.bind(this)) } this.ws.onmessage = async (event) => { @@ -186,7 +232,7 @@ export class DesktopClient extends ViewPlugin { title: 'Another tab or window is already connected.', message: 'Another tab or window is already connected to the desktop application. Please close this tab or window.', modalType: ModalTypes.fixed, - okLabel: null + okLabel: null, } this.call('notification', 'modal' as any, modalContent) @@ -209,24 +255,24 @@ export class DesktopClient extends ViewPlugin { let receipt = await this.tryTillReceiptAvailable(parsed.params[0]) console.log('Receipt:', receipt) console.log('Sending receipt back to server', parsed.params[0], receipt) - this.ws.send(stringifyWithBigInt({ - jsonrpc: '2.0', - result: receipt, - id: parsed.id, - })) - }else{ + this.ws.send( + stringifyWithBigInt({ + jsonrpc: '2.0', + result: receipt, + id: parsed.id, + }) + ) + } else { const provider = this.blockchain.web3().currentProvider //console.log('provider', provider) let result = await provider.sendAsync(parsed) if (parsed.method === 'eth_sendTransaction') { - //console.log('Result:', result) + //console.log('Result:', result) console.log('Sending result back to server', result) } this.ws.send(stringifyWithBigInt(result)) } - - /* if (parsed.method === 'eth_sendTransaction' || parsed.method === 'eth_getTransactionReceipt') { console.log('Message from server:', parsed) @@ -282,9 +328,9 @@ export class DesktopClient extends ViewPlugin { //} } - async init() { } + async init() {} - async sendAsync(payload: any) { } + async sendAsync(payload: any) {} async tryTillReceiptAvailable(txhash) { try { @@ -304,14 +350,10 @@ export class DesktopClient extends ViewPlugin { } } - function stringifyWithBigInt(obj) { - - return cbor.encode(obj) + return cbor.encode(obj) console.log('stringifyWithBigInt', obj) - const r = JSON.stringify(obj, (key, value) => - typeof value === 'bigint' ? value.toString() : value - ); + const r = JSON.stringify(obj, (key, value) => (typeof value === 'bigint' ? value.toString() : value)) console.log('stringifyWithBigInt', r) return r } diff --git a/apps/remix-ide/src/app/udapp/run-tab.tsx b/apps/remix-ide/src/app/udapp/run-tab.tsx index 787f931b70e..f1bbe658b43 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.tsx +++ b/apps/remix-ide/src/app/udapp/run-tab.tsx @@ -13,6 +13,48 @@ import { ForkedVMStateProvider } from '../providers/vm-provider' import { Recorder } from '../tabs/runTab/model/recorder' const _paq = (window._paq = window._paq || []) + +export const providerDescriptions = { + 'vm-cancun': 'Deploy to the in-browser virtual machine running the Cancun fork.', + 'vm-shanghai': 'Deploy to the in-browser virtual machine running the Shanghai fork.', + 'vm-paris': 'Deploy to the in-browser virtual machine running the Paris fork.', + 'vm-london': 'Deploy to the in-browser virtual machine running the London fork.', + 'vm-berlin': 'Deploy to the in-browser virtual machine running the Berlin fork.', + 'vm-mainnet-fork': 'Deploy to a fork of the Ethereum mainnet in the in-browser virtual machine.', + 'vm-sepolia-fork': 'Deploy to a fork of the Sepolia testnet in the in-browser virtual machine.', + 'vm-custom-fork': 'Deploy to a fork of a custom network in the in-browser virtual machine.', + 'walletconnect': 'Deploy using WalletConnect.', + 'desktopHost': 'Deploy using web metamask.', + 'basic-http-provider': 'Deploy to a Custom local network.', + 'hardhat-provider': 'Deploy to the local Hardhat dev chain.', + 'ganache-provider': 'Deploy to the local Ganache dev chain.', + 'foundry-provider': 'Deploy to the local Foundry dev chain.', + 'injected-MetaMask': 'Deploy through the Metamask browser extension.', + 'injected-Brave Wallet': 'Deploy through the Brave Wallet extension.', + 'injected-Brave': 'Deploy through the Brave browser extension.', + 'injected-metamask-optimism': 'Deploy to Optimism through the Metamask browser extension.', + 'injected-metamask-gnosis': 'Deploy to Gnosis through the Metamask browser extension.', + 'injected-metamask-arbitrum': 'Deploy to Arbitrum through the Metamask browser extension.', + 'injected-metamask-sepolia': 'Deploy to the Sepolia testnet through the Metamask browser extension.', + 'injected-metamask-ephemery': 'Deploy to the Ephemery testnet through the Metamask browser extension.', + 'injected-metamask-linea': 'Deploy to Linea through the Metamask browser extension.' +} + +export const providerLogos = { + 'injected-metamask-optimism': ['assets/img/optimism-ethereum-op-logo.png', 'assets/img/metamask.png'], + 'injected-metamask-arbitrum': ['assets/img/arbitrum-arb-logo.png', 'assets/img/metamask.png'], + 'injected-metamask-gnosis': ['assets/img/gnosis_chain.png', 'assets/img/metamask.png'], + 'injected-metamask-linea': ['assets/img/linea_chain.png', 'assets/img/metamask.png'], + 'injected-metamask-sepolia': ['assets/img/metamask.png'], + 'injected-metamask-ephemery': ['assets/img/metamask.png'], + 'injected-MetaMask': ['assets/img/metamask.png'], + 'injected-Brave Wallet': ['assets/img/brave.png'], + 'injected-Trust Wallet': ['assets/img/trust-wallet.png'], + 'hardhat-provider': ['assets/img/hardhat.png'], + 'walletconnect': ['assets/img/Walletconnect-logo.png'], + 'foundry-provider': ['assets/img/foundry.png'] +} + const profile = { name: 'udapp', displayName: 'Deploy & run transactions', @@ -35,7 +77,8 @@ const profile = { 'clearAllInstances', 'addInstance', 'resolveContractAndAddInstance', - 'showPluginDetails' + 'showPluginDetails', + 'getProviders', ] } @@ -139,56 +182,16 @@ export class RunTab extends ViewPlugin { async onInitDone() { const udapp = this // eslint-disable-line - const descriptions = { - 'vm-cancun': 'Deploy to the in-browser virtual machine running the Cancun fork.', - 'vm-shanghai': 'Deploy to the in-browser virtual machine running the Shanghai fork.', - 'vm-paris': 'Deploy to the in-browser virtual machine running the Paris fork.', - 'vm-london': 'Deploy to the in-browser virtual machine running the London fork.', - 'vm-berlin': 'Deploy to the in-browser virtual machine running the Berlin fork.', - 'vm-mainnet-fork': 'Deploy to a fork of the Ethereum mainnet in the in-browser virtual machine.', - 'vm-sepolia-fork': 'Deploy to a fork of the Sepolia testnet in the in-browser virtual machine.', - 'vm-custom-fork': 'Deploy to a fork of a custom network in the in-browser virtual machine.', - 'walletconnect': 'Deploy using WalletConnect.', - 'desktopHost': 'Deploy using web metamask.', - 'basic-http-provider': 'Deploy to a Custom local network.', - 'hardhat-provider': 'Deploy to the local Hardhat dev chain.', - 'ganache-provider': 'Deploy to the local Ganache dev chain.', - 'foundry-provider': 'Deploy to the local Foundry dev chain.', - 'injected-MetaMask': 'Deploy through the Metamask browser extension.', - 'injected-Brave Wallet': 'Deploy through the Brave Wallet extension.', - 'injected-Brave': 'Deploy through the Brave browser extension.', - 'injected-metamask-optimism': 'Deploy to Optimism through the Metamask browser extension.', - 'injected-metamask-gnosis': 'Deploy to Gnosis through the Metamask browser extension.', - 'injected-metamask-arbitrum': 'Deploy to Arbitrum through the Metamask browser extension.', - 'injected-metamask-sepolia': 'Deploy to the Sepolia testnet through the Metamask browser extension.', - 'injected-metamask-ephemery': 'Deploy to the Ephemery testnet through the Metamask browser extension.', - 'injected-metamask-linea': 'Deploy to Linea through the Metamask browser extension.' - } - - const logos = { - 'injected-metamask-optimism': ['assets/img/optimism-ethereum-op-logo.png', 'assets/img/metamask.png'], - 'injected-metamask-arbitrum': ['assets/img/arbitrum-arb-logo.png', 'assets/img/metamask.png'], - 'injected-metamask-gnosis': ['assets/img/gnosis_chain.png', 'assets/img/metamask.png'], - 'injected-metamask-linea': ['assets/img/linea_chain.png', 'assets/img/metamask.png'], - 'injected-metamask-sepolia': ['assets/img/metamask.png'], - 'injected-metamask-ephemery': ['assets/img/metamask.png'], - 'injected-MetaMask': ['assets/img/metamask.png'], - 'injected-Brave Wallet': ['assets/img/brave.png'], - 'injected-Trust Wallet': ['assets/img/trust-wallet.png'], - 'hardhat-provider': ['assets/img/hardhat.png'], - 'walletconnect': ['assets/img/Walletconnect-logo.png'], - 'foundry-provider': ['assets/img/foundry.png'] - } - const addProvider = async (position, name, displayName, isInjected, isVM, isForkedState, fork = '', dataId = '', title = '', forkedVM = false) => { + console.log(`Adding provider ${name}`) await this.call('blockchain', 'addProvider', { position, options: {}, dataId, name, displayName, - description: descriptions[name] || displayName, - logos: logos[name], + description: providerDescriptions[name] || displayName, + logos: providerLogos[name], fork, isInjected, isForkedVM: forkedVM, @@ -204,10 +207,20 @@ export class RunTab extends ViewPlugin { }, provider: new Provider(udapp, name) }) + this.emit('providerAdded', { + name, + displayName, + description: providerDescriptions[name] || displayName, + logos: providerLogos[name], + fork, + isInjected, + isVM, + isForkedState, + }) } const addCustomInjectedProvider = async (position, event, name, displayName, networkId, urls, nativeCurrency?) => { - // name = `${name} through ${event.detail.info.name}` + console.log(`${name} through ${event.detail.info.name}`) await this.engine.register([new InjectedCustomProvider(event.detail.provider, name, displayName, networkId, urls, nativeCurrency)]) await addProvider(position, name, displayName + ' - ' + event.detail.info.name, true, false, false) } @@ -266,7 +279,7 @@ export class RunTab extends ViewPlugin { let stateDetail = await this.call('fileManager', 'readFile', stateFilePath) stateDetail = JSON.parse(stateDetail) const providerName = 'vm-fs-' + stateDetail.stateName - descriptions[providerName] = JSON.stringify({ + providerDescriptions[providerName] = JSON.stringify({ name: providerName, latestBlock: stateDetail.latestBlockNumber, timestamp: stateDetail.savingTimestamp @@ -276,7 +289,7 @@ export class RunTab extends ViewPlugin { name: providerName, displayName: stateDetail.stateName, kind: 'provider', - description: descriptions[providerName], + description: providerDescriptions[providerName], methods: ['sendAsync', 'init'], version: packageJson.version }, this.blockchain, stateDetail.forkName) diff --git a/apps/remix-ide/src/blockchain/blockchain.tsx b/apps/remix-ide/src/blockchain/blockchain.tsx index 03d10f2831b..5834e2346f8 100644 --- a/apps/remix-ide/src/blockchain/blockchain.tsx +++ b/apps/remix-ide/src/blockchain/blockchain.tsx @@ -133,10 +133,10 @@ export class Blockchain extends Plugin { if (plugin && plugin.name && (plugin.name.startsWith('injected') || plugin.name === 'walletconnect') || plugin.name === 'desktopHost') { this.registeredPluginEvents.push(plugin.name) this.on(plugin.name, 'chainChanged', () => { - console.log('blockchain chainChanged') + console.log('chainChanged event') this.detectNetwork((error, network) => { this.networkStatus = { network, error } - console.log('blockchain chainChanged', this.networkStatus) + console.log('blockchain detect chainChanged', this.networkStatus) this._triggerEvent('networkStatus', [this.networkStatus]) }) @@ -570,6 +570,7 @@ export class Blockchain extends Plugin { if (context.context === 'item-another-chain') { this.call('manager', 'activatePlugin', 'environmentExplorer').then(() => this.call('tabs', 'focus', 'environmentExplorer')) } else { + console.log('changeExecutionContext', context) return this.executionContext.executionContextChange(context, null, confirmCb, infoCb, cb) } } diff --git a/apps/remix-ide/src/blockchain/execution-context.js b/apps/remix-ide/src/blockchain/execution-context.js index cf82b96ad82..39216ed3728 100644 --- a/apps/remix-ide/src/blockchain/execution-context.js +++ b/apps/remix-ide/src/blockchain/execution-context.js @@ -145,11 +145,13 @@ export class ExecutionContext { if (!cb) cb = () => { /* Do nothing. */ } if (!confirmCb) confirmCb = () => { /* Do nothing. */ } if (!infoCb) infoCb = () => { /* Do nothing. */ } + console.log(this.customNetWorks) if (this.customNetWorks[context]) { var network = this.customNetWorks[context] await network.init() this.currentFork = network.fork this.executionContext = context + console.log(`context set to ${context}`) // injected web3.setProvider(network.provider) await this._updateChainContext() diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index a4a3fd07f69..9d28a873df5 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -1,206 +1,201 @@ -import * as http from 'http'; -import { WebSocketServer, WebSocket } from 'ws'; -import cors from 'cors'; -import EventEmitter from 'events'; -import { RequestArguments } from '../types'; -import path from 'path'; +import * as http from 'http' +import { WebSocketServer, WebSocket } from 'ws' +import cors from 'cors' +import EventEmitter from 'events' +import { RequestArguments } from '../types' +import path from 'path' import express from 'express' import { findAvailablePort } from '../utils/portFinder' -import { isPackaged } from '../main'; -import { isE2ELocal } from '../main'; -import cbor from 'cbor'; +import { isPackaged } from '../main' +import { isE2ELocal } from '../main' +import cbor from 'cbor' // Forwarding WebSocket client -let connectedWebSocket: WebSocket | null = null; +let connectedWebSocket: WebSocket | null = null // Helper function to send JSON responses const sendResponse = (response: http.ServerResponse, data: any, statusCode = 200) => { - response.writeHead(statusCode, { 'Content-Type': 'application/json' }); - response.end(JSON.stringify(data)); -}; + response.writeHead(statusCode, { 'Content-Type': 'application/json' }) + response.end(JSON.stringify(data)) +} // Handle incoming JSON-RPC requests and forward to WebSocket client -export const handleRequest = async ( - jsonRpcPayload: RequestArguments, - eventEmitter: EventEmitter -): Promise => { - if (!connectedWebSocket || connectedWebSocket.readyState !== WebSocket.OPEN) { - throw new Error('No active WebSocket connection to forward request'); - } +export const handleRequest = async (jsonRpcPayload: RequestArguments, eventEmitter: EventEmitter): Promise => { + if (!connectedWebSocket || connectedWebSocket.readyState !== WebSocket.OPEN) { + throw new Error('No active WebSocket connection to forward request') + } - // Send the payload to the WebSocket client and wait for response - return new Promise((resolve, reject) => { - const timeout = setTimeout(() => reject(new Error('Timeout waiting for WebSocket response')), 240000); // 10 seconds timeout - - connectedWebSocket && connectedWebSocket.once('message', async (data: any) => { - - - //if (Buffer.isBuffer(data)) { - // data = data.toString('utf-8'); - //} - - //console.log('received message from WebSocket ONCE client:', data); - - clearTimeout(timeout); - try { - console.log('received message from WebSocket ONCE client:', data); - const response = parseWithBigInt(new Uint8Array(data)); - console.log('received message from WebSocket ONCE client:', response); - if (response.id === jsonRpcPayload.id) { - if (jsonRpcPayload.method === 'eth_sendTransaction' || jsonRpcPayload.method === 'eth_getTransactionReceipt') { - console.log('response from WebSocket client:', response); - eventEmitter.emit('focus') - } - if (response.error) { - const error = { data: response.error }; - if (error.data && error.data.originalError && error.data.originalError.data) { - resolve({ - jsonrpc: '2.0', - error: error.data.originalError, - id: response.id - }) - } else if (error.data && error.data.message) { - resolve({ - jsonrpc: '2.0', - error: error.data && error.data, - id: response.id - }) - } else { - resolve({ - jsonrpc: '2.0', - error, - id: response.id - }) - } - } else { - if (jsonRpcPayload.method === 'eth_sendTransaction' || jsonRpcPayload.method === 'eth_getTransactionReceipt') { - console.log('resolve response from WebSocket client:', jsonRpcPayload.method, response); - // if(jsonRpcPayload.method === 'eth_getTransactionReceipt'){ - // response.result = JSON.parse(response.result) - // } - } - resolve(response.result); - } - } else { - - console.log('ignore response from WebSocket client:', data); - //reject(new Error('Invalid response ID')); - } - } catch (error) { - console.log('REJECT error response from WebSocket client:', error); - reject(error); - } - }); + // Send the payload to the WebSocket client and wait for response + return new Promise((resolve, reject) => { + const timeout = setTimeout(() => reject(new Error('Timeout waiting for WebSocket response')), 240000) // 10 seconds timeout - connectedWebSocket && connectedWebSocket.send(JSON.stringify(jsonRpcPayload), (err) => { - if (jsonRpcPayload.method === 'eth_sendTransaction' || jsonRpcPayload.method === 'eth_getTransactionReceipt') { - console.log('sent message to WebSocket client:', jsonRpcPayload); - } - if (err) { - clearTimeout(timeout); - reject(err); - } - }); - }); -}; + connectedWebSocket && + connectedWebSocket.once('message', async (data: any) => { + //if (Buffer.isBuffer(data)) { + // data = data.toString('utf-8'); + //} -export const startHostServer = async (eventEmitter: EventEmitter) => { + //console.log('received message from WebSocket ONCE client:', data); - let http_port = await findAvailablePort([49589]) - const websocket_port = await findAvailablePort([49588]) - // Create an Express server - const startServer = () => { - const server = express() - - // Serve static files from the 'remix-ide' directory - const remixPath = path.join(__dirname, 'remix-ide'); - server.use(express.static(remixPath)); - - console.log('remixPath', remixPath) - - // Serve 'index.html' at the root route - server.get('/', (req, res) => { - res.sendFile(path.join(remixPath, 'index.html')); - }); - - // Start the server - const httpServer = http.createServer(server); - httpServer.listen(http_port, () => { - const address = httpServer.address(); - if (typeof address === 'string') { - console.log(`Server started at ${address}`); - } else if (address && address.port) { - console.log(`Server started at http://localhost:${address.port}`); + clearTimeout(timeout) + try { + //console.log('received message from WebSocket ONCE client:', data) + const response = parseWithBigInt(new Uint8Array(data)) + //console.log('received message from WebSocket ONCE client:', response) + if (response.id === jsonRpcPayload.id) { + if (jsonRpcPayload.method === 'eth_sendTransaction' || jsonRpcPayload.method === 'eth_getTransactionReceipt') { + console.log('response from WebSocket client:', response) + eventEmitter.emit('focus') + } + if (response.error) { + const error = { data: response.error } + if (error.data && error.data.originalError && error.data.originalError.data) { + resolve({ + jsonrpc: '2.0', + error: error.data.originalError, + id: response.id, + }) + } else if (error.data && error.data.message) { + resolve({ + jsonrpc: '2.0', + error: error.data && error.data, + id: response.id, + }) + } else { + resolve({ + jsonrpc: '2.0', + error, + id: response.id, + }) + } } else { - + if (jsonRpcPayload.method === 'eth_sendTransaction' || jsonRpcPayload.method === 'eth_getTransactionReceipt') { + //console.log('resolve response from WebSocket client:', jsonRpcPayload.method, response) + // if(jsonRpcPayload.method === 'eth_getTransactionReceipt'){ + // response.result = JSON.parse(response.result) + // } + } + resolve(response.result) } - }); - - return httpServer; - }; - // Create the WebSocket server - const wsServer = new WebSocketServer({ port: websocket_port }); - - wsServer.on('connection', (ws) => { - console.log('WebSocket client connected'); - if (connectedWebSocket?.OPEN) { - ws.send(JSON.stringify({ type: 'error', payload: 'ALREADY_CONNECTED' })); - ws.close(1000, 'Another client connected'); - return - //console.log(connectedWebSocket.url) - //connectedWebSocket.removeAllListeners() - //connectedWebSocket.close() + } else { + //console.log('ignore response from WebSocket client:', data) + //reject(new Error('Invalid response ID')); + } + } catch (error) { + //console.log('REJECT error response from WebSocket client:', error) + reject(error) } + }) - connectedWebSocket = ws; - eventEmitter.emit('connected', true); - - + connectedWebSocket && + connectedWebSocket.send(JSON.stringify(jsonRpcPayload), (err) => { + if (jsonRpcPayload.method === 'eth_sendTransaction' || jsonRpcPayload.method === 'eth_getTransactionReceipt') { + console.log('sent message to WebSocket client:', jsonRpcPayload) + } + if (err) { + clearTimeout(timeout) + reject(err) + } + }) + }) +} - connectedWebSocket.on('message', (data: any) => { - //if (Buffer.isBuffer(data)) { - // data = data.toString('utf-8'); - // } - const response = parseWithBigInt(new Uint8Array(data)); - if (response && response.type) { - console.log('received message from WebSocket client:', response); - eventEmitter.emit(response.type, response.payload); - } - }) - - connectedWebSocket.on('close', () => { - //console.log('WebSocket client disconnected'); - connectedWebSocket = null; - eventEmitter.emit('connected', false); - }); - - connectedWebSocket.on('error', (error) => { - //console.error('WebSocket error:', error.message); - connectedWebSocket = null; - eventEmitter.emit('connected', false); - }); - }); - - - console.log(`WebSocket server running on ws://localhost:` + JSON.stringify((wsServer.address() as any).port)); - if((process.env.NODE_ENV === 'production' || isPackaged) && !isE2ELocal){ - startServer() - }else{ - http_port = 8080 +export const startHostServer = async (eventEmitter: EventEmitter) => { + let http_port = await findAvailablePort([49589]) + const websocket_port = await findAvailablePort([49588]) + // Create an Express server + const startServer = () => { + const server = express() + + // Serve static files from the 'remix-ide' directory + const remixPath = path.join(__dirname, 'remix-ide') + server.use(express.static(remixPath)) + + console.log('remixPath', remixPath) + + // Serve 'index.html' at the root route + server.get('/', (req, res) => { + res.sendFile(path.join(remixPath, 'index.html')) + }) + + // Start the server + const httpServer = http.createServer(server) + httpServer.listen(http_port, () => { + const address = httpServer.address() + if (typeof address === 'string') { + console.log(`Server started at ${address}`) + } else if (address && address.port) { + console.log(`Server started at http://localhost:${address.port}`) + } else { + } + }) + + return httpServer + } + // Create the WebSocket server + const wsServer = new WebSocketServer({ port: websocket_port }) + + wsServer.on('connection', (ws) => { + console.log('WebSocket client connected') + if (connectedWebSocket?.OPEN) { + ws.send(JSON.stringify({ type: 'error', payload: 'ALREADY_CONNECTED' })) + ws.close(1000, 'Another client connected') + return + //console.log(connectedWebSocket.url) + } else { + try { + connectedWebSocket.removeAllListeners() + } catch (e) {} } - return { - http_port, - websocket_port - } -} + connectedWebSocket = ws + eventEmitter.emit('connected', true) + + connectedWebSocket.on('message', (data: any) => { + //if (Buffer.isBuffer(data)) { + // data = data.toString('utf-8'); + // } + const response = parseWithBigInt(new Uint8Array(data)) + if (response && response.type) { + //console.log('received message from WebSocket client:', response) + eventEmitter.emit(response.type, response.payload) + } + }) + + connectedWebSocket.on('close', () => { + //console.log('WebSocket client disconnected'); + connectedWebSocket = null + eventEmitter.emit('connected', false) + }) + + connectedWebSocket.on('error', (error) => { + //console.error('WebSocket error:', error.message); + connectedWebSocket = null + eventEmitter.emit('connected', false) + }) + }) + + console.log(`WebSocket server running on ws://localhost:` + JSON.stringify((wsServer.address() as any).port)) + if ((process.env.NODE_ENV === 'production' || isPackaged) && !isE2ELocal) { + startServer() + } else { + http_port = 8080 + } + return { + http_port, + websocket_port, + } +} function parseWithBigInt(json) { + //console.log('parseWithBigInt', json) + try { return cbor.decode(json) - console.log('parseWithBigInt', json) - return JSON.parse(json, (key, value) => - typeof value === 'string' && /^\d+n?$/.test(value) ? BigInt(value) : value - ); + } catch (e) { + console.log('parseWithBigInt error', e) + return {} } - + console.log('parseWithBigInt', json) + return JSON.parse(json, (key, value) => (typeof value === 'string' && /^\d+n?$/.test(value) ? BigInt(value) : value)) +} diff --git a/libs/remix-ui/run-tab/src/lib/actions/account.ts b/libs/remix-ui/run-tab/src/lib/actions/account.ts index 909e02b4abc..c58dafae399 100644 --- a/libs/remix-ui/run-tab/src/lib/actions/account.ts +++ b/libs/remix-ui/run-tab/src/lib/actions/account.ts @@ -59,6 +59,7 @@ const _getProviderDropdownValue = (plugin: RunTab): string => { } export const setExecutionContext = (plugin: RunTab, dispatch: React.Dispatch, executionContext: { context: string, fork: string }) => { + console.log('setExecutionContext', executionContext) plugin.blockchain.changeExecutionContext(executionContext, null, (alertMsg) => { plugin.call('notification', 'toast', alertMsg) }, () => { setFinalContext(plugin, dispatch) }) diff --git a/libs/remix-ui/statusbar/src/index.ts b/libs/remix-ui/statusbar/src/index.ts index 9c8a70edde5..b8b0cc661e7 100644 --- a/libs/remix-ui/statusbar/src/index.ts +++ b/libs/remix-ui/statusbar/src/index.ts @@ -1,2 +1,3 @@ export * from './lib/remixui-statusbar-panel' +export { DesktopStatus } from './lib/components/desktopStatus' export { StatusBarInterface } from './lib/types' diff --git a/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx b/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx index c69ba6cc935..5545da066a9 100644 --- a/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx +++ b/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx @@ -6,17 +6,9 @@ import { CustomTooltip } from '@remix-ui/helper' import { AppContext } from '@remix-ui/app' import { desktopConnextionType } from '@remix-api' -export interface DesktopStatusProps { - plugin: StatusBar -} - -export default function DesktopStatus({ plugin }: DesktopStatusProps) { +export const DesktopStatus= () => { const appContext = useContext(AppContext) - useEffect(() => { - //console.log('DesktopStatus', appContext.appState) - }, [appContext.appState]) - return (
-
) +
) } return ( From 5dc62dd4800f39b84e5bc577f7f6630ffc65b74e Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 8 Jan 2025 12:28:26 +0100 Subject: [PATCH 26/58] hide panel --- apps/remix-ide/src/app/panels/layout.ts | 6 +- .../src/app/plugins/desktop-client.tsx | 94 +++++++++++-------- apps/remixdesktop/src/main.ts | 2 +- .../src/lib/remix-ui-vertical-icons-panel.tsx | 2 +- 4 files changed, 61 insertions(+), 43 deletions(-) diff --git a/apps/remix-ide/src/app/panels/layout.ts b/apps/remix-ide/src/app/panels/layout.ts index 539a9b1c486..846be03fa26 100644 --- a/apps/remix-ide/src/app/panels/layout.ts +++ b/apps/remix-ide/src/app/panels/layout.ts @@ -6,7 +6,7 @@ import { QueryParams } from '@remix-project/remix-lib' const profile: Profile = { name: 'layout', description: 'layout', - methods: ['minimize', 'maximiseSidePanel', 'resetSidePanel', 'maximizeTerminal', 'maximisePinnedPanel', 'resetPinnedPanel'] + methods: ['minimize', 'minimizeSidePanel', 'maximiseSidePanel', 'resetSidePanel', 'maximizeTerminal', 'maximisePinnedPanel', 'resetPinnedPanel'] } interface panelState { @@ -141,6 +141,10 @@ export class Layout extends Plugin { this.emit('change', this.panels) } + async minimizeSidePanel () { + this.event.emit('minimizesidepanel') + } + async maximiseSidePanel () { const current = await this.call('sidePanel', 'currentFocus') this.maximized[current] = true diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index c102745536f..8a049f3255e 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -36,10 +36,10 @@ interface DesktopClientState { connected: desktopConnection providers: Provider[] disableconnect: boolean, - currentContext: string + currentContext: string, } -const DesktopClientUI = (props: DesktopClientState & { onConnect: (providerName: Provider) => void }) => { +const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => {}} & { onConnect: (providerName: Provider) => void }) => { const appContext = useContext(AppContext) const { connected, providers, onConnect, disableconnect, currentContext } = props @@ -59,28 +59,58 @@ const DesktopClientUI = (props: DesktopClientState & { onConnect: (providerName:

MetaMask for Desktop

+ {connected === desktopConnextionType.connected && ( +
+ +
+ )}
- +
- {providers && - providers.length > 0 && + {providers && providers.length > 0 ? ( providers .filter((provider) => provider.isInjected) .map((provider, index) => ( -
-
-
-
{providerLogos[provider.name] && providerLogos[provider.name].map((logo, index) => )}
-
{provider.displayName}
-

{provider.description}

- -
+
+
+
+
+ {providerLogos[provider.name] && + providerLogos[provider.name].map((logo, index) => ( + + ))}
+
{provider.displayName}
+

{provider.description}

+ +
- ))} +
+ )) + ) : ( +
+
+ No injected providers found. Please install MetaMask or another browser wallet. +
+
+ )}
@@ -128,6 +158,7 @@ export class DesktopClient extends ViewPlugin { this.on('udapp', 'providerAdded', updateProviders) window.addEventListener('eip6963:announceProvider', (event: CustomEvent) => updateProviders()) if (!isElectron()) window.dispatchEvent(new Event('eip6963:requestProvider')) + this.call('layout', 'minimizeSidePanel') } onDeactivation() {} @@ -182,10 +213,15 @@ export class DesktopClient extends ViewPlugin { } } + async openDesktopApp() { + console.log('openDesktopApp') + this.ws.send(stringifyWithBigInt({ type: 'focus', payload: null })) + } + updateComponent(state: DesktopClientState) { return ( <> - + ) } @@ -199,7 +235,7 @@ export class DesktopClient extends ViewPlugin { } async connectToWebSocket() { - this.call('menuicons', 'select', 'udapp') + //this.call('menuicons', 'select', 'udapp') //this.call('manager', 'activatePlugin', 'environmentExplorer').then(() => this.call('tabs' as any, 'focus', 'environmentExplorer')) console.log('Connecting to server') try { @@ -290,28 +326,6 @@ export class DesktopClient extends ViewPlugin { console.log('Disconnected from server') this.blockchain.event.unregister('networkStatus', this.handleNetworkStatus.bind(this), null) this.ws = null - /* - const modalContent: AppModal = { - id: this.profile.name, - title: this.profile.displayName, - message: 'Connection to the desktop client has been lost. Please restart the desktop client.', - modalType: ModalTypes.confirm, - okLabel: 'Reconnect now', - cancelLabel: 'Cancel', - - okFn: () => { - this.connectToWebSocket() - }, - cancelFn: () => { - - }, - hideFn: () => { - - }, - } - - this.call('notification', 'modal' as any, modalContent) - */ this.emit('connected', false) if (this.state.connected !== desktopConnextionType.alreadyConnected) { diff --git a/apps/remixdesktop/src/main.ts b/apps/remixdesktop/src/main.ts index 2e60fcbe705..5b2376f2f05 100644 --- a/apps/remixdesktop/src/main.ts +++ b/apps/remixdesktop/src/main.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, dialog, Menu, MenuItem, shell, utilityProcess, screen, ipcMain } from 'electron'; +import { app, BrowserWindow, dialog, Menu, MenuItem, shell, utilityProcess, screen, ipcMain, protocol } from 'electron'; import path from 'path'; diff --git a/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx b/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx index b6bf6c28f74..50d56a7cbc1 100644 --- a/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx +++ b/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx @@ -84,7 +84,7 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic > p.profile.name==='udapp' || (appContext.appState.connectedToDesktop === desktopConnextionType.disabled && p.isRequired && p.profile.name !== 'pluginManager'))} + icons={icons.filter((p) => (appContext.appState.connectedToDesktop === desktopConnextionType.disabled && p.isRequired && p.profile.name !== 'pluginManager'))} verticalIconsPlugin={verticalIconsPlugin} itemContextAction={itemContextAction} /> From f061075c53e7d49b31d02c0ec50fe86c1858f102 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 9 Jan 2025 09:35:06 +0100 Subject: [PATCH 27/58] trace events --- .../src/app/plugins/DesktopClientUI.tsx | 90 +++++ .../src/app/plugins/desktop-client.tsx | 364 +++++++----------- apps/remix-ide/src/blockchain/blockchain.tsx | 19 +- apps/remixdesktop/src/lib/server.ts | 1 + apps/remixdesktop/src/plugins/desktopHost.ts | 2 +- .../run-tab/src/lib/actions/events.ts | 6 +- 6 files changed, 239 insertions(+), 243 deletions(-) create mode 100644 apps/remix-ide/src/app/plugins/DesktopClientUI.tsx diff --git a/apps/remix-ide/src/app/plugins/DesktopClientUI.tsx b/apps/remix-ide/src/app/plugins/DesktopClientUI.tsx new file mode 100644 index 00000000000..ee9afa6d2ba --- /dev/null +++ b/apps/remix-ide/src/app/plugins/DesktopClientUI.tsx @@ -0,0 +1,90 @@ +import React, { useContext, useEffect } from 'react'; +import { AppContext, appActionTypes } from '@remix-ui/app'; +import { Provider } from '../../blockchain/blockchain'; +import { providerLogos } from '../udapp/run-tab'; +import { desktopConnection } from '@remix-api'; + +interface DesktopClientState { + connected: desktopConnection; + providers: Provider[]; + disableconnect: boolean; + currentContext: string; +} + +const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => {} } & { onConnect: (providerName: Provider) => void }) => { + const appContext = useContext(AppContext); + const { connected, providers, onConnect, disableconnect, currentContext } = props; + + useEffect(() => { + console.log('connected', props.connected); + appContext.appStateDispatch({ + type: appActionTypes.setConnectedToDesktop, + payload: props.connected, + }); + appContext.appStateDispatch({ + type: appActionTypes.setShowPopupPanel, + payload: false, + }); + }, [props.connected]); + + return ( +
+
+

MetaMask for Desktop

+

+ 1. Connect to your favorite Ethereum wallet provider +

2. Go back to the Remix Desktop application +

3. Deploy using 'MetaMask for Desktop' +

+
+ +
+
+ {providers && providers.length > 0 ? ( + providers + .filter((provider) => provider.isInjected) + .map((provider, index) => ( +
+
+
+
+ {providerLogos[provider.name] && + providerLogos[provider.name].map((logo, index) => ( + + ))} +
+
{provider.displayName}
+

{provider.description}

+ +
+
+
+ )) + ) : ( +
+
+ No injected providers found. Please install MetaMask or another browser wallet. +
+
+ )} +
+
+
+ ); +}; + +export default DesktopClientUI; \ No newline at end of file diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index 8a049f3255e..c09b89759b2 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -1,26 +1,16 @@ /* eslint-disable prefer-const */ -import React, { useContext, useEffect } from 'react' -import { Plugin } from '@remixproject/engine' -import { CustomRemixApi, desktopConnection, desktopConnextionType } from '@remix-api' -import { Blockchain, Provider } from '../../blockchain/blockchain' -import { AppAction, appActionTypes, AppContext, AppModal, ModalTypes } from '@remix-ui/app' -import { ViewPlugin } from '@remixproject/engine-web' -import { PluginViewWrapper } from '@remix-ui/helper' -import { QueryParams } from '@remix-project/remix-lib' -import cbor from 'cbor' -import isElectron from 'is-electron' -import { providerLogos } from '../udapp/run-tab' -import { DesktopStatus } from '@remix-ui/statusbar' - -const _paq = (window._paq = window._paq || []) - -/* TODO: Metamask -- open metamask by default -- handle canceled transactions -- send network updates : contextChanged -- send account updates -- socket disconnect -*/ +import React from 'react'; +import { desktopConnection, desktopConnextionType } from '@remix-api'; +import { Blockchain, Provider } from '../../blockchain/blockchain'; +import { AppAction, AppModal, ModalTypes } from '@remix-ui/app'; +import { ViewPlugin } from '@remixproject/engine-web'; +import { PluginViewWrapper } from '@remix-ui/helper'; +import { QueryParams } from '@remix-project/remix-lib'; +import cbor from 'cbor'; +import isElectron from 'is-electron'; +import DesktopClientUI from './DesktopClientUI'; // Import the UI component + +const _paq = (window._paq = window._paq || []); const profile = { name: 'desktopClient', @@ -30,200 +20,135 @@ const profile = { events: ['connected'], maintainedBy: 'Remix', location: 'mainPanel', -} +}; interface DesktopClientState { - connected: desktopConnection - providers: Provider[] - disableconnect: boolean, - currentContext: string, -} - -const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => {}} & { onConnect: (providerName: Provider) => void }) => { - const appContext = useContext(AppContext) - const { connected, providers, onConnect, disableconnect, currentContext } = props - - useEffect(() => { - console.log('connected', props.connected) - appContext.appStateDispatch({ - type: appActionTypes.setConnectedToDesktop, - payload: props.connected, - }) - appContext.appStateDispatch({ - type: appActionTypes.setShowPopupPanel, - payload: false, - }) - }, [props.connected]) - - return ( -
-
-

MetaMask for Desktop

- {connected === desktopConnextionType.connected && ( -
- -
- )} -
- -
-
- {providers && providers.length > 0 ? ( - providers - .filter((provider) => provider.isInjected) - .map((provider, index) => ( -
-
-
-
- {providerLogos[provider.name] && - providerLogos[provider.name].map((logo, index) => ( - - ))} -
-
{provider.displayName}
-

{provider.description}

- -
-
-
- )) - ) : ( -
-
- No injected providers found. Please install MetaMask or another browser wallet. -
-
- )} -
-
-
- ) + connected: desktopConnection; + providers: Provider[]; + disableconnect: boolean; + currentContext: string; } export class DesktopClient extends ViewPlugin { - blockchain: Blockchain - ws: WebSocket - dispatch: React.Dispatch = () => {} - state: DesktopClientState - appStateDispatch: React.Dispatch - queryParams: QueryParams - params: any + blockchain: Blockchain; + ws: WebSocket; + dispatch: React.Dispatch = () => {}; + state: DesktopClientState; + appStateDispatch: React.Dispatch; + queryParams: QueryParams; + params: any; constructor(blockchain: Blockchain) { - super(profile) - this.blockchain = blockchain + super(profile); + this.blockchain = blockchain; this.state = { connected: desktopConnextionType.disconnected, providers: [], disableconnect: false, currentContext: '', - } - this.queryParams = new QueryParams() + }; + this.queryParams = new QueryParams(); - this.params = this.queryParams.get() - console.log('DesktopClient params', this.params) + this.params = this.queryParams.get(); + console.log('DesktopClient params', this.params); } onActivation() { - console.log('DesktopClient activated') - _paq.push(['trackEvent', 'plugin', 'activated', 'DesktopClient']) + console.log('DesktopClient activated'); + _paq.push(['trackEvent', 'plugin', 'activated', 'DesktopClient']); - this.connectToWebSocket() + this.connectToWebSocket(); const updateProviders = async () => { - const providersObj: { [key: string]: Provider } = await this.call('blockchain', 'getAllProviders') - const providers: Provider[] = Object.values(providersObj) - this.state.providers = providers - this.renderComponent() - console.log('providers', providers) - } + const providersObj: { [key: string]: Provider } = await this.call('blockchain', 'getAllProviders'); + const providers: Provider[] = Object.values(providersObj); + this.state.providers = providers; + this.renderComponent(); + console.log('providers', providers); + }; + + this.on('udapp', 'providerAdded', updateProviders); + window.addEventListener('eip6963:announceProvider', (event: CustomEvent) => updateProviders()); + if (!isElectron()) window.dispatchEvent(new Event('eip6963:requestProvider')); + this.call('layout', 'minimizeSidePanel'); + this.blockchain.event.register('networkStatus', this.handleNetworkStatus.bind(this)); + this.blockchain.event.register('contextChanged', this.handleContextChanged.bind(this)); + } - this.on('udapp', 'providerAdded', updateProviders) - window.addEventListener('eip6963:announceProvider', (event: CustomEvent) => updateProviders()) - if (!isElectron()) window.dispatchEvent(new Event('eip6963:requestProvider')) - this.call('layout', 'minimizeSidePanel') + handleContextChanged(context: any) { + console.log('contextChanged handled', context); } onDeactivation() {} setDispatch(dispatch: React.Dispatch): void { - this.dispatch = dispatch - this.renderComponent() + this.dispatch = dispatch; + this.renderComponent(); } setAppStateDispatch(appStateDispatch: React.Dispatch) { - console.log('setAppStateDispatch', appStateDispatch) - this.appStateDispatch = appStateDispatch + console.log('setAppStateDispatch', appStateDispatch); + this.appStateDispatch = appStateDispatch; } renderComponent() { this.dispatch({ ...this.state, - }) + }); } async handleProviderConnect(provider: Provider) { - console.log('handleProviderConnect', provider) - this.state.disableconnect = true - this.renderComponent() + console.log('handleProviderConnect', provider); + this.state.disableconnect = true; + this.renderComponent(); this.blockchain.changeExecutionContext({ context: provider.name, fork: '' }, null, null, () => { - console.log('setFinalContext') - this.state.disableconnect = false - this.renderComponent() - }) + console.log('setFinalContext'); + this.state.disableconnect = false; + this.renderComponent(); + }); } setConnectionState = (state: desktopConnection) => { - this.state.connected = state + this.state.connected = state; - this.renderComponent() - } + this.renderComponent(); + }; async handleNetworkStatus(context: any) { - console.log('networkStatus', context) - this.state.currentContext = context - this.renderComponent() - this.ws.send(stringifyWithBigInt({ type: 'contextChanged', payload: null })) + console.log('networkStatus handled', context); + this.state.currentContext = this.blockchain.executionContext.executionContext; + this.renderComponent(); + //this.ws.send(stringifyWithBigInt({ type: 'contextChanged', payload: null })); } async checkConnection() { - console.log('Checking connection', this.ws) + console.log('Checking connection', this.ws); if (this.ws && this.ws.readyState === this.ws.OPEN) { - console.log('OK Connected to server') + console.log('OK Connected to server'); } else { - console.log('NOT Connected to server') - this.connectToWebSocket() + console.log('NOT Connected to server'); + this.connectToWebSocket(); } } async openDesktopApp() { - console.log('openDesktopApp') - this.ws.send(stringifyWithBigInt({ type: 'focus', payload: null })) + console.log('openDesktopApp'); + this.ws.send(stringifyWithBigInt({ type: 'focus', payload: null })); } updateComponent(state: DesktopClientState) { return ( <> - + - ) + ); } render() { @@ -231,115 +156,93 @@ export class DesktopClient extends ViewPlugin {
- ) + ); } async connectToWebSocket() { - //this.call('menuicons', 'select', 'udapp') - //this.call('manager', 'activatePlugin', 'environmentExplorer').then(() => this.call('tabs' as any, 'focus', 'environmentExplorer')) - console.log('Connecting to server') + console.log('Connecting to server'); try { - this.ws = new WebSocket(`ws://localhost:${this.params.desktopClientPort}`) - this.ws.binaryType = 'arraybuffer' + this.ws = new WebSocket(`ws://localhost:${this.params.desktopClientPort}`); + this.ws.binaryType = 'arraybuffer'; } catch (e) { - console.error('CATCH WebSocket error:', e) - return + console.error('CATCH WebSocket error:', e); + return; } this.ws.onopen = () => { - console.log('Connected to server') - this.emit('connected', true) - this.setConnectionState(desktopConnextionType.connected) + console.log('Connected to server'); + this.emit('connected', true); + this.setConnectionState(desktopConnextionType.connected); this.call('terminal', 'log', { value: 'Connected to the desktop application.', type: 'info', - }) - this.blockchain.event.register('contextChanged', this.handleNetworkStatus.bind(this)) - } + }); + //this.blockchain.event.register('contextChanged', this.handleNetworkStatus.bind(this)); + }; this.ws.onmessage = async (event) => { - const parsed = JSON.parse(event.data) - console.log('Message from server:', parsed.method) + const parsed = JSON.parse(event.data); + console.log('Message from server:', parsed.method); if (parsed && parsed.type === 'error') { if (parsed.payload === 'ALREADY_CONNECTED') { - console.log('ALREADY_CONNECTED') - this.setConnectionState(desktopConnextionType.alreadyConnected) + console.log('ALREADY_CONNECTED'); + this.setConnectionState(desktopConnextionType.alreadyConnected); const modalContent: AppModal = { id: this.profile.name, title: 'Another tab or window is already connected.', message: 'Another tab or window is already connected to the desktop application. Please close this tab or window.', modalType: ModalTypes.fixed, okLabel: null, - } + }; - this.call('notification', 'modal' as any, modalContent) - return + this.call('notification', 'modal' as any, modalContent); + return; } } if (parsed.method === 'eth_sendTransaction' || parsed.method === 'eth_getTransactionReceipt') { this.call('terminal', 'log', { value: 'Transaction from desktop client: ' + event.data, type: 'info', - }) + }); } if (parsed.method === 'eth_sendTransaction' || parsed.method === 'eth_getTransactionReceipt') { - console.log('Sending message to web3:', parsed) + console.log('Sending message to web3:', parsed); } - let receipt - //const result = await this.call('web3Provider', 'sendAsync', parsed) + let receipt; if (parsed.method === 'eth_getTransactionReceipt') { - let receipt = await this.tryTillReceiptAvailable(parsed.params[0]) - console.log('Receipt:', receipt) - console.log('Sending receipt back to server', parsed.params[0], receipt) + let receipt = await this.tryTillReceiptAvailable(parsed.params[0]); + console.log('Receipt:', receipt); + console.log('Sending receipt back to server', parsed.params[0], receipt); this.ws.send( stringifyWithBigInt({ jsonrpc: '2.0', result: receipt, id: parsed.id, }) - ) + ); } else { - const provider = this.blockchain.web3().currentProvider - //console.log('provider', provider) - let result = await provider.sendAsync(parsed) + const provider = this.blockchain.web3().currentProvider; + let result = await provider.sendAsync(parsed); if (parsed.method === 'eth_sendTransaction') { - //console.log('Result:', result) - console.log('Sending result back to server', result) + console.log('Sending result back to server', result); } - this.ws.send(stringifyWithBigInt(result)) + this.ws.send(stringifyWithBigInt(result)); } - - /* - if (parsed.method === 'eth_sendTransaction' || parsed.method === 'eth_getTransactionReceipt') { - console.log('Message from server:', parsed) - console.log('Result:', result) - this.call('terminal', 'log', { - value: 'Result: ' + JSON.stringify(result), - type: 'info', - }) - } - return result - */ - } + }; this.ws.onclose = () => { - console.log('Disconnected from server') - this.blockchain.event.unregister('networkStatus', this.handleNetworkStatus.bind(this), null) - this.ws = null + console.log('Disconnected from server'); + this.ws = null; - this.emit('connected', false) + this.emit('connected', false); if (this.state.connected !== desktopConnextionType.alreadyConnected) { - this.setConnectionState(desktopConnextionType.disconnected) + this.setConnectionState(desktopConnextionType.disconnected); setTimeout(() => { - this.connectToWebSocket() - }, 5000) + this.connectToWebSocket(); + }, 5000); } - } - - //this.ws.onerror = (error) => { - // console.error('WebSocket error:', error) - //} + }; } async init() {} @@ -348,26 +251,25 @@ export class DesktopClient extends ViewPlugin { async tryTillReceiptAvailable(txhash) { try { - //console.log('tryTillReceiptAvailable', txhash) - const receipt = await this.call('blockchain', 'getTransactionReceipt', txhash) - if (receipt) return receipt + const receipt = await this.call('blockchain', 'getTransactionReceipt', txhash); + if (receipt) return receipt; } catch (e) { // do nothing } - await this.pause() - return await this.tryTillReceiptAvailable(txhash) + await this.pause(); + return await this.tryTillReceiptAvailable(txhash); } async pause() { return new Promise((resolve, reject) => { - setTimeout(resolve, 500) - }) + setTimeout(resolve, 500); + }); } } function stringifyWithBigInt(obj) { - return cbor.encode(obj) - console.log('stringifyWithBigInt', obj) - const r = JSON.stringify(obj, (key, value) => (typeof value === 'bigint' ? value.toString() : value)) - console.log('stringifyWithBigInt', r) - return r -} + return cbor.encode(obj); + console.log('stringifyWithBigInt', obj); + const r = JSON.stringify(obj, (key, value) => (typeof value === 'bigint' ? value.toString() : value)); + console.log('stringifyWithBigInt', r); + return r; +} \ No newline at end of file diff --git a/apps/remix-ide/src/blockchain/blockchain.tsx b/apps/remix-ide/src/blockchain/blockchain.tsx index 5834e2346f8..1f62be0db40 100644 --- a/apps/remix-ide/src/blockchain/blockchain.tsx +++ b/apps/remix-ide/src/blockchain/blockchain.tsx @@ -130,16 +130,17 @@ export class Blockchain extends Plugin { onActivation() { this.active = true this.on('manager', 'pluginActivated', (plugin) => { - if (plugin && plugin.name && (plugin.name.startsWith('injected') || plugin.name === 'walletconnect') || plugin.name === 'desktopHost') { + if ((plugin && plugin.name && (plugin.name.startsWith('injected') || plugin.name === 'walletconnect')) || plugin.name === 'desktopHost') { this.registeredPluginEvents.push(plugin.name) this.on(plugin.name, 'chainChanged', () => { - console.log('chainChanged event') - this.detectNetwork((error, network) => { - this.networkStatus = { network, error } - console.log('blockchain detect chainChanged', this.networkStatus) - this._triggerEvent('networkStatus', [this.networkStatus]) - - }) + console.log('chainChanged event', plugin.name, this.executionContext.executionContext) + if (plugin.name === this.executionContext.executionContext) { + this.detectNetwork((error, network) => { + this.networkStatus = { network, error } + console.log('trigger networkStatus', this.networkStatus) + this._triggerEvent('networkStatus', [this.networkStatus]) + }) + } }) } }) @@ -196,6 +197,7 @@ export class Blockchain extends Plugin { this._triggerEvent('contextChanged', [context]) this.detectNetwork((error, network) => { this.networkStatus = { network, error } + console.log('trigger networkStatus 2', this.networkStatus) this._triggerEvent('networkStatus', [this.networkStatus]) }) }) @@ -211,6 +213,7 @@ export class Blockchain extends Plugin { setInterval(() => { this.detectNetwork((error, network) => { this.networkStatus = { network, error } + console.log('trigger networkStatus 3', this.networkStatus) this._triggerEvent('networkStatus', [this.networkStatus]) }) }, 30000) diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index 9d28a873df5..11654635774 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -193,6 +193,7 @@ function parseWithBigInt(json) { try { return cbor.decode(json) } catch (e) { + console.log('parseWithBigInt error', e, json) console.log('parseWithBigInt error', e) return {} } diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 3dd3137412c..0d61bf55c24 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -41,7 +41,7 @@ export class DesktopHostPlugin extends ElectronBasePlugin { eventEmitter.on('contextChanged', (context) => { console.log('contextChanged', context) for (const client of this.clients) { - client.emit('chainChanged', context) + //client.emit('chainChanged', context) } }) } diff --git a/libs/remix-ui/run-tab/src/lib/actions/events.ts b/libs/remix-ui/run-tab/src/lib/actions/events.ts index 76df6a15220..e766f05dd47 100644 --- a/libs/remix-ui/run-tab/src/lib/actions/events.ts +++ b/libs/remix-ui/run-tab/src/lib/actions/events.ts @@ -100,9 +100,9 @@ export const setupEvents = (plugin: RunTab) => { plugin.on('truffle', 'compilationFinished', (file, source, languageVersion, data) => broadcastCompilationResult('truffle', plugin, dispatch, file, source, languageVersion, data)) plugin.on('desktopHost', 'chainChanged', (context) => { - console.log('desktopHost chainChanged', context) - fillAccountsList(plugin, dispatch) - updateInstanceBalance(plugin, dispatch) + //console.log('desktopHost chainChanged', context) + //fillAccountsList(plugin, dispatch) + //updateInstanceBalance(plugin, dispatch) }) plugin.on('udapp', 'setEnvironmentModeReducer', (env: { context: string, fork: string }, from: string) => { From b059e843380034016f531c9195914f2b379f2f08 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 9 Jan 2025 10:12:19 +0100 Subject: [PATCH 28/58] debounce events --- .../src/app/plugins/desktop-client.tsx | 18 +++++++++++++++++- apps/remixdesktop/src/plugins/desktopHost.ts | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index c09b89759b2..a20c3dd4b9f 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -118,9 +118,17 @@ export class DesktopClient extends ViewPlugin { console.log('networkStatus handled', context); this.state.currentContext = this.blockchain.executionContext.executionContext; this.renderComponent(); - //this.ws.send(stringifyWithBigInt({ type: 'contextChanged', payload: null })); + this.debouncedSendContextChanged(); } + // Debounced function to send context changed event + debouncedSendContextChanged = debounce(() => { + if (this.ws && this.ws.readyState === WebSocket.OPEN) { + console.log('Sending context changed event to server'); + this.ws.send(stringifyWithBigInt({ type: 'contextChanged', payload: null })); + } + }, 500); // Adjust the debounce wait time as needed + async checkConnection() { console.log('Checking connection', this.ws); if (this.ws && this.ws.readyState === this.ws.OPEN) { @@ -272,4 +280,12 @@ function stringifyWithBigInt(obj) { const r = JSON.stringify(obj, (key, value) => (typeof value === 'bigint' ? value.toString() : value)); console.log('stringifyWithBigInt', r); return r; +} + +function debounce(func: (...args: any[]) => void, wait: number) { + let timeout: NodeJS.Timeout; + return function (...args: any[]) { + clearTimeout(timeout); + timeout = setTimeout(() => func.apply(this, args), wait); + }; } \ No newline at end of file diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 0d61bf55c24..3dd3137412c 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -41,7 +41,7 @@ export class DesktopHostPlugin extends ElectronBasePlugin { eventEmitter.on('contextChanged', (context) => { console.log('contextChanged', context) for (const client of this.clients) { - //client.emit('chainChanged', context) + client.emit('chainChanged', context) } }) } From 3e2c01a3db3857959b6b43dca22195912fef8e36 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 9 Jan 2025 10:16:35 +0100 Subject: [PATCH 29/58] move UI --- .../src/app/{plugins => components}/DesktopClientUI.tsx | 0 apps/remix-ide/src/app/plugins/desktop-client.tsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename apps/remix-ide/src/app/{plugins => components}/DesktopClientUI.tsx (100%) diff --git a/apps/remix-ide/src/app/plugins/DesktopClientUI.tsx b/apps/remix-ide/src/app/components/DesktopClientUI.tsx similarity index 100% rename from apps/remix-ide/src/app/plugins/DesktopClientUI.tsx rename to apps/remix-ide/src/app/components/DesktopClientUI.tsx diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index a20c3dd4b9f..e4426a84644 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -8,7 +8,7 @@ import { PluginViewWrapper } from '@remix-ui/helper'; import { QueryParams } from '@remix-project/remix-lib'; import cbor from 'cbor'; import isElectron from 'is-electron'; -import DesktopClientUI from './DesktopClientUI'; // Import the UI component +import DesktopClientUI from '../components/DesktopClientUI'; // Import the UI component const _paq = (window._paq = window._paq || []); From 78b649bd4135ce42f6b28cd7e00d5625cd071faa Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 9 Jan 2025 10:24:36 +0100 Subject: [PATCH 30/58] brave title --- .../src/app/components/DesktopClientUI.tsx | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide/src/app/components/DesktopClientUI.tsx b/apps/remix-ide/src/app/components/DesktopClientUI.tsx index ee9afa6d2ba..34505921430 100644 --- a/apps/remix-ide/src/app/components/DesktopClientUI.tsx +++ b/apps/remix-ide/src/app/components/DesktopClientUI.tsx @@ -14,6 +14,7 @@ interface DesktopClientState { const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => {} } & { onConnect: (providerName: Provider) => void }) => { const appContext = useContext(AppContext); const { connected, providers, onConnect, disableconnect, currentContext } = props; + const [title, setTitle] = React.useState('Connecting...'); useEffect(() => { console.log('connected', props.connected); @@ -27,10 +28,26 @@ const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => {} }); }, [props.connected]); + useEffect(() => { + console.log('providers', props.providers); + const metamaskProvider = providers.find(provider => provider.name.toLowerCase().includes('metamask')); + const braveProvider = providers.find(provider => provider.name.toLowerCase().includes('brave')); + + if (metamaskProvider && braveProvider) { + setTitle('Metamask and Brave Wallet for Remix Desktop'); + } else if (metamaskProvider) { + setTitle('Metamask for Remix Desktop'); + } else if (braveProvider) { + setTitle('Brave Wallet for Remix Desktop'); + } else { + setTitle('Connecting...'); + } + },[providers]); + return (
-

MetaMask for Desktop

+

{title}

1. Connect to your favorite Ethereum wallet provider

2. Go back to the Remix Desktop application From a01da62f95e1bd82a61ecd5780794e3e2aba91f4 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 9 Jan 2025 11:37:43 +0100 Subject: [PATCH 31/58] visuals --- apps/remix-ide/src/app.js | 19 ++++---- .../app/src/lib/remix-app/remix-app.tsx | 45 +++++++++++-------- .../home-tab/src/lib/remix-ui-home-tab.tsx | 8 +++- .../src/lib/components/Home.tsx | 9 +++- 4 files changed, 51 insertions(+), 30 deletions(-) diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index 758910dc759..14fd5013be0 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -126,6 +126,8 @@ class AppComponent { }) this.appManager = new RemixAppManager({}) this.queryParams = new QueryParams() + this.params = this.queryParams.get() + this.desktopClientMode = this.params && this.params.activate && this.params.activate.split(',').includes('desktopClient') this._components = {} // setup storage const configStorage = new Storage('config-v0.8:') @@ -521,8 +523,7 @@ class AppComponent { } async activate() { - const queryParams = new QueryParams() - const params = queryParams.get() + try { this.engine.register(await this.appManager.registeredPlugins()) @@ -599,13 +600,13 @@ class AppComponent { .activatePlugin(this.workspace) .then(async () => { try { - if (params.deactivate) { - await this.appManager.deactivatePlugin(params.deactivate.split(',')) + if (this.params.deactivate) { + await this.appManager.deactivatePlugin(this.params.deactivate.split(',')) } } catch (e) { console.log(e) } - if (params.code && (!params.activate || params.activate.split(',').includes('solidity'))) { + if (this.params.code && (!this.params.activate || this.params.activate.split(',').includes('solidity'))) { // if code is given in url we focus on solidity plugin this.menuicons.select('solidity') } else { @@ -617,8 +618,8 @@ class AppComponent { } } - if (params.call) { - const callDetails = params.call.split('//') + if (this.params.call) { + const callDetails = this.params.call.split('//') if (callDetails.length > 1) { this.appManager.call('notification', 'toast', `initiating ${callDetails[0]} and calling "${callDetails[1]}" ...`) // @todo(remove the timeout when activatePlugin is on 0.3.0) @@ -626,8 +627,8 @@ class AppComponent { } } - if (params.calls) { - const calls = params.calls.split('///') + if (this.params.calls) { + const calls = this.params.calls.split('///') // call all functions in the list, one after the other for (const call of calls) { diff --git a/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx b/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx index 0c4a58ffa3f..a6305b62366 100644 --- a/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx @@ -14,6 +14,7 @@ import { UsageTypes } from './types' import { appReducer } from './reducer/app' import { appInitialState } from './state/app' import isElectron from 'is-electron' +import { desktopConnextionType } from '@remix-api' declare global { interface Window { @@ -44,12 +45,18 @@ const RemixApp = (props: IRemixAppUi) => { const sidePanelRef = useRef(null) const pinnedPanelRef = useRef(null) + console.log('RemixApp props', props) + const [appState, appStateDispatch] = useReducer(appReducer, { ...appInitialState, - showPopupPanel: !window.localStorage.getItem('did_show_popup_panel') && !isElectron() + showPopupPanel: !window.localStorage.getItem('did_show_popup_panel') && !isElectron(), + connectedToDesktop: props.app.desktopClientMode ? desktopConnextionType.disconnected : desktopConnextionType.disabled }) useEffect(() => { + if(props.app.params && props.app.params.activate && props.app.params.activate.split(',').includes('desktopClient')){ + setHideSidePanel(true) + } async function activateApp() { props.app.themeModule.initTheme(() => { setAppReady(true) @@ -112,27 +119,29 @@ const RemixApp = (props: IRemixAppUi) => { },[appState.showPopupPanel]) function setListeners() { - props.app.sidePanel.events.on('toggle', () => { - setHideSidePanel((prev) => { - return !prev + if(!props.app.desktopClientMode){ + props.app.sidePanel.events.on('toggle', () => { + setHideSidePanel((prev) => { + return !prev + }) + }) + props.app.sidePanel.events.on('showing', () => { + setHideSidePanel(false) }) - }) - props.app.sidePanel.events.on('showing', () => { - setHideSidePanel(false) - }) - props.app.layout.event.on('minimizesidepanel', () => { - // the 'showing' event always fires from sidepanel, so delay this a bit - setTimeout(() => { - setHideSidePanel(true) - }, 1000) - }) + props.app.layout.event.on('minimizesidepanel', () => { + // the 'showing' event always fires from sidepanel, so delay this a bit + setTimeout(() => { + setHideSidePanel(true) + }, 1000) + }) - props.app.layout.event.on('maximisesidepanel', () => { - setMaximiseLeftTrigger((prev) => { - return prev + 1 + props.app.layout.event.on('maximisesidepanel', () => { + setMaximiseLeftTrigger((prev) => { + return prev + 1 + }) }) - }) + } props.app.layout.event.on('enhancesidepanel', () => { setEnhanceLeftTrigger((prev) => { diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx index 89d8cbca8c2..10faa11d55f 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx @@ -9,9 +9,10 @@ import HomeTabScamAlert from './components/homeTabScamAlert' import HomeTabGetStarted from './components/homeTabGetStarted' import HomeTabFeatured from './components/homeTabFeatured' import HomeTabFeaturedPlugins from './components/homeTabFeaturedPlugins' -import { appPlatformTypes, platformContext } from '@remix-ui/app' +import { AppContext, appPlatformTypes, platformContext } from '@remix-ui/app' import { HomeTabFileElectron } from './components/homeTabFileElectron' import { LanguageOptions } from './components/homeTablangOptions' +import { desktopConnextionType } from '@remix-api' declare global { interface Window { @@ -25,6 +26,7 @@ export interface RemixUiHomeTabProps { export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { const platform = useContext(platformContext) + const appContext = useContext(AppContext) const { plugin } = props const [state, setState] = useState<{ @@ -71,6 +73,10 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { } }, []) + if(appContext.appState.connectedToDesktop != desktopConnextionType.disabled) { + return (<>) + } + // border-right return (

diff --git a/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx b/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx index 5a3e9e1789e..6a098f74585 100644 --- a/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx +++ b/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx @@ -1,17 +1,22 @@ import { CustomTooltip } from '@remix-ui/helper' -import React from 'react' +import React, { useContext } from 'react' import { FormattedMessage } from 'react-intl' import BasicLogo from './BasicLogo' +import { AppContext } from '@remix-ui/app' +import { desktopConnextionType } from '@remix-api' interface HomeProps { verticalIconPlugin: any } function Home({ verticalIconPlugin }: HomeProps) { + const appContext = useContext(AppContext) return ( }>
await verticalIconPlugin.activateHome()} + onClick={async () => { + if(appContext.appState.connectedToDesktop === desktopConnextionType.disabled) await verticalIconPlugin.activateHome() + }} {...{ plugin: 'home' }} data-id="verticalIconsHomeIcon" id="verticalIconsHomeIcon" From d85c7c53efbff771fa391a92e839bd9abd068b4c Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 9 Jan 2025 14:47:14 +0100 Subject: [PATCH 32/58] clean up --- .../src/app/providers/injected-provider.tsx | 1 - apps/remix-ide/src/app/tabs/web3-provider.js | 8 +- .../src/blockchain/execution-context.js | 2 - .../src/lib/plugins/web3-provider.ts | 12 -- libs/remix-api/src/lib/remix-api.ts | 2 - .../components/environment-explorer-ui.tsx | 121 +++++++++--------- .../src/lib/types/index.ts | 3 +- 7 files changed, 66 insertions(+), 83 deletions(-) delete mode 100644 libs/remix-api/src/lib/plugins/web3-provider.ts diff --git a/apps/remix-ide/src/app/providers/injected-provider.tsx b/apps/remix-ide/src/app/providers/injected-provider.tsx index 16c3d404e89..70634f9594c 100644 --- a/apps/remix-ide/src/app/providers/injected-provider.tsx +++ b/apps/remix-ide/src/app/providers/injected-provider.tsx @@ -76,7 +76,6 @@ export abstract class InjectedProvider extends Plugin implements IProvider { } sendAsync(data: JsonDataRequest): Promise { - //console.log('sendAsync', data) return new Promise((resolve, reject) => { this.sendAsyncInternal(data, resolve, reject) }) diff --git a/apps/remix-ide/src/app/tabs/web3-provider.js b/apps/remix-ide/src/app/tabs/web3-provider.js index c6ba9fd7685..39e5543c2e6 100644 --- a/apps/remix-ide/src/app/tabs/web3-provider.js +++ b/apps/remix-ide/src/app/tabs/web3-provider.js @@ -28,14 +28,13 @@ export class Web3ProviderModule extends Plugin { Should be taken carefully and probably not be release as it is now. */ sendAsync(payload) { - //console.log('global web3 provider', payload) + return new Promise((resolve, reject) => { this.askUserPermission('sendAsync', `Calling ${payload.method} with parameters ${JSON.stringify(payload.params, replacer, '\t')}`).then( async (result) => { if (result) { const provider = this.blockchain.web3().currentProvider const resultFn = async (error, message) => { - //console.log('resultFn', error, message) if (error) { // Handle 'The method "debug_traceTransaction" does not exist / is not available.' error if(error.message && error.code && error.code === -32601) { @@ -50,16 +49,14 @@ export class Web3ProviderModule extends Plugin { } if (payload.method === 'eth_sendTransaction') { if (payload.params.length && !payload.params[0].to && message.result) { - //console.log('waiting for receipt', message.result) setTimeout(async () => { const receipt = await this.tryTillReceiptAvailable(message.result) if (!receipt.contractAddress) { - //console.log('receipt available but contract address not present', receipt) + console.log('receipt available but contract address not present', receipt) return } const contractAddressStr = addressToString(receipt.contractAddress) const contractData = await this.call('compilerArtefacts', 'getContractDataFromAddress', contractAddressStr) - //console.log('contractData', contractData) if (contractData) { const data = await this.call('compilerArtefacts', 'getCompilerAbstract', contractData.file) const contractObject = { @@ -102,7 +99,6 @@ export class Web3ProviderModule extends Plugin { async tryTillReceiptAvailable(txhash) { try { - //console.log('tryTillReceiptAvailable', txhash) const receipt = await this.call('blockchain', 'getTransactionReceipt', txhash) if (receipt) return receipt } catch (e) { diff --git a/apps/remix-ide/src/blockchain/execution-context.js b/apps/remix-ide/src/blockchain/execution-context.js index 39216ed3728..cf82b96ad82 100644 --- a/apps/remix-ide/src/blockchain/execution-context.js +++ b/apps/remix-ide/src/blockchain/execution-context.js @@ -145,13 +145,11 @@ export class ExecutionContext { if (!cb) cb = () => { /* Do nothing. */ } if (!confirmCb) confirmCb = () => { /* Do nothing. */ } if (!infoCb) infoCb = () => { /* Do nothing. */ } - console.log(this.customNetWorks) if (this.customNetWorks[context]) { var network = this.customNetWorks[context] await network.init() this.currentFork = network.fork this.executionContext = context - console.log(`context set to ${context}`) // injected web3.setProvider(network.provider) await this._updateChainContext() diff --git a/libs/remix-api/src/lib/plugins/web3-provider.ts b/libs/remix-api/src/lib/plugins/web3-provider.ts deleted file mode 100644 index ac92ddad944..00000000000 --- a/libs/remix-api/src/lib/plugins/web3-provider.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { StatusEvents } from '@remixproject/plugin-utils' -import { JsonDataRequest, JsonDataResult } from '../types/rpc' - -export interface IWeb3Provider { - events: { - } & StatusEvents - methods: { - init(): void - sendAsync(payload: JsonDataRequest): Promise - } - -} diff --git a/libs/remix-api/src/lib/remix-api.ts b/libs/remix-api/src/lib/remix-api.ts index ba786e23d51..4fd77629391 100644 --- a/libs/remix-api/src/lib/remix-api.ts +++ b/libs/remix-api/src/lib/remix-api.ts @@ -19,7 +19,6 @@ import { IMenuIconsApi } from "./plugins/menuicons-api" import { IDgitPlugin } from "./plugins/dgitplugin-api" import { IPopupPanelAPI } from "./plugins/popuppanel-api" import { IDesktopClient } from "./plugins/desktop-client" -import { IWeb3Provider } from "./plugins/web3-provider" export interface ICustomRemixApi extends IRemixApi { popupPanel: IPopupPanelAPI @@ -42,7 +41,6 @@ export interface ICustomRemixApi extends IRemixApi { remixAI: IRemixAI, remixAID: IRemixAID desktopClient: IDesktopClient - web3Provider: IWeb3Provider } diff --git a/libs/remix-ui/environment-explorer/src/lib/components/environment-explorer-ui.tsx b/libs/remix-ui/environment-explorer/src/lib/components/environment-explorer-ui.tsx index bdf9758b9bd..0bd67a5c188 100644 --- a/libs/remix-ui/environment-explorer/src/lib/components/environment-explorer-ui.tsx +++ b/libs/remix-ui/environment-explorer/src/lib/components/environment-explorer-ui.tsx @@ -1,23 +1,21 @@ // eslint-disable-next-line no-use-before-define -import React, { useContext, useEffect, useState } from 'react' +import React, { useEffect, useState } from 'react' import { environmentExplorerUIGridSections, environmentExplorerUIProps } from '../types' import { RemixUIGridCell, RemixUIGridSection, RemixUIGridView } from '@remix-ui/remix-ui-grid-view' import { CustomTooltip } from '@remix-ui/helper' -import { AppContext } from '@remix-ui/app' -import { desktopConnextionType } from '@remix-api' const defaultSections: environmentExplorerUIGridSections = { Injected: { title: 'Deploy using a Browser Extension.', keywords: ['Injected'], providers: [], - filterFn: (provider) => provider.isInjected, + filterFn: (provider) => provider.isInjected }, 'Remix VMs': { title: 'Deploy to an In-browser Virtual Machine.', keywords: ['Remix VMs'], providers: [], - filterFn: (provider) => provider.isVM && !provider.isForkedVM, + filterFn: (provider) => provider.isVM && !provider.isForkedVM }, 'Forked States': { title: 'Deploy to an In-browser Forked State.', @@ -28,80 +26,87 @@ const defaultSections: environmentExplorerUIGridSections = { const { latestBlock, timestamp } = JSON.parse(provider.description) return ( <> -
- Latest Block: - {parseInt(latestBlock)} -
- -
- Forked at: - {new Date(timestamp).toDateString()} -
+
Latest Block: {parseInt(latestBlock)}
+ +
Forked at: {(new Date(timestamp)).toDateString()}
- - ) - }, + ) + } }, 'Remix forked VMs': { title: 'Deploy to a Remix forked Virtual Machine.', keywords: ['Remix forked VMs'], providers: [], - filterFn: (provider) => provider.isForkedVM, + filterFn: (provider) => provider.isForkedVM }, - Externals: { + 'Externals': { title: 'Deploy to an external Provider.', keywords: ['Externals'], providers: [], - filterFn: (provider) => !provider.isInjected && !provider.isVM && !provider.isForkedState && !provider.isForkedVM, + filterFn: (provider) => (!provider.isInjected && !provider.isVM && !provider.isForkedState && !provider.isForkedVM) }, } export const EnvironmentExplorerUI = (props: environmentExplorerUIProps) => { + const [sections, setSections] = useState(defaultSections) const { state, pinStateCallback, profile } = props - const context = useContext(AppContext) useEffect(() => { - console.log('context.appState.connectedToDesktop', context.appState.connectedToDesktop) - - setSections((prevSections) => { - const newSections = { ...prevSections } - Object.keys(newSections).forEach((section) => { - newSections[section].providers = Object.values(state.providersFlat).filter(newSections[section].filterFn) - newSections[section].id = section - newSections[section].hide = (context.appState.connectedToDesktop && context.appState.connectedToDesktop !== desktopConnextionType.disabled && section !== 'Injected') - }) - return newSections + + setSections((prevSections) => { + const newSections = { ...prevSections } + Object.keys(newSections).forEach((section) => { + newSections[section].providers = Object.values(state.providersFlat).filter(newSections[section].filterFn) + newSections[section].id = section }) - - }, [state, context]) + return newSections + }) + }, [state]) return ( <> - - {Object.values(sections).map( - (section, key) => - section.providers.length > 0 && !section.hide && ( - - {section.providers.map((provider) => ( - { - await pinStateCallback(provider, pinned) - }} - > -
{(section.descriptionFn && section.descriptionFn(provider)) || provider.description}
-
- ))} -
- ) - )} + + {Object.values(sections).map((section) => ( + section.providers.length > 0 && ( + + {section.providers.map(provider => ( + { + await pinStateCallback(provider, pinned) + }} + > +
{(section.descriptionFn && section.descriptionFn(provider)) || provider.description}
+
+ ))} +
+ ) + ))}
) diff --git a/libs/remix-ui/environment-explorer/src/lib/types/index.ts b/libs/remix-ui/environment-explorer/src/lib/types/index.ts index 51cab0ca632..706e577eddf 100644 --- a/libs/remix-ui/environment-explorer/src/lib/types/index.ts +++ b/libs/remix-ui/environment-explorer/src/lib/types/index.ts @@ -18,8 +18,7 @@ export type environmentExplorerUIGridSection = { providers: Provider[] filterFn: (provider: Provider) => boolean descriptionFn?: (provider: Provider) => string | JSX.Element | null - id?: string, - hide?: boolean + id?: string } export type environmentExplorerUIGridSections = { From 6c745d43b9b3cdb09af3b94cdd84fb59f4c8df00 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 9 Jan 2025 15:03:06 +0100 Subject: [PATCH 33/58] e2e --- libs/remix-ui/app/src/lib/remix-app/remix-app.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx b/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx index a6305b62366..6b9ca6f7639 100644 --- a/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx @@ -45,7 +45,7 @@ const RemixApp = (props: IRemixAppUi) => { const sidePanelRef = useRef(null) const pinnedPanelRef = useRef(null) - console.log('RemixApp props', props) + //console.log('RemixApp props', props) const [appState, appStateDispatch] = useReducer(appReducer, { ...appInitialState, From 0e0144260efaf5e6e2bded22e63993651c64be1d Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 10 Jan 2025 07:45:16 +0100 Subject: [PATCH 34/58] revert --- libs/remix-lib/src/execution/txRunnerWeb3.ts | 1 - .../panel/src/lib/main/main-panel.tsx | 7 +- .../run-tab/src/lib/actions/account.ts | 3 - .../run-tab/src/lib/actions/events.ts | 9 +- .../src/lib/components/environment.tsx | 96 ++++++++-- .../run-tab/src/lib/components/settingsUI.tsx | 9 +- .../run-tab/src/lib/reducers/runTab.ts | 1 - libs/remix-ui/run-tab/src/lib/run-tab.tsx | 174 +++++++++--------- 8 files changed, 172 insertions(+), 128 deletions(-) diff --git a/libs/remix-lib/src/execution/txRunnerWeb3.ts b/libs/remix-lib/src/execution/txRunnerWeb3.ts index 163be3651e5..1cebf59ecc8 100644 --- a/libs/remix-lib/src/execution/txRunnerWeb3.ts +++ b/libs/remix-lib/src/execution/txRunnerWeb3.ts @@ -18,7 +18,6 @@ export class TxRunnerWeb3 { } async _executeTx (tx, network, txFee, api, promptCb, callback) { - console.log('executeTx', tx) if (network && network.lastBlock && network.lastBlock.baseFeePerGas) { // the sending stack (web3.js / metamask need to have the type defined) // this is to avoid the following issue: https://github.com/MetaMask/metamask-extension/issues/11824 diff --git a/libs/remix-ui/panel/src/lib/main/main-panel.tsx b/libs/remix-ui/panel/src/lib/main/main-panel.tsx index 9de2fb6706a..0786a644fdc 100644 --- a/libs/remix-ui/panel/src/lib/main/main-panel.tsx +++ b/libs/remix-ui/panel/src/lib/main/main-panel.tsx @@ -1,9 +1,9 @@ /* eslint-disable no-unused-expressions */ -import React, { useContext, useEffect, useRef, useState } from 'react' // eslint-disable-line +import React, {useContext, useEffect, useRef, useState} from 'react' // eslint-disable-line import DragBar from '../dragbar/dragbar' import RemixUIPanelPlugin from '../plugins/panel-plugin' import { PluginRecord } from '../types' -import { AppContext, appPlatformTypes, platformContext } from '@remix-ui/app' +import { appPlatformTypes, platformContext } from '@remix-ui/app' import './main-panel.css' export type RemixUIMainPanelProps = { @@ -18,7 +18,6 @@ const RemixUIMainPanel = (props: RemixUIMainPanelProps) => { const mainPanelRef = useRef(null) const tabsRef = useRef(null) const terminalRef = useRef(null) - const appContext = useContext(AppContext) const refs = [tabsRef, editorRef, mainPanelRef, terminalRef] @@ -30,7 +29,7 @@ const RemixUIMainPanel = (props: RemixUIMainPanelProps) => { profile: panel.plugin.profile, active: panel.active, view: panel.plugin.profile.name === 'tabs' ? panel.plugin.renderTabsbar() : panel.plugin.render(), - class: panel.plugin.profile.name + '-wrap ' + (panel.minimized ? 'minimized ' : ' ') + ((platform === appPlatformTypes.desktop) ? 'desktop' : ''), + class: panel.plugin.profile.name + '-wrap ' + (panel.minimized ? 'minimized ' : ' ') + ((platform === appPlatformTypes.desktop)? 'desktop' : ''), minimized: panel.minimized, pinned: panel.pinned }) diff --git a/libs/remix-ui/run-tab/src/lib/actions/account.ts b/libs/remix-ui/run-tab/src/lib/actions/account.ts index c58dafae399..4d937cdc5eb 100644 --- a/libs/remix-ui/run-tab/src/lib/actions/account.ts +++ b/libs/remix-ui/run-tab/src/lib/actions/account.ts @@ -16,7 +16,6 @@ export const updateAccountBalances = async (plugin: RunTab, dispatch: React.Disp } export const fillAccountsList = async (plugin: RunTab, dispatch: React.Dispatch) => { - console.log('fillAccountsList') try { dispatch(fetchAccountsListRequest()) try { @@ -35,7 +34,6 @@ export const fillAccountsList = async (plugin: RunTab, dispatch: React.Dispatch< const selectedAddress = plugin.blockchain.getInjectedWeb3Address() if (!(Object.keys(loadedAccounts).includes(toChecksumAddress(selectedAddress)))) setAccount(dispatch, null) } - console.log('loadedAccounts', loadedAccounts) dispatch(fetchAccountsListSuccess(loadedAccounts)) } catch (e) { dispatch(fetchAccountsListFailed(e.message)) @@ -59,7 +57,6 @@ const _getProviderDropdownValue = (plugin: RunTab): string => { } export const setExecutionContext = (plugin: RunTab, dispatch: React.Dispatch, executionContext: { context: string, fork: string }) => { - console.log('setExecutionContext', executionContext) plugin.blockchain.changeExecutionContext(executionContext, null, (alertMsg) => { plugin.call('notification', 'toast', alertMsg) }, () => { setFinalContext(plugin, dispatch) }) diff --git a/libs/remix-ui/run-tab/src/lib/actions/events.ts b/libs/remix-ui/run-tab/src/lib/actions/events.ts index e766f05dd47..2e06963e11a 100644 --- a/libs/remix-ui/run-tab/src/lib/actions/events.ts +++ b/libs/remix-ui/run-tab/src/lib/actions/events.ts @@ -38,7 +38,6 @@ export const setupEvents = (plugin: RunTab) => { }) plugin.blockchain.event.register('contextChanged', async (context) => { - console.log('contextChanged', context) dispatch(resetProxyDeployments()) if (!context.startsWith('vm')) getNetworkProxyAddresses(plugin, dispatch) if (context !== 'walletconnect') { @@ -99,12 +98,6 @@ export const setupEvents = (plugin: RunTab) => { plugin.on('truffle', 'compilationFinished', (file, source, languageVersion, data) => broadcastCompilationResult('truffle', plugin, dispatch, file, source, languageVersion, data)) - plugin.on('desktopHost', 'chainChanged', (context) => { - //console.log('desktopHost chainChanged', context) - //fillAccountsList(plugin, dispatch) - //updateInstanceBalance(plugin, dispatch) - }) - plugin.on('udapp', 'setEnvironmentModeReducer', (env: { context: string, fork: string }, from: string) => { plugin.call('notification', 'toast', envChangeNotification(env, from)) setExecutionContext(plugin, dispatch, env) @@ -131,7 +124,7 @@ export const setupEvents = (plugin: RunTab) => { if (activatedPlugin.name === 'remixd') { dispatch(setRemixDActivated(true)) } else { - if (activatedPlugin && (activatedPlugin.name.startsWith('injected') || activatedPlugin.name === 'desktopHost')) { + if (activatedPlugin && activatedPlugin.name.startsWith('injected')) { plugin.on(activatedPlugin.name, 'accountsChanged', (accounts: Array) => { const accountsMap = {} accounts.map(account => { accountsMap[account] = shortenAddress(account, '0')}) diff --git a/libs/remix-ui/run-tab/src/lib/components/environment.tsx b/libs/remix-ui/run-tab/src/lib/components/environment.tsx index 443fe151b40..e3faf9938ef 100644 --- a/libs/remix-ui/run-tab/src/lib/components/environment.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/environment.tsx @@ -1,25 +1,13 @@ -import React, { useRef, useState, useContext, useEffect } from 'react' +// eslint-disable-next-line no-use-before-define +import React, { useRef } from 'react' import { FormattedMessage, useIntl } from 'react-intl' import { EnvironmentProps, Provider } from '../types' import { Dropdown } from 'react-bootstrap' import { CustomMenu, CustomToggle, CustomTooltip } from '@remix-ui/helper' -import EnvironmentDropdown from './EnvironmentDropdown' -import { AppContext } from '@remix-ui/app' -import { desktopConnextionType } from '@remix-api' - const _paq = (window._paq = window._paq || []) export function EnvironmentUI(props: EnvironmentProps) { const vmStateName = useRef('') - const [filters, setFilters] = useState<((provider: Provider) => boolean)[]>([]) - const context = useContext(AppContext) // Use the AppContext - - useEffect(() => { - const filterFunction = (provider: Provider) => { - return context.appState.connectedToDesktop != desktopConnextionType.disabled ? provider.isInjected : true - } - setFilters((prevFilters) => [...prevFilters, filterFunction]) - }, [context.appState.connectedToDesktop]) Object.entries(props.providers.providerList.filter((provider) => { return provider.isVM })) Object.entries(props.providers.providerList.filter((provider) => { return provider.isInjected })) @@ -147,7 +135,85 @@ export function EnvironmentUI(props: EnvironmentProps) {
}
- + + + {isL2(currentProvider && currentProvider.displayName)} + {currentProvider && currentProvider.displayName} + {currentProvider && bridges[currentProvider.displayName.substring(0, 13)] && ( + }> + + + )} + + + {props.providers.providerList.length === 0 && + + No provider pinned + + } + { (props.providers.providerList.filter((provider) => { return provider.isInjected })).map(({ name, displayName }) => ( + { + handleChangeExEnv(name) + }} + data-id={`dropdown-item-${name}`} + > + + {displayName} + + + ))} + { props.providers.providerList.filter((provider) => { return provider.isInjected }).length !== 0 && } + { (props.providers.providerList.filter((provider) => { return provider.isVM })).map(({ displayName, name }) => ( + { + handleChangeExEnv(name) + }} + data-id={`dropdown-item-${name}`} + > + + {displayName} + + + ))} + { props.providers.providerList.filter((provider) => { return provider.isVM }).length !== 0 && } + { (props.providers.providerList.filter((provider) => { return !(provider.isVM || provider.isInjected) })).map(({ displayName, name }) => ( + { + handleChangeExEnv(name) + }} + data-id={`dropdown-item-${name}`} + > + + {isL2(displayName)} + {displayName} + + + ))} + + { + props.setExecutionContext({ context: 'item-another-chain' }) + }} + data-id={`dropdown-item-another-chain`} + > + + Customize this list... + + + +
) diff --git a/libs/remix-ui/run-tab/src/lib/components/settingsUI.tsx b/libs/remix-ui/run-tab/src/lib/components/settingsUI.tsx index e21a2d8c889..733c867205e 100644 --- a/libs/remix-ui/run-tab/src/lib/components/settingsUI.tsx +++ b/libs/remix-ui/run-tab/src/lib/components/settingsUI.tsx @@ -1,17 +1,14 @@ // eslint-disable-next-line no-use-before-define -import React, { useContext, useEffect } from 'react' +import React, { useEffect } from 'react' import { SettingsProps } from '../types' import { EnvironmentUI } from './environment' import { NetworkUI } from './network' import { AccountUI } from './account' import { GasLimitUI } from './gasLimit' import { ValueUI } from './value' -import { AppContext } from '@remix-ui/app' -import { desktopConnextionType } from '@remix-api' export function SettingsUI(props: SettingsProps) { // this._deps.config.events.on('settings/personal-mode_changed', this.onPersonalChange.bind(this)) - const appContext = useContext(AppContext) return (
@@ -39,8 +36,8 @@ export function SettingsUI(props: SettingsProps) { signMessageWithAddress={props.signMessageWithAddress} passphrase={props.passphrase} /> - {appContext.appState.connectedToDesktop === desktopConnextionType.disabled ? - <> : null} + +
) } diff --git a/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts b/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts index 442086513ae..9fba9ec4470 100644 --- a/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts +++ b/libs/remix-ui/run-tab/src/lib/reducers/runTab.ts @@ -158,7 +158,6 @@ export const runTabReducer = (state: RunTabState = runTabInitialState, action: A case SET_EXECUTION_ENVIRONMENT: { const payload: string = action.payload - console.log('SET_EXECUTION_ENVIRONMENT', payload) return { ...state, diff --git a/libs/remix-ui/run-tab/src/lib/run-tab.tsx b/libs/remix-ui/run-tab/src/lib/run-tab.tsx index b9fe2ede8c1..c6eb716af69 100644 --- a/libs/remix-ui/run-tab/src/lib/run-tab.tsx +++ b/libs/remix-ui/run-tab/src/lib/run-tab.tsx @@ -1,5 +1,5 @@ // eslint-disable-next-line no-use-before-define -import React, { Fragment, useCallback, useContext, useEffect, useReducer, useState } from 'react' +import React, { Fragment, useCallback, useEffect, useReducer, useState } from 'react' import semver from 'semver' import { FormattedMessage } from 'react-intl' import { ModalDialog } from '@remix-ui/modal-dialog' @@ -57,8 +57,6 @@ import { MainnetPrompt } from './components/mainnet' import { ScenarioPrompt } from './components/scenario' import { setIpfsCheckedState, setRemixDActivated } from './actions/payload' import { ChainCompatibleInfo, getCompatibleChain, getCompatibleChains, HardFork, isChainCompatible, isChainCompatibleWithAnyFork } from './actions/evmmap' -import { AppContext } from '@remix-ui/app' -import { desktopConnextionType } from '@remix-api' export type CheckStatus = 'Passed' | 'Failed' | 'Not Found' @@ -69,9 +67,9 @@ export function RunTabUI(props: RunTabProps) { title: '', message: '', okLabel: '', - okFn: () => { }, + okFn: () => {}, cancelLabel: '', - cancelFn: () => { } + cancelFn: () => {} }) const [modals, setModals] = useState([]) const [focusToaster, setFocusToaster] = useState('') @@ -89,9 +87,8 @@ export function RunTabUI(props: RunTabProps) { const [runTab, dispatch] = useReducer(runTabReducer, initialState) const REACT_API = { runTab } const currentfile = plugin.config.get('currentFile') - const [solcVersion, setSolcVersion] = useState<{ version: string, canReceive: boolean }>({ version: '', canReceive: true }) + const [solcVersion, setSolcVersion] = useState<{version: string, canReceive: boolean}>({ version: '', canReceive: true }) const [evmCheckComplete, setEvmCheckComplete] = useState(false) - const appContext = useContext(AppContext) const getVersion = () => { let version = '0.8.25' @@ -144,7 +141,7 @@ export function RunTabUI(props: RunTabProps) { return 'Not Found' } else { if (!IsCompatible) { - //show modal + //show modal plugin.call('notification', 'modal', { id: 'evm-chainId-incompatible', title: 'Incompatible EVM for the selected chain', @@ -160,7 +157,7 @@ export function RunTabUI(props: RunTabProps) { okLabel: 'Switch EVM and Recompile', cancelLabel: 'Cancel', okFn: () => checkEvmChainCompatibilityOkFunction(chain), - cancelFn: () => { } + cancelFn: () => {} }) return 'Failed' } else { @@ -373,87 +370,84 @@ export function RunTabUI(props: RunTabProps) { signMessageWithAddress={signMessage} passphrase={runTab.passphrase} /> - {appContext.appState.connectedToDesktop === desktopConnextionType.disabled && ( - <> - - - { - const { metadata, abi, object } = instance.contractData; - plugin.call('quick-dapp', 'edit', { - address: instance.address, - abi: abi, - name: instance.name, - network: runTab.networkName, - devdoc: object.devdoc, - methodIdentifiers: object.evm.methodIdentifiers, - solcVersion: JSON.parse(metadata).compiler.version, - }) - }} - /> - )} + + + { + const { metadata, abi, object } = instance.contractData; + plugin.call('quick-dapp', 'edit', { + address: instance.address, + abi: abi, + name: instance.name, + network: runTab.networkName, + devdoc: object.devdoc, + methodIdentifiers: object.evm.methodIdentifiers, + solcVersion: JSON.parse(metadata).compiler.version, + }) + }} + />
From 95e9ea753294e591ed115ce69d0b05b3045b3b02 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 10 Jan 2025 08:19:40 +0100 Subject: [PATCH 35/58] rm logs --- apps/remix-ide/src/blockchain/blockchain.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/remix-ide/src/blockchain/blockchain.tsx b/apps/remix-ide/src/blockchain/blockchain.tsx index e6c237d076d..8a2fb8169c5 100644 --- a/apps/remix-ide/src/blockchain/blockchain.tsx +++ b/apps/remix-ide/src/blockchain/blockchain.tsx @@ -133,11 +133,9 @@ export class Blockchain extends Plugin { if ((plugin && plugin.name && (plugin.name.startsWith('injected') || plugin.name === 'walletconnect')) || plugin.name === 'desktopHost') { this.registeredPluginEvents.push(plugin.name) this.on(plugin.name, 'chainChanged', () => { - console.log('chainChanged event', plugin.name, this.executionContext.executionContext) if (plugin.name === this.executionContext.executionContext) { this.detectNetwork((error, network) => { this.networkStatus = { network, error } - console.log('trigger networkStatus', this.networkStatus) this._triggerEvent('networkStatus', [this.networkStatus]) }) } @@ -197,7 +195,6 @@ export class Blockchain extends Plugin { this._triggerEvent('contextChanged', [context]) this.detectNetwork((error, network) => { this.networkStatus = { network, error } - console.log('trigger networkStatus 2', this.networkStatus) this._triggerEvent('networkStatus', [this.networkStatus]) }) }) @@ -213,7 +210,6 @@ export class Blockchain extends Plugin { setInterval(() => { this.detectNetwork((error, network) => { this.networkStatus = { network, error } - console.log('trigger networkStatus 3', this.networkStatus) this._triggerEvent('networkStatus', [this.networkStatus]) }) }, 30000) @@ -573,7 +569,6 @@ export class Blockchain extends Plugin { if (context.context === 'item-another-chain') { this.call('manager', 'activatePlugin', 'environmentExplorer').then(() => this.call('tabs', 'focus', 'environmentExplorer')) } else { - console.log('changeExecutionContext', context) return this.executionContext.executionContextChange(context, null, confirmCb, infoCb, cb) } } From cfb6a9e90d267df9b178e133724c272f84185b1c Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 10 Jan 2025 08:20:43 +0100 Subject: [PATCH 36/58] rm file --- .../lib/components/EnvironmentDropdown.tsx | 114 ------------------ 1 file changed, 114 deletions(-) delete mode 100644 libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx diff --git a/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx b/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx deleted file mode 100644 index 1684a69c791..00000000000 --- a/libs/remix-ui/run-tab/src/lib/components/EnvironmentDropdown.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import { CustomToggle, CustomTooltip, CustomMenu } from '@remix-ui/helper'; -import React from 'react'; -import { Dropdown } from 'react-bootstrap'; -import { FormattedMessage } from 'react-intl'; -import { Provider } from '../types'; - -interface EnvironmentDropdownProps { - currentProvider: Provider; - isL2: (provider: string) => boolean; - bridges: Record; - handleChangeExEnv: (name: string) => void; - filters?: ((provider: Provider) => boolean)[]; - props: { - providers: { - providerList: Provider[]; - }; - setExecutionContext: (executionContext: { context: string }) => void; - }; -} - -const EnvironmentDropdown = ({ currentProvider, isL2, bridges, handleChangeExEnv, filters, props }: EnvironmentDropdownProps) => { - const applyFilters = (provider: Provider) => { - if (!filters) return true; - return filters.every(filter => filter(provider)); - }; - - const injectedProviders = props.providers.providerList.filter((provider) => provider.isInjected && applyFilters(provider)); - const vmProviders = props.providers.providerList.filter((provider) => provider.isVM && applyFilters(provider)); - const otherProviders = props.providers.providerList.filter((provider) => !(provider.isVM || provider.isInjected) && applyFilters(provider)); - - return ( - - - {isL2(currentProvider && currentProvider.displayName)} - {currentProvider && currentProvider.displayName} - {currentProvider && bridges[currentProvider.displayName.substring(0, 13)] && ( - }> - - - )} - - - {props.providers.providerList.length === 0 && - - No provider pinned - - } - {injectedProviders.map(({ name, displayName }) => ( - { - handleChangeExEnv(name) - }} - data-id={`dropdown-item-${name}`} - > - - {displayName} - - - ))} - {injectedProviders.length !== 0 && vmProviders.length !== 0 && } - {vmProviders.map(({ displayName, name }) => ( - { - handleChangeExEnv(name) - }} - data-id={`dropdown-item-${name}`} - > - - {displayName} - - - ))} - {vmProviders.length !== 0 && otherProviders.length !== 0 && } - {otherProviders.map(({ displayName, name }) => ( - { - handleChangeExEnv(name) - }} - data-id={`dropdown-item-${name}`} - > - - {isL2(displayName)} - {displayName} - - - ))} - - { - props.setExecutionContext({ context: 'item-another-chain' }) - }} - data-id={`dropdown-item-another-chain`} - > - - Customize this list... - - - - - ); -}; - -export default EnvironmentDropdown; \ No newline at end of file From fcb6aef66e6b3d4353c6943d3bc8ecfd3286dbfd Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 10 Jan 2025 08:21:10 +0100 Subject: [PATCH 37/58] rm log --- libs/remix-ui/terminal/src/lib/components/ChechTxStatus.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/libs/remix-ui/terminal/src/lib/components/ChechTxStatus.tsx b/libs/remix-ui/terminal/src/lib/components/ChechTxStatus.tsx index da0b306f36b..e65cf7e7fd8 100644 --- a/libs/remix-ui/terminal/src/lib/components/ChechTxStatus.tsx +++ b/libs/remix-ui/terminal/src/lib/components/ChechTxStatus.tsx @@ -1,7 +1,6 @@ import React from 'react' // eslint-disable-line const CheckTxStatus = ({ tx, type }) => { - console.log('tx', tx) if (tx.status === 1 || tx.status === '0x1' || tx.status === true || tx.status === '1' || tx.status === BigInt(1)) { return } From af44bd7ddf743922e5e09d68a6d130a78a06f30f Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 10 Jan 2025 08:22:22 +0100 Subject: [PATCH 38/58] revert --- .../workspace/src/lib/components/electron-workspace-name.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/remix-ui/workspace/src/lib/components/electron-workspace-name.tsx b/libs/remix-ui/workspace/src/lib/components/electron-workspace-name.tsx index 0df2e312c90..3251fb77d64 100644 --- a/libs/remix-ui/workspace/src/lib/components/electron-workspace-name.tsx +++ b/libs/remix-ui/workspace/src/lib/components/electron-workspace-name.tsx @@ -50,4 +50,4 @@ export const ElectronWorkspaceName = (props: ElectronWorkspaceNameProps) => {
) -} \ No newline at end of file +} From 916ac7f1d60c65428170ef2f485f01205e9a9549 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 10 Jan 2025 08:27:17 +0100 Subject: [PATCH 39/58] revert changes --- libs/remix-lib/src/execution/txRunnerWeb3.ts | 4 -- .../src/components/terminal-transactions.tsx | 47 ------------------- .../terminal-transactions/src/index.ts | 1 - .../lib/components/remix-ui-terminal-bar.tsx | 13 +---- .../remix-ui-terminal-menu-buttons.tsx | 43 ++++------------- .../src/lib/remix-ui-terminal-wrapper.tsx | 29 ++---------- libs/remix-ui/xterm/src/lib/actions/index.ts | 2 +- .../remix-ui-terminal-menu-xterm.tsx | 2 +- .../lib/components/remix-ui-xterminals.tsx | 8 ++-- libs/remix-ui/xterm/src/lib/reducer/index.ts | 10 +--- libs/remix-ui/xterm/src/lib/types/index.ts | 2 - tsconfig.paths.json | 3 -- 12 files changed, 20 insertions(+), 144 deletions(-) delete mode 100644 libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx delete mode 100644 libs/remix-ui/terminal-transactions/src/index.ts diff --git a/libs/remix-lib/src/execution/txRunnerWeb3.ts b/libs/remix-lib/src/execution/txRunnerWeb3.ts index 1cebf59ecc8..b2c46feff45 100644 --- a/libs/remix-lib/src/execution/txRunnerWeb3.ts +++ b/libs/remix-lib/src/execution/txRunnerWeb3.ts @@ -46,7 +46,6 @@ export class TxRunnerWeb3 { const listenOnResponse = () => { // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve, reject) => { - console.log('listenOnResponse') const receipt = await tryTillReceiptAvailable(resp, this.getWeb3()) tx = await tryTillTxAvailable(resp, this.getWeb3()) currentDateTime = new Date(); @@ -81,10 +80,8 @@ export class TxRunnerWeb3 { } else { try { const res = await this.getWeb3().eth.sendTransaction(tx, null, { checkRevertBeforeSending: false, ignoreGasPricing: true }) - console.log('res', res) cb(null, res.transactionHash) } catch (e) { - console.log(e) if (!e.message) e.message = '' if (e.error) { e.message = e.message + ' ' + e.error @@ -195,7 +192,6 @@ export class TxRunnerWeb3 { async function tryTillReceiptAvailable (txhash: string, web3: Web3) { try { const receipt = await web3.eth.getTransactionReceipt(txhash) - console.log('receipt', receipt) if (receipt) { if (!receipt.to && !receipt.contractAddress) { // this is a contract creation and the receipt doesn't contain a contract address. we have to keep polling... diff --git a/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx b/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx deleted file mode 100644 index 540b6866045..00000000000 --- a/libs/remix-ui/terminal-transactions/src/components/terminal-transactions.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { TerminalContext } from '@remix-ui/terminal' -import { Plugin } from '@remixproject/engine' -import { PluginQueueItem } from '@remixproject/plugin-utils/src/lib/tools/queue'; -import React, { useState, useEffect, useContext } from 'react' // eslint-disable-line - -export interface TerminalTransactionsProps { - plugin: Plugin -} - -const pluginsToWatch = ['injected-metamask', 'web3Provider']; - -interface queue { - pluginName: string, - queue: PluginQueueItem[] -} - -export const TerminalTransactions = (props: TerminalTransactionsProps) => { - - const { xtermState, dispatchXterm } = useContext(TerminalContext) - const [queues, setQueues] = useState([]) - - useEffect(() => { - - pluginsToWatch.forEach(pluginName => { - props.plugin.on(pluginName, 'queue', (data: any) => { - //console.log('plugin', pluginName, 'queue', data); - setQueues(queues => [...queues.filter(queue => queue.pluginName !== pluginName), { pluginName, queue: data }]); - }); - }); - return () => { - pluginsToWatch.forEach(pluginName => { - props.plugin.off(pluginName, 'queue'); - }); - }; - }, [props.plugin]); - -return (<> -
- {queues.map((queue, index) => { - return
-
{queue.queue.map((item, i) =>
{item && (item as any).args && (item as any).args[0] && (item as any).args[0].method}
)}
-
- })} -
-) - -} \ No newline at end of file diff --git a/libs/remix-ui/terminal-transactions/src/index.ts b/libs/remix-ui/terminal-transactions/src/index.ts deleted file mode 100644 index 055a9b0730e..00000000000 --- a/libs/remix-ui/terminal-transactions/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './components/terminal-transactions' \ No newline at end of file diff --git a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx index 797b2fd8a86..a51bb33e613 100644 --- a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx +++ b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-bar.tsx @@ -1,4 +1,4 @@ -import { AppContext, appPlatformTypes, platformContext } from '@remix-ui/app' +import { appPlatformTypes, platformContext } from '@remix-ui/app' import { CustomTooltip } from '@remix-ui/helper' import React, { useState, useEffect, useRef, useContext } from 'react' // eslint-disable-line import { FormattedMessage, useIntl } from 'react-intl' @@ -9,12 +9,10 @@ import { RemixUITerminalMenu } from './remix-ui-terminal-menu' import { RemixUITerminalMenuToggle } from './remix-ui-terminal-menu-toggle' import { RemixUIXtermMenu } from '../../../../xterm/src/lib/components/remix-ui-terminal-menu-xterm' import { RemixUITerminalMenuButtons } from './remix-ui-terminal-menu-buttons' -import { desktopConnextionType } from '@remix-api' export const RemixUITerminalBar = (props: RemixUiTerminalProps) => { const { terminalState, xtermState } = useContext(TerminalContext) const platform = useContext(platformContext) - const appContext = useContext(AppContext) const intl = useIntl() const terminalMenu = useRef(null) @@ -30,17 +28,10 @@ export const RemixUITerminalBar = (props: RemixUiTerminalProps) => { data-id="terminalToggleMenu" > - {appContext.appState.connectedToDesktop !== desktopConnextionType.disabled ? -
- - -
: null - - } {platform === appPlatformTypes.desktop ?
- {xtermState.selectedTerminalTab === 'output' ? : } + {xtermState.showOutput? : }
: } diff --git a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx index 1e0ffe06cea..826528759fe 100644 --- a/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx +++ b/libs/remix-ui/terminal/src/lib/components/remix-ui-terminal-menu-buttons.tsx @@ -1,69 +1,42 @@ -import { AppContext } from '@remix-ui/app' import React, { useContext, useEffect } from 'react' // eslint-disable-line import { TerminalContext } from '../context' import { RemixUiTerminalProps, SET_OPEN } from '../types/terminalTypes' import './remix-ui-terminal-menu-buttons.css' -import { desktopConnextionType } from '@remix-api'; export const RemixUITerminalMenuButtons = (props: RemixUiTerminalProps) => { const { xtermState, dispatchXterm, terminalState, dispatch } = useContext(TerminalContext) - const appContext = useContext(AppContext) function selectOutput(event: any): void { props.plugin.call('layout', 'minimize', props.plugin.profile.name, false) - dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'output' }) + dispatchXterm({ type: 'SHOW_OUTPUT', payload: true }) dispatch({ type: SET_OPEN, payload: true }) } - const showTerminal = async (event: any): Promise => { + const showTerminal = async(event: any): Promise => { props.plugin.call('layout', 'minimize', props.plugin.profile.name, false) - if (xtermState.terminals.length === 0) { + if ( xtermState.terminals.length === 0) { const start_time = Date.now() const pid = await props.plugin.call('xterm', 'createTerminal', xtermState.workingDir, null) const end_time = Date.now() console.log(`createTerminal took ${end_time - start_time} ms`) dispatchXterm({ type: 'HIDE_ALL_TERMINALS', payload: null }) - dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'xterm' }) + dispatchXterm({ type: 'SHOW_OUTPUT', payload: false }) dispatchXterm({ type: 'ADD_TERMINAL', payload: { pid, queue: '', timeStamp: Date.now(), ref: null, hidden: false } }) } else { - dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'xterm' }) + dispatchXterm({ type: 'SHOW_OUTPUT', payload: false }) } dispatch({ type: SET_OPEN, payload: true }) } - const showTransactions = async (event: any): Promise => { - dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'transactions' }) - } - - if (appContext.appState.connectedToDesktop === desktopConnextionType.connected) { - - return null - return ( -
- - -
- ) - } - return (
- - -{/* */}
) } \ No newline at end of file diff --git a/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx b/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx index e403bd61c7b..d21123eaef2 100644 --- a/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx +++ b/libs/remix-ui/terminal/src/lib/remix-ui-terminal-wrapper.tsx @@ -1,19 +1,16 @@ -import { AppContext, appPlatformTypes, platformContext } from '@remix-ui/app' +import { appPlatformTypes, platformContext } from '@remix-ui/app' import { RemixUiXterminals, xTerminInitialState, xtermReducer } from '@remix-ui/xterm' -import { TerminalTransactions } from 'libs/remix-ui/terminal-transactions/src' -import React, { useContext, useEffect, useReducer } from 'react' // eslint-disable-line +import React, { useContext, useReducer } from 'react' // eslint-disable-line import { RemixUITerminalBar } from './components/remix-ui-terminal-bar' import { TerminalContext } from './context' import { initialState, registerCommandReducer } from './reducers/terminalReducer' import RemixUiTerminal from './remix-ui-terminal' import { RemixUiTerminalProps } from './types/terminalTypes' -import { desktopConnextionType } from '@remix-api' export const RemixUITerminalWrapper = (props: RemixUiTerminalProps) => { const [terminalState, dispatch] = useReducer(registerCommandReducer, initialState) const [xtermState, dispatchXterm] = useReducer(xtermReducer, xTerminInitialState) const platform = useContext(platformContext) - const appContext = useContext(AppContext) const providerState = { terminalState, dispatch, @@ -21,34 +18,14 @@ export const RemixUITerminalWrapper = (props: RemixUiTerminalProps) => { dispatchXterm } - useEffect(() => { - if (appContext.appState.connectedToDesktop === desktopConnextionType.connected) { - dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'transactions' }) - } - }, [appContext.appState.connectedToDesktop]) - - if (appContext.appState.connectedToDesktop === desktopConnextionType.disconnected) { - return <> - } - - if (appContext.appState.connectedToDesktop === desktopConnextionType.connected) { - return <> - - - {platform !== appPlatformTypes.desktop && } - - - } - return (<> {platform !== appPlatformTypes.desktop && } {platform === appPlatformTypes.desktop && <> - + - {/* */} } diff --git a/libs/remix-ui/xterm/src/lib/actions/index.ts b/libs/remix-ui/xterm/src/lib/actions/index.ts index 5e81f5fc39e..5489af6206b 100644 --- a/libs/remix-ui/xterm/src/lib/actions/index.ts +++ b/libs/remix-ui/xterm/src/lib/actions/index.ts @@ -3,7 +3,7 @@ import { Plugin } from "@remixproject/engine" export const createTerminal = async (shell: string = '', plugin: Plugin, workingDir: string, dispatch: React.Dispatch) => { const pid = await plugin.call('xterm', 'createTerminal', workingDir, shell) - dispatch({ type: 'SET_TERMINAL_TAB', payload: 'xterm' }) + dispatch({ type: 'SHOW_OUTPUT', payload: false }) dispatch({ type: 'HIDE_ALL_TERMINALS', payload: null }) dispatch({ type: 'ADD_TERMINAL', payload: { pid, queue: '', timeStamp: Date.now(), ref: null, hidden: false } }) diff --git a/libs/remix-ui/xterm/src/lib/components/remix-ui-terminal-menu-xterm.tsx b/libs/remix-ui/xterm/src/lib/components/remix-ui-terminal-menu-xterm.tsx index 8eb0a022774..49a5d2e36cb 100644 --- a/libs/remix-ui/xterm/src/lib/components/remix-ui-terminal-menu-xterm.tsx +++ b/libs/remix-ui/xterm/src/lib/components/remix-ui-terminal-menu-xterm.tsx @@ -26,7 +26,7 @@ export const RemixUIXtermMenu = (props: RemixUiTerminalProps) => { } return (<> -
+
onCreateTerminal()}> }> diff --git a/libs/remix-ui/xterm/src/lib/components/remix-ui-xterminals.tsx b/libs/remix-ui/xterm/src/lib/components/remix-ui-xterminals.tsx index 207238a08a3..7dbcedaaf82 100644 --- a/libs/remix-ui/xterm/src/lib/components/remix-ui-xterminals.tsx +++ b/libs/remix-ui/xterm/src/lib/components/remix-ui-xterminals.tsx @@ -40,7 +40,7 @@ export const RemixUiXterminals = (props: RemixUiXterminalsProps) => { plugin.on('xterm', 'new', async () => { const pid = await plugin.call('xterm', 'createTerminal', workingDir, null) dispatchXterm({ type: 'HIDE_ALL_TERMINALS', payload: null }) - dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'xterm' }) + dispatchXterm({ type: 'SHOW_OUTPUT', payload: false }) dispatchXterm({ type: 'ADD_TERMINAL', payload: { pid, queue: '', timeStamp: Date.now(), ref: null, hidden: false } }) }) @@ -80,7 +80,7 @@ export const RemixUiXterminals = (props: RemixUiXterminalsProps) => { useEffect(() => { setTerminals(xtermState.terminals) if (xtermState.terminals.length === 0) { - dispatchXterm({ type: 'SET_TERMINAL_TAB', payload: 'output' }) + dispatchXterm({ type: 'SHOW_OUTPUT', payload: true }) } }, [xtermState.terminals]) @@ -139,9 +139,9 @@ export const RemixUiXterminals = (props: RemixUiXterminalsProps) => { } return (<> - {
+ {
<> - {
+ {
{terminals.map((xtermState) => { return (
diff --git a/libs/remix-ui/xterm/src/lib/reducer/index.ts b/libs/remix-ui/xterm/src/lib/reducer/index.ts index cf038787992..a96d2185234 100644 --- a/libs/remix-ui/xterm/src/lib/reducer/index.ts +++ b/libs/remix-ui/xterm/src/lib/reducer/index.ts @@ -5,8 +5,7 @@ export const xTerminInitialState: xTerminalUiState = { terminals: [], shells: [], showOutput: true, - workingDir: '', - selectedTerminalTab: 'output' + workingDir: '' } export const xtermReducer = (state = xTerminInitialState, action: Actions) => { @@ -60,13 +59,6 @@ export const xtermReducer = (state = xTerminInitialState, action: Actions) => { ...state, showOutput: action.payload } - - case 'SET_TERMINAL_TAB': - return { - ...state, - selectedTerminalTab: action.payload - } - case 'SET_WORKING_DIR': return { ...state, diff --git a/libs/remix-ui/xterm/src/lib/types/index.ts b/libs/remix-ui/xterm/src/lib/types/index.ts index b9fcbaed260..170441acb95 100644 --- a/libs/remix-ui/xterm/src/lib/types/index.ts +++ b/libs/remix-ui/xterm/src/lib/types/index.ts @@ -13,7 +13,6 @@ export interface xTerminalUiState { shells: string[] showOutput: boolean workingDir: string - selectedTerminalTab: 'output' | 'xterm' | 'transactions' } export interface ActionPayloadTypes { @@ -27,7 +26,6 @@ export interface ActionPayloadTypes { ADD_SHELLS: string[], SHOW_OUTPUT: boolean SET_WORKING_DIR: string - SET_TERMINAL_TAB: 'output' | 'xterm' | 'transactions' } export interface Action { diff --git a/tsconfig.paths.json b/tsconfig.paths.json index 5d5f8b219c0..7e5cec001f4 100644 --- a/tsconfig.paths.json +++ b/tsconfig.paths.json @@ -175,9 +175,6 @@ "@remix-ui/xterm": [ "libs/remix-ui/xterm/src/index.ts" ], - "@remix-ui/terminal-transactions": [ - "libs/remix-ui/erminal-transactions/src/index.ts" - ], "@remix-ui/remix-ai": [ "libs/remix-ui/remix-ai/src/index.ts" ], From 0d04a3e19503c9bc7e487e1c03d81ea6d9936887 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 10 Jan 2025 08:38:20 +0100 Subject: [PATCH 40/58] fix linting --- apps/remix-ide/src/app.js | 4 +- .../src/app/components/DesktopClientUI.tsx | 6 +- .../app/plugins/electron/desktopHostPlugin.ts | 26 ++++---- apps/remix-ide/src/app/udapp/run-tab.tsx | 5 +- .../components/modals/modal-wrapper.tsx | 20 +++--- .../app/src/lib/remix-app/reducer/app.ts | 62 +++++++++---------- .../app/src/lib/remix-app/remix-app.tsx | 4 +- .../app/src/lib/remix-app/state/app.ts | 2 +- .../home-tab/src/lib/remix-ui-home-tab.tsx | 2 +- .../src/lib/remixui-statusbar-panel.tsx | 2 +- .../src/lib/components/Home.tsx | 2 +- 11 files changed, 66 insertions(+), 69 deletions(-) diff --git a/apps/remix-ide/src/app.js b/apps/remix-ide/src/app.js index 14fd5013be0..3502e33bd1c 100644 --- a/apps/remix-ide/src/app.js +++ b/apps/remix-ide/src/app.js @@ -670,9 +670,7 @@ class AppComponent { // activate solidity plugin this.appManager.activatePlugin(['solidity', 'udapp', 'deploy-libraries', 'link-libraries', 'openzeppelin-proxy', 'scriptRunnerBridge']) - if(!isElectron()){ - - }else{ + if(isElectron()){ this.appManager.activatePlugin(['desktopHost']) } } diff --git a/apps/remix-ide/src/app/components/DesktopClientUI.tsx b/apps/remix-ide/src/app/components/DesktopClientUI.tsx index 34505921430..2899025cc99 100644 --- a/apps/remix-ide/src/app/components/DesktopClientUI.tsx +++ b/apps/remix-ide/src/app/components/DesktopClientUI.tsx @@ -11,7 +11,7 @@ interface DesktopClientState { currentContext: string; } -const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => {} } & { onConnect: (providerName: Provider) => void }) => { +const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => void } & { onConnect: (providerName: Provider) => void }) => { const appContext = useContext(AppContext); const { connected, providers, onConnect, disableconnect, currentContext } = props; const [title, setTitle] = React.useState('Connecting...'); @@ -84,8 +84,8 @@ const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => {} {disableconnect ? 'please wait ...' : currentContext === provider.name - ? 'Connected' - : 'Connect'} + ? 'Connected' + : 'Connect'}
diff --git a/apps/remix-ide/src/app/plugins/electron/desktopHostPlugin.ts b/apps/remix-ide/src/app/plugins/electron/desktopHostPlugin.ts index f8b831d8ec5..7dc008d0981 100644 --- a/apps/remix-ide/src/app/plugins/electron/desktopHostPlugin.ts +++ b/apps/remix-ide/src/app/plugins/electron/desktopHostPlugin.ts @@ -6,23 +6,23 @@ import { ElectronPlugin } from '@remixproject/engine-electron' const _paq = (window._paq = window._paq || []) const profile = { - name: 'desktopHost', - displayName: '', - description: '', - methods: [], - events: ['connected'], - maintainedBy: 'Remix' + name: 'desktopHost', + displayName: '', + description: '', + methods: [], + events: ['connected'], + maintainedBy: 'Remix' } export class DesktopHost extends ElectronPlugin { - constructor() { - super(profile) - } + constructor() { + super(profile) + } - onActivation() { - console.log('DesktopHost activated') - _paq.push(['trackEvent', 'plugin', 'activated', 'DesktopHost']) - } + onActivation() { + console.log('DesktopHost activated') + _paq.push(['trackEvent', 'plugin', 'activated', 'DesktopHost']) + } } \ No newline at end of file diff --git a/apps/remix-ide/src/app/udapp/run-tab.tsx b/apps/remix-ide/src/app/udapp/run-tab.tsx index f1bbe658b43..d29bfd8d9ac 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.tsx +++ b/apps/remix-ide/src/app/udapp/run-tab.tsx @@ -13,7 +13,6 @@ import { ForkedVMStateProvider } from '../providers/vm-provider' import { Recorder } from '../tabs/runTab/model/recorder' const _paq = (window._paq = window._paq || []) - export const providerDescriptions = { 'vm-cancun': 'Deploy to the in-browser virtual machine running the Cancun fork.', 'vm-shanghai': 'Deploy to the in-browser virtual machine running the Shanghai fork.', @@ -216,7 +215,7 @@ export class RunTab extends ViewPlugin { isInjected, isVM, isForkedState, - }) + }) } const addCustomInjectedProvider = async (position, event, name, displayName, networkId, urls, nativeCurrency?) => { @@ -318,7 +317,7 @@ export class RunTab extends ViewPlugin { // wallet connect await addProvider(6, 'walletconnect', 'WalletConnect', false, false, false) - if(isElectron()) { + if (isElectron()) { // desktop host await addProvider(12, 'desktopHost', 'Metamask for Remix Desktop', false, false, false) } diff --git a/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx b/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx index 0c2e49dc72f..214b4dd2500 100644 --- a/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/components/modals/modal-wrapper.tsx @@ -118,16 +118,16 @@ const ModalWrapper = (props: ModalWrapperProps) => { }) break case ModalTypes.fixed: - setState({ - ...props, - okFn: null, - cancelFn: null, - okLabel: null, - cancelLabel: null, - preventBlur: true, - hideCancelIcon: true, - }) - break + setState({ + ...props, + okFn: null, + cancelFn: null, + okLabel: null, + cancelLabel: null, + preventBlur: true, + hideCancelIcon: true, + }) + break default: setState({ ...props, diff --git a/libs/remix-ui/app/src/lib/remix-app/reducer/app.ts b/libs/remix-ui/app/src/lib/remix-app/reducer/app.ts index abe232c1fce..2110a638997 100644 --- a/libs/remix-ui/app/src/lib/remix-app/reducer/app.ts +++ b/libs/remix-ui/app/src/lib/remix-app/reducer/app.ts @@ -3,44 +3,44 @@ import { AppState } from "../interface"; export const appReducer = (state: AppState, action: AppAction): AppState => { switch (action.type) { - case appActionTypes.setGitHubUser: { - return { - ...state, - gitHubUser: action.payload - } + case appActionTypes.setGitHubUser: { + return { + ...state, + gitHubUser: action.payload } - case appActionTypes.setCurrentBranch: { - return { - ...state, - currentBranch: action.payload - } + } + case appActionTypes.setCurrentBranch: { + return { + ...state, + currentBranch: action.payload } - case appActionTypes.setNeedsGitInit: { - return { - ...state, - needsGitInit: action.payload - } + } + case appActionTypes.setNeedsGitInit: { + return { + ...state, + needsGitInit: action.payload } - case appActionTypes.setCanUseGit: { - return { - ...state, - canUseGit: action.payload - } + } + case appActionTypes.setCanUseGit: { + return { + ...state, + canUseGit: action.payload } + } - case appActionTypes.setShowPopupPanel: { - return { - ...state, - showPopupPanel: action.payload - } + case appActionTypes.setShowPopupPanel: { + return { + ...state, + showPopupPanel: action.payload } + } - case appActionTypes.setConnectedToDesktop: { - console.log('setConnectedToDesktop', action.payload) - return { - ...state, - connectedToDesktop: action.payload - } + case appActionTypes.setConnectedToDesktop: { + console.log('setConnectedToDesktop', action.payload) + return { + ...state, + connectedToDesktop: action.payload } } + } } \ No newline at end of file diff --git a/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx b/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx index 6b9ca6f7639..d80acef5218 100644 --- a/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx @@ -54,7 +54,7 @@ const RemixApp = (props: IRemixAppUi) => { }) useEffect(() => { - if(props.app.params && props.app.params.activate && props.app.params.activate.split(',').includes('desktopClient')){ + if (props.app.params && props.app.params.activate && props.app.params.activate.split(',').includes('desktopClient')){ setHideSidePanel(true) } async function activateApp() { @@ -119,7 +119,7 @@ const RemixApp = (props: IRemixAppUi) => { },[appState.showPopupPanel]) function setListeners() { - if(!props.app.desktopClientMode){ + if (!props.app.desktopClientMode){ props.app.sidePanel.events.on('toggle', () => { setHideSidePanel((prev) => { return !prev diff --git a/libs/remix-ui/app/src/lib/remix-app/state/app.ts b/libs/remix-ui/app/src/lib/remix-app/state/app.ts index ac0e772c598..d6ce19940b3 100644 --- a/libs/remix-ui/app/src/lib/remix-app/state/app.ts +++ b/libs/remix-ui/app/src/lib/remix-app/state/app.ts @@ -8,4 +8,4 @@ export const appInitialState: AppState = { canUseGit: false, showPopupPanel: false, connectedToDesktop: desktopConnextionType.disabled -} \ No newline at end of file +} \ No newline at end of file diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx index 10faa11d55f..8b46147f7c5 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx @@ -73,7 +73,7 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { } }, []) - if(appContext.appState.connectedToDesktop != desktopConnextionType.disabled) { + if (appContext.appState.connectedToDesktop != desktopConnextionType.disabled) { return (<>) } diff --git a/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx b/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx index aa6f5ed43fd..d27671c6669 100644 --- a/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx +++ b/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx @@ -70,7 +70,7 @@ export function RemixUIStatusBar({ statusBarPlugin }: RemixUIStatusBarProps) { return aiActive } - if(platform !== appPlatformTypes.desktop && appContext.appState.connectedToDesktop !== desktopConnextionType.disabled) { + if (platform !== appPlatformTypes.desktop && appContext.appState.connectedToDesktop !== desktopConnextionType.disabled) { return (<>
) } diff --git a/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx b/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx index 6a098f74585..8e4515593d0 100644 --- a/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx +++ b/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx @@ -15,7 +15,7 @@ function Home({ verticalIconPlugin }: HomeProps) {
{ - if(appContext.appState.connectedToDesktop === desktopConnextionType.disabled) await verticalIconPlugin.activateHome() + if (appContext.appState.connectedToDesktop === desktopConnextionType.disabled) await verticalIconPlugin.activateHome() }} {...{ plugin: 'home' }} data-id="verticalIconsHomeIcon" From fab9ced40769f4311c381b785d6ac0c34b11ecbd Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 10 Jan 2025 09:03:14 +0100 Subject: [PATCH 41/58] v icons refactor --- .../src/lib/remix-ui-vertical-icons-panel.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx b/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx index 50d56a7cbc1..108052d4824 100644 --- a/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx +++ b/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx @@ -6,10 +6,9 @@ import Home from './components/Home' import { verticalScrollReducer } from './reducers/verticalScrollReducer' import { Chevron } from './components/Chevron' import { IconRecord } from './types' -import { AppContext, onLineContext } from '@remix-ui/app' +import { onLineContext } from '@remix-ui/app' import { CustomTooltip } from '@remix-ui/helper' import { Registry } from '@remix-project/remix-lib' -import { desktopConnextionType } from '@remix-api' export interface RemixUiVerticalIconsPanelProps { verticalIconsPlugin: Plugin @@ -28,7 +27,6 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic const [activateScroll, dispatchScrollAction] = useReducer(verticalScrollReducer, initialState) const [theme, setTheme] = useState('dark') const online = useContext(onLineContext) - const appContext = useContext(AppContext) const evaluateScrollability = () => { dispatchScrollAction({ @@ -84,7 +82,7 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic > (appContext.appState.connectedToDesktop === desktopConnextionType.disabled && p.isRequired && p.profile.name !== 'pluginManager'))} + icons={icons.filter((p) => p.isRequired && p.profile.name !== 'pluginManager')} verticalIconsPlugin={verticalIconsPlugin} itemContextAction={itemContextAction} /> @@ -106,7 +104,7 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic { - return appContext.appState.connectedToDesktop === desktopConnextionType.disabled && !p.isRequired && p.profile.name !== 'settings' + return !p.isRequired && p.profile.name !== 'settings' })} verticalIconsPlugin={verticalIconsPlugin} itemContextAction={itemContextAction} @@ -118,7 +116,7 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic ) : null } appContext.appState.connectedToDesktop === desktopConnextionType.disabled && ( p.profile.name === 'settings' || p.profile.name === 'pluginManager'))} + icons={icons.filter((p) => p.profile.name === 'settings' || p.profile.name === 'pluginManager')} verticalIconsPlugin={verticalIconsPlugin} itemContextAction={itemContextAction} /> From 7cbe76a4e6dd3b60eb61b25b7fb1dc3b5bddb55b Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 10 Jan 2025 09:03:37 +0100 Subject: [PATCH 42/58] clean up --- .../src/app/components/vertical-icons.tsx | 37 +++++++++++++++---- .../src/app/plugins/desktop-client.tsx | 12 +++--- apps/remix-ide/src/app/udapp/run-tab.tsx | 1 - .../src/lib/types/desktopConnection.ts | 4 +- .../app/src/lib/remix-app/remix-app.tsx | 4 +- .../app/src/lib/remix-app/state/app.ts | 4 +- .../home-tab/src/lib/remix-ui-home-tab.tsx | 4 +- .../src/lib/components/desktopStatus.tsx | 14 +++---- .../src/lib/remixui-statusbar-panel.tsx | 4 +- libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx | 4 +- .../src/lib/components/Home.tsx | 4 +- 11 files changed, 56 insertions(+), 36 deletions(-) diff --git a/apps/remix-ide/src/app/components/vertical-icons.tsx b/apps/remix-ide/src/app/components/vertical-icons.tsx index 865c4fa4684..980bc8db26c 100644 --- a/apps/remix-ide/src/app/components/vertical-icons.tsx +++ b/apps/remix-ide/src/app/components/vertical-icons.tsx @@ -6,6 +6,10 @@ import { EventEmitter } from 'events' import { IconRecord, RemixUiVerticalIconsPanel } from '@remix-ui/vertical-icons-panel' import { Profile } from '@remixproject/plugin-utils' import { PluginViewWrapper } from '@remix-ui/helper' +import { AppAction, AppState } from '@remix-ui/app' +import { desktopConnectionType } from '@remix-api' +import Home from 'libs/remix-ui/vertical-icons-panel/src/lib/components/Home' +import BasicLogo from 'libs/remix-ui/vertical-icons-panel/src/lib/components/BasicLogo' const profile = { name: 'menuicons', @@ -13,7 +17,7 @@ const profile = { description: 'Remix IDE vertical icons', version: packageJson.version, methods: ['select', 'unlinkContent', 'linkContent'], - events: ['toggleContent', 'showContent'] + events: ['toggleContent', 'showContent'], } export class VerticalIcons extends Plugin { @@ -21,6 +25,7 @@ export class VerticalIcons extends Plugin { htmlElement: HTMLDivElement icons: Record = {} dispatch: React.Dispatch = () => {} + appStateDispatch: React.Dispatch = () => {} constructor() { super(profile) this.events = new EventEmitter() @@ -35,7 +40,7 @@ export class VerticalIcons extends Plugin { .map((value) => { return { ...value, - isRequired: fixedOrder.indexOf(value.profile.name) > -1 + isRequired: fixedOrder.indexOf(value.profile.name) > -1, } }) .sort((a, b) => { @@ -52,12 +57,12 @@ export class VerticalIcons extends Plugin { ...required, ...divived.filter((value) => { return !value.isRequired - }) + }), ] this.dispatch({ verticalIconsPlugin: this, - icons: sorted + icons: sorted, }) } @@ -65,6 +70,10 @@ export class VerticalIcons extends Plugin { this.dispatch = dispatch } + setAppStateDispatch(appStateDispatch: React.Dispatch) { + this.appStateDispatch = appStateDispatch + } + onActivation() { this.renderComponent() this.on('sidePanel', 'focusChanged', (name: string) => { @@ -103,7 +112,7 @@ export class VerticalIcons extends Plugin { active: false, pinned: false, canbeDeactivated: await this.call('manager', 'canDeactivate', this.profile, profile), - timestamp: Date.now() + timestamp: Date.now(), } this.renderComponent() } @@ -138,14 +147,26 @@ export class VerticalIcons extends Plugin { this.events.emit('toggleContent', name) } - updateComponent(state: any) { - return + updateComponent(state: any, appState: Partial) { + if (appState.connectedToDesktop === desktopConnectionType.disabled) { + return + } else { + return ( + <> +
+
+ +
+
+ + ) + } } render() { return (
- +
) } diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index e4426a84644..5b0d8fe26e0 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -1,6 +1,6 @@ /* eslint-disable prefer-const */ import React from 'react'; -import { desktopConnection, desktopConnextionType } from '@remix-api'; +import { desktopConnection, desktopConnectionType } from '@remix-api'; import { Blockchain, Provider } from '../../blockchain/blockchain'; import { AppAction, AppModal, ModalTypes } from '@remix-ui/app'; import { ViewPlugin } from '@remixproject/engine-web'; @@ -42,7 +42,7 @@ export class DesktopClient extends ViewPlugin { super(profile); this.blockchain = blockchain; this.state = { - connected: desktopConnextionType.disconnected, + connected: desktopConnectionType .disconnected, providers: [], disableconnect: false, currentContext: '', @@ -179,7 +179,7 @@ export class DesktopClient extends ViewPlugin { this.ws.onopen = () => { console.log('Connected to server'); this.emit('connected', true); - this.setConnectionState(desktopConnextionType.connected); + this.setConnectionState(desktopConnectionType .connected); this.call('terminal', 'log', { value: 'Connected to the desktop application.', type: 'info', @@ -193,7 +193,7 @@ export class DesktopClient extends ViewPlugin { if (parsed && parsed.type === 'error') { if (parsed.payload === 'ALREADY_CONNECTED') { console.log('ALREADY_CONNECTED'); - this.setConnectionState(desktopConnextionType.alreadyConnected); + this.setConnectionState(desktopConnectionType .alreadyConnected); const modalContent: AppModal = { id: this.profile.name, title: 'Another tab or window is already connected.', @@ -243,8 +243,8 @@ export class DesktopClient extends ViewPlugin { this.ws = null; this.emit('connected', false); - if (this.state.connected !== desktopConnextionType.alreadyConnected) { - this.setConnectionState(desktopConnextionType.disconnected); + if (this.state.connected !== desktopConnectionType .alreadyConnected) { + this.setConnectionState(desktopConnectionType .disconnected); setTimeout(() => { this.connectToWebSocket(); diff --git a/apps/remix-ide/src/app/udapp/run-tab.tsx b/apps/remix-ide/src/app/udapp/run-tab.tsx index d29bfd8d9ac..a2fcb311cde 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.tsx +++ b/apps/remix-ide/src/app/udapp/run-tab.tsx @@ -182,7 +182,6 @@ export class RunTab extends ViewPlugin { const udapp = this // eslint-disable-line const addProvider = async (position, name, displayName, isInjected, isVM, isForkedState, fork = '', dataId = '', title = '', forkedVM = false) => { - console.log(`Adding provider ${name}`) await this.call('blockchain', 'addProvider', { position, options: {}, diff --git a/libs/remix-api/src/lib/types/desktopConnection.ts b/libs/remix-api/src/lib/types/desktopConnection.ts index 11a3ff60967..33f7db89ed5 100644 --- a/libs/remix-api/src/lib/types/desktopConnection.ts +++ b/libs/remix-api/src/lib/types/desktopConnection.ts @@ -1,8 +1,8 @@ -export const desktopConnextionType = { +export const desktopConnectionType = { connected: 'connected', disconnected: 'disconnected', disabled: 'disabled', alreadyConnected: 'alreadyConnected', } -export type desktopConnection = typeof desktopConnextionType[keyof typeof desktopConnextionType] \ No newline at end of file +export type desktopConnection = typeof desktopConnectionType [keyof typeof desktopConnectionType ] \ No newline at end of file diff --git a/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx b/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx index d80acef5218..ea9aacb8904 100644 --- a/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx +++ b/libs/remix-ui/app/src/lib/remix-app/remix-app.tsx @@ -14,7 +14,7 @@ import { UsageTypes } from './types' import { appReducer } from './reducer/app' import { appInitialState } from './state/app' import isElectron from 'is-electron' -import { desktopConnextionType } from '@remix-api' +import { desktopConnectionType } from '@remix-api' declare global { interface Window { @@ -50,7 +50,7 @@ const RemixApp = (props: IRemixAppUi) => { const [appState, appStateDispatch] = useReducer(appReducer, { ...appInitialState, showPopupPanel: !window.localStorage.getItem('did_show_popup_panel') && !isElectron(), - connectedToDesktop: props.app.desktopClientMode ? desktopConnextionType.disconnected : desktopConnextionType.disabled + connectedToDesktop: props.app.desktopClientMode ? desktopConnectionType .disconnected : desktopConnectionType .disabled }) useEffect(() => { diff --git a/libs/remix-ui/app/src/lib/remix-app/state/app.ts b/libs/remix-ui/app/src/lib/remix-app/state/app.ts index d6ce19940b3..bf3fbdc4ee9 100644 --- a/libs/remix-ui/app/src/lib/remix-app/state/app.ts +++ b/libs/remix-ui/app/src/lib/remix-app/state/app.ts @@ -1,4 +1,4 @@ -import { desktopConnextionType, GitHubUser } from "@remix-api"; +import { desktopConnectionType , GitHubUser } from "@remix-api"; import { AppState } from "../interface"; export const appInitialState: AppState = { @@ -7,5 +7,5 @@ export const appInitialState: AppState = { needsGitInit: true, canUseGit: false, showPopupPanel: false, - connectedToDesktop: desktopConnextionType.disabled + connectedToDesktop: desktopConnectionType .disabled } \ No newline at end of file diff --git a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx index 8b46147f7c5..30c96bef773 100644 --- a/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx +++ b/libs/remix-ui/home-tab/src/lib/remix-ui-home-tab.tsx @@ -12,7 +12,7 @@ import HomeTabFeaturedPlugins from './components/homeTabFeaturedPlugins' import { AppContext, appPlatformTypes, platformContext } from '@remix-ui/app' import { HomeTabFileElectron } from './components/homeTabFileElectron' import { LanguageOptions } from './components/homeTablangOptions' -import { desktopConnextionType } from '@remix-api' +import { desktopConnectionType } from '@remix-api' declare global { interface Window { @@ -73,7 +73,7 @@ export const RemixUiHomeTab = (props: RemixUiHomeTabProps) => { } }, []) - if (appContext.appState.connectedToDesktop != desktopConnextionType.disabled) { + if (appContext.appState.connectedToDesktop != desktopConnectionType .disabled) { return (<>) } diff --git a/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx b/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx index 5545da066a9..252ebcbd984 100644 --- a/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx +++ b/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx @@ -4,7 +4,7 @@ import { StatusBar } from 'apps/remix-ide/src/app/components/status-bar' import '../../css/statusbar.css' import { CustomTooltip } from '@remix-ui/helper' import { AppContext } from '@remix-ui/app' -import { desktopConnextionType } from '@remix-api' +import { desktopConnectionType } from '@remix-api' export const DesktopStatus= () => { const appContext = useContext(AppContext) @@ -12,23 +12,23 @@ export const DesktopStatus= () => { return (
- {appContext.appState.connectedToDesktop === desktopConnextionType.connected ? ( + {appContext.appState.connectedToDesktop === desktopConnectionType .connected ? ( <> Connected to the desktop application ) : null} - {appContext.appState.connectedToDesktop === desktopConnextionType.alreadyConnected ? ( + {appContext.appState.connectedToDesktop === desktopConnectionType .alreadyConnected ? ( <> Error: you are already connected to the desktop application in another tab or window ) : null} - {appContext.appState.connectedToDesktop === desktopConnextionType.disconnected ? ( + {appContext.appState.connectedToDesktop === desktopConnectionType .disconnected ? ( <> Waiting for the desktop application to connect... diff --git a/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx b/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx index d27671c6669..6ede079809a 100644 --- a/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx +++ b/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx @@ -11,7 +11,7 @@ import { StatusBarContextProvider } from '../contexts/statusbarcontext' import DidYouKnow from './components/didYouKnow' import { AppContext, appPlatformTypes, platformContext } from '@remix-ui/app' import { DesktopStatus } from './components/desktopStatus' -import { desktopConnextionType } from '@remix-api' +import { desktopConnectionType } from '@remix-api' export interface RemixUIStatusBarProps { statusBarPlugin: StatusBar @@ -70,7 +70,7 @@ export function RemixUIStatusBar({ statusBarPlugin }: RemixUIStatusBarProps) { return aiActive } - if (platform !== appPlatformTypes.desktop && appContext.appState.connectedToDesktop !== desktopConnextionType.disabled) { + if (platform !== appPlatformTypes.desktop && appContext.appState.connectedToDesktop !== desktopConnectionType .disabled) { return (<>
) } diff --git a/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx index a73a6edef86..1d901613f9b 100644 --- a/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx +++ b/libs/remix-ui/tabs/src/lib/remix-ui-tabs.tsx @@ -7,7 +7,7 @@ import { Tab, Tabs, TabList, TabPanel } from 'react-tabs' import './remix-ui-tabs.css' import { values } from 'lodash' import { AppContext } from '@remix-ui/app' -import { desktopConnextionType } from '@remix-api' +import { desktopConnectionType } from '@remix-api' const _paq = (window._paq = window._paq || []) /* eslint-disable-next-line */ @@ -187,7 +187,7 @@ export const TabsUI = (props: TabsUIProps) => { return (
diff --git a/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx b/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx index 8e4515593d0..4f1b8248768 100644 --- a/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx +++ b/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx @@ -3,7 +3,7 @@ import React, { useContext } from 'react' import { FormattedMessage } from 'react-intl' import BasicLogo from './BasicLogo' import { AppContext } from '@remix-ui/app' -import { desktopConnextionType } from '@remix-api' +import { desktopConnectionType } from '@remix-api' interface HomeProps { verticalIconPlugin: any } @@ -15,7 +15,7 @@ function Home({ verticalIconPlugin }: HomeProps) {
{ - if (appContext.appState.connectedToDesktop === desktopConnextionType.disabled) await verticalIconPlugin.activateHome() + if (appContext.appState.connectedToDesktop === desktopConnectionType .disabled) await verticalIconPlugin.activateHome() }} {...{ plugin: 'home' }} data-id="verticalIconsHomeIcon" From c4889a581de3156b167fc4f9896c3f3749b68ecb Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 10 Jan 2025 09:09:18 +0100 Subject: [PATCH 43/58] revert all --- .../src/app/components/vertical-icons.tsx | 37 ++++--------------- .../src/lib/components/Home.tsx | 9 +---- 2 files changed, 10 insertions(+), 36 deletions(-) diff --git a/apps/remix-ide/src/app/components/vertical-icons.tsx b/apps/remix-ide/src/app/components/vertical-icons.tsx index 980bc8db26c..865c4fa4684 100644 --- a/apps/remix-ide/src/app/components/vertical-icons.tsx +++ b/apps/remix-ide/src/app/components/vertical-icons.tsx @@ -6,10 +6,6 @@ import { EventEmitter } from 'events' import { IconRecord, RemixUiVerticalIconsPanel } from '@remix-ui/vertical-icons-panel' import { Profile } from '@remixproject/plugin-utils' import { PluginViewWrapper } from '@remix-ui/helper' -import { AppAction, AppState } from '@remix-ui/app' -import { desktopConnectionType } from '@remix-api' -import Home from 'libs/remix-ui/vertical-icons-panel/src/lib/components/Home' -import BasicLogo from 'libs/remix-ui/vertical-icons-panel/src/lib/components/BasicLogo' const profile = { name: 'menuicons', @@ -17,7 +13,7 @@ const profile = { description: 'Remix IDE vertical icons', version: packageJson.version, methods: ['select', 'unlinkContent', 'linkContent'], - events: ['toggleContent', 'showContent'], + events: ['toggleContent', 'showContent'] } export class VerticalIcons extends Plugin { @@ -25,7 +21,6 @@ export class VerticalIcons extends Plugin { htmlElement: HTMLDivElement icons: Record = {} dispatch: React.Dispatch = () => {} - appStateDispatch: React.Dispatch = () => {} constructor() { super(profile) this.events = new EventEmitter() @@ -40,7 +35,7 @@ export class VerticalIcons extends Plugin { .map((value) => { return { ...value, - isRequired: fixedOrder.indexOf(value.profile.name) > -1, + isRequired: fixedOrder.indexOf(value.profile.name) > -1 } }) .sort((a, b) => { @@ -57,12 +52,12 @@ export class VerticalIcons extends Plugin { ...required, ...divived.filter((value) => { return !value.isRequired - }), + }) ] this.dispatch({ verticalIconsPlugin: this, - icons: sorted, + icons: sorted }) } @@ -70,10 +65,6 @@ export class VerticalIcons extends Plugin { this.dispatch = dispatch } - setAppStateDispatch(appStateDispatch: React.Dispatch) { - this.appStateDispatch = appStateDispatch - } - onActivation() { this.renderComponent() this.on('sidePanel', 'focusChanged', (name: string) => { @@ -112,7 +103,7 @@ export class VerticalIcons extends Plugin { active: false, pinned: false, canbeDeactivated: await this.call('manager', 'canDeactivate', this.profile, profile), - timestamp: Date.now(), + timestamp: Date.now() } this.renderComponent() } @@ -147,26 +138,14 @@ export class VerticalIcons extends Plugin { this.events.emit('toggleContent', name) } - updateComponent(state: any, appState: Partial) { - if (appState.connectedToDesktop === desktopConnectionType.disabled) { - return - } else { - return ( - <> -
-
- -
-
- - ) - } + updateComponent(state: any) { + return } render() { return (
- +
) } diff --git a/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx b/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx index 4f1b8248768..5a3e9e1789e 100644 --- a/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx +++ b/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx @@ -1,22 +1,17 @@ import { CustomTooltip } from '@remix-ui/helper' -import React, { useContext } from 'react' +import React from 'react' import { FormattedMessage } from 'react-intl' import BasicLogo from './BasicLogo' -import { AppContext } from '@remix-ui/app' -import { desktopConnectionType } from '@remix-api' interface HomeProps { verticalIconPlugin: any } function Home({ verticalIconPlugin }: HomeProps) { - const appContext = useContext(AppContext) return ( }>
{ - if (appContext.appState.connectedToDesktop === desktopConnectionType .disabled) await verticalIconPlugin.activateHome() - }} + onClick={async () => await verticalIconPlugin.activateHome()} {...{ plugin: 'home' }} data-id="verticalIconsHomeIcon" id="verticalIconsHomeIcon" From d4e8c4ffecc128e775910dddaf191bb84f31fade Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 10 Jan 2025 09:13:31 +0100 Subject: [PATCH 44/58] refactor --- .../src/lib/components/Home.tsx | 44 +++++++--- .../src/lib/remix-ui-vertical-icons-panel.tsx | 87 +++++++------------ 2 files changed, 64 insertions(+), 67 deletions(-) diff --git a/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx b/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx index 5a3e9e1789e..ea15633204d 100644 --- a/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx +++ b/libs/remix-ui/vertical-icons-panel/src/lib/components/Home.tsx @@ -2,23 +2,43 @@ import { CustomTooltip } from '@remix-ui/helper' import React from 'react' import { FormattedMessage } from 'react-intl' import BasicLogo from './BasicLogo' + interface HomeProps { verticalIconPlugin: any + disableClick?: boolean } -function Home({ verticalIconPlugin }: HomeProps) { +function Home({ verticalIconPlugin, disableClick }: HomeProps) { + const handleClick = async () => { + if (!disableClick) { + await verticalIconPlugin.activateHome() + } + } + return ( - }> -
await verticalIconPlugin.activateHome()} - {...{ plugin: 'home' }} - data-id="verticalIconsHomeIcon" - id="verticalIconsHomeIcon" - > - -
-
+ <> + {disableClick ? ( +
+ +
+ ) : ( + }> +
+ +
+
+ )} + ) } diff --git a/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx b/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx index 108052d4824..f2ef812a834 100644 --- a/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx +++ b/libs/remix-ui/vertical-icons-panel/src/lib/remix-ui-vertical-icons-panel.tsx @@ -6,9 +6,10 @@ import Home from './components/Home' import { verticalScrollReducer } from './reducers/verticalScrollReducer' import { Chevron } from './components/Chevron' import { IconRecord } from './types' -import { onLineContext } from '@remix-ui/app' +import { AppContext, onLineContext } from '@remix-ui/app' import { CustomTooltip } from '@remix-ui/helper' import { Registry } from '@remix-project/remix-lib' +import { desktopConnectionType } from '@remix-api' export interface RemixUiVerticalIconsPanelProps { verticalIconsPlugin: Plugin @@ -18,7 +19,7 @@ export interface RemixUiVerticalIconsPanelProps { const initialState = { scrollHeight: 0, clientHeight: 0, - scrollState: false + scrollState: false, } const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVerticalIconsPanelProps) => { @@ -27,6 +28,7 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic const [activateScroll, dispatchScrollAction] = useReducer(verticalScrollReducer, initialState) const [theme, setTheme] = useState('dark') const online = useContext(onLineContext) + const appContext = useContext(AppContext) const evaluateScrollability = () => { dispatchScrollAction({ @@ -34,8 +36,8 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic payload: { scrollHeight: scrollableRef.current?.scrollHeight, clientHeight: scrollableRef.current?.clientHeight, - scrollState: false - } + scrollState: false, + }, }) } @@ -67,40 +69,27 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic verticalIconsPlugin.call('manager', 'deactivatePlugin', name) } + if (appContext.appState.connectedToDesktop !== desktopConnectionType.disabled) { + return ( + <> +
+
+ +
+
+ + ) + } + return (
-
scrollableRef.current.clientHeight - ? 'remixui_default-icons-container remixui_requiredSection' - : activateScroll && activateScroll.scrollState - ? 'remixui_default-icons-container remixui_requiredSection' - : 'remixui_requiredSection' - } - > - p.isRequired && p.profile.name !== 'pluginManager')} - verticalIconsPlugin={verticalIconsPlugin} - itemContextAction={itemContextAction} - /> - {scrollableRef.current && scrollableRef.current.scrollHeight > scrollableRef.current.clientHeight ? ( - - ) : null} +
scrollableRef.current.clientHeight ? 'remixui_default-icons-container remixui_requiredSection' : activateScroll && activateScroll.scrollState ? 'remixui_default-icons-container remixui_requiredSection' : 'remixui_requiredSection'}> + p.isRequired && p.profile.name !== 'pluginManager')} verticalIconsPlugin={verticalIconsPlugin} itemContextAction={itemContextAction} /> + {scrollableRef.current && scrollableRef.current.scrollHeight > scrollableRef.current.clientHeight ? : null}
-
scrollableRef.current.clientHeight - ? 'remixui_default-icons-container remixui_scrollable-container remixui_scrollbar remixui_hide-scroll' - : activateScroll && activateScroll.scrollState - ? 'remixui_default-icons-container remixui_scrollable-container remixui_scrollbar remixui_hide-scroll' - : 'remixui_scrollable-container remixui_scrollbar remixui_hide-scroll' - } - ref={scrollableRef} - > +
scrollableRef.current.clientHeight ? 'remixui_default-icons-container remixui_scrollable-container remixui_scrollbar remixui_hide-scroll' : activateScroll && activateScroll.scrollState ? 'remixui_default-icons-container remixui_scrollable-container remixui_scrollbar remixui_hide-scroll' : 'remixui_scrollable-container remixui_scrollbar remixui_hide-scroll'} ref={scrollableRef}> { @@ -111,31 +100,19 @@ const RemixUiVerticalIconsPanel = ({ verticalIconsPlugin, icons }: RemixUiVertic />
- { scrollableRef.current && scrollableRef.current.scrollHeight > scrollableRef.current.clientHeight ? ( - - ) : null } - p.profile.name === 'settings' || p.profile.name === 'pluginManager')} - verticalIconsPlugin={verticalIconsPlugin} - itemContextAction={itemContextAction} - /> - { Registry.getInstance().get('platform').api.isDesktop() ? ( + {scrollableRef.current && scrollableRef.current.scrollHeight > scrollableRef.current.clientHeight ? : null} + p.profile.name === 'settings' || p.profile.name === 'pluginManager')} verticalIconsPlugin={verticalIconsPlugin} itemContextAction={itemContextAction} /> + {Registry.getInstance().get('platform').api.isDesktop() ? ( online ? ( - + - ) - : - ( + + ) : ( + - ) - ) : null } + + ) + ) : null}
From f934e46ac91ca24071dcc2dc83cc467b9d28b81e Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 10 Jan 2025 09:22:36 +0100 Subject: [PATCH 45/58] rename --- apps/remix-ide/src/app/components/DesktopClientUI.tsx | 2 +- apps/remix-ide/src/app/udapp/run-tab.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/remix-ide/src/app/components/DesktopClientUI.tsx b/apps/remix-ide/src/app/components/DesktopClientUI.tsx index 2899025cc99..e82d01ae494 100644 --- a/apps/remix-ide/src/app/components/DesktopClientUI.tsx +++ b/apps/remix-ide/src/app/components/DesktopClientUI.tsx @@ -51,7 +51,7 @@ const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => voi

1. Connect to your favorite Ethereum wallet provider

2. Go back to the Remix Desktop application -

3. Deploy using 'MetaMask for Desktop' +

3. Deploy using 'MetaMask/Brave Wallet'

diff --git a/apps/remix-ide/src/app/udapp/run-tab.tsx b/apps/remix-ide/src/app/udapp/run-tab.tsx index a2fcb311cde..02c890d65a6 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.tsx +++ b/apps/remix-ide/src/app/udapp/run-tab.tsx @@ -318,7 +318,7 @@ export class RunTab extends ViewPlugin { if (isElectron()) { // desktop host - await addProvider(12, 'desktopHost', 'Metamask for Remix Desktop', false, false, false) + await addProvider(12, 'desktopHost', 'Metamask/Brave Wallet', false, false, false) } // external provider From e780a557e29f40a9ac382145516dfd75005c0bac Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Mon, 13 Jan 2025 12:46:31 +0100 Subject: [PATCH 46/58] debugging --- .../src/app/plugins/desktop-client.tsx | 274 +++++++++--------- apps/remixdesktop/package.json | 2 + apps/remixdesktop/src/lib/server.ts | 37 +-- apps/remixdesktop/yarn.lock | 12 + libs/remix-lib/src/execution/txRunnerWeb3.ts | 4 + package.json | 2 + yarn.lock | 12 + 7 files changed, 186 insertions(+), 157 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index 5b0d8fe26e0..2792cb53c01 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -1,16 +1,17 @@ /* eslint-disable prefer-const */ -import React from 'react'; -import { desktopConnection, desktopConnectionType } from '@remix-api'; -import { Blockchain, Provider } from '../../blockchain/blockchain'; -import { AppAction, AppModal, ModalTypes } from '@remix-ui/app'; -import { ViewPlugin } from '@remixproject/engine-web'; -import { PluginViewWrapper } from '@remix-ui/helper'; -import { QueryParams } from '@remix-project/remix-lib'; -import cbor from 'cbor'; -import isElectron from 'is-electron'; -import DesktopClientUI from '../components/DesktopClientUI'; // Import the UI component - -const _paq = (window._paq = window._paq || []); +import React from 'react' +import { desktopConnection, desktopConnectionType } from '@remix-api' +import { Blockchain, Provider } from '../../blockchain/blockchain' +import { AppAction, AppModal, ModalTypes } from '@remix-ui/app' +import { ViewPlugin } from '@remixproject/engine-web' +import { PluginViewWrapper } from '@remix-ui/helper' +import { QueryParams } from '@remix-project/remix-lib' +import cbor from 'cbor' +import isElectron from 'is-electron' +import DesktopClientUI from '../components/DesktopClientUI' // Import the UI component +import JSONbig from 'json-bigint' + +const _paq = (window._paq = window._paq || []) const profile = { name: 'desktopClient', @@ -20,143 +21,136 @@ const profile = { events: ['connected'], maintainedBy: 'Remix', location: 'mainPanel', -}; +} interface DesktopClientState { - connected: desktopConnection; - providers: Provider[]; - disableconnect: boolean; - currentContext: string; + connected: desktopConnection + providers: Provider[] + disableconnect: boolean + currentContext: string } export class DesktopClient extends ViewPlugin { - blockchain: Blockchain; - ws: WebSocket; - dispatch: React.Dispatch = () => {}; - state: DesktopClientState; - appStateDispatch: React.Dispatch; - queryParams: QueryParams; - params: any; + blockchain: Blockchain + ws: WebSocket + dispatch: React.Dispatch = () => {} + state: DesktopClientState + appStateDispatch: React.Dispatch + queryParams: QueryParams + params: any constructor(blockchain: Blockchain) { - super(profile); - this.blockchain = blockchain; + super(profile) + this.blockchain = blockchain this.state = { - connected: desktopConnectionType .disconnected, + connected: desktopConnectionType.disconnected, providers: [], disableconnect: false, currentContext: '', - }; - this.queryParams = new QueryParams(); + } + this.queryParams = new QueryParams() - this.params = this.queryParams.get(); - console.log('DesktopClient params', this.params); + this.params = this.queryParams.get() + console.log('DesktopClient params', this.params) } onActivation() { - console.log('DesktopClient activated'); - _paq.push(['trackEvent', 'plugin', 'activated', 'DesktopClient']); + console.log('DesktopClient activated') + _paq.push(['trackEvent', 'plugin', 'activated', 'DesktopClient']) - this.connectToWebSocket(); + this.connectToWebSocket() const updateProviders = async () => { - const providersObj: { [key: string]: Provider } = await this.call('blockchain', 'getAllProviders'); - const providers: Provider[] = Object.values(providersObj); - this.state.providers = providers; - this.renderComponent(); - console.log('providers', providers); - }; - - this.on('udapp', 'providerAdded', updateProviders); - window.addEventListener('eip6963:announceProvider', (event: CustomEvent) => updateProviders()); - if (!isElectron()) window.dispatchEvent(new Event('eip6963:requestProvider')); - this.call('layout', 'minimizeSidePanel'); - this.blockchain.event.register('networkStatus', this.handleNetworkStatus.bind(this)); - this.blockchain.event.register('contextChanged', this.handleContextChanged.bind(this)); + const providersObj: { [key: string]: Provider } = await this.call('blockchain', 'getAllProviders') + const providers: Provider[] = Object.values(providersObj) + this.state.providers = providers + this.renderComponent() + console.log('providers', providers) + } + + this.on('udapp', 'providerAdded', updateProviders) + window.addEventListener('eip6963:announceProvider', (event: CustomEvent) => updateProviders()) + if (!isElectron()) window.dispatchEvent(new Event('eip6963:requestProvider')) + this.call('layout', 'minimizeSidePanel') + this.blockchain.event.register('networkStatus', this.handleNetworkStatus.bind(this)) + this.blockchain.event.register('contextChanged', this.handleContextChanged.bind(this)) } handleContextChanged(context: any) { - console.log('contextChanged handled', context); + console.log('contextChanged handled', context) } onDeactivation() {} setDispatch(dispatch: React.Dispatch): void { - this.dispatch = dispatch; - this.renderComponent(); + this.dispatch = dispatch + this.renderComponent() } setAppStateDispatch(appStateDispatch: React.Dispatch) { - console.log('setAppStateDispatch', appStateDispatch); - this.appStateDispatch = appStateDispatch; + console.log('setAppStateDispatch', appStateDispatch) + this.appStateDispatch = appStateDispatch } renderComponent() { this.dispatch({ ...this.state, - }); + }) } async handleProviderConnect(provider: Provider) { - console.log('handleProviderConnect', provider); - this.state.disableconnect = true; - this.renderComponent(); + console.log('handleProviderConnect', provider) + this.state.disableconnect = true + this.renderComponent() this.blockchain.changeExecutionContext({ context: provider.name, fork: '' }, null, null, () => { - console.log('setFinalContext'); - this.state.disableconnect = false; - this.renderComponent(); - }); + console.log('setFinalContext') + this.state.disableconnect = false + this.renderComponent() + }) } setConnectionState = (state: desktopConnection) => { - this.state.connected = state; + this.state.connected = state - this.renderComponent(); - }; + this.renderComponent() + } async handleNetworkStatus(context: any) { - console.log('networkStatus handled', context); - this.state.currentContext = this.blockchain.executionContext.executionContext; - this.renderComponent(); - this.debouncedSendContextChanged(); + console.log('networkStatus handled', context) + this.state.currentContext = this.blockchain.executionContext.executionContext + this.renderComponent() + this.debouncedSendContextChanged() } // Debounced function to send context changed event debouncedSendContextChanged = debounce(() => { if (this.ws && this.ws.readyState === WebSocket.OPEN) { - console.log('Sending context changed event to server'); - this.ws.send(stringifyWithBigInt({ type: 'contextChanged', payload: null })); + console.log('Sending context changed event to server') + this.ws.send(stringifyWithBigInt({ type: 'contextChanged', payload: null })) } - }, 500); // Adjust the debounce wait time as needed + }, 500) // Adjust the debounce wait time as needed async checkConnection() { - console.log('Checking connection', this.ws); + console.log('Checking connection', this.ws) if (this.ws && this.ws.readyState === this.ws.OPEN) { - console.log('OK Connected to server'); + console.log('OK Connected to server') } else { - console.log('NOT Connected to server'); - this.connectToWebSocket(); + console.log('NOT Connected to server') + this.connectToWebSocket() } } async openDesktopApp() { - console.log('openDesktopApp'); - this.ws.send(stringifyWithBigInt({ type: 'focus', payload: null })); + console.log('openDesktopApp') + this.ws.send(stringifyWithBigInt({ type: 'focus', payload: null })) } updateComponent(state: DesktopClientState) { return ( <> - + - ); + ) } render() { @@ -164,93 +158,98 @@ export class DesktopClient extends ViewPlugin {
- ); + ) } async connectToWebSocket() { - console.log('Connecting to server'); + console.log('Connecting to server') try { - this.ws = new WebSocket(`ws://localhost:${this.params.desktopClientPort}`); - this.ws.binaryType = 'arraybuffer'; + this.ws = new WebSocket(`ws://localhost:${this.params.desktopClientPort}`) + this.ws.binaryType = 'arraybuffer' } catch (e) { - console.error('CATCH WebSocket error:', e); - return; + console.error('CATCH WebSocket error:', e) + return } this.ws.onopen = () => { - console.log('Connected to server'); - this.emit('connected', true); - this.setConnectionState(desktopConnectionType .connected); + console.log('Connected to server') + this.emit('connected', true) + this.setConnectionState(desktopConnectionType.connected) this.call('terminal', 'log', { value: 'Connected to the desktop application.', type: 'info', - }); + }) //this.blockchain.event.register('contextChanged', this.handleNetworkStatus.bind(this)); - }; + } this.ws.onmessage = async (event) => { - const parsed = JSON.parse(event.data); - console.log('Message from server:', parsed.method); + const parsed = JSON.parse(event.data) + console.log('Message from server:', parsed.method) if (parsed && parsed.type === 'error') { if (parsed.payload === 'ALREADY_CONNECTED') { - console.log('ALREADY_CONNECTED'); - this.setConnectionState(desktopConnectionType .alreadyConnected); + console.log('ALREADY_CONNECTED') + this.setConnectionState(desktopConnectionType.alreadyConnected) const modalContent: AppModal = { id: this.profile.name, title: 'Another tab or window is already connected.', message: 'Another tab or window is already connected to the desktop application. Please close this tab or window.', modalType: ModalTypes.fixed, okLabel: null, - }; + } - this.call('notification', 'modal' as any, modalContent); - return; + this.call('notification', 'modal' as any, modalContent) + return } } if (parsed.method === 'eth_sendTransaction' || parsed.method === 'eth_getTransactionReceipt') { this.call('terminal', 'log', { value: 'Transaction from desktop client: ' + event.data, type: 'info', - }); + }) } if (parsed.method === 'eth_sendTransaction' || parsed.method === 'eth_getTransactionReceipt') { - console.log('Sending message to web3:', parsed); + console.log('Sending message to web3:', parsed) } - let receipt; + let receipt if (parsed.method === 'eth_getTransactionReceipt') { - let receipt = await this.tryTillReceiptAvailable(parsed.params[0]); - console.log('Receipt:', receipt); - console.log('Sending receipt back to server', parsed.params[0], receipt); + console.log('Getting receipt for', parsed.params) + let receipt = await this.tryTillReceiptAvailable(parsed.params[0]) + console.log('Receipt:', receipt) + console.log('Sending receipt back to server', parsed.params[0], receipt, stringifyWithBigInt({ + jsonrpc: '2.0', + result: receipt, + id: parsed.id, + })) this.ws.send( stringifyWithBigInt({ jsonrpc: '2.0', result: receipt, id: parsed.id, }) - ); + ) } else { - const provider = this.blockchain.web3().currentProvider; - let result = await provider.sendAsync(parsed); + const provider = this.blockchain.web3().currentProvider + let result = await provider.sendAsync(parsed) if (parsed.method === 'eth_sendTransaction') { - console.log('Sending result back to server', result); + console.log('Sending result back to server', result) } - this.ws.send(stringifyWithBigInt(result)); + this.ws.send(stringifyWithBigInt(result)) } - }; + } this.ws.onclose = () => { - console.log('Disconnected from server'); - this.ws = null; + console.log('Disconnected from server') + this.ws = null - this.emit('connected', false); - if (this.state.connected !== desktopConnectionType .alreadyConnected) { - this.setConnectionState(desktopConnectionType .disconnected); + this.emit('connected', false) + if (this.state.connected !== desktopConnectionType.alreadyConnected) { + this.setConnectionState(desktopConnectionType.disconnected) setTimeout(() => { - this.connectToWebSocket(); - }, 5000); + this.connectToWebSocket() + }, 5000) } - }; + } } async init() {} @@ -259,33 +258,30 @@ export class DesktopClient extends ViewPlugin { async tryTillReceiptAvailable(txhash) { try { - const receipt = await this.call('blockchain', 'getTransactionReceipt', txhash); - if (receipt) return receipt; + const receipt = await this.call('blockchain', 'getTransactionReceipt', txhash) + if (receipt) return receipt } catch (e) { // do nothing } - await this.pause(); - return await this.tryTillReceiptAvailable(txhash); + await this.pause() + return await this.tryTillReceiptAvailable(txhash) } async pause() { return new Promise((resolve, reject) => { - setTimeout(resolve, 500); - }); + setTimeout(resolve, 500) + }) } } function stringifyWithBigInt(obj) { - return cbor.encode(obj); - console.log('stringifyWithBigInt', obj); - const r = JSON.stringify(obj, (key, value) => (typeof value === 'bigint' ? value.toString() : value)); - console.log('stringifyWithBigInt', r); - return r; + const r = JSON.stringify(obj, (key, value) => (typeof value === 'bigint' ? value.toString() + 'n' : value)) + return r } function debounce(func: (...args: any[]) => void, wait: number) { - let timeout: NodeJS.Timeout; + let timeout: NodeJS.Timeout return function (...args: any[]) { - clearTimeout(timeout); - timeout = setTimeout(() => func.apply(this, args), wait); - }; -} \ No newline at end of file + clearTimeout(timeout) + timeout = setTimeout(() => func.apply(this, args), wait) + } +} diff --git a/apps/remixdesktop/package.json b/apps/remixdesktop/package.json index 8406dbbc452..2c2be24a2b8 100644 --- a/apps/remixdesktop/package.json +++ b/apps/remixdesktop/package.json @@ -42,6 +42,7 @@ "@electron/notarize": "^2.3.0", "@types/byline": "^4.2.35", "@types/express": "^4.17.21", + "@types/json-bigint": "^1.0.4", "@types/nightwatch": "^2.3.23", "chromedriver": "116", "cross-env": "^7.0.3", @@ -81,6 +82,7 @@ "electron-updater": "^6.1.8", "express": "^4.21.2", "isomorphic-git": "^1.24.2", + "json-bigint": "^1.0.0", "matomo-tracker": "^2.2.4", "node-pty": "^1.0.0", "octokit": "^3.1.2", diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index 11654635774..bb332300f94 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -1,24 +1,19 @@ import * as http from 'http' import { WebSocketServer, WebSocket } from 'ws' -import cors from 'cors' import EventEmitter from 'events' import { RequestArguments } from '../types' import path from 'path' import express from 'express' +import cbor from 'cbor' + import { findAvailablePort } from '../utils/portFinder' import { isPackaged } from '../main' import { isE2ELocal } from '../main' -import cbor from 'cbor' +import JSONbig from 'json-bigint' // Forwarding WebSocket client let connectedWebSocket: WebSocket | null = null -// Helper function to send JSON responses -const sendResponse = (response: http.ServerResponse, data: any, statusCode = 200) => { - response.writeHead(statusCode, { 'Content-Type': 'application/json' }) - response.end(JSON.stringify(data)) -} - // Handle incoming JSON-RPC requests and forward to WebSocket client export const handleRequest = async (jsonRpcPayload: RequestArguments, eventEmitter: EventEmitter): Promise => { if (!connectedWebSocket || connectedWebSocket.readyState !== WebSocket.OPEN) { @@ -31,20 +26,20 @@ export const handleRequest = async (jsonRpcPayload: RequestArguments, eventEmitt connectedWebSocket && connectedWebSocket.once('message', async (data: any) => { - //if (Buffer.isBuffer(data)) { - // data = data.toString('utf-8'); - //} + if (Buffer.isBuffer(data)) { + data = data.toString('utf-8'); + } //console.log('received message from WebSocket ONCE client:', data); clearTimeout(timeout) try { //console.log('received message from WebSocket ONCE client:', data) - const response = parseWithBigInt(new Uint8Array(data)) + const response = parseWithBigInt(data) //console.log('received message from WebSocket ONCE client:', response) if (response.id === jsonRpcPayload.id) { if (jsonRpcPayload.method === 'eth_sendTransaction' || jsonRpcPayload.method === 'eth_getTransactionReceipt') { - console.log('response from WebSocket client:', response) + console.log('response from WebSocket client:', data, response) eventEmitter.emit('focus') } if (response.error) { @@ -152,10 +147,10 @@ export const startHostServer = async (eventEmitter: EventEmitter) => { eventEmitter.emit('connected', true) connectedWebSocket.on('message', (data: any) => { - //if (Buffer.isBuffer(data)) { - // data = data.toString('utf-8'); - // } - const response = parseWithBigInt(new Uint8Array(data)) + if (Buffer.isBuffer(data)) { + data = data.toString('utf-8'); + } + const response = parseWithBigInt(data) if (response && response.type) { //console.log('received message from WebSocket client:', response) eventEmitter.emit(response.type, response.payload) @@ -189,7 +184,13 @@ export const startHostServer = async (eventEmitter: EventEmitter) => { } function parseWithBigInt(json) { - //console.log('parseWithBigInt', json) + const result = JSON.parse(json, (key, value) => { + if (typeof value === 'string' && /^\d+n?$/.test(value)) { + return BigInt(value.endsWith('n') ? value.slice(0, -1) : value) + } + return value + }) + return result try { return cbor.decode(json) } catch (e) { diff --git a/apps/remixdesktop/yarn.lock b/apps/remixdesktop/yarn.lock index 70015cf3000..6d559d01b2d 100644 --- a/apps/remixdesktop/yarn.lock +++ b/apps/remixdesktop/yarn.lock @@ -1208,6 +1208,11 @@ resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== +"@types/json-bigint@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/json-bigint/-/json-bigint-1.0.4.tgz#250d29e593375499d8ba6efaab22d094c3199ef3" + integrity sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag== + "@types/json-schema@^7.0.8": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -4660,6 +4665,13 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" diff --git a/libs/remix-lib/src/execution/txRunnerWeb3.ts b/libs/remix-lib/src/execution/txRunnerWeb3.ts index b2c46feff45..03d70f37a88 100644 --- a/libs/remix-lib/src/execution/txRunnerWeb3.ts +++ b/libs/remix-lib/src/execution/txRunnerWeb3.ts @@ -39,6 +39,7 @@ export class TxRunnerWeb3 { let currentDateTime = new Date(); const start = currentDateTime.getTime() / 1000 const cb = (err, resp) => { + console.log('transactionBroadcasted', resp, err) if (err) { return callback(err, resp) } @@ -46,6 +47,7 @@ export class TxRunnerWeb3 { const listenOnResponse = () => { // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve, reject) => { + console.log('waiting for receipt from IDE') const receipt = await tryTillReceiptAvailable(resp, this.getWeb3()) tx = await tryTillTxAvailable(resp, this.getWeb3()) currentDateTime = new Date(); @@ -79,7 +81,9 @@ export class TxRunnerWeb3 { ) } else { try { + console.log('sending transaction') const res = await this.getWeb3().eth.sendTransaction(tx, null, { checkRevertBeforeSending: false, ignoreGasPricing: true }) + console.log('transaction success', res) cb(null, res.transactionHash) } catch (e) { if (!e.message) e.message = '' diff --git a/package.json b/package.json index 0ce3181ab6d..16af79719a8 100644 --- a/package.json +++ b/package.json @@ -168,6 +168,7 @@ "isomorphic-git": "^1.25.7", "jquery": "^3.3.1", "js-yaml": "^4.1.0", + "json-bigint": "^1.0.0", "jspdf": "^2.5.1", "jszip": "^3.6.0", "just-once": "^2.2.0", @@ -263,6 +264,7 @@ "@types/express-ws": "^3.0.1", "@types/fs-extra": "^9.0.1", "@types/isomorphic-git__lightning-fs": "^4.4.2", + "@types/json-bigint": "^1.0.4", "@types/lodash": "^4.14.172", "@types/mocha": "^9.1.1", "@types/node": "18.16.1", diff --git a/yarn.lock b/yarn.lock index deda27a7b7c..e71734fc30c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7520,6 +7520,11 @@ resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" integrity sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg== +"@types/json-bigint@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/json-bigint/-/json-bigint-1.0.4.tgz#250d29e593375499d8ba6efaab22d094c3199ef3" + integrity sha512-ydHooXLbOmxBbubnA7Eh+RpBzuaIiQjh8WGJYQB50JFGFrdxW7JzVlyEV7fAXw0T2sqJ1ysTneJbiyNLqZRAag== + "@types/json-schema@^7.0.8": version "7.0.9" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" @@ -20053,6 +20058,13 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + json-buffer@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" From 1fed8e588eb9a0e442716dfa8fed378ba9d7808e Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 14 Jan 2025 07:50:59 +0100 Subject: [PATCH 47/58] disable brave wallet --- .../src/app/components/DesktopClientUI.tsx | 112 ++++++++++-------- .../src/app/plugins/desktop-client.tsx | 8 +- apps/remix-ide/src/app/udapp/run-tab.tsx | 2 +- 3 files changed, 67 insertions(+), 55 deletions(-) diff --git a/apps/remix-ide/src/app/components/DesktopClientUI.tsx b/apps/remix-ide/src/app/components/DesktopClientUI.tsx index e82d01ae494..7df3342c50b 100644 --- a/apps/remix-ide/src/app/components/DesktopClientUI.tsx +++ b/apps/remix-ide/src/app/components/DesktopClientUI.tsx @@ -1,48 +1,70 @@ -import React, { useContext, useEffect } from 'react'; -import { AppContext, appActionTypes } from '@remix-ui/app'; -import { Provider } from '../../blockchain/blockchain'; -import { providerLogos } from '../udapp/run-tab'; -import { desktopConnection } from '@remix-api'; +import React, { useContext, useEffect } from 'react' +import { AppContext, appActionTypes } from '@remix-ui/app' +import { Provider } from '../../blockchain/blockchain' +import { providerLogos } from '../udapp/run-tab' +import { desktopConnection } from '@remix-api' +import { set } from 'lodash' interface DesktopClientState { - connected: desktopConnection; - providers: Provider[]; - disableconnect: boolean; - currentContext: string; + connected: desktopConnection + providers: Provider[] + disableconnect: boolean + currentContext: string } const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => void } & { onConnect: (providerName: Provider) => void }) => { - const appContext = useContext(AppContext); - const { connected, providers, onConnect, disableconnect, currentContext } = props; - const [title, setTitle] = React.useState('Connecting...'); + const appContext = useContext(AppContext) + const { connected, providers, onConnect, disableconnect, currentContext } = props + const [title, setTitle] = React.useState('Connecting...') + const [disabled, setDisabled] = React.useState(false) + const [hasMetamask, setHasMetamask] = React.useState(false) + const [hasBrave, setHasBrave] = React.useState(false) useEffect(() => { - console.log('connected', props.connected); + console.log('connected', props.connected) appContext.appStateDispatch({ type: appActionTypes.setConnectedToDesktop, payload: props.connected, - }); + }) appContext.appStateDispatch({ type: appActionTypes.setShowPopupPanel, payload: false, - }); - }, [props.connected]); + }) + }, [props.connected]) useEffect(() => { - console.log('providers', props.providers); - const metamaskProvider = providers.find(provider => provider.name.toLowerCase().includes('metamask')); - const braveProvider = providers.find(provider => provider.name.toLowerCase().includes('brave')); + console.log('providers', props.providers) + const metamaskProvider = providers.find((provider) => provider.name.toLowerCase().includes('metamask')) + const braveProvider = providers.find((provider) => provider.name.toLowerCase().includes('brave')) + setHasMetamask(!!metamaskProvider) + setHasBrave(!!braveProvider) - if (metamaskProvider && braveProvider) { - setTitle('Metamask and Brave Wallet for Remix Desktop'); - } else if (metamaskProvider) { - setTitle('Metamask for Remix Desktop'); - } else if (braveProvider) { - setTitle('Brave Wallet for Remix Desktop'); + }, [providers]) + + useEffect(() => { + if (hasMetamask) { + setTitle('Connect to MetaMask') + setDisabled(false) + } else if (hasBrave && !hasMetamask) { + setTitle('Brave Wallet is not supported') + setDisabled(true) } else { - setTitle('Connecting...'); + setTitle('Connecting...') } - },[providers]); + },[hasMetamask, hasBrave]) + + if (disabled) { + return ( +
+
+

{title}

+

+ The Brave Wallet is not supported at this time. +

+
+
+ ) + } return (
@@ -51,7 +73,10 @@ const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => voi

1. Connect to your favorite Ethereum wallet provider

2. Go back to the Remix Desktop application -

3. Deploy using 'MetaMask/Brave Wallet' +

3. Deploy using 'MetaMask Wallet' + {hasBrave &&

+ Note: Brave Wallet is not supported. +
}

@@ -59,33 +84,16 @@ const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => voi
{providers && providers.length > 0 ? ( providers - .filter((provider) => provider.isInjected) + .filter((provider) => provider.isInjected && provider.name.toLocaleLowerCase().includes('metamask')) .map((provider, index) => (
-
- {providerLogos[provider.name] && - providerLogos[provider.name].map((logo, index) => ( - - ))} -
+
{providerLogos[provider.name] && providerLogos[provider.name].map((logo, index) => )}
{provider.displayName}

{provider.description}

-
@@ -101,7 +109,7 @@ const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => voi
- ); -}; + ) +} -export default DesktopClientUI; \ No newline at end of file +export default DesktopClientUI diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index 2792cb53c01..86c24a7635c 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -210,7 +210,7 @@ export class DesktopClient extends ViewPlugin { console.log('Sending message to web3:', parsed) } - let receipt + if (parsed.method === 'eth_getTransactionReceipt') { console.log('Getting receipt for', parsed.params) let receipt = await this.tryTillReceiptAvailable(parsed.params[0]) @@ -233,7 +233,11 @@ export class DesktopClient extends ViewPlugin { if (parsed.method === 'eth_sendTransaction') { console.log('Sending result back to server', result) } - this.ws.send(stringifyWithBigInt(result)) + if (parsed.method === 'net_version' && result.result === 1337) { + console.log('Sending result back to server', result, this.blockchain.executionContext) + }else{ + this.ws.send(stringifyWithBigInt(result)) + } } } diff --git a/apps/remix-ide/src/app/udapp/run-tab.tsx b/apps/remix-ide/src/app/udapp/run-tab.tsx index 02c890d65a6..20b23e5dfc8 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.tsx +++ b/apps/remix-ide/src/app/udapp/run-tab.tsx @@ -318,7 +318,7 @@ export class RunTab extends ViewPlugin { if (isElectron()) { // desktop host - await addProvider(12, 'desktopHost', 'Metamask/Brave Wallet', false, false, false) + await addProvider(5, 'desktopHost', 'Metamask Wallet', false, false, false) } // external provider From 8af12fe8785cf11c0270064cb2d7647917b2bda1 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 14 Jan 2025 09:44:32 +0100 Subject: [PATCH 48/58] add simple test --- .../src/app/components/DesktopClientUI.tsx | 2 +- .../src/app/plugins/desktop-client.tsx | 7 ++ apps/remixdesktop/src/plugins/desktopHost.ts | 1 + .../test/tests/app/metamask.test.ts | 64 +++++++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 apps/remixdesktop/test/tests/app/metamask.test.ts diff --git a/apps/remix-ide/src/app/components/DesktopClientUI.tsx b/apps/remix-ide/src/app/components/DesktopClientUI.tsx index 7df3342c50b..cd4450db244 100644 --- a/apps/remix-ide/src/app/components/DesktopClientUI.tsx +++ b/apps/remix-ide/src/app/components/DesktopClientUI.tsx @@ -92,7 +92,7 @@ const DesktopClientUI = (props: DesktopClientState & { openDesktopApp: () => voi
{providerLogos[provider.name] && providerLogos[provider.name].map((logo, index) => )}
{provider.displayName}

{provider.description}

-
diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index 86c24a7635c..aecea64f9a0 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -235,9 +235,16 @@ export class DesktopClient extends ViewPlugin { } if (parsed.method === 'net_version' && result.result === 1337) { console.log('Sending result back to server', result, this.blockchain.executionContext) + console.log(this.state.providers) + if(this.state.providers.length === 0) { // if no providers are available, send the VM context + this.ws.send(stringifyWithBigInt(result)) + } + }else{ this.ws.send(stringifyWithBigInt(result)) } + + } } diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 3dd3137412c..1319df29243 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -73,6 +73,7 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { async init() { console.log('initializing destkophost plugin...') + if (!isConnected) await shell.openExternal(`http://localhost:${ports.http_port}/?activate=udapp,desktopClient&desktopClientPort=${ports.websocket_port}`) // wait for the connection diff --git a/apps/remixdesktop/test/tests/app/metamask.test.ts b/apps/remixdesktop/test/tests/app/metamask.test.ts new file mode 100644 index 00000000000..97f2d0b67bf --- /dev/null +++ b/apps/remixdesktop/test/tests/app/metamask.test.ts @@ -0,0 +1,64 @@ +import { result } from 'lodash' +import { NightwatchBrowser } from 'nightwatch' + +const tests = { + before: function (browser: NightwatchBrowser, done: VoidFunction) { + done() + }, + 'open default template': function (browser: NightwatchBrowser) { + browser + .waitForElementVisible('*[data-id="remixIdeIconPanel"]', 10000) + .waitForElementVisible('button[data-id="landingPageImportFromTemplate"]') + .click('button[data-id="landingPageImportFromTemplate"]') + .waitForElementPresent('*[data-id="create-remixDefault"]') + .scrollAndClick('*[data-id="create-remixDefault"]') + .waitForElementVisible('*[data-id="modalDialogCustomPromptTextCreate"]') + .waitForElementPresent('[data-id="TemplatesSelectionModalDialogContainer-react"] .modal-ok') + .click('[data-id="TemplatesSelectionModalDialogContainer-react"] .modal-ok') + .pause(3000) + .windowHandles(function (result) { + console.log(result.value) + browser + .switchWindow(result.value[1]) + .waitForElementVisible('*[data-id="treeViewLitreeViewItemtests"]') + .click('*[data-id="treeViewLitreeViewItemtests"]') + .waitForElementVisible('*[data-id="treeViewLitreeViewItemcontracts"]') + .click('*[data-id="treeViewLitreeViewItemcontracts"]') + .waitForElementVisible('[data-id="treeViewLitreeViewItemcontracts/1_Storage.sol"]') + .openFile('contracts/1_Storage.sol') + .waitForElementVisible('*[id="editorView"]', 10000) + .getEditorValue((content) => { + browser.assert.ok(content.includes('function retrieve() public view returns (uint256){')) + }) + }) + }, + 'connect to Wallet': function (browser: NightwatchBrowser) { + browser + .clickLaunchIcon('udapp') + .waitForElementVisible('[data-id="settingsSelectEnvOptions"]') + .click('[data-id="settingsSelectEnvOptions"] button') + .waitForElementVisible(`[data-id="dropdown-item-desktopHost"]`) + .click('[data-id="dropdown-item-desktopHost"]') // close the dropdown + .waitForElementVisible({ + locateStrategy: 'xpath', + selector: '//*[@data-id="settingsNetworkEnv" and contains(.,"1337")]', + }) + .clickLaunchIcon('solidity') + .click('*[data-id="compilerContainerCompileBtn"]') + .pause(2000) + .clickLaunchIcon('udapp') + .waitForElementVisible('*[data-id="Deploy - transact (not payable)"]', 45000) // wait for the contract to compile + .pause(2000) + .click('*[data-id="Deploy - transact (not payable)"]') + .waitForElementPresent('*[data-id="universalDappUiContractActionWrapper"]', 60000) + .clickInstance(0) + .clickFunction('store - transact (not payable)', { types: 'uint256 num', values: '10' }) + .clickFunction('retrieve - call') + .waitForElementContainsText('[data-id="treeViewLi0"]', 'uint256: 10') + .pause() + }, +} + +module.exports = { + ...tests, +} From 35e27f520442739cb291ffaf45b7a74e67ae3c90 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Tue, 14 Jan 2025 09:58:13 +0100 Subject: [PATCH 49/58] test --- apps/remixdesktop/test/tests/app/metamask.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/remixdesktop/test/tests/app/metamask.test.ts b/apps/remixdesktop/test/tests/app/metamask.test.ts index 97f2d0b67bf..bcc0777690d 100644 --- a/apps/remixdesktop/test/tests/app/metamask.test.ts +++ b/apps/remixdesktop/test/tests/app/metamask.test.ts @@ -1,4 +1,3 @@ -import { result } from 'lodash' import { NightwatchBrowser } from 'nightwatch' const tests = { From 989576d1fb84bf4c35df35bc6cb11fd327109c9a Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Thu, 23 Jan 2025 12:57:18 +0100 Subject: [PATCH 50/58] debugging --- apps/remixdesktop/src/plugins/desktopHost.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 1319df29243..3fd6f1d6459 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -4,7 +4,14 @@ import { handleRequest, startHostServer } from "../lib/server" import EventEmitter from "events" import { ipcMain, shell } from "electron" import { RequestArguments } from "../types" +import fs from 'fs' +import path from 'path' + +const logFilePath = path.join(__dirname, 'desktopHost.log') +console.log('logFilePath', logFilePath) +// Create or clear the log file +fs.writeFileSync(logFilePath, '', { flag: 'w' }) const profile = { displayName: 'desktopHost', name: 'desktopHost', @@ -72,7 +79,7 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { } async init() { - console.log('initializing destkophost plugin...') + console.log('initializing destkophost plugin...', this.webContentsId) if (!isConnected) await shell.openExternal(`http://localhost:${ports.http_port}/?activate=udapp,desktopClient&desktopClientPort=${ports.websocket_port}`) @@ -90,9 +97,15 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { } async sendAsync(data: RequestArguments) { - //console.log('SEND ASYNC', data) + //console.log('SEND ASYNC', data, this.webContentsId) const result = await handleRequest(data, eventEmitter) - //console.log('RESULT from handleRequest', data, result) + console.log('RESULT from handleRequest', data, this.webContentsId, result) + + const logEntry = ` + Request: ${JSON.stringify(data, (key, value) => typeof value === 'bigint' ? value.toString() : value, 2)} + Result: ${JSON.stringify(result, (key, value) => typeof value === 'bigint' ? value.toString() : value, 2)} + ` + fs.appendFileSync(logFilePath, logEntry) return result } } \ No newline at end of file From cfbc3ce1cd214d5dcd32b47fd5f34f161ef30e9a Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 24 Jan 2025 09:44:47 +0100 Subject: [PATCH 51/58] lint --- apps/remix-ide/src/app/plugins/desktop-client.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index aecea64f9a0..c1fcf873133 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -210,7 +210,6 @@ export class DesktopClient extends ViewPlugin { console.log('Sending message to web3:', parsed) } - if (parsed.method === 'eth_getTransactionReceipt') { console.log('Getting receipt for', parsed.params) let receipt = await this.tryTillReceiptAvailable(parsed.params[0]) @@ -236,15 +235,14 @@ export class DesktopClient extends ViewPlugin { if (parsed.method === 'net_version' && result.result === 1337) { console.log('Sending result back to server', result, this.blockchain.executionContext) console.log(this.state.providers) - if(this.state.providers.length === 0) { // if no providers are available, send the VM context + if (this.state.providers.length === 0) { // if no providers are available, send the VM context this.ws.send(stringifyWithBigInt(result)) } - }else{ + } else { this.ws.send(stringifyWithBigInt(result)) } - - + } } From 0563f4ae2559b33bfcc076eaced0422c0875785b Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 24 Jan 2025 10:00:53 +0100 Subject: [PATCH 52/58] debugging --- apps/remix-ide/src/app/plugins/desktop-client.tsx | 1 + apps/remixdesktop/src/plugins/desktopHost.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index c1fcf873133..ca5da12d9b6 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -240,6 +240,7 @@ export class DesktopClient extends ViewPlugin { } } else { + console.log('Sending result back to server', result) this.ws.send(stringifyWithBigInt(result)) } diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 3fd6f1d6459..dfa3e26aa8e 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -99,9 +99,9 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { async sendAsync(data: RequestArguments) { //console.log('SEND ASYNC', data, this.webContentsId) const result = await handleRequest(data, eventEmitter) - console.log('RESULT from handleRequest', data, this.webContentsId, result) const logEntry = ` + webContentsId: ${this.webContentsId} Request: ${JSON.stringify(data, (key, value) => typeof value === 'bigint' ? value.toString() : value, 2)} Result: ${JSON.stringify(result, (key, value) => typeof value === 'bigint' ? value.toString() : value, 2)} ` From 47d6a8e6448c5e937a9b6b2807035b6c53d3c402 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Fri, 24 Jan 2025 10:07:33 +0100 Subject: [PATCH 53/58] fix server --- apps/remixdesktop/src/lib/server.ts | 253 +++++++++++-------- apps/remixdesktop/src/plugins/desktopHost.ts | 135 +++++----- 2 files changed, 208 insertions(+), 180 deletions(-) diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index bb332300f94..2885962a629 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -9,111 +9,139 @@ import cbor from 'cbor' import { findAvailablePort } from '../utils/portFinder' import { isPackaged } from '../main' import { isE2ELocal } from '../main' -import JSONbig from 'json-bigint' -// Forwarding WebSocket client -let connectedWebSocket: WebSocket | null = null - -// Handle incoming JSON-RPC requests and forward to WebSocket client -export const handleRequest = async (jsonRpcPayload: RequestArguments, eventEmitter: EventEmitter): Promise => { - if (!connectedWebSocket || connectedWebSocket.readyState !== WebSocket.OPEN) { - throw new Error('No active WebSocket connection to forward request') +// We will hold onto the pending requests here. +// Key: The request ID; Value: an object containing { resolve, reject, method } +const pendingRequests: Record< + number | string, + { + resolve: (value: any) => void + reject: (reason: any) => void + method?: string } +> = {} - // Send the payload to the WebSocket client and wait for response - return new Promise((resolve, reject) => { - const timeout = setTimeout(() => reject(new Error('Timeout waiting for WebSocket response')), 240000) // 10 seconds timeout +let connectedWebSocket: WebSocket | null = null - connectedWebSocket && - connectedWebSocket.once('message', async (data: any) => { - if (Buffer.isBuffer(data)) { - data = data.toString('utf-8'); - } +// ------------------------- +// Single top-level message handler +// ------------------------- +function setupMessageHandler(ws: WebSocket, eventEmitter: EventEmitter) { + ws.on('message', (data: Buffer | string) => { + if (Buffer.isBuffer(data)) { + data = data.toString('utf8') + } - //console.log('received message from WebSocket ONCE client:', data); + let parsed: { id: any; error: any; result: any; type: string | symbol; payload: any } + try { + parsed = parseWithBigInt(data) + } catch (err) { + console.error('Could not parse incoming WebSocket message:', err) + return + } - clearTimeout(timeout) - try { - //console.log('received message from WebSocket ONCE client:', data) - const response = parseWithBigInt(data) - //console.log('received message from WebSocket ONCE client:', response) - if (response.id === jsonRpcPayload.id) { - if (jsonRpcPayload.method === 'eth_sendTransaction' || jsonRpcPayload.method === 'eth_getTransactionReceipt') { - console.log('response from WebSocket client:', data, response) - eventEmitter.emit('focus') - } - if (response.error) { - const error = { data: response.error } - if (error.data && error.data.originalError && error.data.originalError.data) { - resolve({ - jsonrpc: '2.0', - error: error.data.originalError, - id: response.id, - }) - } else if (error.data && error.data.message) { - resolve({ - jsonrpc: '2.0', - error: error.data && error.data, - id: response.id, - }) - } else { - resolve({ - jsonrpc: '2.0', - error, - id: response.id, - }) - } - } else { - if (jsonRpcPayload.method === 'eth_sendTransaction' || jsonRpcPayload.method === 'eth_getTransactionReceipt') { - //console.log('resolve response from WebSocket client:', jsonRpcPayload.method, response) - // if(jsonRpcPayload.method === 'eth_getTransactionReceipt'){ - // response.result = JSON.parse(response.result) - // } - } - resolve(response.result) - } + // If the message has an 'id', try to find a pending request + if (typeof parsed?.id !== 'undefined') { + const requestId = parsed.id + const pendingReq = pendingRequests[requestId] + if (pendingReq) { + // Found a matching pending request. + // Clear it from the queue to avoid memory leak + delete pendingRequests[requestId] + + // If there's an error in the response + if (parsed.error) { + const errorObj = { data: parsed.error } + // Your same logic as before + if (errorObj.data && errorObj.data.originalError) { + pendingReq.resolve({ + jsonrpc: '2.0', + error: errorObj.data.originalError, + id: parsed.id, + }) + } else if (errorObj.data && errorObj.data.message) { + pendingReq.resolve({ + jsonrpc: '2.0', + error: errorObj.data, + id: parsed.id, + }) } else { - //console.log('ignore response from WebSocket client:', data) - //reject(new Error('Invalid response ID')); + pendingReq.resolve({ + jsonrpc: '2.0', + error: errorObj, + id: parsed.id, + }) } - } catch (error) { - //console.log('REJECT error response from WebSocket client:', error) - reject(error) + } else { + // No error; resolve with result + pendingReq.resolve(parsed.result) } - }) + } else { + // If there's no matching pending request, you can decide to ignore or handle differently + // console.log('No pending request matches id', requestId, parsed) + } + } else if (parsed?.type) { + // Possibly a "notification" or event-based message + // that doesn't match a pending JSON-RPC request + eventEmitter.emit(parsed.type, parsed.payload) + } + }) +} - connectedWebSocket && - connectedWebSocket.send(JSON.stringify(jsonRpcPayload), (err) => { +// ------------------------- +// The request forwarder +// ------------------------- +export const handleRequest = async ( + jsonRpcPayload: RequestArguments, + eventEmitter: EventEmitter +): Promise => { + if (!connectedWebSocket || connectedWebSocket.readyState !== WebSocket.OPEN) { + throw new Error('No active WebSocket connection to forward request') + } + + const requestId = jsonRpcPayload.id + + return new Promise((resolve, reject) => { + // Store references in our pendingRequests map + pendingRequests[requestId] = { resolve, reject, method: jsonRpcPayload.method } + + // Optional: You can start a request-specific timeout here + // to reject the request if it doesn't resolve in time. + const timeout = setTimeout(() => { + // If it times out, remove from pendingRequests. + delete pendingRequests[requestId] + reject(new Error('Timeout waiting for WebSocket response')) + }, 240000) // 4-min timeout or whatever you prefer + + connectedWebSocket.send(JSON.stringify(jsonRpcPayload), (err) => { + if (err) { + delete pendingRequests[requestId] + clearTimeout(timeout) + reject(err) + } else { + // If you want to log for specific methods: if (jsonRpcPayload.method === 'eth_sendTransaction' || jsonRpcPayload.method === 'eth_getTransactionReceipt') { - console.log('sent message to WebSocket client:', jsonRpcPayload) - } - if (err) { - clearTimeout(timeout) - reject(err) + console.log('Sent message to WebSocket client:', jsonRpcPayload) } - }) + } + }) }) } export const startHostServer = async (eventEmitter: EventEmitter) => { let http_port = await findAvailablePort([49589]) const websocket_port = await findAvailablePort([49588]) + // Create an Express server const startServer = () => { const server = express() - - // Serve static files from the 'remix-ide' directory const remixPath = path.join(__dirname, 'remix-ide') server.use(express.static(remixPath)) - console.log('remixPath', remixPath) - - // Serve 'index.html' at the root route server.get('/', (req, res) => { res.sendFile(path.join(remixPath, 'index.html')) }) - // Start the server const httpServer = http.createServer(server) httpServer.listen(http_port, () => { const address = httpServer.address() @@ -121,59 +149,58 @@ export const startHostServer = async (eventEmitter: EventEmitter) => { console.log(`Server started at ${address}`) } else if (address && address.port) { console.log(`Server started at http://localhost:${address.port}`) - } else { } }) return httpServer } + // Create the WebSocket server const wsServer = new WebSocketServer({ port: websocket_port }) - wsServer.on('connection', (ws) => { console.log('WebSocket client connected') - if (connectedWebSocket?.OPEN) { + + // If we already have a connected client, close the new one + if (connectedWebSocket && connectedWebSocket.readyState === WebSocket.OPEN) { ws.send(JSON.stringify({ type: 'error', payload: 'ALREADY_CONNECTED' })) ws.close(1000, 'Another client connected') return - //console.log(connectedWebSocket.url) - } else { + } else if (connectedWebSocket) { try { + // Clean up any leftover listeners connectedWebSocket.removeAllListeners() - } catch (e) {} + } catch (_) {} } connectedWebSocket = ws eventEmitter.emit('connected', true) - connectedWebSocket.on('message', (data: any) => { - if (Buffer.isBuffer(data)) { - data = data.toString('utf-8'); - } - const response = parseWithBigInt(data) - if (response && response.type) { - //console.log('received message from WebSocket client:', response) - eventEmitter.emit(response.type, response.payload) - } - }) + // Important: Use a single on('message') listener for all requests + setupMessageHandler(ws, eventEmitter) connectedWebSocket.on('close', () => { - //console.log('WebSocket client disconnected'); + console.log('WebSocket client disconnected') connectedWebSocket = null eventEmitter.emit('connected', false) + // Optionally clean up pendingRequests or handle them as errors + // for (const requestId in pendingRequests) { + // pendingRequests[requestId].reject(new Error('WebSocket closed')) + // delete pendingRequests[requestId] + // } }) connectedWebSocket.on('error', (error) => { - //console.error('WebSocket error:', error.message); + console.error('WebSocket error:', error) connectedWebSocket = null eventEmitter.emit('connected', false) }) }) - console.log(`WebSocket server running on ws://localhost:` + JSON.stringify((wsServer.address() as any).port)) + console.log(`WebSocket server running on ws://localhost:${(wsServer.address() as any).port}`) if ((process.env.NODE_ENV === 'production' || isPackaged) && !isE2ELocal) { startServer() } else { + // For local dev, maybe keep using port 8080 http_port = 8080 } @@ -183,21 +210,23 @@ export const startHostServer = async (eventEmitter: EventEmitter) => { } } -function parseWithBigInt(json) { - const result = JSON.parse(json, (key, value) => { - if (typeof value === 'string' && /^\d+n?$/.test(value)) { - return BigInt(value.endsWith('n') ? value.slice(0, -1) : value) - } - return value - }) - return result +function parseWithBigInt(json: string) { + // You can unify your approach here, either JSON.parse or try cbor first: try { - return cbor.decode(json) - } catch (e) { - console.log('parseWithBigInt error', e, json) - console.log('parseWithBigInt error', e) - return {} + // Attempt JSON parse with BigInt + return JSON.parse(json, (key, value) => { + if (typeof value === 'string' && /^\d+n?$/.test(value)) { + return BigInt(value.endsWith('n') ? value.slice(0, -1) : value) + } + return value + }) + } catch (jsonErr) { + // fallback to cbor if you like: + try { + return cbor.decode(json) + } catch (cborErr) { + console.log('parseWithBigInt error', cborErr, json) + return {} + } } - console.log('parseWithBigInt', json) - return JSON.parse(json, (key, value) => (typeof value === 'string' && /^\d+n?$/.test(value) ? BigInt(value) : value)) -} +} \ No newline at end of file diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index dfa3e26aa8e..96d58a6f4f0 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -7,15 +7,14 @@ import { RequestArguments } from "../types" import fs from 'fs' import path from 'path' - const logFilePath = path.join(__dirname, 'desktopHost.log') console.log('logFilePath', logFilePath) // Create or clear the log file fs.writeFileSync(logFilePath, '', { flag: 'w' }) const profile = { - displayName: 'desktopHost', - name: 'desktopHost', - description: 'desktopHost', + displayName: 'desktopHost', + name: 'desktopHost', + description: 'desktopHost', } const eventEmitter = new EventEmitter() @@ -27,85 +26,85 @@ let ports: { } export class DesktopHostPlugin extends ElectronBasePlugin { - clients: DesktopHostPluginClient[] = [] - constructor() { - super(profile, clientProfile, DesktopHostPluginClient) - this.methods = [...super.methods] - this.startServer() - eventEmitter.on('connected', (payload) => { - console.log('connected', payload) - isConnected = payload - if (!isConnected) { - for (const client of this.clients) { - client.disconnect() - } - } - }) - eventEmitter.on('focus', () => { - console.log('focus') - ipcMain.emit('focus-window', 0) - }) - eventEmitter.on('contextChanged', (context) => { - console.log('contextChanged', context) - for (const client of this.clients) { - client.emit('chainChanged', context) - } - }) - } + clients: DesktopHostPluginClient[] = [] + constructor() { + super(profile, clientProfile, DesktopHostPluginClient) + this.methods = [...super.methods] + this.startServer() + eventEmitter.on('connected', (payload) => { + console.log('connected', payload) + isConnected = payload + if (!isConnected) { + for (const client of this.clients) { + client.disconnect() + } + } + }) + eventEmitter.on('focus', () => { + console.log('focus') + ipcMain.emit('focus-window', 0) + }) + eventEmitter.on('contextChanged', (context) => { + console.log('contextChanged', context) + for (const client of this.clients) { + client.emit('chainChanged', context) + } + }) + } - async startServer(): Promise { - console.log('desktopHost activated') - ports = await startHostServer(eventEmitter) - console.log('desktopHost server started', ports) - } + async startServer(): Promise { + console.log('desktopHost activated') + ports = await startHostServer(eventEmitter) + console.log('desktopHost server started', ports) + } } const clientProfile: Profile = { - name: 'desktopHost', - displayName: 'desktopHost', - description: 'desktopHost', - methods: ['getIsConnected', 'sendAsync', 'init'], - kind: 'provider', + name: 'desktopHost', + displayName: 'desktopHost', + description: 'desktopHost', + methods: ['getIsConnected', 'sendAsync', 'init'], + kind: 'provider', } export class DesktopHostPluginClient extends ElectronBasePluginClient { - constructor(webContentsId: number, profile: Profile) { - super(webContentsId, profile) - } + constructor(webContentsId: number, profile: Profile) { + super(webContentsId, profile) + } - getIsConnected() { - console.log('getIsConnected', isConnected) - return isConnected - } + getIsConnected() { + console.log('getIsConnected', isConnected) + return isConnected + } - async init() { - console.log('initializing destkophost plugin...', this.webContentsId) - - if (!isConnected) - await shell.openExternal(`http://localhost:${ports.http_port}/?activate=udapp,desktopClient&desktopClientPort=${ports.websocket_port}`) - // wait for the connection - while (!isConnected) { - await new Promise(resolve => setTimeout(resolve, 1000)) - } - } + async init() { + console.log('initializing destkophost plugin...', this.webContentsId) - async disconnect() { - this.call('notification' as any, 'alert', { - id: 'Connection lost', - message: 'You have been disconnected from Remix on the web. Please select another environment for deploy & run.', - }) + if (!isConnected) + await shell.openExternal(`http://localhost:${ports.http_port}/?activate=udapp,desktopClient&desktopClientPort=${ports.websocket_port}`) + // wait for the connection + while (!isConnected) { + await new Promise(resolve => setTimeout(resolve, 1000)) } + } - async sendAsync(data: RequestArguments) { - //console.log('SEND ASYNC', data, this.webContentsId) - const result = await handleRequest(data, eventEmitter) + async disconnect() { + this.call('notification' as any, 'alert', { + id: 'Connection lost', + message: 'You have been disconnected from Remix on the web. Please select another environment for deploy & run.', + }) + } - const logEntry = ` + async sendAsync(data: RequestArguments) { + //console.log('SEND ASYNC', data, this.webContentsId) + const result = await handleRequest(data, eventEmitter) + + const logEntry = ` webContentsId: ${this.webContentsId} Request: ${JSON.stringify(data, (key, value) => typeof value === 'bigint' ? value.toString() : value, 2)} Result: ${JSON.stringify(result, (key, value) => typeof value === 'bigint' ? value.toString() : value, 2)} ` - fs.appendFileSync(logFilePath, logEntry) - return result - } + fs.appendFileSync(logFilePath, logEntry) + return result + } } \ No newline at end of file From 659c6a3cb60b01b31e2d7273d63f6ab5b6d0a3ee Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Mon, 27 Jan 2025 09:22:36 +0100 Subject: [PATCH 54/58] fix bugs --- .../src/app/plugins/desktop-client.tsx | 29 ++++++---- apps/remix-ide/src/app/udapp/run-tab.tsx | 2 +- apps/remixdesktop/src/lib/server.ts | 1 + apps/remixdesktop/src/main.ts | 16 +++--- apps/remixdesktop/src/plugins/desktopHost.ts | 54 +++++++++++++++++-- .../run-tab/src/lib/actions/events.ts | 6 +++ 6 files changed, 84 insertions(+), 24 deletions(-) diff --git a/apps/remix-ide/src/app/plugins/desktop-client.tsx b/apps/remix-ide/src/app/plugins/desktop-client.tsx index ca5da12d9b6..4455e081d48 100644 --- a/apps/remix-ide/src/app/plugins/desktop-client.tsx +++ b/apps/remix-ide/src/app/plugins/desktop-client.tsx @@ -140,6 +140,13 @@ export class DesktopClient extends ViewPlugin { } } + async isInjected() { + const executionContext = this.blockchain.executionContext.executionContext + const currentProvider = this.state.providers.find((provider) => provider.name === executionContext) + console.log('isInjected', currentProvider) + this.ws.send(stringifyWithBigInt({ type: 'isInjected', payload: currentProvider.isInjected })) + } + async openDesktopApp() { console.log('openDesktopApp') this.ws.send(stringifyWithBigInt({ type: 'focus', payload: null })) @@ -183,7 +190,7 @@ export class DesktopClient extends ViewPlugin { this.ws.onmessage = async (event) => { const parsed = JSON.parse(event.data) - console.log('Message from server:', parsed.method) + console.log('Message from server:', parsed.method, parsed.id) if (parsed && parsed.type === 'error') { if (parsed.payload === 'ALREADY_CONNECTED') { console.log('ALREADY_CONNECTED') @@ -228,21 +235,23 @@ export class DesktopClient extends ViewPlugin { ) } else { const provider = this.blockchain.web3().currentProvider + await this.isInjected() let result = await provider.sendAsync(parsed) if (parsed.method === 'eth_sendTransaction') { console.log('Sending result back to server', result) } - if (parsed.method === 'net_version' && result.result === 1337) { - console.log('Sending result back to server', result, this.blockchain.executionContext) - console.log(this.state.providers) - if (this.state.providers.length === 0) { // if no providers are available, send the VM context - this.ws.send(stringifyWithBigInt(result)) - } - - } else { + // if (parsed.method === 'net_version' && result.result === 1337) { + // console.log('incoming net_version', result) + // console.log('Sending result back to server', result, this.blockchain.executionContext) + // console.log(this.state.providers) + // if (this.state.providers.length === 0) { // if no providers are available, send the VM context + // this.ws.send(stringifyWithBigInt(result)) + // } + + // } else { console.log('Sending result back to server', result) this.ws.send(stringifyWithBigInt(result)) - } + //} } } diff --git a/apps/remix-ide/src/app/udapp/run-tab.tsx b/apps/remix-ide/src/app/udapp/run-tab.tsx index 20b23e5dfc8..03472a6a1e9 100644 --- a/apps/remix-ide/src/app/udapp/run-tab.tsx +++ b/apps/remix-ide/src/app/udapp/run-tab.tsx @@ -314,7 +314,7 @@ export class RunTab extends ViewPlugin { }) // wallet connect - await addProvider(6, 'walletconnect', 'WalletConnect', false, false, false) + await addProvider(20, 'walletconnect', 'WalletConnect', false, false, false) if (isElectron()) { // desktop host diff --git a/apps/remixdesktop/src/lib/server.ts b/apps/remixdesktop/src/lib/server.ts index 2885962a629..358dc2b0da2 100644 --- a/apps/remixdesktop/src/lib/server.ts +++ b/apps/remixdesktop/src/lib/server.ts @@ -110,6 +110,7 @@ export const handleRequest = async ( const timeout = setTimeout(() => { // If it times out, remove from pendingRequests. delete pendingRequests[requestId] + console.error('Timeout waiting for WebSocket response', jsonRpcPayload) reject(new Error('Timeout waiting for WebSocket response')) }, 240000) // 4-min timeout or whatever you prefer diff --git a/apps/remixdesktop/src/main.ts b/apps/remixdesktop/src/main.ts index 5b2376f2f05..2610f772fb7 100644 --- a/apps/remixdesktop/src/main.ts +++ b/apps/remixdesktop/src/main.ts @@ -37,7 +37,7 @@ export const createWindow = async (dir?: string): Promise => { // reize factor let resizeFactor = 0.8 // if the window is too small the size is 100% - if( screen.getPrimaryDisplay().size.width < 2560 || screen.getPrimaryDisplay().size.height < 1440) { + if (screen.getPrimaryDisplay().size.width < 2560 || screen.getPrimaryDisplay().size.height < 1440) { resizeFactor = 1 } const width = screen.getPrimaryDisplay().size.width * resizeFactor @@ -175,18 +175,16 @@ ipcMain.handle('matomo:trackEvent', async (event, data) => { } }) -ipcMain.on('focus-window', (event, windowId) => { +ipcMain.on('focus-window', (windowId: any) => { console.log('focus-window', windowId) windowSet.forEach((win: BrowserWindow) => { - //if (win.id === windowId) { - if(win.isMinimized()) { + console.log('win', win.webContents.id) + if (win.webContents.id === windowId) { + if (win.isMinimized()) { win.restore() } win.show() win.focus() - // } + } }) -}) - - - +}) \ No newline at end of file diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 96d58a6f4f0..0708bf81f15 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -21,8 +21,8 @@ const eventEmitter = new EventEmitter() let isConnected = false let ports: { - http_port: number - websocket_port: number + http_port: number + websocket_port: number } export class DesktopHostPlugin extends ElectronBasePlugin { @@ -40,6 +40,12 @@ export class DesktopHostPlugin extends ElectronBasePlugin { } } }) + eventEmitter.on('isInjected', (isInjected: boolean) => { + console.log('isInjected', isInjected) + for (const client of this.clients) { + client.setIsInjected(isInjected) + } + }) eventEmitter.on('focus', () => { console.log('focus') ipcMain.emit('focus-window', 0) @@ -68,8 +74,39 @@ const clientProfile: Profile = { } export class DesktopHostPluginClient extends ElectronBasePluginClient { + isConnected: boolean + isInjected: boolean constructor(webContentsId: number, profile: Profile) { super(webContentsId, profile) + this.isConnected = null + this.isInjected = null + } + + setIsInjected(isInjected: boolean) { + if (this.isInjected !== isInjected && isConnected) { + this.isInjected = isInjected + + if (isInjected) { + this.call('notification' as any, 'toast', 'You are now connected to Metamask!') + } else { + this.call('notification' as any, 'alert', { + title: 'Metamask Wallet', + id: isInjected ? 'Injected' : 'Not_injected', + message: isInjected ? 'You are now connected to Metamask!' : 'You are not yet connected to Metamask. Please connect to Metamask in the browser to interact with the blockchain.', + }) + } + } + } + + setIsConnected(isConnected: boolean) { + if (this.isConnected !== isConnected) { + this.isConnected = isConnected + this.call('notification' as any, 'alert', { + title: 'Connection', + id: isConnected ? 'Connected' : 'Disconnected', + message: isConnected ? 'You are now connected to Remix on the web!' : 'You have been disconnected from Remix on the web. Please select another environment for deploy & run.', + }) + } } getIsConnected() { @@ -78,7 +115,7 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { } async init() { - console.log('initializing destkophost plugin...', this.webContentsId) + console.log('SETTING UP REMOTE WEBSOCKET...', this.webContentsId) if (!isConnected) await shell.openExternal(`http://localhost:${ports.http_port}/?activate=udapp,desktopClient&desktopClientPort=${ports.websocket_port}`) @@ -86,6 +123,7 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { while (!isConnected) { await new Promise(resolve => setTimeout(resolve, 1000)) } + console.log('CONNECTED TO REMOTE WEBSOCKET', this.webContentsId) } async disconnect() { @@ -96,7 +134,14 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { } async sendAsync(data: RequestArguments) { - //console.log('SEND ASYNC', data, this.webContentsId) + if (!isConnected) { + console.log('NOT CONNECTED', this.webContentsId) + return { error: 'Not connected to the remote websocket' } + } + console.log('SEND ASYNC', data, this.webContentsId) + if (data.method === 'eth_getTransactionReceipt') { + ipcMain.emit('focus-window', this.webContentsId) + } const result = await handleRequest(data, eventEmitter) const logEntry = ` @@ -104,6 +149,7 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { Request: ${JSON.stringify(data, (key, value) => typeof value === 'bigint' ? value.toString() : value, 2)} Result: ${JSON.stringify(result, (key, value) => typeof value === 'bigint' ? value.toString() : value, 2)} ` + fs.appendFileSync(logFilePath, logEntry) return result } diff --git a/libs/remix-ui/run-tab/src/lib/actions/events.ts b/libs/remix-ui/run-tab/src/lib/actions/events.ts index 2e06963e11a..ee0fff5897e 100644 --- a/libs/remix-ui/run-tab/src/lib/actions/events.ts +++ b/libs/remix-ui/run-tab/src/lib/actions/events.ts @@ -98,6 +98,12 @@ export const setupEvents = (plugin: RunTab) => { plugin.on('truffle', 'compilationFinished', (file, source, languageVersion, data) => broadcastCompilationResult('truffle', plugin, dispatch, file, source, languageVersion, data)) + plugin.on('desktopHost', 'chainChanged', (context) => { + //console.log('desktopHost chainChanged', context) + fillAccountsList(plugin, dispatch) + updateInstanceBalance(plugin, dispatch) + }) + plugin.on('udapp', 'setEnvironmentModeReducer', (env: { context: string, fork: string }, from: string) => { plugin.call('notification', 'toast', envChangeNotification(env, from)) setExecutionContext(plugin, dispatch, env) From bab71fefca6330f2aeb0ec38bb26fa83ce12f6c2 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Mon, 27 Jan 2025 17:38:00 +0100 Subject: [PATCH 55/58] add UI --- apps/remixdesktop/src/plugins/desktopHost.ts | 32 ++++++++------ .../src/lib/types/desktopConnection.ts | 1 + .../app/src/lib/remix-app/interface/index.ts | 1 + .../app/src/lib/remix-app/state/app.ts | 3 +- .../src/lib/components/desktopStatus.tsx | 44 ++++++++++++++----- .../src/lib/remixui-statusbar-panel.tsx | 13 ++++-- 6 files changed, 64 insertions(+), 30 deletions(-) diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 0708bf81f15..76ad499febb 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -34,11 +34,6 @@ export class DesktopHostPlugin extends ElectronBasePlugin { eventEmitter.on('connected', (payload) => { console.log('connected', payload) isConnected = payload - if (!isConnected) { - for (const client of this.clients) { - client.disconnect() - } - } }) eventEmitter.on('isInjected', (isInjected: boolean) => { console.log('isInjected', isInjected) @@ -80,6 +75,10 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { super(webContentsId, profile) this.isConnected = null this.isInjected = null + eventEmitter.on('connected', async (payload) => { + console.log('CLIENT connected', payload) + isConnected = payload + }) } setIsInjected(isInjected: boolean) { @@ -87,12 +86,12 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { this.isInjected = isInjected if (isInjected) { - this.call('notification' as any, 'toast', 'You are now connected to Metamask!') + this.call('notification' as any, 'toast', 'You are now connected to Metamask!') } else { this.call('notification' as any, 'alert', { title: 'Metamask Wallet', id: isInjected ? 'Injected' : 'Not_injected', - message: isInjected ? 'You are now connected to Metamask!' : 'You are not yet connected to Metamask. Please connect to Metamask in the browser to interact with the blockchain.', + message: isInjected ? 'You are now connected to Metamask!' : 'You are not yet connected to Metamask. Please connect to Metamask in the browser.', }) } } @@ -102,13 +101,20 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { if (this.isConnected !== isConnected) { this.isConnected = isConnected this.call('notification' as any, 'alert', { - title: 'Connection', + title: 'Metamask Wallet', id: isConnected ? 'Connected' : 'Disconnected', message: isConnected ? 'You are now connected to Remix on the web!' : 'You have been disconnected from Remix on the web. Please select another environment for deploy & run.', }) } } + async disconnect() { + this.call('notification' as any, 'alert', { + id: 'Connection lost', + message: 'You have been disconnected from Remix on the web. Please select another environment for deploy & run.', + }) + } + getIsConnected() { console.log('getIsConnected', isConnected) return isConnected @@ -126,12 +132,7 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { console.log('CONNECTED TO REMOTE WEBSOCKET', this.webContentsId) } - async disconnect() { - this.call('notification' as any, 'alert', { - id: 'Connection lost', - message: 'You have been disconnected from Remix on the web. Please select another environment for deploy & run.', - }) - } + async sendAsync(data: RequestArguments) { if (!isConnected) { @@ -139,6 +140,9 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { return { error: 'Not connected to the remote websocket' } } console.log('SEND ASYNC', data, this.webContentsId) + const provider = await this.call('blockchain' as any, 'getProvider') + console.log('provider', provider) + if (data.method === 'eth_getTransactionReceipt') { ipcMain.emit('focus-window', this.webContentsId) } diff --git a/libs/remix-api/src/lib/types/desktopConnection.ts b/libs/remix-api/src/lib/types/desktopConnection.ts index 33f7db89ed5..bf6c725ca57 100644 --- a/libs/remix-api/src/lib/types/desktopConnection.ts +++ b/libs/remix-api/src/lib/types/desktopConnection.ts @@ -3,6 +3,7 @@ export const desktopConnectionType = { disconnected: 'disconnected', disabled: 'disabled', alreadyConnected: 'alreadyConnected', + connectedToInjected: 'connectedToInjected' } export type desktopConnection = typeof desktopConnectionType [keyof typeof desktopConnectionType ] \ No newline at end of file diff --git a/libs/remix-ui/app/src/lib/remix-app/interface/index.ts b/libs/remix-ui/app/src/lib/remix-app/interface/index.ts index 790a693218f..72fdfc2f0ef 100644 --- a/libs/remix-ui/app/src/lib/remix-app/interface/index.ts +++ b/libs/remix-ui/app/src/lib/remix-app/interface/index.ts @@ -54,5 +54,6 @@ export interface AppState { canUseGit: boolean showPopupPanel: boolean connectedToDesktop: desktopConnection + desktopClientConnected: desktopConnection } diff --git a/libs/remix-ui/app/src/lib/remix-app/state/app.ts b/libs/remix-ui/app/src/lib/remix-app/state/app.ts index bf3fbdc4ee9..6f8370f6ebd 100644 --- a/libs/remix-ui/app/src/lib/remix-app/state/app.ts +++ b/libs/remix-ui/app/src/lib/remix-app/state/app.ts @@ -7,5 +7,6 @@ export const appInitialState: AppState = { needsGitInit: true, canUseGit: false, showPopupPanel: false, - connectedToDesktop: desktopConnectionType .disabled + connectedToDesktop: desktopConnectionType.disabled, + desktopClientConnected: desktopConnectionType.connected } \ No newline at end of file diff --git a/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx b/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx index 252ebcbd984..1a6611e8ada 100644 --- a/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx +++ b/libs/remix-ui/statusbar/src/lib/components/desktopStatus.tsx @@ -1,34 +1,56 @@ -import React, { useEffect, Dispatch, useState, useContext } from 'react' -// eslint-disable-next-line @nrwl/nx/enforce-module-boundaries -import { StatusBar } from 'apps/remix-ide/src/app/components/status-bar' +import React, { useContext } from 'react' import '../../css/statusbar.css' import { CustomTooltip } from '@remix-ui/helper' import { AppContext } from '@remix-ui/app' import { desktopConnectionType } from '@remix-api' -export const DesktopStatus= () => { +export const DesktopStatus = () => { const appContext = useContext(AppContext) return (
- {appContext.appState.connectedToDesktop === desktopConnectionType .connected ? ( + {appContext.appState.connectedToDesktop === desktopConnectionType.connected ? ( <> Connected to the desktop application ) : null} - {appContext.appState.connectedToDesktop === desktopConnectionType .alreadyConnected ? ( + {appContext.appState.desktopClientConnected === desktopConnectionType.disabled ? ( + <> + + + Metamask + + + ) : null} + {appContext.appState.desktopClientConnected === desktopConnectionType.connected ? ( + <> + + + Connected to browser + + + ) : null} + {appContext.appState.desktopClientConnected === desktopConnectionType.connectedToInjected ? ( + <> + + + Connected to Metamask + + + ) : null} + {appContext.appState.connectedToDesktop === desktopConnectionType.alreadyConnected ? ( <> Error: you are already connected to the desktop application in another tab or window ) : null} - {appContext.appState.connectedToDesktop === desktopConnectionType .disconnected ? ( + {appContext.appState.connectedToDesktop === desktopConnectionType.disconnected ? ( <> Waiting for the desktop application to connect... diff --git a/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx b/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx index 6ede079809a..ee5b1fbfd84 100644 --- a/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx +++ b/libs/remix-ui/statusbar/src/lib/remixui-statusbar-panel.tsx @@ -70,9 +70,9 @@ export function RemixUIStatusBar({ statusBarPlugin }: RemixUIStatusBarProps) { return aiActive } - if (platform !== appPlatformTypes.desktop && appContext.appState.connectedToDesktop !== desktopConnectionType .disabled) { + if (platform !== appPlatformTypes.desktop && appContext.appState.connectedToDesktop !== desktopConnectionType.disabled) { return (<>
-
) +
) } return ( @@ -96,9 +96,12 @@ export function RemixUIStatusBar({ statusBarPlugin }: RemixUIStatusBarProps) { )}
- { (platform !== appPlatformTypes.desktop) &&
+ {(platform !== appPlatformTypes.desktop) &&
-
} +
} + {(platform === appPlatformTypes.desktop) &&
+
} +
@@ -108,7 +111,9 @@ export function RemixUIStatusBar({ statusBarPlugin }: RemixUIStatusBarProps) {
+
+
From 1e2aef094ae3fe5c7ac3493b7f7127ec58af1637 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 29 Jan 2025 08:49:08 +0100 Subject: [PATCH 56/58] fig log --- apps/remixdesktop/src/plugins/desktopHost.ts | 51 +++++++++----------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 76ad499febb..512fda30b90 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -6,8 +6,10 @@ import { ipcMain, shell } from "electron" import { RequestArguments } from "../types" import fs from 'fs' import path from 'path' +import os from 'os' +import { isPackaged } from "../main" -const logFilePath = path.join(__dirname, 'desktopHost.log') +const logFilePath = path.join(os.tmpdir(), 'desktopHost.log') console.log('logFilePath', logFilePath) // Create or clear the log file fs.writeFileSync(logFilePath, '', { flag: 'w' }) @@ -69,51 +71,43 @@ const clientProfile: Profile = { } export class DesktopHostPluginClient extends ElectronBasePluginClient { - isConnected: boolean + isInjected: boolean constructor(webContentsId: number, profile: Profile) { super(webContentsId, profile) - this.isConnected = null this.isInjected = null eventEmitter.on('connected', async (payload) => { - console.log('CLIENT connected', payload) + console.log('SERVER connected', payload) isConnected = payload + await this.sendConnectionStatus() }) } - setIsInjected(isInjected: boolean) { + async setIsInjected(isInjected: boolean) { if (this.isInjected !== isInjected && isConnected) { this.isInjected = isInjected + await this.sendConnectionStatus() if (isInjected) { this.call('notification' as any, 'toast', 'You are now connected to Metamask!') } else { - this.call('notification' as any, 'alert', { - title: 'Metamask Wallet', - id: isInjected ? 'Injected' : 'Not_injected', - message: isInjected ? 'You are now connected to Metamask!' : 'You are not yet connected to Metamask. Please connect to Metamask in the browser.', - }) + this.call('notification' as any, 'toast', 'You are not yet connected to Metamask. Please connect to Metamask in the browser') } } } - setIsConnected(isConnected: boolean) { - if (this.isConnected !== isConnected) { - this.isConnected = isConnected - this.call('notification' as any, 'alert', { - title: 'Metamask Wallet', - id: isConnected ? 'Connected' : 'Disconnected', - message: isConnected ? 'You are now connected to Remix on the web!' : 'You have been disconnected from Remix on the web. Please select another environment for deploy & run.', - }) + async sendConnectionStatus() { + const provider = await this.call('blockchain' as any, 'getProvider') + console.log('provider', provider) + if (provider === 'desktopHost' && !this.isInjected) { + this.emit('connectedToBrowser') + } else if (provider === 'desktopHost' && this.isInjected) { + this.emit('connectedToMetamask') + } else { + this.emit('disconnected') } } - async disconnect() { - this.call('notification' as any, 'alert', { - id: 'Connection lost', - message: 'You have been disconnected from Remix on the web. Please select another environment for deploy & run.', - }) - } getIsConnected() { console.log('getIsConnected', isConnected) @@ -140,21 +134,22 @@ export class DesktopHostPluginClient extends ElectronBasePluginClient { return { error: 'Not connected to the remote websocket' } } console.log('SEND ASYNC', data, this.webContentsId) - const provider = await this.call('blockchain' as any, 'getProvider') - console.log('provider', provider) + if (data.method === 'eth_getTransactionReceipt') { ipcMain.emit('focus-window', this.webContentsId) } const result = await handleRequest(data, eventEmitter) - const logEntry = ` + if (!isPackaged) { + const logEntry = ` webContentsId: ${this.webContentsId} Request: ${JSON.stringify(data, (key, value) => typeof value === 'bigint' ? value.toString() : value, 2)} Result: ${JSON.stringify(result, (key, value) => typeof value === 'bigint' ? value.toString() : value, 2)} ` - fs.appendFileSync(logFilePath, logEntry) + fs.appendFileSync(logFilePath, logEntry) + } return result } } \ No newline at end of file From 94fcf2624a12e466754061e0e1608df11809f921 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 29 Jan 2025 08:49:29 +0100 Subject: [PATCH 57/58] fix logging --- apps/remixdesktop/src/plugins/desktopHost.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 512fda30b90..03b1c814d5b 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -9,10 +9,12 @@ import path from 'path' import os from 'os' import { isPackaged } from "../main" -const logFilePath = path.join(os.tmpdir(), 'desktopHost.log') -console.log('logFilePath', logFilePath) -// Create or clear the log file -fs.writeFileSync(logFilePath, '', { flag: 'w' }) +if (!isPackaged) { + const logFilePath = path.join(os.tmpdir(), 'desktopHost.log') + console.log('logFilePath', logFilePath) + // Create or clear the log file + fs.writeFileSync(logFilePath, '', { flag: 'w' }) +} const profile = { displayName: 'desktopHost', name: 'desktopHost', From 1ba5250afcd14faa4bc3f3cb6e096546e4d09c65 Mon Sep 17 00:00:00 2001 From: bunsenstraat Date: Wed, 29 Jan 2025 08:50:29 +0100 Subject: [PATCH 58/58] fix log path --- apps/remixdesktop/src/plugins/desktopHost.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/remixdesktop/src/plugins/desktopHost.ts b/apps/remixdesktop/src/plugins/desktopHost.ts index 03b1c814d5b..022f47a92fe 100644 --- a/apps/remixdesktop/src/plugins/desktopHost.ts +++ b/apps/remixdesktop/src/plugins/desktopHost.ts @@ -9,12 +9,8 @@ import path from 'path' import os from 'os' import { isPackaged } from "../main" -if (!isPackaged) { - const logFilePath = path.join(os.tmpdir(), 'desktopHost.log') - console.log('logFilePath', logFilePath) - // Create or clear the log file - fs.writeFileSync(logFilePath, '', { flag: 'w' }) -} +const logFilePath = isPackaged ? path.join(os.tmpdir(), 'desktopHost.log') : path.join(__dirname, 'desktopHost.log') + const profile = { displayName: 'desktopHost', name: 'desktopHost',