diff --git a/.gitignore b/.gitignore index 77420203..80287976 100644 --- a/.gitignore +++ b/.gitignore @@ -64,4 +64,5 @@ __MACOSX react/package.json # Build files -dist/* \ No newline at end of file +dist/* +out/* \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..2c6543d5 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +node_modules/ +assets/ +out/ +dist/ +yarn.lock diff --git a/README.md b/README.md index 454375d0..21443183 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,234 @@ -### This is experimental and unfinished software. Use at your own risk! No warranty for any kind of damage! +# Verus Desktop -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +The Verus Multicoin Wallet and Ecosystem desktop application -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +## Development Prerequisites -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +### Required Software -# Verus Wallet -The Verus Multicoin Wallet and Ecosystem GUI +1) [Node.js](https://nodejs.org/en/download/) + - **Note:** Node.js 20.x is recommended. Node.js 22 and higher are **not supported**. +2) [Yarn](https://yarnpkg.com/getting-started/install) +3) [Git](https://git-scm.com/) +4) [Verus CLI](https://verus.io/wallet) (`verus` and `verusd` binaries) -## Build & Installation +### Cloning the Repository and Optional Plugins -#### Prerequirements: +Clone the Verus Desktop repository and the GUI submodule: +```bash +git clone --recursive https://github.com/VerusCoin/Verus-Desktop +``` -1) [Install yarn](https://yarnpkg.com/) +#### Optional Plugins -2) [Install git](https://git-scm.com/) +Optional plugins can be cloned into the same directory level as the Verus Desktop folder. +The [Verus Login Consent Client](https://github.com/VerusCoin/verus-login-consent-client) is needed to handle deeplinks, including login. +```bash +git clone https://github.com/VerusCoin/verus-login-consent-client.git +``` -#### Build & Start Verus-Desktop-GUI (frontend) +The [Verus PBaaS visualizer](https://github.com/VerusCoin/verus-pbaas-visualizer) provides PBaaS network Visualizations in 3d graphs. +```bash +git clone https://github.com/VerusCoin/verus-pbaas-visualizer.git +``` -```shell -git clone --recursive https://github.com/VerusCoin/Verus --branch master --single-branch -cd Verus/gui/Verus-Desktop-GUI/react/ -yarn install +### Verus Desktop Setup + +From the Verus Desktop directory, create the following folder structure for your operating system: + +| Operating System | Path | +|------------------|-----------------------------| +| Linux | `assets/bin/linux64/verusd/`| +| macOS | `assets/bin/osx/verusd/` | +| Windows | `assets/bin/win64/verusd/` | + +Copy both `verus` and `verusd` binaries into the appropriate folder (e.g. `assets/bin/linux64/verusd/`). + +#### Deeplinks + +Deeplinks require running a production build at least once. After that, you can run Verus Desktop in any mode and still have the deeplinks functional. + +## Running + +Verus Desktop can be run without building to allow for easier development or with building to test for production before packaging the app. + +**Important:** Both the GUI and the PBaaS visualizer require the `NODE_OPTIONS=--openssl-legacy-provider` environment variable. This environment variable will cause an error when trying to run Verus Desktop. Make sure to use a **separate terminal** for the GUI and PBaaS visualizer. + +### Development Mode (Without Building) + +On Linux and macOS, run Verus Desktop with plugins in development mode using a single terminal with: +```bash +yarn install:all +yarn dev:all ``` -Leave the above process running and use a new terminal windows/tab when proceeding with the below steps. -Now please create a directory called `bin` inside `assets/` and afterwards copy `komodod` and `komodo-cli` to a new subfolder named after the operating system you are building Agama for: `linux64`, `osx` or `win64`. Inside this subfolder, create another directory called `verusd` -and copy `verusd` and `verus-cli` into it. +On Windows, or to run each part separately, follow these steps. -From within `Verus/` the structure will be `assets/bin/linux64` (for example on linux). +#### GUI +Open a new terminal in the Verus Desktop directory: +```bash +export NODE_OPTIONS=--openssl-legacy-provider +cd gui/Verus-Desktop-GUI/react/ +yarn install +``` -#### Start Verus App (electron) +You can run the GUI in two ways. -```shell -cd Verus +1. Without plugins: + ```bash + yarn start + ``` + +2. With plugins: + ```bash + yarn start-no-dashboard + ``` + +#### Optional: PBaaS visualizer + +Open a new terminal, navigate to the PBaaS visualizer directory: +```bash +export NODE_OPTIONS=--openssl-legacy-provider yarn install yarn start ``` -To use debug/dev mode please stop the Verus App (electron) and either set `dev: true` and `debug: true` in `~/.verus/config.json` and then restart the app or replace step 3) from above with the start command below: -```shell +#### Optional: Login Consent Client + +Open a new terminal, navigate to the Login Consent Client directory: +```bash +yarn install +yarn start +``` + +#### Desktop + +With the GUI and any optional plugins running, navigate to the Verus Desktop directory: +```bash +yarn install yarn start devmode ``` -You are ready to dev! +#### Debugging + +- If you see a blank white window after starting the desktop application, check if the GUI is running. +- If the GUI or PBaaS visualizer fails to start and you get this error: + + `Error: error:0308010C:digital envelope routines::unsupported` + + This indicates that the required environment variable is not set. +- If the GUI or PBaaS visualizer fails to start and you get this error: + + `Error: listen EADDRINUSE: address already in use :::9838` + + Then run the GUI with `yarn start-no-dashboard` to avoid dashboard conflicts. + +- If you get a blank white window after trying to open the PBaaS visualizer, check if the PBaaS visualizer is running. +- If you get a smaller blank white window after using a deeplink, check if the Login Consent Client is running. + +### Production Mode (With Building) + +On Linux and macOS, run Verus Desktop with plugins using a single terminal with +```bash +yarn install:all +yarn start:all +``` + +On Windows, or to manually build the components and run Verus Desktop, follow these steps. + +#### GUI + +Open a new terminal in the Verus Desktop directory: +```bash +export NODE_OPTIONS=--openssl-legacy-provider +cd gui/Verus-Desktop-GUI/react/ +yarn install +yarn build +``` + +#### Optional: PBaaS visualizer + +Open a new terminal, navigate to the PBaaS visualizer directory: +```bash +export NODE_OPTIONS=--openssl-legacy-provider +yarn install +yarn build +``` + +After building, you will find the plugin files in the `/build` directory. Create the folder `assets/plugins/builtin/verus-pbaas-visualizer/` inside your Verus Desktop directory and copy the build files into it. + +#### Optional: Login Consent Client + +Open a new terminal, navigate to the Login Consent Client directory: +```bash +yarn install +yarn build +``` +After building, you will find the plugin files in the `/build` directory. Create the folder `assets/plugins/builtin/verus-login-consent-client/` inside your Verus Desktop directory and copy the build files into it. -## Bundling & packaging: +#### Desktop + +With the GUI and any optional plugins built, navigate to the Verus Desktop directory: +```bash +yarn install +yarn start +``` +#### Debugging + +- If you see a blank white window after starting the desktop application, the GUI needs to be built. +- If the GUI or PBaaS visualizer fails to build and you get this error: + + `Error: error:0308010C:digital envelope routines::unsupported` + + This indicates that the required environment variable is not set. +- If you get a blank white window after trying to open the PBaaS visualizer, the PBaaS visualizer needs to be built. +- If you get a smaller blank white window after using a deeplink, the Login Consent Client needs to be built. + + +## Creating Builds + +| Operating System | File Type | +|------------------|------------| +| Linux | `.AppImage`| +| macOS | `.dmg` | +| Windows | `.exe` | + +To create a build from Linux for Windows, you will need either Wine or a [Docker container](https://www.electron.build/multi-platform-build#to-build-app-for-windows-on-linux) + +### Using Linux and macOS + +On Linux and macOS, package Verus Desktop with plugins using a single terminal with: +```bash +yarn install:all +yarn dist:all +``` + +The packaged application will be packaged based on your operating system, and located in the `/dist` directory. + +To create a build for Windows: +```bash +yarn install:all +yarn dist-win:all +``` + +### Windows or Manual Builds + +To manually build the components and package Verus Desktop, follow these steps. + +Build all dependencies, including the GUI and any optional plugins, before packaging the application. See [Production Mode (With Building)](#production-mode-with-building) for how to build. + +Package the application: ```shell -yarn run dist +yarn dist-win ``` -We refer to the original [electron-builder](https://www.electron.build) website for more detailed information and further documentation. +For manually building on Linux or macOS: +```shell +yarn dist +``` +For more detailed information about the build process, see the original [electron-builder](https://www.electron.build) website. \ No newline at end of file diff --git a/docs/EncryptedKeys.md b/docs/EncryptedKeys.md new file mode 100644 index 00000000..3e4de342 --- /dev/null +++ b/docs/EncryptedKeys.md @@ -0,0 +1,260 @@ +# Encrypted Keys + +Certain vdxfkeys, also known as encrypted keys, are for sensitive data that must be encrypted at rest. The wallet handles the encryption and decryption of the sensitive data for the user. + +The encryption and decryption processes are still being developed. + +## List of Encrypted Keys + +The following keys are used to store sensitive data in encrypted form: + +- `vrsc::identity.credential`: Stores credentials (such as usernames and passwords), which can be given to applications for authentication purposes. + +## General Notes + +1. For encrypting and storing data to be accessed only by a specific identity (e.g., yourself), both the `fromid` and `toid` must match that identity. +2. For the encryption and decryption processes, an identity with a z-address is needed. +3. The decryption process doesn't currently use a vdxfkey for selective searching within the `contentmultimap`, but it should in the future. +4. Currently, the encryption process runs whenever an encrypted key is found at the top level of the `contentmultimap` keys of the Identity Update Request. For a credential, `vrsc::identity.credential` key and the plaintext credential are respectively replaced with a derived key hash (based on `vrsc::identity.credential` and the encryption ivk) and a data descriptor that contains the encrypted credential data. More detail about this replacement can be found below in [Encryption Process with a Credential](#encryption-process-with-a-credential). + +## Encryption Process with a Credential + +The encryption process follows these steps: + +1. Run `z_getencryptionaddress` with + - `address`: the identity's z-address + - `fromid`: the identity's address (e.g., `CredentialTester@`) + - `toid`: the same identity's address + + The result should contain the z-address that will be used to encrypt the credential and the corresponding incoming viewing key (ivk). + +
Example: + + ```bash + z_getencryptionaddress '{ + "address": "zs1ztll53sh8dst9utln6vl6vn7fv2zdayxhk58rd7casqhemuh5fwymv8q86g9cf670g3wsge573w", + "fromid": "CredentialTester@", + "toid": "CredentialTester@" + }' + ``` + ```json + { + "address": "zs1x49g3lkt93udlnnc8y5k7p5n0vlvqa2r2rsmsj2629hfvwljpn39mltsxy0fktp5ue46wlw3mlc", + "extendedviewingkey": "zxviews1qde7tnnvqqqqpqy03gsmqjumlyg0ck25hh9etcf7h4l56kunlcjtr36e4pkr32kftw650890j009cdhgm2lc23uyrrq5g7xp5cspjy6lnwf9uk96pv9yruewfrz6k8q0gy9w065cellk3pt37s0ps90rc2zwj4h46f82h35sk23kxduuewc26673fam042zfazxn5r9zwaytcdhc3r50vrutvnnw4zxdalpw2s0w40nxu7qkgh3x3duha872ckhwt9fcl5uy7ne0d3gwknyp2", + "ivk": "f094f7446c88558005eebfcff532cb448bd0ada959903bc2570b1a5c74e41e07" + } + ``` +
+ + +2. Encrypt the credential using `signdata` with + - `address`: the same identity's address + - `vdxfdata`: the credential + - `encrypttoaddress`: the z-address obtained in Step 1 + + From the result, get the data descriptor of the encrypted credential, which is in the `mmrdescriptor_encrypted` section of the JSON result. + +
Example: + + ```bash + signdata '{ + "address":"CredentialTester@", + "vdxfdata": { + "vrsc::data.type.object.credential":{ + "version": 1, + "credentialkey": "iHh1FFVvcNb2mcBudD11umfKJXHbBbH6Sj", + "credential": ["username", "password"], + "scopes": ["App1@"] + } + }, + "encrypttoaddress": "zs1x49g3lkt93udlnnc8y5k7p5n0vlvqa2r2rsmsj2629hfvwljpn39mltsxy0fktp5ue46wlw3mlc" + }' + ``` + ```json + { + "version": 1, + "flags": 5, + "objectdata": "fb9a69e5019a6a790b94cd7c5c1cef65126029e8709c3efcbd302fff69bf3488a4fbde512fc4117cc989dd8d3f98d3650e60e90eb02add89fb3c887d225eeee62723b4f71d192cb0ebe17bcc0680501b86201a4448fd562368d62efac7a7778e943fe93841acf091f02210b24cf988449241782962b65731e7939a9adaa8fd870100dd598ea6a4c22bbd620e07b996e53e521f38849210f9f2d916599346fe1676484e461a61ae9c7437e111", + "epk": "27d8a2e582b6f30bac693154d6d18a4ee333fc93ae8361813b4c6c7c6ed1f90b" + } + ``` +
+ + +3. Hash the vdxfkey corresponding to `vrsc::identity.credential` with the ivk using `getvdxfid` with + - `vrsc::identity.credential` + - `uint256`: the ivk + + Get the `vdxfid` in the result for the next step. + +
Example: + + ```bash + getvdxfid vrsc::identity.credential '{"uint256":"f094f7446c88558005eebfcff532cb448bd0ada959903bc2570b1a5c74e41e07"}' + ``` + ```json + { + "vdxfid": "i4zYNxkyAsMKuL5MFV9cy5aqxCbhTnS3da", + "indexid": "x9peqmC42BZzXVxP7AomwU7NyrciGcZi1T", + "hash160result": "01dc9f8b9389d5569b6fa505185fd37e0265a510", + "qualifiedname": { + "namespace": "i5w5MuNik5NtLcYmNzcvaoixooEebB6MGV", + "name": "vrsc::identity.credential" + }, + "bounddata": { + "uint256": "f094f7446c88558005eebfcff532cb448bd0ada959903bc2570b1a5c74e41e07" + } + } + ``` + + +4. Add the encrypted credential to the contentmultimap using `updateidentity` with + - `name`: the identity's address + - `contentmultimap`: the hashed vdxfkey from Step 3 with the data descriptor of the encrypted credential + +
Example: + + ```bash + updateidentity '{ + "name": "CredentialTester@", + "contentmultimap": { + "i4zYNxkyAsMKuL5MFV9cy5aqxCbhTnS3da": [ + { + "vrsc::data.type.object.datadescriptor": { + "version": 1, + "flags": 5, + "objectdata": "fb9a69e5019a6a790b94cd7c5c1cef65126029e8709c3efcbd302fff69bf3488a4fbde512fc4117cc989dd8d3f98d3650e60e90eb02add89fb3c887d225eeee62723b4f71d192cb0ebe17bcc0680501b86201a4448fd562368d62efac7a7778e943fe93841acf091f02210b24cf988449241782962b65731e7939a9adaa8fd870100dd598ea6a4c22bbd620e07b996e53e521f38849210f9f2d916599346fe1676484e461a61ae9c7437e111", + "epk": "27d8a2e582b6f30bac693154d6d18a4ee333fc93ae8361813b4c6c7c6ed1f90b" + } + } + ] + } + }' + ``` +
+ + +## Decryption Process with a Credential + +The decryption process follows these steps: + +1. Run `z_getencryptionaddress` with + - `address`: the identity's z-address + - `fromid`: the identity's address (e.g., `CredentialTester@`) + - `toid`: the same identity's address + + This is the same as Step 1 from the [*Encryption Process*](#encryption-process). + + The result should contain an ivk and extended viewing key (evk), which will be used to find and decrypt the credential. + +
Example: + + ```bash + z_getencryptionaddress '{ + "address": "zs1ztll53sh8dst9utln6vl6vn7fv2zdayxhk58rd7casqhemuh5fwymv8q86g9cf670g3wsge573w", + "fromid": "CredentialTester@", + "toid": "CredentialTester@" + }' + ``` + ```json + { + "address": "zs1x49g3lkt93udlnnc8y5k7p5n0vlvqa2r2rsmsj2629hfvwljpn39mltsxy0fktp5ue46wlw3mlc", + "extendedviewingkey": "zxviews1qde7tnnvqqqqpqy03gsmqjumlyg0ck25hh9etcf7h4l56kunlcjtr36e4pkr32kftw650890j009cdhgm2lc23uyrrq5g7xp5cspjy6lnwf9uk96pv9yruewfrz6k8q0gy9w065cellk3pt37s0ps90rc2zwj4h46f82h35sk23kxduuewc26673fam042zfazxn5r9zwaytcdhc3r50vrutvnnw4zxdalpw2s0w40nxu7qkgh3x3duha872ckhwt9fcl5uy7ne0d3gwknyp2", + "ivk": "f094f7446c88558005eebfcff532cb448bd0ada959903bc2570b1a5c74e41e07" + } + ``` +
+ + +2. Hash the vdxfkey corresponding to `vrsc::identity.credential` with the ivk using `getvdxfid` with + - `vrsc::identity.credential` + - `uint256`: the ivk + + This is identical as Step 3 from the [*Encryption Process*](#encryption-process). + + Get the `vdxfid` in the result for Step 4. + +
Example: + + ```bash + getvdxfid vrsc::identity.credential '{"uint256":"f094f7446c88558005eebfcff532cb448bd0ada959903bc2570b1a5c74e41e07"}' + ``` + ```json + { + "vdxfid": "i4zYNxkyAsMKuL5MFV9cy5aqxCbhTnS3da", + "indexid": "x9peqmC42BZzXVxP7AomwU7NyrciGcZi1T", + "hash160result": "01dc9f8b9389d5569b6fa505185fd37e0265a510", + "qualifiedname": { + "namespace": "i5w5MuNik5NtLcYmNzcvaoixooEebB6MGV", + "name": "vrsc::identity.credential" + }, + "bounddata": { + "uint256": "f094f7446c88558005eebfcff532cb448bd0ada959903bc2570b1a5c74e41e07" + } + } + ``` + + +3. Get the `contentmultimap` of the identity using `getidentitycontent` with + - the identity's address + + The `contentmultimap` is within the `identity` part of the JSON result. + +
Example: + + ```bash + getidentitycontent CredentialTester@ + ``` + ```json + "contentmultimap": { + "i4zYNxkyAsMKuL5MFV9cy5aqxCbhTnS3da": [ + { + "i4GC1YGEVD21afWudGoFJVdnfjJ5XWnCQv": { + "version": 1, + "flags": 5, + "objectdata": "fb9a69e5019a6a790b94cd7c5c1cef65126029e8709c3efcbd302fff69bf3488a4fbde512fc4117cc989dd8d3f98d3650e60e90eb02add89fb3c887d225eeee62723b4f71d192cb0ebe17bcc0680501b86201a4448fd562368d62efac7a7778e943fe93841acf091f02210b24cf988449241782962b65731e7939a9adaa8fd870100dd598ea6a4c22bbd620e07b996e53e521f38849210f9f2d916599346fe1676484e461a61ae9c7437e111", + "epk": "27d8a2e582b6f30bac693154d6d18a4ee333fc93ae8361813b4c6c7c6ed1f90b" + } + } + ] + } + ``` +
+ + +4. Using the hashed vdxfkey created in Step 2, find the data descriptor of the encrypted credential, and decrypt it using `decryptdata` with + - `datadescriptor`: the data descriptor of the encrypted credential + - `evk`: the evk obtained in Step 1 + +
Example: + + ```bash + decryptdata '{ + "datadescriptor": { + "version": 1, + "flags": 5, + "objectdata": "fb9a69e5019a6a790b94cd7c5c1cef65126029e8709c3efcbd302fff69bf3488a4fbde512fc4117cc989dd8d3f98d3650e60e90eb02add89fb3c887d225eeee62723b4f71d192cb0ebe17bcc0680501b86201a4448fd562368d62efac7a7778e943fe93841acf091f02210b24cf988449241782962b65731e7939a9adaa8fd870100dd598ea6a4c22bbd620e07b996e53e521f38849210f9f2d916599346fe1676484e461a61ae9c7437e111", + "epk": "27d8a2e582b6f30bac693154d6d18a4ee333fc93ae8361813b4c6c7c6ed1f90b" + }, + "evk":"zxviews1qde7tnnvqqqqpqy03gsmqjumlyg0ck25hh9etcf7h4l56kunlcjtr36e4pkr32kftw650890j009cdhgm2lc23uyrrq5g7xp5cspjy6lnwf9uk96pv9yruewfrz6k8q0gy9w065cellk3pt37s0ps90rc2zwj4h46f82h35sk23kxduuewc26673fam042zfazxn5r9zwaytcdhc3r50vrutvnnw4zxdalpw2s0w40nxu7qkgh3x3duha872ckhwt9fcl5uy7ne0d3gwknyp2" + }' + ``` + ```json + [ + { + "iDTG49YLqmkHMYRyuQBYgEyTByQwAzqGd6": { + "version": 1, + "flags": 0, + "credentialkey": "iHh1FFVvcNb2mcBudD11umfKJXHbBbH6Sj", + "credential": [ + "cjkdfasjak@tlmail.com", + "!@23ji2390uodsf" + ], + "scopes": [ + "App1@" + ] + } + } + ] + ``` +
diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..80669df5 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,28 @@ +import js from "@eslint/js"; +import globals from "globals"; +import tseslint from "typescript-eslint"; +import pluginReact from "eslint-plugin-react"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + { + files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"], + plugins: { js }, + extends: ["js/recommended"], + languageOptions: { + globals: { ...globals.browser, ...globals.node }, + }, + }, + { + files: ["**/*.js"], + languageOptions: { sourceType: "commonjs" }, + }, + tseslint.configs.recommended, + pluginReact.configs.flat.recommended, + { + files: ["**/*.js"], + rules: { + "@typescript-eslint/no-require-imports": "off", + }, + }, +]); diff --git a/main.js b/main.js index de740841..49ed2b64 100644 --- a/main.js +++ b/main.js @@ -1,52 +1,53 @@ const electron = require('electron'); -const { - Menu, -} = require('electron'); -const { userAgreesToTerms } = require('./routes/children/userAgreement/window'); +const {Menu} = require('electron'); +const {userAgreesToTerms} = require('./routes/children/userAgreement/window'); const app = electron.app; -const hasLock = app.requestSingleInstanceLock() +const hasLock = app.requestSingleInstanceLock(); if (!hasLock) { - app.quit() + app.quit(); } else { - let api = require("./routes/api"); + let api = require('./routes/api'); Object.freeze(Object.prototype); Object.freeze(Object); const BrowserWindow = electron.BrowserWindow; - const path = require("path"); - const os = require("os"); - const version = require("./version.json"); - const portscanner = require("portscanner"); + const path = require('path'); + const os = require('os'); + const portscanner = require('portscanner'); const osPlatform = os.platform(); - const express = require("express"); - const bodyParser = require("body-parser"); - const { formatBytes } = require("agama-wallet-lib/src/utils"); - const { dialog } = require("electron"); - require("@electron/remote/main").initialize(); + const express = require('express'); + const bodyParser = require('body-parser'); + const {formatBytes} = require('agama-wallet-lib/src/utils'); + const {dialog} = require('electron'); + require('@electron/remote/main').initialize(); - global.USB_HOME_DIR = path.resolve(__dirname, "./usb_home"); - global.HOME = os.platform() === "win32" ? process.env.APPDATA : process.env.HOME; + global.USB_HOME_DIR = path.resolve(__dirname, './usb_home'); + global.HOME = os.platform() === 'win32' ? process.env.APPDATA : process.env.HOME; api.construct(); - const openurlhandler = require("./routes/deeplink/openurlhandler"); + const openurlhandler = require('./routes/deeplink/openurlhandler'); api.clearWriteLog(); - const { MasterSecret, BuiltinSecret } = require("./routes/preloads/keys"); - const setuplink = require("./routes/deeplink/setuplink"); + const {MasterSecret, BuiltinSecret} = require('./routes/preloads/keys'); + const setuplink = require('./routes/deeplink/setuplink'); const removelink = require('./routes/deeplink/removelink'); + const {APP_NAME, APP_MODE, APP_VERSION} = require('./routes/appBasicInfo'); + + // Project root directory (parent of 'out' when compiled, or current dir in dev) + const PROJECT_ROOT = path.resolve(__dirname, '..'); const guiapp = express(); //TODO: add more things here - const { appConfig } = api; + const {appConfig} = api; const appBasicInfo = { - name: "Verus Desktop", - mode: "standard", - version: version.version, + name: APP_NAME, + mode: APP_MODE, + version: APP_VERSION, }; app.setName(appBasicInfo.name); @@ -56,53 +57,53 @@ if (!hasLock) { let _argv = {}; for (let i = 0; i < process.argv.length; i++) { - if (process.argv[i].indexOf("nogui") > -1) { + if (process.argv[i].indexOf('nogui') > -1) { _argv.nogui = true; - api.log("enable nogui mode", "init"); + api.log('enable nogui mode', 'init'); } - if (process.argv[i].indexOf("=") > -1) { - const _argvSplit = process.argv[i].split("="); + if (process.argv[i].indexOf('=') > -1) { + const _argvSplit = process.argv[i].split('='); _argv[_argvSplit[0]] = _argvSplit[1]; } if (!_argv.nogui) { _argv = {}; } else { - api.log("arguments", "init"); - api.log(_argv, "init"); + api.log('arguments', 'init'); + api.log(_argv, 'init'); api.argv = _argv; } } - api.log(`app info: ${appBasicInfo.name} ${appBasicInfo.version}`, "init"); - api.log("sys info:", "init"); - api.log(`totalmem_readable: ${formatBytes(os.totalmem())}`, "init"); - api.log(`arch: ${os.arch()}`, "init"); - api.log(`cpu: ${os.cpus()[0].model}`, "init"); - api.log(`cpu_cores: ${os.cpus().length}`, "init"); - api.log(`platform: ${osPlatform}`, "init"); - api.log(`os_release: ${os.release()}`, "init"); - api.log(`os_type: ${os.type()}`, "init"); + api.log(`app info: ${appBasicInfo.name} ${appBasicInfo.version}`, 'init'); + api.log('sys info:', 'init'); + api.log(`totalmem_readable: ${formatBytes(os.totalmem())}`, 'init'); + api.log(`arch: ${os.arch()}`, 'init'); + api.log(`cpu: ${os.cpus()[0].model}`, 'init'); + api.log(`cpu_cores: ${os.cpus().length}`, 'init'); + api.log(`platform: ${osPlatform}`, 'init'); + api.log(`os_release: ${os.release()}`, 'init'); + api.log(`os_type: ${os.type()}`, 'init'); api.log( `app started in ${ - appConfig.general.main.dev || process.argv.indexOf("devmode") > -1 ? "dev mode" : " user mode" + appConfig.general.main.dev || process.argv.indexOf('devmode') > -1 ? 'dev mode' : ' user mode' }`, - "init" + 'init' ); //api.setConfKMD(); guiapp.use((req, res, next) => { - if (!appConfig.general.main.dev && !(process.argv.indexOf("devmode") > -1)) { - res.header("Access-Control-Allow-Origin", "http://localhost:3000"); + if (!appConfig.general.main.dev && !(process.argv.indexOf('devmode') > -1)) { + res.header('Access-Control-Allow-Origin', 'http://localhost:3000'); } else { - res.header("Access-Control-Allow-Origin", "*"); + res.header('Access-Control-Allow-Origin', '*'); } - res.header("Access-Control-Allow-Headers", "X-Requested-With,content-type"); - res.header("Access-Control-Allow-Credentials", "true"); - res.header("Access-Control-Allow-Methods", "GET, POST"); + res.header('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); + res.header('Access-Control-Allow-Credentials', 'true'); + res.header('Access-Control-Allow-Methods', 'GET, POST'); next(); }); @@ -110,54 +111,54 @@ if (!hasLock) { const _setImmediate = setImmediate; const _clearImmediate = clearImmediate; - process.once("loaded", () => { + process.once('loaded', () => { global.setImmediate = _setImmediate; global.clearImmediate = _clearImmediate; - if (osPlatform === "darwin") { + if (osPlatform === 'darwin') { process.setFdLimit(appConfig.general.main.maxDescriptors.darwin); app.setAboutPanelOptions({ applicationName: app.getName(), applicationVersion: `${app.getVersion()}`, - copyright: "Released under the MIT license", + copyright: 'Released under the MIT license', }); - } else if (osPlatform === "linux") { + } else if (osPlatform === 'linux') { process.setFdLimit(appConfig.general.main.maxDescriptors.linux); } }); // silent errors - if (!appConfig.general.main.dev && !process.argv.indexOf("devmode") > -1) { - process.on("uncaughtException", (err) => { - api.log(`${new Date().toUTCString()} uncaughtException: ${err.message}`, "exception"); - api.log(err.stack, "exception"); + if (!appConfig.general.main.dev && !process.argv.indexOf('devmode') > -1) { + process.on('uncaughtException', err => { + api.log(`${new Date().toUTCString()} uncaughtException: ${err.message}`, 'exception'); + api.log(err.stack, 'exception'); }); } - guiapp.use(bodyParser.json({ limit: "500mb" })); // support json encoded bodies + guiapp.use(bodyParser.json({limit: '500mb'})); // support json encoded bodies guiapp.use( bodyParser.urlencoded({ - limit: "500mb", + limit: '500mb', extended: true, }) ); // support encoded bodies - guiapp.get("/", (req, res) => { - res.send("Verus app server"); + guiapp.get('/', (req, res) => { + res.send('Verus app server'); }); - const guipath = path.join(__dirname, "/gui"); - guiapp.use("/gui", express.static(guipath)); - guiapp.use("/api", api); + const guipath = path.join(PROJECT_ROOT, 'gui'); + guiapp.use('/gui', express.static(guipath)); + guiapp.use('/api', api); - const server = require("http").createServer(guiapp); - let io = require("socket.io")(server, { + const server = require('http').createServer(guiapp); + let io = require('socket.io')(server, { cors: { origin: - appConfig.general.main.dev || process.argv.indexOf("devmode") > -1 - ? "http://localhost:3000" + appConfig.general.main.dev || process.argv.indexOf('devmode') > -1 + ? 'http://localhost:3000' : null, - methods: ["GET", "POST"], + methods: ['GET', 'POST'], }, }); @@ -172,11 +173,11 @@ if (!hasLock) { module.exports = guiapp; let agamaIcon; - if (os.platform() === "linux") { - agamaIcon = path.join(__dirname, "/assets/icons/vrsc_512x512x32.png"); + if (os.platform() === 'linux') { + agamaIcon = path.join(__dirname, '/assets/icons/vrsc_512x512x32.png'); } - if (os.platform() === "win32") { - agamaIcon = path.join(__dirname, "/assets/icons/vrsc.ico"); + if (os.platform() === 'win32') { + agamaIcon = path.join(__dirname, '/assets/icons/vrsc.ico'); } // close app @@ -189,9 +190,9 @@ if (!hasLock) { if (!_argv.nogui) { startApp() .then(() => createMainWindow()) - .catch((e) => api.log(e, "init")); + .catch(e => api.log(e, 'init')); } else startApp(); - }) + }); function createAppCloseWindow() { // initialise window @@ -220,24 +221,24 @@ if (!hasLock) { appCloseWindow.setResizable(false); appCloseWindow.loadURL( - appConfig.general.main.dev || process.argv.indexOf("devmode") > -1 + appConfig.general.main.dev || process.argv.indexOf('devmode') > -1 ? `http://127.0.0.1:${appConfig.general.main.agamaPort}/gui/startup/app-closing.html` - : `file://${__dirname}/gui/startup/app-closing.html` + : `file://${PROJECT_ROOT}/gui/startup/app-closing.html` ); - appCloseWindow.webContents.on("did-finish-load", () => { + appCloseWindow.webContents.on('did-finish-load', () => { setTimeout(() => { appCloseWindow.show(); }, 40); }); - appCloseWindow.webContents.on("devtools-opened", () => { + appCloseWindow.webContents.on('devtools-opened', () => { dialog.showMessageBox(appCloseWindow, { - type: "warning", - title: "Be Careful!", + type: 'warning', + title: 'Be Careful!', message: - "WARNING! You are opening the developer tools menu. ONLY enter commands here if you know exactly what you are doing.\n\nNEVER copy+paste any commands given to you into here. No trustworthy support person will EVER ask you to do that.\n\nANY CODE COPY+PASTED INTO DEV TOOLS CAN CONTROL YOUR FUNDS.", - buttons: ["OK"], + 'WARNING! You are opening the developer tools menu. ONLY enter commands here if you know exactly what you are doing.\n\nNEVER copy+paste any commands given to you into here. No trustworthy support person will EVER ask you to do that.\n\nANY CODE COPY+PASTED INTO DEV TOOLS CAN CONTROL YOUR FUNDS.', + buttons: ['OK'], }); }); } @@ -245,24 +246,24 @@ if (!hasLock) { function appExit() { const CloseDaemons = () => { return new Promise((resolve, reject) => { - api.log("Closing Main Window...", "quit"); + api.log('Closing Main Window...', 'quit'); api.quitKomodod(appConfig.general.native.cliStopTimeout); - const result = "Closing daemons: done"; + const result = 'Closing daemons: done'; - api.log(result, "quit"); + api.log(result, 'quit'); resolve(result); }); }; const HideMainWindow = () => { return new Promise((resolve, reject) => { - const result = "Hiding Main Window: done"; + const result = 'Hiding Main Window: done'; - api.log("Exiting App...", "quit"); + api.log('Exiting App...', 'quit'); mainWindow = null; - api.log(result, "quit"); + api.log(result, 'quit'); resolve(result); }); }; @@ -276,11 +277,11 @@ if (!hasLock) { const QuitApp = () => { return new Promise((resolve, reject) => { - const result = "Quiting App: done"; + const result = 'Quiting App: done'; forceQuitApp = true; app.quit(); - api.log(result, "quit"); + api.log(result, 'quit'); resolve(result); }); }; @@ -299,10 +300,7 @@ if (!hasLock) { api.quitKomodod(appConfig.general.native.cliStopTimeout); setInterval(async () => { - if ( - !Object.keys(api.startedDaemonRegistry).length && - !(await api.isAnyDaemonRunning()) - ) { + if (!Object.keys(api.startedDaemonRegistry).length && !(await api.isAnyDaemonRunning())) { closeApp(); } }, 1000); @@ -314,10 +312,10 @@ if (!hasLock) { // check if agama is already running portscanner.checkPortStatus( appConfig.general.main.agamaPort, - "127.0.0.1", + '127.0.0.1', async (error, status) => { // Status is 'open' if currently in use or 'closed' if available - if (status === "closed") { + if (status === 'closed') { let termsAgreed = appConfig.general.main.agreedToTerms; if (!termsAgreed && (await userAgreesToTerms())) { @@ -326,38 +324,35 @@ if (!hasLock) { } if (termsAgreed) { - api.log( - "user agreed to terms of use", - "init" - ); + api.log('user agreed to terms of use', 'init'); server.listen(appConfig.general.main.agamaPort, () => { api.log( `guiapp and sockets.io are listening on port ${appConfig.general.main.agamaPort}`, - "init" + 'init' ); }); api.setIO(io); // pass sockets object to api router - api.setVar("appBasicInfo", appBasicInfo); - api.setVar("MasterSecret", MasterSecret); - api.setVar("BuiltinSecret", BuiltinSecret); + api.setVar('appBasicInfo', appBasicInfo); + api.setVar('MasterSecret', MasterSecret); + api.setVar('BuiltinSecret', BuiltinSecret); - api.log("saving plugin builtin secret...", "init"); + api.log('saving plugin builtin secret...', 'init'); try { await api.saveBuiltinSecret({ BuiltinSecret, }); } catch (e) { - api.log("error plugin builtin secret!", "init"); - api.log(e, "init"); + api.log('error plugin builtin secret!', 'init'); + api.log(e, 'init'); } } else { app.quit(); } } else { openAlreadyRunningWindow(); - reject("another api instance is already running"); + reject('another api instance is already running'); } if (error) reject(error); @@ -394,20 +389,20 @@ if (!hasLock) { willQuitApp = true; alreadyRunningWindow.loadURL( - appConfig.general.main.dev || process.argv.indexOf("devmode") > -1 + appConfig.general.main.dev || process.argv.indexOf('devmode') > -1 ? `http://127.0.0.1:${appConfig.general.main.agamaPort}/gui/startup/agama-instance-error.html` - : `file://${__dirname}/gui/startup/agama-instance-error.html` + : `file://${PROJECT_ROOT}/gui/startup/agama-instance-error.html` ); - alreadyRunningWindow.webContents.on("did-finish-load", () => { + alreadyRunningWindow.webContents.on('did-finish-load', () => { alreadyRunningWindow.show(); }); - api.log("another agama app is already running", "init"); + api.log('another agama app is already running', 'init'); } function createMainWindow() { - require(path.join(__dirname, "private/mainmenu")); + require(path.join(__dirname, 'private/mainmenu')); if (closeAppAfterLoading) { mainWindow = null; @@ -416,21 +411,21 @@ if (!hasLock) { const staticMenu = Menu.buildFromTemplate([ // if static - { role: "copy" }, - { type: "separator" }, - { role: "selectall" }, + {role: 'copy'}, + {type: 'separator'}, + {role: 'selectall'}, ]); const editMenu = Menu.buildFromTemplate([ // if editable - { role: "undo" }, - { role: "redo" }, - { type: "separator" }, - { role: "cut" }, - { role: "copy" }, - { role: "paste" }, - { type: "separator" }, - { role: "selectall" }, + {role: 'undo'}, + {role: 'redo'}, + {type: 'separator'}, + {role: 'cut'}, + {role: 'copy'}, + {role: 'paste'}, + {type: 'separator'}, + {role: 'selectall'}, ]); // initialise window @@ -452,27 +447,27 @@ if (!hasLock) { webviewTag: false, sandbox: false, - preload: path.resolve(__dirname, "routes", "preloads", "plugin", "preload-builtin.js"), + preload: path.resolve(__dirname, 'routes', 'preloads', 'plugin', 'preload-builtin.js'), }, }); mainWindow.loadURL( - appConfig.general.main.dev || process.argv.indexOf("devmode") > -1 - ? "http://localhost:3000" - : `file://${__dirname}/gui/Verus-Desktop-GUI/react/build/index.html` + appConfig.general.main.dev || process.argv.indexOf('devmode') > -1 + ? 'http://localhost:3000' + : `file://${PROJECT_ROOT}/gui/Verus-Desktop-GUI/react/build/index.html` ); - mainWindow.webContents.on("devtools-opened", () => { + mainWindow.webContents.on('devtools-opened', () => { dialog.showMessageBox(mainWindow, { - type: "warning", - title: "Be Careful!", + type: 'warning', + title: 'Be Careful!', message: - "WARNING! You are opening the developer tools menu. ONLY enter commands here if you know exactly what you are doing. If someone told you to copy+paste commands into here, you should probably ignore them, close dev tools, and stay safe.", - buttons: ["OK"], + 'WARNING! You are opening the developer tools menu. ONLY enter commands here if you know exactly what you are doing. If someone told you to copy+paste commands into here, you should probably ignore them, close dev tools, and stay safe.', + buttons: ['OK'], }); }); - mainWindow.webContents.on("did-finish-load", () => { + mainWindow.webContents.on('did-finish-load', () => { setTimeout(() => { mainWindow.show(); @@ -480,19 +475,19 @@ if (!hasLock) { }, 40); }); - mainWindow.webContents.on("context-menu", (e, params) => { + mainWindow.webContents.on('context-menu', (e, params) => { // context-menu returns params - const { selectionText, isEditable } = params; // params obj + const {selectionText, isEditable} = params; // params obj if (isEditable) { editMenu.popup(mainWindow); - } else if (selectionText && selectionText.trim() !== "") { + } else if (selectionText && selectionText.trim() !== '') { staticMenu.popup(mainWindow); } }); // close app - mainWindow.on("close", (event) => { + mainWindow.on('close', event => { if (_argv.nogui && mainWindow.isVisible()) { event.preventDefault(); mainWindow.hide(); @@ -504,8 +499,8 @@ if (!hasLock) { return mainWindow; } - app.on("web-contents-created", (event, contents) => { - contents.on("will-attach-webview", (event, webPreferences, params) => { + app.on('web-contents-created', (event, contents) => { + contents.on('will-attach-webview', (event, webPreferences, params) => { // Strip away preload scripts if unused or verify their location is legitimate delete webPreferences.preload; delete webPreferences.preloadURL; @@ -516,26 +511,26 @@ if (!hasLock) { event.preventDefault(); }); - contents.on("will-navigate", (event, url) => { + contents.on('will-navigate', (event, url) => { console.log(`[will-navigate] ${url}`); console.log(event); event.preventDefault(); }); - contents.on("will-redirect", (event, url) => { + contents.on('will-redirect', (event, url) => { console.log(`[will-redirect] ${url}`); console.log(event); event.preventDefault(); }); - contents.on("new-window", async (event, navigationUrl) => { + contents.on('new-window', async (event, navigationUrl) => { // In this example, we'll ask the operating system // to open this event's url in the default browser. event.preventDefault(); }); contents.setWindowOpenHandler(() => { - return { action: "deny" }; + return {action: 'deny'}; }); }); @@ -549,41 +544,65 @@ if (!hasLock) { } } + function minimizeMain() { + if (!mainWindow) { + createMainWindow(); + } else { + if (!mainWindow.isMinimized()) { + mainWindow.minimize(); + } + } + } + function handleSecondInstance(event, argv, cwd) { focusMain(); - if (process.platform == "win32" || process.platform == "linux") { - const argIndex = 2; - openurlhandler(null, argv.slice(1).toString().split(",")[argIndex], api.dlhandler); + if (process.platform == 'win32' || process.platform == 'linux') { + const argIndex = process.platform === 'win32' ? 1 : 2; + openurlhandler(null, argv.slice(1)[argIndex], api.dlhandler); } } api.setupFocusApis(focusMain); + api.setupMinimizeApis(minimizeMain); - app.on("activate", focusMain); - app.on("second-instance", handleSecondInstance); + app.on('activate', focusMain); + app.on('second-instance', handleSecondInstance); // Deep linking if (!appConfig.general.main.disableDeeplink) { - api.log("setting up deeplink", "init"); + api.log('setting up deeplink', 'init'); + try { + api + .installLinuxDeeplinkIntegration() + .then(() => { + api.log('deeplink integration created', 'init'); + }) + .catch(e => { + api.log('deeplink integration failed', 'init'); + api.log(e, 'init'); + }); + } catch (e) { + api.log('deeplink integration failed', 'init'); + api.log(e, 'init'); + } setuplink(app); } else { - api.log("removing deeplink", "init"); - removelink(app) + api.log('removing deeplink', 'init'); + removelink(app); } - app.on("open-url", (event, url) => openurlhandler(event, url, api.dlhandler)); + app.on('open-url', (event, url) => openurlhandler(event, url, api.dlhandler)); // Emitted when all windows have been closed and the application will quit. // Calling event.preventDefault() will prevent the default behaviour, which is terminating the application. - app.on("will-quit", (event) => { + app.on('will-quit', event => { if (!forceQuitApp && mainWindow != null) { // loading window is still open - api.log("will-quit while loading window active", "quit"); + api.log('will-quit while loading window active', 'quit'); event.preventDefault(); appExit(); } }); } - diff --git a/package.json b/package.json index 754c1379..373d781f 100644 --- a/package.json +++ b/package.json @@ -3,14 +3,20 @@ "productName": "Verus-Desktop", "version": "1.2.6", "description": "Verus Desktop Wallet App", - "main": "main.js", + "main": "out/main.js", "scripts": { - "start": "cross-env NODE_ENV=development electron .", + "build": "tsc && copyfiles -f version.json out/ && copyfiles -u 0 'assets/**/*' out/", + "start": "yarn run build && cross-env NODE_ENV=development electron .", + "start:all": "./scripts/prod.sh", "debug": "yarn start devmode", + "dev:all": "./scripts/dev.sh", "make-patch": "./make-patch.sh", - "pack": "cross-env NODE_ENV=production electron-builder --dir verus-unpacked", - "dist": "cross-env NODE_ENV=production electron-builder --publish=never ", - "dist-win": "cross-env NODE_ENV=production electron-builder --publish=never --win", + "install:all": "./scripts/setup.sh", + "pack": "yarn run build && cross-env NODE_ENV=production electron-builder --dir verus-unpacked", + "dist": "yarn run build && cross-env NODE_ENV=production electron-builder --publish=never ", + "dist-win": "yarn run build && cross-env NODE_ENV=production electron-builder --publish=never --win", + "dist:all": "./scripts/create-build.sh", + "dist-win:all": "./scripts/create-build-win.sh", "test": "mocha", "update-agamalib": "rm -rf node_modules/agama-wallet-lib/ && yarn install", "postinstall": "rm -rf node_modules/bitgo-utxo-lib/node_modules/create-hash" @@ -36,14 +42,6 @@ "url": "https://verus.io" }, "license": "MIT", - "devDependencies": { - "cross-env": "5.2.1", - "electron": "22.3.25", - "electron-builder": "24.13.3", - "electron-devtools-installer": "3.2.0", - "tslint": "6.1.3", - "typescript": "4.4.4" - }, "dependencies": { "@bitgo/utxo-lib": "git+https://github.com/VerusCoin/BitGoJS.git#utxo-lib-verus", "@electron/remote": "1.1.0", @@ -52,7 +50,7 @@ "agama-wallet-lib": "git+https://github.com/VerusCoin/agama-wallet-lib.git#dev", "arch": "2.1.0", "async": "2.6.4", - "axios": "1.7.4", + "axios": "1.16.0", "base64url": "git+https://github.com/VerusCoin/base64url.git", "bigi": "1.4.2", "bitgo-utxo-lib": "git+https://github.com/VerusCoin/bitgo-utxo-lib.git", @@ -78,21 +76,43 @@ "sha256": "0.2.0", "socket.io": "4.6.2", "systeminformation": "5.23.8", - "tx-builder": "^0.18.0", + "tx-builder": "0.18.0", "unzipper": "0.10.11", "verus-typescript-primitives": "git+https://github.com/VerusCoin/verus-typescript-primitives.git", "verus-wallet-endpoints": "git+https://github.com/VerusCoin/verus-wallet-endpoints.git", "verus_bridgekeeper": "git+https://github.com/VerusCoin/verusbridgekeeper.git", - "verusd-rpc-ts-client": "git+https://github.com/VerusCoin/verusd-rpc-ts-client", + "verusd-rpc-ts-client": "git+https://github.com/VerusCoin/verusd-rpc-ts-client.git", "wif": "2.0.6" }, + "devDependencies": { + "@eslint/js": "9.39.2", + "@ianvs/prettier-plugin-sort-imports": "4.7.0", + "@types/node": "18.19.0", + "copyfiles": "2.4.1", + "cross-env": "5.2.1", + "electron": "22.3.25", + "electron-builder": "24.13.3", + "electron-devtools-installer": "3.2.0", + "eslint": "9.39.2", + "eslint-config-prettier": "10.1.8", + "eslint-plugin-react": "7.37.5", + "globals": "17.0.0", + "prettier": "3.6.0", + "typescript": "5.8.3", + "typescript-eslint": "8.53.0" + }, "optionalDependencies": { "osx-temperature-sensor": "1.0.8" }, "build": { "appId": "Verus", "files": [ - "**/*", + "package.json", + "version.json", + "out/**/*", + "gui/**/*", + "keys/**/*", + "!**/*.ts", "!buildscripts", "!dist", "!test${/*}", @@ -135,7 +155,7 @@ "icon": "assets/icons/agama_icons", "desktop": { "Encoding": "UTF-8", - "MimeType": "x-scheme-handler/i5jtwbp6zymeay9llnraglgjqgdrffsau4" + "MimeType": "x-scheme-handler/i5jtwbp6zymeay9llnraglgjqgdrffsau4;x-scheme-handler/verus" }, "target": [ "appimage" @@ -164,7 +184,7 @@ "https-proxy-agent": "2.2.4", "mem": "4.0.0", "bin-links": "1.1.6", - "yargs-parser": "13.1.2", + "yargs-parser": "21.1.1", "minimist": "1.2.6", "decode-uri-component": "0.2.1", "elliptic": "6.6.1", @@ -190,7 +210,6 @@ "minimatch": "5.1.0", "json-schema": "0.4.0", "got": "11.8.5", - "axios": "1.7.4", "json5": "2.2.2", "semver": "6.3.1", "tough-cookie": "4.1.3", diff --git a/prettier.config.mjs b/prettier.config.mjs new file mode 100644 index 00000000..32a76675 --- /dev/null +++ b/prettier.config.mjs @@ -0,0 +1,40 @@ +/** + * @type {import("prettier").Config} + */ +const config = { + plugins: ["@ianvs/prettier-plugin-sort-imports"], + // Based on sentry.js's prettier config. + importOrder: [ + // Node.js builtins. + "", + "", + // Packages. `react` related packages come first. + "^react", + "", + "", + // Internal alias imports. + "^#/(.*)$", + "", + // Parent imports. Put `..` last. + "^\\.\\./(?!/?$)", + "^\\.\\./\\.?$", + "", + // Other relative imports. Put same-folder imports and `.` last. + "^\\./(?=.*/)(?!/?$)", + "^\\.(?!/?$)", + "^\\./?$", + // Newline after imports. + "", + ], + bracketSpacing: false, + bracketSameLine: false, + printWidth: 100, + semi: true, + singleQuote: true, + tabWidth: 2, + trailingComma: "es5", + useTabs: false, + arrowParens: "avoid", +}; + +export default config; diff --git a/routes/api.js b/routes/api.js index 8b79089f..04a0d444 100644 --- a/routes/api.js +++ b/routes/api.js @@ -3,8 +3,8 @@ const express = require('express'); let api = express.Router(); api.rpcCalls = { GET: {}, - POST: {} -} + POST: {}, +}; api.coinsInitializing = {}; api.startedDaemonRegistry = {}; @@ -18,16 +18,16 @@ api.appRuntimeLog = []; api.plugins = api.plugins = { registry: {}, - builtin: {} -} + builtin: {}, +}; api.pluginWindows = { registry: {}, - builtin: {} -} + builtin: {}, +}; api.pluginOnCompletes = { registry: {}, - builtin: {} -} + builtin: {}, +}; api.lockDownAddCoin = false; api._isWatchOnly = false; @@ -59,9 +59,7 @@ api.electrumCache = {}; api.electrumJSCore = require('./electrumjs/electrumjs.core.js'); api.electrumJSNetworks = require('./electrumjs/electrumjs.networks.js'); -const { - electrumServers, -} = require('./electrumjs/electrumServers.js'); +const {electrumServers} = require('./electrumjs/electrumServers.js'); api.electrumServers = electrumServers; api.electrumServersV1_4 = {}; api.nspvProcesses = {}; @@ -77,7 +75,7 @@ api.native = { tx_cache: {}, addr_balance_cache: {}, currency_definition_cache: {}, - } + }, }; // eth @@ -85,15 +83,15 @@ api.eth = { wallet: null, interface: null, temp: { - pending_txs: {} - } + pending_txs: {}, + }, }; // erc20 api.erc20 = { wallet: null, - contracts: {} -} + contracts: {}, +}; api.setconf = require('../private/setconf.js'); api.nativeCoind = require('./nativeCoind.js'); @@ -122,6 +120,7 @@ api = require('./api/plugin/builtin/loginconsentui')(api); api = require('./api/plugin/builtin/pbaasvisualizer')(api); api = require('./api/focus')(api); +api = require('./api/minimize')(api); // native api = require('./api/native/addrBalance.js')(api); @@ -137,6 +136,7 @@ api = require('./api/native/mininginfo')(api); api = require('./api/native/getTransaction.js')(api); api = require('./api/native/transactions')(api); api = require('./api/native/zoperations')(api); +api = require('./api/native/zgetencryptionaddress').default(api); api = require('./api/native/remove')(api); api = require('./api/native/restart')(api); api = require('./api/native/send.js')(api); @@ -147,6 +147,7 @@ api = require('./api/native/idRegistration.js')(api); api = require('./api/native/idRevocation.js')(api); api = require('./api/native/idUpdate.js')(api); api = require('./api/native/idInformation.js')(api); +api = require('./api/native/updateIdentity.js')(api); api = require('./api/native/getCurrencies.js')(api); api = require('./api/native/getCurrency.js')(api); api = require('./api/native/estimateSendcurrencyFee.js')(api); @@ -154,6 +155,7 @@ api = require('./api/native/estimateConversion.js')(api); api = require('./api/native/getConversionPaths.js')(api); api = require('./api/native/currencyGraylist.js')(api); api = require('./api/native/idRecovery.js')(api); +api = require('./api/native/decryptdata.js')(api); api = require('./api/native/signdata.js')(api); api = require('./api/native/verifydata.js')(api); api = require('./api/native/generate.js')(api); @@ -161,10 +163,7 @@ api = require('./api/native/coinSupply.js')(api); api = require('./api/native/blockSubsidy.js')(api); api = require('./api/native/shieldcoinbase.js')(api); api = require('./api/native/verusid/verusid.js')(api); -api = require('./api/native/verusid/login/verifyRequest.js')(api); -api = require('./api/native/verusid/login/signResponse.js')(api); -api = require('./api/native/verusid/provision/signIdProvisioningRequest.js')(api); -api = require('./api/native/verusid/provision/verifyIdProvisioningResponse.js')(api); +api = require('./api/native/credentials/getCredentials').default(api); api = require('./api/native/makeoffer')(api); api = require('./api/native/getoffers')(api); api = require('./api/native/closeoffers')(api); @@ -176,17 +175,17 @@ api = require('./api/native/getNetworkGraph')(api); api = require('./api/native/verusbridge/verusbridge.js')(api); api = require('./api/native/verusbridge/vethconf.js')(api); -// lite +// lite api = require('./api/getSignatureInfo.js')(api); // general network calls -api.networkFees = {} -api.coinSupply = {} -api = require('./api/network/fees/btc/btcFees')(api) -api = require('./api/network/fees/networkFees')(api) -api = require('./api/network/supply/vrsc/vrscCoinSupply')(api) -api = require('./api/network/supply/zec/zecCoinSupply')(api) -api = require('./api/network/supply/coinSupply')(api) +api.networkFees = {}; +api.coinSupply = {}; +api = require('./api/network/fees/btc/btcFees')(api); +api = require('./api/network/fees/networkFees')(api); +api = require('./api/network/supply/vrsc/vrscCoinSupply')(api); +api = require('./api/network/supply/zec/zecCoinSupply')(api); +api = require('./api/network/supply/coinSupply')(api); // core api = require('./api/binsUtils.js')(api); @@ -205,6 +204,7 @@ api = require('./api/dlhandler.js')(api); api = require('./api/utility_apis/csvExport.js')(api); api = require('./api/utility_apis/pbaas')(api); api = require('./api/utility_apis/checkUpdates')(api); +api = require('./api/utility_apis/deeplinkSetup')(api); api = require('./api/utility_apis/cache')(api); // kv @@ -257,4 +257,4 @@ api = require('./api/diagnostics.js')(api); api = require('./api/construct')(api); -module.exports = api; \ No newline at end of file +module.exports = api; diff --git a/routes/api/dlhandler.js b/routes/api/dlhandler.js index 6a15e303..64464c19 100644 --- a/routes/api/dlhandler.js +++ b/routes/api/dlhandler.js @@ -1,28 +1,65 @@ -const { LOGIN_CONSENT_REQUEST_VDXF_KEY, LoginConsentRequest } = require('verus-typescript-primitives'); -const base64url = require("base64url"); -const { ROOT_SYSTEM_NAME } = require('./utils/constants/dev_options'); - -module.exports = (api) => { - api.dlhandler = (url) => { - const handlers = { - [LOGIN_CONSENT_REQUEST_VDXF_KEY.vdxfid]: (url) => { - const value = url.searchParams.get(LOGIN_CONSENT_REQUEST_VDXF_KEY.vdxfid) - const req = new LoginConsentRequest(); - req.fromBuffer(base64url.toBuffer(value)); - - return api.loginConsentUi.request( - req.toJson(), - { - id: "VERUS_DESKTOP_MAIN", - search_builtin: true, - main_chain_ticker: ROOT_SYSTEM_NAME - } - ) +const { + GENERIC_REQUEST_DEEPLINK_VDXF_KEY, + GenericRequest, + LOGIN_CONSENT_REQUEST_VDXF_KEY, + LoginConsentRequest, +} = require('verus-typescript-primitives'); +const {ROOT_SYSTEM_NAME} = require('./utils/constants/dev_options'); +const {SUPPORTED_V1_DLS, CALLBACK_HOST} = require('./utils/constants/supported_dls'); + +module.exports = api => { + api.dlhandler = urlstring => { + const deeplinkHandler = urlstring => { + const url = new URL(urlstring); + + let id; + let data; + + // Handle v1 and v2 requests separately. + if (url.host === CALLBACK_HOST) { + id = url.pathname.split('/')[1]; + + if (!SUPPORTED_V1_DLS.includes(id)) { + throw new Error('Unsupported deeplink url path.'); + } + + let dl; + switch (id) { + case LOGIN_CONSENT_REQUEST_VDXF_KEY.vdxfid: + dl = LoginConsentRequest.fromWalletDeeplinkUri(urlstring); + break; + default: + throw new Error(`Unsupported deeplink ID: ${urlstring}`); + } + data = dl.toJson(); + } else { + if (api.appConfig.general.main.experimentalFeatures) { + const req = GenericRequest.fromWalletDeeplinkUri(urlstring); + id = GENERIC_REQUEST_DEEPLINK_VDXF_KEY.vdxfid; + // Send the request as the hex string of the buffer so it's properly serialized. + // If the buffer is sent directly, the IPC converts it to a JSON object and increases + // the size of the payload. + data = req.toBuffer().toString('hex'); + } else { + throw new Error('Generic requests are only allowed with experimental features enabled.'); + } } - } - return handlers[url.pathname.replace(/\//g, "")](url) - } + return api.loginConsentUi.deeplink( + { + id: id, + data: data, + }, + { + id: 'VERUS_DESKTOP_MAIN', + search_builtin: true, + main_chain_ticker: ROOT_SYSTEM_NAME, + } + ); + }; + + return deeplinkHandler(urlstring); + }; return api; -}; \ No newline at end of file +}; diff --git a/routes/api/minimize.js b/routes/api/minimize.js new file mode 100644 index 00000000..82a463a4 --- /dev/null +++ b/routes/api/minimize.js @@ -0,0 +1,26 @@ +module.exports = api => { + api.setupMinimizeApis = minimizeFunction => { + api.minimizeApp = minimizeFunction; + + api.setPost('/plugin/minimize', async (req, res) => { + try { + api.minimizeApp(); + + res.send( + JSON.stringify({ + msg: 'success', + }) + ); + } catch (e) { + res.send( + JSON.stringify({ + msg: 'error', + result: e.message, + }) + ); + } + }); + }; + + return api; +}; diff --git a/routes/api/native/credentials/getCredentials.ts b/routes/api/native/credentials/getCredentials.ts new file mode 100644 index 00000000..0a12843b --- /dev/null +++ b/routes/api/native/credentials/getCredentials.ts @@ -0,0 +1,235 @@ +import { + Credential, + DATA_DESCRIPTOR_VDXF_KEY, + DATA_TYPE_OBJECT_CREDENTIAL, + fromBase58Check, + IDENTITY_CREDENTIAL, + IdentityDefinition, +} from 'verus-typescript-primitives'; + +import {ZGetEncryptionAddressResult} from '../zgetencryptionaddress'; + +interface VdxfIdResult { + vdxfid: string; +} + +interface Identity { + identity: IdentityDefinition & {privateaddress?: string}; +} + +interface CredentialsMap { + [scope: string]: Credential[]; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export default (api: any) => { + /** + * Extracts and decrypts the list of credentials in the given identity + * + * @param coin The chainTicker of the coin to make the call on + * @param address The identity or address to get the credentials from + */ + api.native.get_credentials_list = async ( + coin: string, + address: string + ): Promise => { + // Get the z-address to generate the viewing key. + const identity: Identity = await api.native.get_identity(coin, address); + + const zaddress = identity.identity.privateaddress; + + if (!zaddress) { + throw new Error(`No z-address found for identity ${address}`); + } + + // Generate the viewing key to decrypt the credentials. + const keys: ZGetEncryptionAddressResult = await api.native.z_get_encryption_address(coin, { + address: zaddress, + fromid: address, + toid: address, + }); + + const evk = keys.extendedviewingkey; + const ivk = keys.ivk; + + // Generate the credential key using the ivk. + const credentialKeyResult: VdxfIdResult = await api.native.get_vdxf_id( + coin, + IDENTITY_CREDENTIAL.vdxfid, + { + uint256: ivk, + } + ); + + if (!credentialKeyResult.vdxfid) { + throw new Error('Failed to generate credential key'); + } + + const credentialKey = credentialKeyResult.vdxfid; + + const identityContent: Identity = await api.native.get_identity_content(coin, address, { + vdxfkey: credentialKey, + }); + + if ( + !identityContent.identity.contentmultimap || + !identityContent.identity.contentmultimap[credentialKey] + ) { + return []; + } + + const credentialEntries = identityContent.identity.contentmultimap[credentialKey]; + const credentials: Credential[] = []; + + for (const entry of credentialEntries) { + // Convert single univalues to an array to make the processing consistent. + const entriesToProcess: Array> = Array.isArray(entry) + ? entry + : [entry]; + + for (const singleEntry of entriesToProcess) { + if (singleEntry[DATA_DESCRIPTOR_VDXF_KEY.vdxfid]) { + const dataDescriptor = singleEntry[DATA_DESCRIPTOR_VDXF_KEY.vdxfid]; + + try { + const decryptedData = await api.native.decrypt_data(coin, { + datadescriptor: dataDescriptor, + evk: evk, + }); + + // The data descriptor is in a list. + if (decryptedData && Array.isArray(decryptedData)) { + const credObj = decryptedData[0] as Record; + const credJson = credObj[DATA_TYPE_OBJECT_CREDENTIAL.vdxfid]; + const cred = Credential.fromJson( + credJson as Parameters[0] + ); + credentials.push(cred); + } + } catch (err: unknown) { + const message = err instanceof Error ? err.message : String(err); + console.error(`Failed to decrypt credential: ${message}`); + // Decrypt the other credentials even if one fails. + } + } + } + } + + return credentials; + }; + + /** + * Creates a map of credentials organized by scope + * + * @param coin The chainTicker of the coin to make the call on + * @param address The identity or address to get the credentials from + */ + api.native.get_credentials_map = async ( + coin: string, + address: string + ): Promise => { + // Get the list of credentials. + const credentialsList: Credential[] = await api.native.get_credentials_list(coin, address); + + const credentialsMap: CredentialsMap = {}; + + // Track seen credential keys by scope to avoid duplicates. + const seenCredentials: Record> = {}; + + // Process each credential and organize by the main scope in reverse order so + // the newest credentials are first. + for (let i = credentialsList.length - 1; i >= 0; i--) { + const credential = credentialsList[i]; + + // Try to convert the main scope into an i-address, if it isn't one already. + let mainScope = credential.scopes[0] as string; + try { + fromBase58Check(mainScope); + } catch { + try { + const scopeId = await api.native.get_identity(coin, mainScope); + mainScope = scopeId.identity.identityaddress; + } catch { + // If there is an error getting the identity, then the scope is not an identity. + // In that case, just leave the scope as is. + } + } + + const credentialKey = credential.credentialKey; + + if (!credentialsMap[mainScope]) { + credentialsMap[mainScope] = []; + } + + if (!seenCredentials[mainScope]) { + seenCredentials[mainScope] = new Set(); + } + + // Skip duplicate credentials that come later since they are + // the previous credentials for that scope. + if (!seenCredentials[mainScope].has(credentialKey)) { + credentialsMap[mainScope].push(credential); + seenCredentials[mainScope].add(credentialKey); + } + } + + return credentialsMap; + }; + + /** + * Gets credentials filtered by scope and optionally by credential keys + * + * @param coin The chainTicker of the coin to make the call on + * @param address The identity or address to get the credentials from + * @param scope The scope of the credentials to get + * @param credentialKeys Optional list of credential keys to filter the result by + */ + api.native.get_credentials_by_scope = async ( + coin: string, + address: string, + scope: string, + credentialKeys?: string[] + ): Promise => { + const credentialsMap = await api.native.get_credentials_map(coin, address); + const scopeCredentials = credentialsMap[scope] || []; + + if (!credentialKeys || credentialKeys.length === 0) { + return scopeCredentials; + } + + return scopeCredentials.filter((cred: Credential) => + credentialKeys.includes(cred.credentialKey) + ); + }; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + api.setPost('/native/get_credentials_by_scope', async (req: any, res: any) => { + const {coin, address, scope, credentialKeys} = req.body; + + try { + const result = await api.native.get_credentials_by_scope( + coin, + address, + scope, + credentialKeys + ); + + res.send( + JSON.stringify({ + msg: 'success', + result: result, + }) + ); + } catch (e: unknown) { + const message = e instanceof Error ? e.message : String(e); + res.send( + JSON.stringify({ + msg: 'error', + result: message, + }) + ); + } + }); + + return api; +}; diff --git a/routes/api/native/decryptdata.js b/routes/api/native/decryptdata.js new file mode 100644 index 00000000..41a77358 --- /dev/null +++ b/routes/api/native/decryptdata.js @@ -0,0 +1,46 @@ +module.exports = api => { + /** + * Decrypts data given the parameters of a data descriptor, and optionally + * evk, ivk, txid and/or if to retrieve the data from its reference. + * + * @param {String} coin The chainTicker of the coin to make the call on + * @param {Object} params The parameters to pass to decryptdata + */ + api.native.decrypt_data = (coin, params) => { + return new Promise((resolve, reject) => { + api.native + .callDaemon(coin, 'decryptdata', [params]) + .then(resultObj => { + resolve(resultObj); + }) + .catch(err => { + reject(err); + }); + }); + }; + + api.setPost('/native/decrypt_data', (req, res) => { + const {chainTicker, parameters} = req.body; + + api.native + .decrypt_data(chainTicker, parameters) + .then(resultObj => { + const retObj = { + msg: 'success', + result: resultObj, + }; + + res.send(JSON.stringify(retObj)); + }) + .catch(error => { + const retObj = { + msg: 'error', + result: error.message, + }; + + res.send(JSON.stringify(retObj)); + }); + }); + + return api; +}; diff --git a/routes/api/native/idInformation.js b/routes/api/native/idInformation.js index dc4608a2..16aae39a 100644 --- a/routes/api/native/idInformation.js +++ b/routes/api/native/idInformation.js @@ -1,286 +1,392 @@ -const { GetOffersRequest } = require('verus-typescript-primitives'); +const {GetOffersRequest} = require('verus-typescript-primitives'); -module.exports = (api) => { - api.native.get_identities = (coin, includeCanSpend = true, includeCanSign = false, includeWatchOnly = false, includeOffers = false) => { +module.exports = api => { + api.native.get_identities = ( + coin, + includeCanSpend = true, + includeCanSign = false, + includeWatchOnly = false, + includeOffers = false + ) => { const promiseArr = [ - api.native.callDaemon(coin, 'listidentities', [includeCanSpend, includeCanSign, includeWatchOnly]), - api.native.callDaemon(coin, "z_gettotalbalance", []) - ] + api.native.callDaemon(coin, 'listidentities', [ + includeCanSpend, + includeCanSign, + includeWatchOnly, + ]), + api.native.callDaemon(coin, 'z_gettotalbalance', []), + ]; - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { Promise.all(promiseArr) - .then(async (resultArr) => { - const identities = resultArr[0] - const balances = resultArr[1] - const totalBalance = Number(balances.total) - - if (!identities) { - resolve([]) - } else { - let formattedIds = identities.slice() - let txcount = null - let reserve_balance = null - let useCache = true - let openOffers = {} + .then(async resultArr => { + const identities = resultArr[0]; + const balances = resultArr[1]; + const totalBalance = Number(balances.total); - try { - const walletinfo = await api.native.callDaemon(coin, "getwalletinfo", []) - txcount = walletinfo.txcount - reserve_balance = walletinfo.reserve_balance - } catch (e) { - useCache = false - api.log('Not using address balance cache:', 'get_identities') - api.log(e, 'get_identities') - } + if (!identities) { + resolve([]); + } else { + let formattedIds = identities.slice(); + let txcount = null; + let reserve_balance = null; + let useCache = true; + let openOffers = {}; - try { - openOffers = await api.native.callDaemon(coin, "listopenoffers", []) - } catch (e) { - api.log('Failed to fetch open offers:', 'get_identities') - api.log(e, 'get_identities') - } - - for (let i = 0; i < formattedIds.length; i++) { - const iAddr = identities[i].identity.identityaddress - const zAddr = identities[i].identity.privateaddress - let zBalance = null - let iBalances = {} - - iBalances = await api.native.get_addr_balance( - coin, - iAddr, - useCache, - txcount, - totalBalance, - reserve_balance - ); - const tBalance = iBalances[coin] - - if (zAddr != null) { - try { - zBalance = Number( - await api.native.get_addr_balance( - coin, - zAddr, - useCache, - txcount, - totalBalance, - reserve_balance - ) - ); - } catch (e) { - api.log(e, "get_identities"); - } + try { + const walletinfo = await api.native.callDaemon(coin, 'getwalletinfo', []); + txcount = walletinfo.txcount; + reserve_balance = walletinfo.reserve_balance; + } catch (e) { + useCache = false; + api.log('Not using address balance cache:', 'get_identities'); + api.log(e, 'get_identities'); } - - formattedIds[i].balances = { - native: { - public: { - confirmed: tBalance, - unconfirmed: null, - immature: null - }, - private: { - confirmed: zBalance - } - }, - reserve: {...iBalances, [coin]: null} + + try { + openOffers = await api.native.callDaemon(coin, 'listopenoffers', []); + } catch (e) { + api.log('Failed to fetch open offers:', 'get_identities'); + api.log(e, 'get_identities'); } - formattedIds[i].addresses = { - public: [{ - address: iAddr, - balances: { - native: tBalance, - reserve: {...iBalances, [coin]: null} - }, - tag: "identity" - }], - private: zAddr == null ? [] : [{ - address: zAddr, - balances: { - native: zBalance, - reserve: {} + for (let i = 0; i < formattedIds.length; i++) { + const iAddr = identities[i].identity.identityaddress; + const zAddr = identities[i].identity.privateaddress; + let zBalance = null; + let iBalances = {}; + + iBalances = await api.native.get_addr_balance( + coin, + iAddr, + useCache, + txcount, + totalBalance, + reserve_balance + ); + const tBalance = iBalances[coin]; + + if (zAddr != null) { + try { + zBalance = Number( + await api.native.get_addr_balance( + coin, + zAddr, + useCache, + txcount, + totalBalance, + reserve_balance + ) + ); + } catch (e) { + api.log(e, 'get_identities'); + } + } + + formattedIds[i].balances = { + native: { + public: { + confirmed: tBalance, + unconfirmed: null, + immature: null, + }, + private: { + confirmed: zBalance, + }, }, - tag: "sapling" - }] - } + reserve: {...iBalances, [coin]: null}, + }; + + formattedIds[i].addresses = { + public: [ + { + address: iAddr, + balances: { + native: tBalance, + reserve: {...iBalances, [coin]: null}, + }, + tag: 'identity', + }, + ], + private: + zAddr == null + ? [] + : [ + { + address: zAddr, + balances: { + native: zBalance, + reserve: {}, + }, + tag: 'sapling', + }, + ], + }; - const recoveryId = identities.find( - (listIdentityObject) => { + const recoveryId = identities.find(listIdentityObject => { return ( listIdentityObject.identity.identityaddress === formattedIds[i].identity.recoveryauthority ); - } - ); + }); - formattedIds[i].canwriterecovery = recoveryId != null && recoveryId.status === 'active' - formattedIds[i].canwriterevocation = formattedIds[i].canwriterecovery - - if ( - formattedIds[i].identity.parent !== - "i5w5MuNik5NtLcYmNzcvaoixooEebB6MGV" && - formattedIds[i].identity.parent !== - "iJhCezBExJHvtyH3fGhNnt2NhU4Ztkf2yq" && - formattedIds[i].identity.parent !== - "i3UXS5QPRQGNRDDqVnyWTnmFCTHDbzmsYk" - ) { - try { - formattedIds[i].identity.name = `${ - formattedIds[i].identity.name - }.${ - ( - await api.native.get_currency_definition( - coin, - formattedIds[i].identity.parent - ) - ).name - }`; - } catch(e) { - api.log('Failed to get parent for ' + formattedIds[i].identity.name, 'get_identities') - api.log(e, 'get_identities') + formattedIds[i].canwriterecovery = + recoveryId != null && recoveryId.status === 'active'; + formattedIds[i].canwriterevocation = formattedIds[i].canwriterecovery; + + if ( + formattedIds[i].identity.parent !== 'i5w5MuNik5NtLcYmNzcvaoixooEebB6MGV' && + formattedIds[i].identity.parent !== 'iJhCezBExJHvtyH3fGhNnt2NhU4Ztkf2yq' && + formattedIds[i].identity.parent !== 'i3UXS5QPRQGNRDDqVnyWTnmFCTHDbzmsYk' + ) { + try { + formattedIds[i].identity.name = `${formattedIds[i].identity.name}.${ + ( + await api.native.get_currency_definition( + coin, + formattedIds[i].identity.parent + ) + ).name + }`; + } catch (e) { + api.log( + 'Failed to get parent for ' + formattedIds[i].identity.name, + 'get_identities' + ); + api.log(e, 'get_identities'); + } } - } - if (formattedIds[i].status === 'active') { - formattedIds[i].canrevoke = identities.some( - (listIdentityObject) => { + if (formattedIds[i].status === 'active') { + formattedIds[i].canrevoke = identities.some(listIdentityObject => { return ( listIdentityObject.identity.identityaddress !== formattedIds[i].identity.identityaddress && listIdentityObject.identity.identityaddress === - formattedIds[i].identity.revocationauthority && + formattedIds[i].identity.revocationauthority && listIdentityObject.status === 'active' ); - } - ); - } else formattedIds[i].canrevoke = false - - if ( - formattedIds[i].status === "revoked" && - recoveryId != null && - recoveryId.status === "active" - ) { - formattedIds[i].canrecover = - recoveryId.identity.identityaddress !== - formattedIds[i].identity.identityaddress; - } else formattedIds[i].canrecover = false; - } + }); + } else formattedIds[i].canrevoke = false; - if (includeOffers) { - for (let i = 0; i < formattedIds.length; i++) { - try { - formattedIds[i].offers = (await api.native.getoffers( - new GetOffersRequest( - coin, - formattedIds[i].identity.identityaddress, - false, - false - ), - formattedIds, - openOffers - )) - } catch(e) { - api.log(`Failed to get offers for ${formattedIds[i].identity.name}`, 'get_identities'); - api.log(e, 'get_identities'); + if ( + formattedIds[i].status === 'revoked' && + recoveryId != null && + recoveryId.status === 'active' + ) { + formattedIds[i].canrecover = + recoveryId.identity.identityaddress !== formattedIds[i].identity.identityaddress; + } else formattedIds[i].canrecover = false; + } + + if (includeOffers) { + for (let i = 0; i < formattedIds.length; i++) { + try { + formattedIds[i].offers = await api.native.getoffers( + new GetOffersRequest( + coin, + formattedIds[i].identity.identityaddress, + false, + false + ), + formattedIds, + openOffers + ); + } catch (e) { + api.log( + `Failed to get offers for ${formattedIds[i].identity.name}`, + 'get_identities' + ); + api.log(e, 'get_identities'); + } } } - } - resolve(formattedIds) - } - }) - .catch(err => { - reject(err) - }) + resolve(formattedIds); + } + }) + .catch(err => { + reject(err); + }); }); }; - api.setPost('/native/get_identities', (req, res, next) => { - const { chainTicker, includeCanSpend, includeCanSign, includeWatchOnly, includeOffers } = + api.setPost('/native/get_identities', (req, res, next) => { + const {chainTicker, includeCanSpend, includeCanSign, includeWatchOnly, includeOffers} = req.body; - api.native.get_identities(chainTicker, includeCanSpend, includeCanSign, includeWatchOnly, includeOffers) - .then((identities) => { - const retObj = { - msg: 'success', - result: identities, - }; - - res.send(JSON.stringify(retObj)); - }) - .catch(error => { - const retObj = { - msg: 'error', - result: error.message, - }; - - res.send(JSON.stringify(retObj)); - }) + api.native + .get_identities(chainTicker, includeCanSpend, includeCanSign, includeWatchOnly, includeOffers) + .then(identities => { + const retObj = { + msg: 'success', + result: identities, + }; + + res.send(JSON.stringify(retObj)); + }) + .catch(error => { + const retObj = { + msg: 'error', + result: error.message, + }; + + res.send(JSON.stringify(retObj)); + }); }); api.native.get_identity = (coin, name) => { - return new Promise((resolve, reject) => { - api.native.callDaemon(coin, 'getidentity', [name]) - .then(async (identity) => { - if ( - identity.identity.parent !== - "i5w5MuNik5NtLcYmNzcvaoixooEebB6MGV" && - identity.identity.parent !== - "iJhCezBExJHvtyH3fGhNnt2NhU4Ztkf2yq" && + return new Promise((resolve, reject) => { + api.native + .callDaemon(coin, 'getidentity', [name]) + .then(async identity => { + if ( + identity.identity.parent !== 'i5w5MuNik5NtLcYmNzcvaoixooEebB6MGV' && + identity.identity.parent !== 'iJhCezBExJHvtyH3fGhNnt2NhU4Ztkf2yq' && // Avoid trying to get the null parent of VRSC or VRSCTEST. - identity.identity.parent !== - "i3UXS5QPRQGNRDDqVnyWTnmFCTHDbzmsYk" - ) { - identity.identity.name = `${identity.identity.name}.${ - ( - await api.native.get_currency_definition( - coin, - identity.identity.parent - ) - ).name - }`; - } - - try { - identity.offers = await api.native.getoffers( - new GetOffersRequest(coin, identity.identity.identityaddress, false, false) - ); - } catch (e) { - api.log(`Failed to get offers for ${identity.identity.name}`, "get_identity"); - api.log(e, "get_identity"); - } - - resolve(identity) - }) - .catch(err => { - reject(err) + identity.identity.parent !== 'i3UXS5QPRQGNRDDqVnyWTnmFCTHDbzmsYk' + ) { + identity.identity.name = `${identity.identity.name}.${ + (await api.native.get_currency_definition(coin, identity.identity.parent)).name + }`; + } + + try { + identity.offers = await api.native.getoffers( + new GetOffersRequest(coin, identity.identity.identityaddress, false, false) + ); + } catch (e) { + api.log(`Failed to get offers for ${identity.identity.name}`, 'get_identity'); + api.log(e, 'get_identity'); + } + + resolve(identity); + }) + .catch(err => { + reject(err); + }); + }); + }; + + api.setPost('/native/get_identity', (req, res) => { + const {chainTicker, name} = req.body; + + api.native + .get_identity(chainTicker, name) + .then(identity => { + const retObj = { + msg: 'success', + result: identity, + }; + + res.send(JSON.stringify(retObj)); }) + .catch(error => { + const retObj = { + msg: 'error', + result: error.message, + }; + + res.send(JSON.stringify(retObj)); + }); + }); + + api.native.get_identity_content = ( + coin, + name, + { + heightstart = 0, + heightend = 0, + txproofs = false, + txproofheight = 0, + vdxfkey = undefined, + keepdeleted = false, + } = {} + ) => { + // The daemon only accepts valid vdxfkeys and keepdeleted is after the vdxfkey in the arguments, + // so we can only have keepdeleted with a valid vdxfkey. + if (keepdeleted && !vdxfkey) { + return Promise.reject(new Error('vdxfkey must be defined when keepdeleted is provided')); + } + + const args = [name, heightstart, heightend, txproofs, txproofheight]; + if (vdxfkey) { + args.push(vdxfkey); + } + if (keepdeleted) { + args.push(true); + } + + return new Promise((resolve, reject) => { + api.native + .callDaemon(coin, 'getidentitycontent', args) + .then(async identity => { + if ( + identity.identity.parent !== 'i5w5MuNik5NtLcYmNzcvaoixooEebB6MGV' && + identity.identity.parent !== 'iJhCezBExJHvtyH3fGhNnt2NhU4Ztkf2yq' && + // Avoid trying to get the null parent of VRSC or VRSCTEST. + identity.identity.parent !== 'i3UXS5QPRQGNRDDqVnyWTnmFCTHDbzmsYk' + ) { + identity.identity.name = `${identity.identity.name}.${ + (await api.native.get_currency_definition(coin, identity.identity.parent)).name + }`; + } + + try { + identity.offers = await api.native.getoffers( + new GetOffersRequest(coin, identity.identity.identityaddress, false, false) + ); + } catch (e) { + api.log(`Failed to get offers for ${identity.identity.name}`, 'get_identity_content'); + api.log(e, 'get_identity_content'); + } + + resolve(identity); + }) + .catch(err => { + reject(err); + }); }); }; - api.setPost('/native/get_identity', (req, res, next) => { - const { chainTicker, name } = req.body - - api.native.get_identity(chainTicker, name) - .then((identity) => { - const retObj = { - msg: 'success', - result: identity, - }; - - res.send(JSON.stringify(retObj)); - }) - .catch(error => { - const retObj = { - msg: 'error', - result: error.message, - }; - - res.send(JSON.stringify(retObj)); - }) + api.setPost('/native/get_identity_content', (req, res) => { + const { + chainTicker, + name, + heightstart, + heightend, + txproofs, + txproofheight, + vdxfkey, + keepdeleted, + } = req.body; + + api.native + .get_identity_content(chainTicker, name, { + heightstart, + heightend, + txproofs, + txproofheight, + vdxfkey, + keepdeleted, + }) + .then(identity => { + const retObj = { + msg: 'success', + result: identity, + }; + + res.send(JSON.stringify(retObj)); + }) + .catch(error => { + const retObj = { + msg: 'error', + result: error.message, + }; + + res.send(JSON.stringify(retObj)); + }); }); - + return api; -}; \ No newline at end of file +}; diff --git a/routes/api/native/signdata.js b/routes/api/native/signdata.js index 0cb05ac8..bcc494cd 100644 --- a/routes/api/native/signdata.js +++ b/routes/api/native/signdata.js @@ -1,168 +1,133 @@ - -module.exports = (api) => { +module.exports = api => { /** * Signs a message given the message, and an identity/address currently in the wallet - * + * * @param {String} coin The chainTicker of the coin to make the call on * @param {String} address The identity or address to sign the message * @param {String} message The message to verify * @param {String} cursig The current signature if multisig */ - api.native.sign_message = ( - coin, - address, - message, - cursig = "" - ) => { + api.native.sign_message = (coin, address, message, cursig = '') => { return new Promise((resolve, reject) => { api.native - .callDaemon( - coin, - "signmessage", - [ - address, - message, - cursig - ] - ) - .then(resultObj => { - resolve(resultObj) - }) - .catch(err => { - reject(err); - }); + .callDaemon(coin, 'signmessage', [address, message, cursig]) + .then(resultObj => { + resolve(resultObj); + }) + .catch(err => { + reject(err); + }); }); }; /** * Signs a file given the file, and an identity/address currently in the wallet - * + * * @param {String} coin The chainTicker of the coin to make the call on * @param {String} address The identity or address to sign the file * @param {String} file The file to verify * @param {String} cursig The current signature if multisig */ - api.native.sign_file = ( - coin, - address, - file, - cursig = "" - ) => { + api.native.sign_file = (coin, address, file, cursig = '') => { return new Promise((resolve, reject) => { api.native - .callDaemon( - coin, - "signfile", - [ - address, - file, - cursig - ] - ) - .then(resultObj => { - resolve(resultObj) - }) - .catch(err => { - reject(err); - }); + .callDaemon(coin, 'signfile', [address, file, cursig]) + .then(resultObj => { + resolve(resultObj); + }) + .catch(err => { + reject(err); + }); }); }; /** - * Signs data given the arguments including an identity/address currently in the wallet + * Signs data given the parameters including an identity/address currently in the wallet * and the data to be signed - * + * * @param {String} coin The chainTicker of the coin to make the call on - * @param {String} arguments The arguments to pass to signdata + * @param {Object} params The parameters to pass to signdata */ - api.native.sign_data = ( - coin, - arguments, - ) => { + api.native.sign_data = (coin, params) => { return new Promise((resolve, reject) => { api.native - .callDaemon( - coin, - "signdata", - [ - arguments, - ] - ) - .then(resultObj => { - resolve(resultObj) - }) - .catch(err => { - reject(err); - }); + .callDaemon(coin, 'signdata', [params]) + .then(resultObj => { + resolve(resultObj); + }) + .catch(err => { + reject(err); + }); }); }; - - api.setPost('/native/sign_message', (req, res, next) => { - const { - chainTicker, - address, - data, - cursig - } = req.body; + api.setPost('/native/sign_message', (req, res) => { + const {chainTicker, address, data, cursig} = req.body; api.native - .sign_message( - chainTicker, - address, - data, - cursig - ) + .sign_message(chainTicker, address, data, cursig) .then(resultObj => { const retObj = { - msg: "success", - result: resultObj + msg: 'success', + result: resultObj, }; res.send(JSON.stringify(retObj)); }) .catch(error => { const retObj = { - msg: "error", - result: error.message + msg: 'error', + result: error.message, }; res.send(JSON.stringify(retObj)); }); }); - api.setPost('/native/sign_file', (req, res, next) => { - const { - chainTicker, - address, - data, - cursig - } = req.body; + api.setPost('/native/sign_file', (req, res) => { + const {chainTicker, address, data, cursig} = req.body; api.native - .sign_file( - chainTicker, - address, - data, - cursig - ) + .sign_file(chainTicker, address, data, cursig) .then(resultObj => { const retObj = { - msg: "success", - result: resultObj + msg: 'success', + result: resultObj, }; res.send(JSON.stringify(retObj)); }) .catch(error => { const retObj = { - msg: "error", - result: error.message + msg: 'error', + result: error.message, }; res.send(JSON.stringify(retObj)); }); }); + api.setPost('/native/sign_data', async (req, res) => { + const {chainTicker, params} = req.body; + + try { + const resultObj = await api.native.sign_data(chainTicker, params); + + const retObj = { + msg: 'success', + result: resultObj, + }; + + res.send(JSON.stringify(retObj)); + } catch (error) { + const retObj = { + msg: 'error', + result: error.message, + }; + + res.send(JSON.stringify(retObj)); + } + }); + return api; -}; \ No newline at end of file +}; diff --git a/routes/api/native/updateIdentity.js b/routes/api/native/updateIdentity.js new file mode 100644 index 00000000..078ab1bc --- /dev/null +++ b/routes/api/native/updateIdentity.js @@ -0,0 +1,83 @@ +module.exports = (api) => { + /** + * Updates an identity using the `jsonidentity` and optional parameters. + * + * @param {String} coin The chainTicker of the coin to make the call on + * @param {String} jsonidentity The new definition of the identity + * @param {Boolean} [returntx] If true, the transaction is signed by this wallet and returned + * @param {Boolean} [tokenupdate] If true and a tokenized ID control token exists, uses the token to perform the update + * @param {Number} [feeoffer] The non-standard fee amount to pay for the transaction + * @param {Number} [sourceoffunds] The transparent or private address to source all funds for fees to preserve privacy of the identity + */ + api.native.update_identity = ( + coin, + jsonidentity, + returntx = false, + tokenupdate = false, + feeoffer = undefined, + sourceoffunds = undefined + ) => { + + const params = [ + jsonidentity, + returntx, + tokenupdate, + ...(feeoffer !== undefined ? [feeoffer] : []), + ...(sourceoffunds !== undefined ? [sourceoffunds] : []) + ]; + + return new Promise((resolve, reject) => { + api.native + .callDaemon( + coin, + "updateidentity", + params + ) + .then(resultObj => { + resolve(resultObj) + }) + .catch(err => { + reject(err); + }); + }); + }; + + api.setPost('/native/update_identity', (req, res, next) => { + const { + coin, + jsonidentity, + returntx, + tokenupdate, + feeoffer, + sourceoffunds + } = req.body; + + api.native + .update_identity( + coin, + jsonidentity, + returntx, + tokenupdate, + feeoffer, + sourceoffunds + ) + .then(resultObj => { + const retObj = { + msg: "success", + result: resultObj + }; + + res.send(JSON.stringify(retObj)); + }) + .catch(error => { + const retObj = { + msg: "error", + result: error.message + }; + + res.send(JSON.stringify(retObj)); + }); + }); + + return api; +}; \ No newline at end of file diff --git a/routes/api/native/verusid/generic/encryptAppEncryptionResponse.ts b/routes/api/native/verusid/generic/encryptAppEncryptionResponse.ts new file mode 100644 index 00000000..0704da78 --- /dev/null +++ b/routes/api/native/verusid/generic/encryptAppEncryptionResponse.ts @@ -0,0 +1,73 @@ +import { + AppEncryptionResponseDetails, + AppEncryptionResponseDetailsJson, + DataDescriptor, +} from 'verus-typescript-primitives'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export default (api: any) => { + api.native.verusid.generic.encrypt_app_encryption_response = async ( + coin: string, + detail: AppEncryptionResponseDetails, + identity: string, + zaddress: string + ) => { + const signdataResult = await api.native.sign_data(coin, { + address: identity, + messagehex: detail.toBuffer().toString('hex'), + encrypttoaddress: zaddress, + }); + + const encryptedDescriptor = signdataResult.mmrdescriptor_encrypted; + + if ( + !encryptedDescriptor || + !encryptedDescriptor.datadescriptors || + encryptedDescriptor.datadescriptors.length === 0 + ) { + throw new Error('No encrypted data descriptor returned from signdata.'); + } + + const dataDescriptor = DataDescriptor.fromJson(encryptedDescriptor.datadescriptors[0]); + + return dataDescriptor.toJson(); + }; + + api.setPost( + '/native/verusid/generic/encrypt_app_encryption_response', + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async (req: any, res: any) => { + const {chainTicker, detailJSON, identity, zaddress} = req.body; + + try { + const detail = AppEncryptionResponseDetails.fromJson( + detailJSON as AppEncryptionResponseDetailsJson + ); + + const result = await api.native.verusid.generic.encrypt_app_encryption_response( + chainTicker, + detail, + identity, + zaddress + ); + + res.send( + JSON.stringify({ + msg: 'success', + result: result, + }) + ); + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + res.send( + JSON.stringify({ + msg: 'error', + result: message, + }) + ); + } + } + ); + + return api; +}; diff --git a/routes/api/native/verusid/generic/executeAppEncryptionRequest.ts b/routes/api/native/verusid/generic/executeAppEncryptionRequest.ts new file mode 100644 index 00000000..25124f4e --- /dev/null +++ b/routes/api/native/verusid/generic/executeAppEncryptionRequest.ts @@ -0,0 +1,81 @@ +import {AppEncryptionRequestDetails} from 'verus-typescript-primitives'; + +import {ZGetEncryptionAddressArgs, ZGetEncryptionAddressResult} from '../../zgetencryptionaddress'; + +interface AppEncryptionResult { + incomingViewingKey: string; + extendedViewingKey: string; + address: string; + extendedSpendingKey?: string; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export default (api: any) => { + api.native.verusid.generic.execute_app_encryption_request = async ( + coin: string, + detail: AppEncryptionRequestDetails, + fromID: string, + toID: string + ): Promise => { + const walletinfo = await api.native.callDaemon(coin, 'getwalletinfo', []); + + if (!walletinfo.seedfp) { + throw new Error('No seedfp found in walletinfo.'); + } + + const seed = walletinfo.seedfp; + + const args: ZGetEncryptionAddressArgs = { + seed: seed, + hdindex: detail.derivationNumber.toNumber(), + fromid: fromID, + toid: toID, + returnsecret: detail.returnESK(detail.flags), + }; + + const keys: ZGetEncryptionAddressResult = await api.native.z_get_encryption_address(coin, args); + + return { + extendedViewingKey: keys.extendedviewingkey, + incomingViewingKey: keys.ivk, + address: keys.address, + extendedSpendingKey: keys?.extendedspendingkey, + }; + }; + + api.setPost( + '/native/verusid/generic/execute_app_encryption_request', + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async (req: any, res: any) => { + const {chainTicker, detailJSON, fromID, toID} = req.body; + + try { + const detail = AppEncryptionRequestDetails.fromJson(detailJSON); + + const result = await api.native.verusid.generic.execute_app_encryption_request( + chainTicker, + detail, + fromID, + toID + ); + + res.send( + JSON.stringify({ + msg: 'success', + result: result, + }) + ); + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + res.send( + JSON.stringify({ + msg: 'error', + result: message, + }) + ); + } + } + ); + + return api; +}; diff --git a/routes/api/native/verusid/generic/signGenericResponse.ts b/routes/api/native/verusid/generic/signGenericResponse.ts new file mode 100644 index 00000000..57cff9c5 --- /dev/null +++ b/routes/api/native/verusid/generic/signGenericResponse.ts @@ -0,0 +1,51 @@ +import {GenericResponse} from 'verus-typescript-primitives'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export default (api: any) => { + api.native.verusid.generic.sign_response = async (coin: string, response: GenericResponse) => { + const signdataResult = await api.native.sign_data(coin, { + address: response.signature.identityID.toIAddress(), + datahash: response.getRawDataSha256().toString('hex'), + }); + + if (!signdataResult || !signdataResult.signature) { + throw new Error('No signature returned from signdata.'); + } + + response.signature.signatureAsVch = Buffer.from(signdataResult.signature, 'base64'); + + return response; + }; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + api.setPost('/native/verusid/generic/sign_generic_response', async (req: any, res: any) => { + const {chainTicker, response} = req.body; + + // The response comes in as a hex string of the buffer representation. + const genericResponse = new GenericResponse(); + genericResponse.fromBuffer(Buffer.from(response, 'hex')); + + try { + const signedResponse = await api.native.verusid.generic.sign_response( + chainTicker, + genericResponse + ); + res.send( + JSON.stringify({ + msg: 'success', + result: signedResponse.toBuffer().toString('hex'), + }) + ); + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + res.send( + JSON.stringify({ + msg: 'error', + result: message, + }) + ); + } + }); + + return api; +}; diff --git a/routes/api/native/verusid/generic/verifyGenericRequest.js b/routes/api/native/verusid/generic/verifyGenericRequest.js new file mode 100644 index 00000000..ebbda37f --- /dev/null +++ b/routes/api/native/verusid/generic/verifyGenericRequest.js @@ -0,0 +1,45 @@ +const {GenericRequest} = require('verus-typescript-primitives'); + +module.exports = api => { + /** + * Verifies a generic request + * @param {GenericRequest} Request + */ + api.native.verusid.generic.verify_generic_request = async (coin, request) => { + const verified = await api.native.verify_hash( + coin, + request.signature.identityID.toIAddress(), + request.getRawDataSha256().toString('hex'), + request.signature.signatureAsVch.toString('base64') + ); + return verified ? {verified} : {verified, message: 'Failed to verify signature'}; + }; + + api.setPost('/native/verusid/generic/verify_generic_request', async (req, res) => { + const {chainTicker, request} = req.body; + + try { + // The request is sent as a hex string of the buffer to avoid IPC serialization issues. + const genericRequest = new GenericRequest(); + genericRequest.fromBuffer(Buffer.from(request, 'hex')); + res.send( + JSON.stringify({ + msg: 'success', + result: await api.native.verusid.generic.verify_generic_request( + chainTicker, + genericRequest + ), + }) + ); + } catch (e) { + res.send( + JSON.stringify({ + msg: 'error', + result: e.message, + }) + ); + } + }); + + return api; +}; diff --git a/routes/api/native/verusid/identity/executeIdentityUpdateRequest.ts b/routes/api/native/verusid/identity/executeIdentityUpdateRequest.ts new file mode 100644 index 00000000..7fde3582 --- /dev/null +++ b/routes/api/native/verusid/identity/executeIdentityUpdateRequest.ts @@ -0,0 +1,92 @@ +import {IdentityUpdateRequestDetails} from 'verus-typescript-primitives'; + +import {encryptCredentialsInContentMultiMap} from '../../../utils/credentials/encryptCredentials'; +import {ZGetEncryptionAddressArgs, ZGetEncryptionAddressResult} from '../../zgetencryptionaddress'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +module.exports = (api: any) => { + api.native.verusid.identity.execute_identity_update_request = async ( + coin: string, + detail: IdentityUpdateRequestDetails + ) => { + // Replace any values that need to be encrypted before updating the identity. + if (!detail.identity) { + throw new Error('IdentityUpdateRequest does not contain an identity.'); + } + + // Change the identity name in the detail to include `@` at the end so that it is valid + // for the getidentity and updateidentity daemon calls. + detail.identity.name = detail.identity.name + '@'; + const address = detail.identity.name; + const identity = await api.native.get_identity(coin, detail.identity.name); + + if (!identity) { + throw new Error(`No identity found for ${address}.`); + } + + const zaddress = identity.identity.privateaddress; + + if (!zaddress) { + throw new Error(`No z-address found for identity ${address}.`); + } + + const args: ZGetEncryptionAddressArgs = { + address: zaddress, + fromid: address, + toid: address, + }; + + // Generate the viewing key and encryption address to encrypt the credentials. + const encryptionAddressInfo: ZGetEncryptionAddressResult = + await api.native.z_get_encryption_address(coin, args); + + const contentmultimap = detail.identity.contentMultiMap; + + if (contentmultimap) { + await encryptCredentialsInContentMultiMap( + api, + coin, + address, + contentmultimap, + encryptionAddressInfo.ivk, + encryptionAddressInfo.address + ); + } + + const txid = await api.native.update_identity(coin, detail.toCLIJson()); + + return {txid: txid}; + }; + + api.setPost( + '/native/verusid/identity/execute_identity_update_request', + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async (req: any, res: any) => { + const {chainTicker, detailJSON} = req.body; + + try { + const detail = IdentityUpdateRequestDetails.fromJson(detailJSON); + + res.send( + JSON.stringify({ + msg: 'success', + result: await api.native.verusid.identity.execute_identity_update_request( + chainTicker, + detail + ), + }) + ); + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + res.send( + JSON.stringify({ + msg: 'error', + result: message, + }) + ); + } + } + ); + + return api; +}; diff --git a/routes/api/native/verusid/login/signResponse.js b/routes/api/native/verusid/login/signResponse.js index 540c1b72..52e41bbd 100644 --- a/routes/api/native/verusid/login/signResponse.js +++ b/routes/api/native/verusid/login/signResponse.js @@ -5,14 +5,12 @@ const { } = require("verus-typescript-primitives"); module.exports = (api) => { - api.native.verusid.login.sign_response = async (response) => { + api.native.verusid.login.sign_response = async (coin, response) => { const loginResponse = new LoginConsentResponse(response); - const chainTicker = response.chainTicker - // Add the chainTicker when checking the request since the verify request needs it. - let decisionRequest = loginResponse.decision.request - decisionRequest.chainTicker = chainTicker + const decisionRequest = loginResponse.decision.request const verificatonCheck = await api.native.verusid.login.verify_request( + coin, decisionRequest ); @@ -20,7 +18,7 @@ module.exports = (api) => { throw new Error(verificatonCheck.message); } - const signdataResult = await api.native.sign_data(chainTicker, + const signdataResult = await api.native.sign_data(coin, { "address": loginResponse.signing_id, "datahash": loginResponse.decision.toSha256().toString("hex") @@ -32,20 +30,17 @@ module.exports = (api) => { LOGIN_CONSENT_RESPONSE_SIG_VDXF_KEY ); - // Remove the chainTicker field since it's not normally part of the response. - delete decisionRequest.chainTicker - return { response: loginResponse}; }; api.setPost("/native/verusid/login/sign_response", async (req, res, next) => { - const { response } = req.body; + const { chainTicker, response } = req.body; try { res.send( JSON.stringify({ msg: "success", - result: await api.native.verusid.login.sign_response(response), + result: await api.native.verusid.login.sign_response(chainTicker, response), }) ); } catch (e) { diff --git a/routes/api/native/verusid/login/verifyRequest.js b/routes/api/native/verusid/login/verifyRequest.js index c80c0358..097f676e 100644 --- a/routes/api/native/verusid/login/verifyRequest.js +++ b/routes/api/native/verusid/login/verifyRequest.js @@ -5,12 +5,11 @@ module.exports = (api) => { * Verifies a login request * @param {LoginConsentRequest} Request */ - api.native.verusid.login.verify_request = async (request) => { + api.native.verusid.login.verify_request = async (coin, request) => { const loginConsentRequest = new LoginConsentRequest(request); - const chainTicker = request.chainTicker const verified = await api.native.verify_hash( - chainTicker, + coin, loginConsentRequest.signing_id, loginConsentRequest.challenge.toSha256().toString('hex'), loginConsentRequest.signature.signature @@ -20,13 +19,13 @@ module.exports = (api) => { }; api.setPost("/native/verusid/login/verify_request", async (req, res, next) => { - const { request } = req.body; + const { chainTicker, request } = req.body; try { res.send( JSON.stringify({ msg: "success", - result: await api.native.verusid.login.verify_request(request), + result: await api.native.verusid.login.verify_request(chainTicker, request), }) ); } catch (e) { diff --git a/routes/api/native/verusid/verusid.js b/routes/api/native/verusid/verusid.js index b49bab87..ecade0cf 100644 --- a/routes/api/native/verusid/verusid.js +++ b/routes/api/native/verusid/verusid.js @@ -1,7 +1,26 @@ -module.exports = (api) => { - api.native.verusid = {} - api.native.verusid.login = {} - api.native.verusid.provision = {} +module.exports = api => { + api.native.verusid = {}; + api.native.verusid.login = {}; + api.native.verusid.provision = {}; + api.native.verusid.identity = {}; + api.native.verusid.generic = {}; + + // Identity + require('./identity/executeIdentityUpdateRequest')(api); + + // Login + require('./login/verifyRequest')(api); + require('./login/signResponse')(api); + + // Provisioning + require('./provision/signIdProvisioningRequest')(api); + require('./provision/verifyIdProvisioningResponse')(api); + + // Generic + require('./generic/verifyGenericRequest')(api); + require('./generic/signGenericResponse').default(api); + require('./generic/executeAppEncryptionRequest').default(api); + require('./generic/encryptAppEncryptionResponse').default(api); return api; }; diff --git a/routes/api/native/zgetencryptionaddress.ts b/routes/api/native/zgetencryptionaddress.ts new file mode 100644 index 00000000..e8541b01 --- /dev/null +++ b/routes/api/native/zgetencryptionaddress.ts @@ -0,0 +1,69 @@ +// Temporarily export the interfaces since the API has no defined type yet. +export interface ZGetEncryptionAddressArgs { + address?: string; + seed?: string; + hdindex?: number; + rootkey?: string; + fromid?: string; + toid?: string; + encryptionindex?: number; + returnsecret?: boolean; +} + +export interface ZGetEncryptionAddressResult { + extendedviewingkey: string; + ivk: string; + address: string; + extendedspendingkey?: string; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export default (api: any) => { + /** + * Generates a z-address, viewing key, and optionally an extended secret key using either + * a z-address in the wallet, wallet seed and hdindex, or root key (extended private key). + * + * @param {string} coin The chainTicker of the coin to make the call on + * @param {ZGetEncryptionAddressArgs} args The arguments to pass to z_getencryptionaddress + * - address: z-address that is present in this wallet + * - seed: raw wallet seed + * - hdindex: address to derive from seed (default=0) + * - rootkey: extended private key + * - fromid: a key to be used between the fromid and the toid + * - toid: a key to be used between the fromid and the toid + * - encryptionindex: index to derive the final encryption HD address from the derived seed (default=0) + * - returnsecret: if true, returns extended private key (default=false) + */ + api.native.z_get_encryption_address = async ( + coin: string, + args: ZGetEncryptionAddressArgs + ): Promise => { + return api.native.callDaemon(coin, 'z_getencryptionaddress', [args]); + }; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + api.setPost('/native/z_get_encryption_address', async (req: any, res: any) => { + const {chainTicker, args}: {chainTicker: string; args: ZGetEncryptionAddressArgs} = req.body; + + try { + const result = await api.native.z_get_encryption_address(chainTicker, args); + + res.send( + JSON.stringify({ + msg: 'success', + result, + }) + ); + } catch (e) { + const message = e instanceof Error ? e.message : String(e); + res.send( + JSON.stringify({ + msg: 'error', + result: message, + }) + ); + } + }); + + return api; +}; diff --git a/routes/api/plugin/builtin/loginconsentui.js b/routes/api/plugin/builtin/loginconsentui.js deleted file mode 100644 index aa169032..00000000 --- a/routes/api/plugin/builtin/loginconsentui.js +++ /dev/null @@ -1,115 +0,0 @@ -const axios = require('axios'); -const { - LOGIN_CONSENT_RESPONSE_VDXF_KEY, - LOGIN_CONSENT_WEBHOOK_VDXF_KEY, - LOGIN_CONSENT_REDIRECT_VDXF_KEY, - LoginConsentResponse, -} = require("verus-typescript-primitives"); -const { pushMessage } = require('../../../ipc/ipc'); -const { ReservedPluginTypes } = require('../../utils/plugin/builtin'); -const { shell } = require('electron') -const { URL } = require('url'); -const base64url = require('base64url'); - -module.exports = (api) => { - api.loginConsentUi = {} - - api.loginConsentUi.handle_redirect = (response, redirectinfo) => { - const { vdxfkey, uri } = redirectinfo - - const handlers = { - [LOGIN_CONSENT_WEBHOOK_VDXF_KEY.vdxfid]: async () => { - return await axios.post( - uri, - response - ); - }, - [LOGIN_CONSENT_REDIRECT_VDXF_KEY.vdxfid]: () => { - const url = new URL(uri) - - // Prevent opening any urls that don't go to the browser. - if (!['https:', 'http:'].includes(url.protocol)) { - return null; - } - - const res = new LoginConsentResponse(response) - url.searchParams.set( - LOGIN_CONSENT_RESPONSE_VDXF_KEY.vdxfid, - base64url(res.toBuffer()) - ); - - shell.openExternal(url.toString()) - return null - } - } - - return handlers[vdxfkey] == null ? null : handlers[vdxfkey](); - } - - api.loginConsentUi.request = async ( - request, - originInfo - ) => { - return new Promise((resolve, reject) => { - try { - api.startPlugin( - ReservedPluginTypes.VERUS_LOGIN_CONSENT_UI, - true, - (data) => { - try { - if (data.redirect) api.loginConsentUi.handle_redirect(data.response, data.redirect); - - resolve(data.response); - } catch(e) { - reject(e) - } - }, - (pluginWindow) => { - pushMessage( - pluginWindow, - { - request: request, - origin_app_info: originInfo, - }, - "VERUS_LOGIN_CONSENT_REQUEST" - ); - }, - 830, - 550, - false - ); - } catch (e) { - reject(e); - } - }); - }; - - api.setPost('/plugin/builtin/verus_login_consent_ui/request', async (req, res, next) => { - const { request } = req.body; - const { app_id, builtin } = req.api_header - - try { - const retObj = { - msg: "success", - result: await api.loginConsentUi.request( - request, - { - id: app_id, - search_builtin: builtin, - } - ), - }; - - res.send(JSON.stringify(retObj)); - } catch (e) { - const retObj = { - msg: 'error', - result: e.message, - }; - - res.send(JSON.stringify(retObj)); - } - }); - - return api; -}; \ No newline at end of file diff --git a/routes/api/plugin/builtin/loginconsentui.ts b/routes/api/plugin/builtin/loginconsentui.ts new file mode 100644 index 00000000..e05525ba --- /dev/null +++ b/routes/api/plugin/builtin/loginconsentui.ts @@ -0,0 +1,238 @@ +import axios from 'axios'; +import base64url from 'base64url'; +import {BrowserWindow, shell} from 'electron'; +import { + GENERIC_RESPONSE_DEEPLINK_VDXF_KEY, + LOGIN_CONSENT_REDIRECT_VDXF_KEY, + LOGIN_CONSENT_RESPONSE_VDXF_KEY, + LOGIN_CONSENT_WEBHOOK_VDXF_KEY, + LoginConsentResponse, + ResponseURI, +} from 'verus-typescript-primitives'; + +import {pushMessage} from '../../../ipc/ipc'; +import {ReservedPluginTypes} from '../../utils/plugin/builtin'; + +interface RedirectInfo { + type: string; + uri: string; +} + +interface OriginInfo { + id: string; + search_builtin: boolean; +} + +interface ResponseURIJson { + type: string; + uri: string; +} + +interface SingleURIResult { + type: 'v1'; + responseKey: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + response: any; + redirect: RedirectInfo; +} + +interface MultiURIResult { + type: 'v2'; + response: string; + uris: ResponseURIJson[]; +} + +type DeeplinkResponse = SingleURIResult | MultiURIResult | {error: string}; + +// Wraps shell.openExternal to prevent opening any urls that don't go to the browser for security reasons. +function safeOpenExternal(url: URL): void { + if (!['https:', 'http:'].includes(url.protocol)) { + return; + } + + try { + shell.openExternal(url.toString()); + } catch (error) { + console.error('Failed to open URL:', error); + } +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export = (api: any) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + api.loginConsentUi = {} as any; + + // Handles the multiple responses in V2 requests. + api.loginConsentUi.respond = async (response: string, uris: ResponseURIJson[]): Promise => { + if (!uris || uris.length === 0) return; + + // Convert JSON objects to ResponseURI instances and find the first POST URI, fallback to REDIRECT. + const responseUris = uris.map(uri => ResponseURI.fromJson(uri)); + const selectedUri = + responseUris.find(uri => uri.type.eq(ResponseURI.TYPE_POST)) ?? + responseUris.find(uri => uri.type.eq(ResponseURI.TYPE_REDIRECT)); + + if (!selectedUri) return; + + // Deserialize the response from hex string to Buffer + const responseBuffer = Buffer.from(response, 'hex'); + + // Handle POST URI. + if (selectedUri.type.eq(ResponseURI.TYPE_POST)) { + setTimeout(() => { + api.minimizeApp(); + }, 250); + + const uri = selectedUri.getUriString(); + + try { + await axios.post(uri, responseBuffer, { + headers: {'Content-Type': 'application/octet-stream'}, + }); + } catch (e) { + console.error(`Failed to post to webhook ${e}`); + } + return; + } + + // Handle REDIRECT URI. + if (selectedUri.type.eq(ResponseURI.TYPE_REDIRECT)) { + const url = new URL(selectedUri.getUriString()); + + url.searchParams.set(GENERIC_RESPONSE_DEEPLINK_VDXF_KEY.vdxfid, base64url(responseBuffer)); + safeOpenExternal(url); + } + }; + + // Handles the old redirect URIs in V1 requests. + api.loginConsentUi.handle_redirect = ( + responseKey: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + response: any, + redirectinfo: RedirectInfo + ): Promise => { + const {type, uri} = redirectinfo; + + const post = async (): Promise => { + // Add a slight delay to allow the user to see the desktop GUI briefly. + setTimeout(() => { + api.minimizeApp(); + }, 250); + + try { + await axios.post(uri, response); + } catch (e) { + console.error(`Failed to post to webhook ${e}`); + } + + return; + }; + + const redirect = async (): Promise => { + const url = new URL(uri); + + let res: LoginConsentResponse; + + switch (responseKey) { + case LOGIN_CONSENT_RESPONSE_VDXF_KEY.vdxfid: + res = new LoginConsentResponse(response); + break; + + default: + throw new Error(`Unsupported response key for redirecting: ${responseKey}`); + } + + url.searchParams.set(responseKey, base64url(res.toBuffer())); + + safeOpenExternal(url); + }; + + const handlers: Record Promise> = { + [LOGIN_CONSENT_WEBHOOK_VDXF_KEY.vdxfid]: post, + [LOGIN_CONSENT_REDIRECT_VDXF_KEY.vdxfid]: redirect, + }; + + return handlers[type]?.() ?? Promise.resolve(); + }; + + api.loginConsentUi.deeplink = async ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + deeplink: any, + originInfo: OriginInfo + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ): Promise => { + return new Promise((resolve, reject) => { + api.startPlugin( + ReservedPluginTypes.VERUS_LOGIN_CONSENT_UI, + true, + async (data: DeeplinkResponse) => { + try { + if ('error' in data) { + reject(new Error(data.error)); + return; + } + + // Handle v2 multi-URI result + if (data.type === 'v2') { + await api.loginConsentUi.respond(data.response, data.uris); + } else if (data.type === 'v1') { + // Handle v1 single-URI result + await api.loginConsentUi.handle_redirect( + data.responseKey, + data.response, + data.redirect + ); + } + + resolve(data.response); + } catch (e) { + reject(e); + } + }, + (pluginWindow: BrowserWindow) => { + pushMessage( + pluginWindow, + { + deeplink: deeplink, + origin_app_info: originInfo, + }, + 'VERUS_LOGIN_CONSENT_REQUEST' + ); + }, + 830, + 550, + false + ); + }); + }; + + api.setPost( + '/plugin/builtin/verus_login_consent_ui/request', + // eslint-disable-next-line @typescript-eslint/no-explicit-any + async (req: any, res: any) => { + const {request} = req.body; + const {app_id, builtin} = req.api_header; + + try { + const retObj = { + msg: 'success', + result: await api.loginConsentUi.deeplink(request, { + id: app_id, + search_builtin: builtin, + }), + }; + + res.send(JSON.stringify(retObj)); + } catch (e) { + const retObj = { + msg: 'error', + result: (e as Error).message, + }; + + res.send(JSON.stringify(retObj)); + } + } + ); + + return api; +}; diff --git a/routes/api/utility_apis/deeplinkSetup.js b/routes/api/utility_apis/deeplinkSetup.js new file mode 100644 index 00000000..573b8fed --- /dev/null +++ b/routes/api/utility_apis/deeplinkSetup.js @@ -0,0 +1,226 @@ +const fs = require('fs-extra'); +const path = require('path'); +const os = require('os'); +const {execFile} = require('child_process'); +const util = require('util'); +const {IS_TESTNET} = require('../utils/constants/dev_options'); +const execFileAsync = util.promisify(execFile); +const {APP_NAME} = require('../../appBasicInfo'); + +// Increase maxBuffer to handle large outputs (e.g., AppImage extraction). +const MAX_BUFFER_SIZE = 10 * 1024 * 1024; // 10MB + +function xdgDataHome() { + return process.env.XDG_DATA_HOME || path.join(os.homedir(), '.local', 'share'); +} + +async function extractAppImage(appImage, tmpDir) { + await execFileAsync(appImage, ['--appimage-extract'], { + cwd: tmpDir, + maxBuffer: MAX_BUFFER_SIZE, + }); + const extractedPath = path.join(tmpDir, 'squashfs-root'); + return extractedPath; +} + +async function installIcons(squashRoot) { + const hicolorBase = path.join(xdgDataHome(), 'icons', 'hicolor'); + const sourceHicolorBase = path.join(squashRoot, 'usr', 'share', 'icons', 'hicolor'); + + // Check if hicolor directory exists in AppImage. + if (!(await fs.pathExists(sourceHicolorBase))) { + return; + } + + let iconsCopied = 0; + + // Copy all available icon sizes from the hicolor structure. + const sizeDirs = await fs.readdir(sourceHicolorBase).catch(() => []); + + for (const sizeDir of sizeDirs) { + const sourceSizeDir = path.join(sourceHicolorBase, sizeDir, 'apps'); + const destSizeDir = path.join(hicolorBase, sizeDir, 'apps'); + + if (await fs.pathExists(sourceSizeDir)) { + const iconFiles = await fs.readdir(sourceSizeDir).catch(() => []); + const pngFiles = iconFiles.filter(f => f.toLowerCase().endsWith('.png')); + + if (pngFiles.length > 0) { + await fs.mkdirp(destSizeDir); + + for (const pngFile of pngFiles) { + const sourceIcon = path.join(sourceSizeDir, pngFile); + const destIcon = path.join(destSizeDir, pngFile); + + await fs.copyFile(sourceIcon, destIcon); + iconsCopied++; + } + } + } + } + + if (iconsCopied > 0) { + // Update icon caches if possible. + const iconCacheCommands = [ + ['gtk-update-icon-cache-3.0', ['-t', hicolorBase]], + ['gtk-update-icon-cache', ['-f', hicolorBase]], + ['update-icon-caches', [path.dirname(hicolorBase)]], + ]; + + for (const [cmd, args] of iconCacheCommands) { + try { + await execFileAsync(cmd, args, {maxBuffer: MAX_BUFFER_SIZE}); + } catch (e) { + console.warn(`${cmd} ${args.join(' ')} failed:`, e); + } + } + } +} + +// Moves the desktop file from the extracted AppImage, modifies the execution so +// that it works for electron, and returns the contents and path of the file. +async function installDesktopFile(squashRoot, appImage) { + const appsDir = path.join(xdgDataHome(), 'applications'); + await fs.mkdirp(appsDir); + + // Find the desktop file in the extracted AppImage dynamically. + const files = await fs.readdir(squashRoot); + const desktopFileName = files.find(file => file.endsWith('.desktop')); + + if (!desktopFileName) { + throw new Error('No desktop file found in AppImage'); + } + + const sourceDesktopFile = path.join(squashRoot, desktopFileName); + + if (!(await fs.pathExists(sourceDesktopFile))) { + throw new Error(`Desktop file not found in AppImage at ${sourceDesktopFile}`); + } + + let desktopFileContent = await fs.readFile(sourceDesktopFile, 'utf8'); + let adjustedDesktopFileName = desktopFileName; + + const desktopFileBaseName = desktopFileName.replace(/\.desktop$/, ''); + + // Extract X-AppImage-Version and append to Name in parentheses. + const versionMatch = desktopFileContent.match(/^X-AppImage-Version=(.+)$/m); + if (versionMatch) { + const version = versionMatch[1].trim(); + + desktopFileContent = desktopFileContent.replace(/^Name=(.+)$/m, (match, name) => { + const trimmedName = name.trim(); + if (!trimmedName.includes(`(${version})`)) { + return `Name=${trimmedName} (${version})`; + } + return match; + }); + + // Add the version if possible to the desktop file name. + const versionSuffix = `-${version}`; + const desktopFileNameWithId = `${desktopFileBaseName}${versionSuffix}.desktop`; + adjustedDesktopFileName = desktopFileNameWithId; + } + + const desktopFile = path.join(appsDir, adjustedDesktopFileName); + + // Remove stale desktop files to clean up the cache. + for (const filename of await fs.readdir(appsDir)) { + if (filename.startsWith(desktopFileBaseName) && filename.endsWith('.desktop')) { + // Don't delete testnet files if not installing testnet and vice versa. + if (IS_TESTNET === filename.includes('testnet')) { + await fs.remove(path.join(appsDir, filename)).catch(() => {}); + } + } + } + + // Replace AppRun with the actual AppImage path and append --no-sandbox %U + // Need to have --no-sandbox for Electron otherwise the deeplinks fail. + desktopFileContent = desktopFileContent.replace(/^Exec=.*$/m, `Exec=${appImage} --no-sandbox %U`); + + // Update the StartupWMClass to properly associate the running app with the desktop icon. + // The name used by electron doesn't match the one used by electron builder, so we need to set it here. + const wmClass = APP_NAME; + desktopFileContent = desktopFileContent.replace( + /^StartupWMClass=.*$/m, + `StartupWMClass=${wmClass}` + ); + + await fs.writeFile(desktopFile, desktopFileContent, {mode: 0o644}); + + return {content: desktopFileContent, path: desktopFile}; +} + +async function registerDesktopFile(desktopFileName, desktopFileContent) { + const appsDir = path.dirname(desktopFileName); + + // Extract MimeType from the provided desktop file. + let mimeTypes = []; + const mimeTypeMatch = desktopFileContent.match(/^MimeType=(.+)$/m); + if (mimeTypeMatch) { + mimeTypes = mimeTypeMatch[1] + .split(';') + .map(m => m.trim()) + .filter(m => m.length > 0); + } + + // Skip registration if no MIME types found in desktop file + if (mimeTypes.length === 0) { + return; + } + + // Create the desktop integration. + await execFileAsync('update-desktop-database', [appsDir], {maxBuffer: MAX_BUFFER_SIZE}); + + // Force update desktop menu. + try { + await execFileAsync('xdg-desktop-menu', ['forceupdate'], {maxBuffer: MAX_BUFFER_SIZE}); + } catch (e) { + console.warn(`xdg-desktop-menu forceupdate failed:`, e); + } + + for (const mimeType of mimeTypes) { + try { + await execFileAsync('xdg-mime', ['default', path.basename(desktopFileName), mimeType], { + maxBuffer: MAX_BUFFER_SIZE, + }); + } catch (e) { + console.warn(`xdg-mime default ${path.basename(desktopFileName)} ${mimeType} failed:`, e); + } + } + + // Update MIME database. + const mimeDir = path.join(xdgDataHome(), 'mime'); + try { + await execFileAsync('update-mime-database', [mimeDir], {maxBuffer: MAX_BUFFER_SIZE}); + } catch (e) { + console.warn(`update-mime-database with ${mimeDir} failed:`, e); + } +} + +module.exports = api => { + api.installLinuxDeeplinkIntegration = async () => { + if (process.platform !== 'linux') return; + + // Always run the integration so that if the appimage moves or a new version is being used, + // the user will always have a working integration. + const appImage = process.env.APPIMAGE; + + // Skip it if not running from an AppImage. + if (!appImage || !(await fs.pathExists(appImage))) { + return; + } + + const tmpBase = await fs.mkdtemp(path.join(os.tmpdir(), 'verus-appimage-')); + + try { + const squashRoot = await extractAppImage(appImage, tmpBase); + await installIcons(squashRoot); + const desktopFileResult = await installDesktopFile(squashRoot, appImage); + await registerDesktopFile(desktopFileResult.path, desktopFileResult.content); + } finally { + await fs.remove(tmpBase); + } + }; + + return api; +}; diff --git a/routes/api/utils/constants/dev_options.js b/routes/api/utils/constants/dev_options.js deleted file mode 100644 index a363c29d..00000000 --- a/routes/api/utils/constants/dev_options.js +++ /dev/null @@ -1,9 +0,0 @@ -const IS_TESTNET = false; -const ROOT_SYSTEM_ID = IS_TESTNET ? "iJhCezBExJHvtyH3fGhNnt2NhU4Ztkf2yq" : "i5w5MuNik5NtLcYmNzcvaoixooEebB6MGV"; -const ROOT_SYSTEM_NAME = IS_TESTNET ? "VRSCTEST" : "VRSC"; - -module.exports = { - IS_TESTNET, - ROOT_SYSTEM_ID, - ROOT_SYSTEM_NAME -} \ No newline at end of file diff --git a/routes/api/utils/constants/dev_options.ts b/routes/api/utils/constants/dev_options.ts new file mode 100644 index 00000000..9115e237 --- /dev/null +++ b/routes/api/utils/constants/dev_options.ts @@ -0,0 +1,11 @@ +const IS_TESTNET = false; +const ROOT_SYSTEM_ID = IS_TESTNET + ? 'iJhCezBExJHvtyH3fGhNnt2NhU4Ztkf2yq' + : 'i5w5MuNik5NtLcYmNzcvaoixooEebB6MGV'; +const ROOT_SYSTEM_NAME = IS_TESTNET ? 'VRSCTEST' : 'VRSC'; + +module.exports = { + IS_TESTNET, + ROOT_SYSTEM_ID, + ROOT_SYSTEM_NAME, +}; diff --git a/routes/api/utils/constants/supported_dls.js b/routes/api/utils/constants/supported_dls.js index 82973bb1..6a3a6cad 100644 --- a/routes/api/utils/constants/supported_dls.js +++ b/routes/api/utils/constants/supported_dls.js @@ -1,10 +1,10 @@ -const { LOGIN_CONSENT_REQUEST_VDXF_KEY } = require("verus-typescript-primitives") +const {LOGIN_CONSENT_REQUEST_VDXF_KEY} = require('verus-typescript-primitives'); -const CALLBACK_HOST = 'x-callback-url' +const CALLBACK_HOST = 'x-callback-url'; -const SUPPORTED_DLS = [LOGIN_CONSENT_REQUEST_VDXF_KEY.vdxfid] +const SUPPORTED_V1_DLS = [LOGIN_CONSENT_REQUEST_VDXF_KEY.vdxfid]; module.exports = { - SUPPORTED_DLS, - CALLBACK_HOST -} \ No newline at end of file + SUPPORTED_V1_DLS, + CALLBACK_HOST, +}; diff --git a/routes/api/utils/credentials/encryptCredentials.ts b/routes/api/utils/credentials/encryptCredentials.ts new file mode 100644 index 00000000..12ede8f2 --- /dev/null +++ b/routes/api/utils/credentials/encryptCredentials.ts @@ -0,0 +1,96 @@ +import { + CompactIAddressObject, + Credential, + DATA_DESCRIPTOR_VDXF_KEY, + DATA_TYPE_OBJECT_CREDENTIAL, + DataDescriptor, + FqnContentMultiMap, + FqnVdxfUniValue, + IDENTITY_CREDENTIAL, + VdxfUniType, +} from 'verus-typescript-primitives'; + +interface GetVdxfIdResult { + vdxfid: string; + indexid: string; + hash160result: string; + qualifiedname: { + namespace: string; + name: string; + }; + bounddata?: { + vdxfkey: string; + }; +} + +// Replaces the credentials in the contentmultimap with their encrypted forms +// in data descriptors. +export async function encryptCredentialsInContentMultiMap( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + api: any, + coin: string, + address: string, + contentmultimap: FqnContentMultiMap, + ivk: string, + encryptionAddress: string +): Promise { + const searchKey = IDENTITY_CREDENTIAL.vdxfid; + const valueArray = contentmultimap.kvContent.getByAddress(searchKey); + if (!valueArray) return; + + for (let i = 0; i < valueArray.length; i++) { + const vdxfUniValue = valueArray[i]; + if (!(vdxfUniValue instanceof FqnVdxfUniValue)) continue; + // vdxfUniValue.values doesn't work for key comparison since it uses a + // different method for generating string keys than toIAddress() or toAddress(). + // We also have to completely rebuild the values array since we can't modify + // it in place. + const newValues: Array<{[key: string]: VdxfUniType}> = []; + for (const [valueKey, valueType] of Array.from(vdxfUniValue.entries())) { + // Each valueObj contains exactly one key-value pair. + const vdxfkey = valueKey.toAddress(); + if (vdxfkey === DATA_TYPE_OBJECT_CREDENTIAL.vdxfid) { + // Replace the credential with the encrypted data descriptor. + const credential = valueType as Credential; + + const signdataResult = await api.native.sign_data(coin, { + address: address, + vdxfdata: {[vdxfkey]: credential.toJson()}, + encrypttoaddress: encryptionAddress, + }); + + if (!signdataResult) { + throw new Error('Failed to encrypt the credential.'); + } + + const dataDescriptor = DataDescriptor.fromJson( + signdataResult.mmrdescriptor_encrypted.datadescriptors[0] + ); + const descriptorKey = CompactIAddressObject.fromAddress(DATA_DESCRIPTOR_VDXF_KEY.vdxfid); + // The setter for the values array converts using Buffer.from(key, 'hex') + // so we need to use hex buffer representations. + newValues.push({[descriptorKey.toBuffer().toString('hex')]: dataDescriptor}); + } else { + newValues.push({[valueKey.toBuffer().toString('hex')]: valueType}); + } + } + vdxfUniValue.values = newValues; + } + // Replace the credentials key with a hashed key. + const credentialKeyResult: GetVdxfIdResult = await api.native.get_vdxf_id( + coin, + IDENTITY_CREDENTIAL.vdxfid, + { + uint256: ivk, + } + ); + + if (!credentialKeyResult || !credentialKeyResult.vdxfid) { + throw new Error('Failed to generate credential key'); + } + + const credentialKey = credentialKeyResult.vdxfid; + + contentmultimap.kvContent.setByAddress(credentialKey, valueArray); + contentmultimap.kvContent.deleteByAddress(searchKey); +} diff --git a/routes/appBasicInfo.js b/routes/appBasicInfo.js new file mode 100644 index 00000000..68ebf567 --- /dev/null +++ b/routes/appBasicInfo.js @@ -0,0 +1,7 @@ +const version = require("../version.json"); + +module.exports = { + APP_NAME: "Verus Desktop Testnet", + APP_MODE: "standard", + APP_VERSION: version.version, +}; diff --git a/routes/deeplink/openurlhandler.js b/routes/deeplink/openurlhandler.js index 5828959c..0877022e 100644 --- a/routes/deeplink/openurlhandler.js +++ b/routes/deeplink/openurlhandler.js @@ -1,16 +1,8 @@ const { dialog } = require('electron') -const { URL } = require('url'); -const { SUPPORTED_DLS, CALLBACK_HOST } = require('../api/utils/constants/supported_dls'); function openurlhandler(event, urlstring, apihandler) { try { - const url = new URL(urlstring); - - if (url.host !== CALLBACK_HOST) throw new Error("Unsupported host url."); - if (!SUPPORTED_DLS.includes(url.pathname.replace(/\//g, ""))) - throw new Error("Unsupported url path."); - - return apihandler(url); + return apihandler(urlstring); } catch (e) { setTimeout(() => { // This avoids crashing 20 seconds after the error box has been left open. diff --git a/routes/deeplink/removelink.js b/routes/deeplink/removelink.js index 57598076..5edf0d00 100644 --- a/routes/deeplink/removelink.js +++ b/routes/deeplink/removelink.js @@ -1,7 +1,15 @@ -const { WALLET_VDXF_KEY } = require("verus-typescript-primitives") +const {WALLET_VDXF_KEY} = require('verus-typescript-primitives'); function removelink(app) { - return app.removeAsDefaultProtocolClient(WALLET_VDXF_KEY.vdxfid) + const protocols = [WALLET_VDXF_KEY.vdxfid, 'verus']; + const results = []; + + for (const protocol of protocols) { + const res = app.removeAsDefaultProtocolClient(protocol); + results.push({protocol, success: res}); + } + + return results; } -module.exports = removelink \ No newline at end of file +module.exports = removelink; diff --git a/routes/deeplink/setuplink.js b/routes/deeplink/setuplink.js index db209712..35878158 100644 --- a/routes/deeplink/setuplink.js +++ b/routes/deeplink/setuplink.js @@ -1,18 +1,25 @@ -const path = require('path') -const { WALLET_VDXF_KEY } = require('verus-typescript-primitives'); +const path = require('path'); +const {WALLET_VDXF_KEY} = require('verus-typescript-primitives'); function setuplink(app) { - let res; + const protocols = [WALLET_VDXF_KEY.vdxfid, 'verus']; + const results = []; - if (process.defaultApp) { - if (process.argv.length >= 2) { - res = app.setAsDefaultProtocolClient(WALLET_VDXF_KEY.vdxfid, process.execPath, [path.resolve(process.argv[1])]) + for (const protocol of protocols) { + let res; + if (process.defaultApp) { + if (process.argv.length >= 2) { + res = app.setAsDefaultProtocolClient(protocol, process.execPath, [ + path.resolve(process.argv[1]), + ]); + } + } else { + res = app.setAsDefaultProtocolClient(protocol); } - } else { - res = app.setAsDefaultProtocolClient(WALLET_VDXF_KEY.vdxfid) + results.push({protocol, success: res}); } - return res + return results; } -module.exports = setuplink \ No newline at end of file +module.exports = setuplink; diff --git a/scripts/build-gui-and-plugins.sh b/scripts/build-gui-and-plugins.sh new file mode 100755 index 00000000..cd976474 --- /dev/null +++ b/scripts/build-gui-and-plugins.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +FULL_PATH=$(dirname $0) + +source ${FULL_PATH}/directories.sh +source ${FULL_PATH}/setup-node.sh + +# Build the desktop GUI +( + echo "" + echo "Building Verus-Desktop-GUI..." + export NODE_OPTIONS=--openssl-legacy-provider + cd ${GUI_DIR} + yarn build +) + +# Build and copy the login consent client if it exists +if [ -d "${LOGIN_CONSENT_CLIENT_DIR}" ]; then + echo "" + echo "Building verus-login-consent-client..." + ( + cd ${LOGIN_CONSENT_CLIENT_DIR} + yarn build + ) + + # Copy the build files over + echo "" + echo "Copying the build of verus-login-consent-client..." + if [ ! -d "${LOGIN_CONSENT_CLIENT_PLUGIN_DIR}" ]; then + mkdir -p ${LOGIN_CONSENT_CLIENT_PLUGIN_DIR} + fi + cp -r ${LOGIN_CONSENT_CLIENT_DIR}/build/* ${LOGIN_CONSENT_CLIENT_PLUGIN_DIR} +fi + +# Build and copy the pbaas visualizer if it exists +if [ -d "${PBAAS_VISUALIZER_DIR}" ]; then + echo "" + echo "Building verus-pbaas-visualizer..." + ( + export NODE_OPTIONS=--openssl-legacy-provider + cd ${PBAAS_VISUALIZER_DIR} + yarn build + ) + + # Copy the build files over + echo "" + echo "Copying the build of verus-pbaas-visualizer..." + if [ ! -d "${PBAAS_VISUALIZER_PLUGIN_DIR}" ]; then + mkdir -p ${PBAAS_VISUALIZER_PLUGIN_DIR} + fi + cp -r ${PBAAS_VISUALIZER_DIR}/build/* ${PBAAS_VISUALIZER_PLUGIN_DIR} +fi diff --git a/scripts/create-build-win.sh b/scripts/create-build-win.sh new file mode 100755 index 00000000..26d26aa1 --- /dev/null +++ b/scripts/create-build-win.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +FULL_PATH=$(dirname $0) + +source ${FULL_PATH}/setup-node.sh + +${FULL_PATH}/build-gui-and-plugins.sh + +# Build the the electron app +echo "Building Verus-Desktop for Windows..." +yarn dist-win diff --git a/scripts/create-build.sh b/scripts/create-build.sh new file mode 100755 index 00000000..0ad82911 --- /dev/null +++ b/scripts/create-build.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +FULL_PATH=$(dirname $0) + +source ${FULL_PATH}/setup-node.sh + +${FULL_PATH}/build-gui-and-plugins.sh + +# Build the the electron app +echo "" +echo "Building Verus-Desktop..." +yarn dist diff --git a/scripts/dev.sh b/scripts/dev.sh new file mode 100755 index 00000000..be8936ca --- /dev/null +++ b/scripts/dev.sh @@ -0,0 +1,52 @@ +#!/bin/bash + +FULL_PATH=$(dirname $0) + +source ${FULL_PATH}/directories.sh +source ${FULL_PATH}/setup-node.sh + +# Start desktop GUI +( + echo "" + echo "Starting Verus-Desktop-GUI..." + export NODE_OPTIONS=--openssl-legacy-provider + cd ${GUI_DIR} + yarn start-no-dashboard +) & + +# Check if the login consent client exists and start it if possible +if [ -d "${LOGIN_CONSENT_CLIENT_DIR}" ]; then + ( + echo "" + echo "Starting verus-login-consent-client..." + cd ${LOGIN_CONSENT_CLIENT_DIR} + yarn start + ) & +fi + +# Check if the pbaas visualizer exists and start it if possible +if [ -d "${PBAAS_VISUALIZER_DIR}" ]; then + ( + echo "" + echo "Starting verus-pbaas-visualizer..." + export NODE_OPTIONS=--openssl-legacy-provider + cd ${PBAAS_VISUALIZER_DIR} + # Discard the webpack dashboard output to not clutter the terminal + yarn start > /dev/null 2>&1 + ) & +fi + +# Start the electron app in development mode +echo "" +echo "Starting Verus-Desktop..." +yarn start devmode + +cleanup() { + echo "Cleaning up processes..." + jobs -p | xargs kill + + # Give the login consent client time to close gracefully + sleep 1 +} + +trap cleanup EXIT diff --git a/scripts/directories.sh b/scripts/directories.sh new file mode 100644 index 00000000..98a6051c --- /dev/null +++ b/scripts/directories.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +readonly GUI_DIR="gui/Verus-Desktop-GUI/react" +readonly PLUGIN_DIR="assets/plugins/builtin" +readonly LOGIN_CONSENT_CLIENT_DIR="../verus-login-consent-client" +readonly LOGIN_CONSENT_CLIENT_PLUGIN_DIR="${PLUGIN_DIR}/verus-login-consent-client" +readonly PBAAS_VISUALIZER_DIR="../verus-pbaas-visualizer" +readonly PBAAS_VISUALIZER_PLUGIN_DIR="${PLUGIN_DIR}/verus-pbaas-visualizer" \ No newline at end of file diff --git a/scripts/prod.sh b/scripts/prod.sh new file mode 100755 index 00000000..8b3c1c94 --- /dev/null +++ b/scripts/prod.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +FULL_PATH=$(dirname $0) + +source ${FULL_PATH}/setup-node.sh + +${FULL_PATH}/build-gui-and-plugins.sh + +# Start the electron app +echo "" +echo "Starting Verus-Desktop..." +yarn start diff --git a/scripts/setup-node.sh b/scripts/setup-node.sh new file mode 100755 index 00000000..78effe10 --- /dev/null +++ b/scripts/setup-node.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# Try to switch to node 20 using nvm if possible +. ~/.nvm/nvm.sh + +# When running with yarn, this inserts the switched to node version's bin before previous version +# that yarn inserts. This allows for using the switched version of node with yarn. +if nvm use 20 && [ -n "${NVM_BIN}" ]; then + export PATH="${NVM_BIN}:${PATH}" +fi diff --git a/scripts/setup.sh b/scripts/setup.sh new file mode 100755 index 00000000..aad953e7 --- /dev/null +++ b/scripts/setup.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +set -e + +FULL_PATH=$(dirname $0) + +source ${FULL_PATH}/directories.sh +source ${FULL_PATH}/setup-node.sh + +# Install dependencies for the desktop GUI +( + echo "" + echo "Installing dependencies for Verus-Desktop-GUI..." + export NODE_OPTIONS=--openssl-legacy-provider + cd ${GUI_DIR} + yarn install +) + +# Check if the login consent client exists and install dependencies if possible +if [ -d "${LOGIN_CONSENT_CLIENT_DIR}" ]; then + ( + echo "" + echo "Installing dependencies for verus-login-consent-client..." + cd ${LOGIN_CONSENT_CLIENT_DIR} + yarn install + ) +fi + +# Check if the pbaas visualizer exists and install dependencies if possible +if [ -d "${PBAAS_VISUALIZER_DIR}" ]; then + ( + echo "" + echo "Installing dependencies for verus-pbaas-visualizer..." + export NODE_OPTIONS=--openssl-legacy-provider + cd ${PBAAS_VISUALIZER_DIR} + yarn install + ) +fi + +# Install dependencies for the electron app +echo "" +echo "Installing dependencies for Verus-Desktop..." +yarn install diff --git a/tsconfig.json b/tsconfig.json index 194d0d13..7c26890b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,72 +1,16 @@ { "compilerOptions": { - /* Visit https://aka.ms/tsconfig.json to read more about this file */ - - /* Basic Options */ - // "incremental": true, /* Enable incremental compilation */ - "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */ - "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */ - // "lib": [], /* Specify library files to be included in the compilation. */ - // "allowJs": true, /* Allow javascript files to be compiled. */ - // "checkJs": true, /* Report errors in .js files. */ - // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */ - // "declaration": true, /* Generates corresponding '.d.ts' file. */ - // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ - // "sourceMap": true, /* Generates corresponding '.map' file. */ - // "outFile": "./", /* Concatenate and emit output to single file. */ - // "outDir": "./", /* Redirect output structure to the directory. */ - // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ - // "composite": true, /* Enable project compilation */ - // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ - // "removeComments": true, /* Do not emit comments to output. */ - // "noEmit": true, /* Do not emit outputs. */ - // "importHelpers": true, /* Import emit helpers from 'tslib'. */ - // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - - /* Strict Type-Checking Options */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* Enable strict null checks. */ - // "strictFunctionTypes": true, /* Enable strict checking of function types. */ - // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ - // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ - // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ - // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - - /* Additional Checks */ - // "noUnusedLocals": true, /* Report errors on unused locals. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an 'override' modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Require undeclared properties from index signatures to use element accesses. */ - - /* Module Resolution Options */ - // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ - // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ - // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ - // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ - // "typeRoots": [], /* List of folders to include type definitions from. */ - // "types": [], /* Type declaration files to be included in compilation. */ - // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ - "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ - // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - - /* Source Map Options */ - // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ - // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - - /* Experimental Options */ - // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ - // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ - - /* Advanced Options */ - "skipLibCheck": true, /* Skip type checking of declaration files. */ - "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ - } + "target": "es5", + "module": "commonjs", + "allowJs": true, + "checkJs": false, + "outDir": "./out", + "rootDir": "./", + "sourceMap": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + }, + "include": ["main.js", "routes/**/*", "private/**/*", "keys/**/*", "assets/js/**/*"], + "exclude": ["node_modules", "gui", "dist", "out"], } diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 0a27bf74..00000000 --- a/tslint.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "defaultSeverity": "error", - "extends": [ - "tslint:recommended" - ], - "jsRules": {}, - "rules": { - "no-console": false - }, - "rulesDirectory": [] -} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index ca5d2691..0916cf90 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,26 +12,77 @@ resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== -"@babel/code-frame@^7.0.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" - integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== +"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== dependencies: - "@babel/highlight" "^7.16.0" - -"@babel/helper-validator-identifier@^7.15.7": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + "@babel/helper-validator-identifier" "^7.28.5" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/generator@^7.26.2", "@babel/generator@^7.29.0": + version "7.29.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" + integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== + dependencies: + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + +"@babel/parser@^7.26.2", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.0.tgz#669ef345add7d057e92b7ed15f0bac07611831b6" + integrity sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww== + dependencies: + "@babel/types" "^7.29.0" + +"@babel/template@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" + integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== + dependencies: + "@babel/code-frame" "^7.28.6" + "@babel/parser" "^7.28.6" + "@babel/types" "^7.28.6" + +"@babel/traverse@^7.25.9": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" + debug "^4.3.1" -"@babel/highlight@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" - integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== +"@babel/types@^7.26.0", "@babel/types@^7.28.6", "@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== dependencies: - "@babel/helper-validator-identifier" "^7.15.7" - chalk "^2.0.0" - js-tokens "^4.0.0" + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" "@bitgo/blake2b-wasm@^3.0.1": version "3.2.3" @@ -144,6 +195,74 @@ minimatch "^3.0.4" plist "^3.0.4" +"@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" + integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2": + version "4.12.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" + integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== + +"@eslint/config-array@^0.21.1": + version "0.21.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.1.tgz#7d1b0060fea407f8301e932492ba8c18aff29713" + integrity sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA== + dependencies: + "@eslint/object-schema" "^2.1.7" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/config-helpers@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda" + integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== + dependencies: + "@eslint/core" "^0.17.0" + +"@eslint/core@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c" + integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.3.1": + version "3.3.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.3.tgz#26393a0806501b5e2b6a43aa588a4d8df67880ac" + integrity sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.1" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.39.2": + version "9.39.2" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.2.tgz#2d4b8ec4c3ea13c1b3748e0c97ecd766bdd80599" + integrity sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA== + +"@eslint/object-schema@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" + integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== + +"@eslint/plugin-kit@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2" + integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== + dependencies: + "@eslint/core" "^0.17.0" + levn "^0.4.1" + "@ethereumjs/common@2.5.0": version "2.5.0" resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" @@ -772,6 +891,40 @@ "@ethersproject/properties" "^5.1.0" "@ethersproject/strings" "^5.1.0" +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.7.tgz#822cb7b3a12c5a240a24f621b5a2413e27a45f26" + integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.4.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== + +"@ianvs/prettier-plugin-sort-imports@4.7.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@ianvs/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.7.0.tgz#9e556548071744837c274d59226ce717ff4fea36" + integrity sha512-soa2bPUJAFruLL4z/CnMfSEKGznm5ebz29fIa9PxYtu8HHyLKNE1NXAs6dylfw1jn/ilEIfO2oLLN6uAafb7DA== + dependencies: + "@babel/generator" "^7.26.2" + "@babel/parser" "^7.26.2" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" + semver "^7.5.2" + "@iarna/cli@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@iarna/cli/-/cli-1.2.0.tgz#0f7af5e851afe895104583c4ca07377a8094d641" @@ -793,6 +946,32 @@ wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" +"@jridgewell/gen-mapping@^0.3.12": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@malept/cross-spawn-promise@^1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz#504af200af6b98e198bce768bc1730c6936ae01d" @@ -914,6 +1093,11 @@ dependencies: "@types/ms" "*" +"@types/estree@^1.0.6": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + "@types/fs-extra@9.0.13", "@types/fs-extra@^9.0.11": version "9.0.13" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" @@ -931,6 +1115,11 @@ resolved "https://registry.yarnpkg.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64" integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ== +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/keyv@*": version "3.1.4" resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" @@ -953,6 +1142,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== +"@types/node@18.19.0": + version "18.19.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.0.tgz#e86ce256c46661016fa83360bf8738eb4efdc88c" + integrity sha512-667KNhaD7U29mT5wf+TZUnrzPrlL2GNQ5N0BMjO2oNULhBxX0/FKCkm6JMu0Jh7Z+1LwUlR21ekd7KhIboNFNw== + dependencies: + undici-types "~5.26.4" + "@types/node@22.7.5": version "22.7.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" @@ -1016,6 +1212,102 @@ dependencies: "@types/node" "*" +"@typescript-eslint/eslint-plugin@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.0.tgz#afb966c66a2fdc6158cf81118204a971a36d0fc5" + integrity sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg== + dependencies: + "@eslint-community/regexpp" "^4.12.2" + "@typescript-eslint/scope-manager" "8.53.0" + "@typescript-eslint/type-utils" "8.53.0" + "@typescript-eslint/utils" "8.53.0" + "@typescript-eslint/visitor-keys" "8.53.0" + ignore "^7.0.5" + natural-compare "^1.4.0" + ts-api-utils "^2.4.0" + +"@typescript-eslint/parser@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.53.0.tgz#d8bed6f12dc74e03751e5f947510ff2b165990c6" + integrity sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg== + dependencies: + "@typescript-eslint/scope-manager" "8.53.0" + "@typescript-eslint/types" "8.53.0" + "@typescript-eslint/typescript-estree" "8.53.0" + "@typescript-eslint/visitor-keys" "8.53.0" + debug "^4.4.3" + +"@typescript-eslint/project-service@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.53.0.tgz#327c67c61c16a1c8b12a440b0779b41eb77cc7df" + integrity sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.53.0" + "@typescript-eslint/types" "^8.53.0" + debug "^4.4.3" + +"@typescript-eslint/scope-manager@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.53.0.tgz#f922fcbf0d42e72f065297af31779ccf19de9a97" + integrity sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g== + dependencies: + "@typescript-eslint/types" "8.53.0" + "@typescript-eslint/visitor-keys" "8.53.0" + +"@typescript-eslint/tsconfig-utils@8.53.0", "@typescript-eslint/tsconfig-utils@^8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.0.tgz#105279d7969a7abdc8345cc9c57cff83cf910f8f" + integrity sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA== + +"@typescript-eslint/type-utils@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.53.0.tgz#81a0de5c01fc68f6df0591d03cd8226bda01c91f" + integrity sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw== + dependencies: + "@typescript-eslint/types" "8.53.0" + "@typescript-eslint/typescript-estree" "8.53.0" + "@typescript-eslint/utils" "8.53.0" + debug "^4.4.3" + ts-api-utils "^2.4.0" + +"@typescript-eslint/types@8.53.0", "@typescript-eslint/types@^8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.53.0.tgz#1adcad3fa32bc2c4cbf3785ba07a5e3151819efb" + integrity sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ== + +"@typescript-eslint/typescript-estree@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.0.tgz#7805b46b7a8ce97e91b7bb56fc8b1ba26ca8ef52" + integrity sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw== + dependencies: + "@typescript-eslint/project-service" "8.53.0" + "@typescript-eslint/tsconfig-utils" "8.53.0" + "@typescript-eslint/types" "8.53.0" + "@typescript-eslint/visitor-keys" "8.53.0" + debug "^4.4.3" + minimatch "^9.0.5" + semver "^7.7.3" + tinyglobby "^0.2.15" + ts-api-utils "^2.4.0" + +"@typescript-eslint/utils@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.53.0.tgz#bf0a4e2edaf1afc9abce209fc02f8cab0b74af13" + integrity sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.53.0" + "@typescript-eslint/types" "8.53.0" + "@typescript-eslint/typescript-estree" "8.53.0" + +"@typescript-eslint/visitor-keys@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.0.tgz#9a785664ddae7e3f7e570ad8166e48dbc9c6cf02" + integrity sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw== + dependencies: + "@typescript-eslint/types" "8.53.0" + eslint-visitor-keys "^4.2.1" + "@xmldom/xmldom@0.8.4": version "0.8.4" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.4.tgz#05b76034d3e09d4b9d309d9b862994de23e7687d" @@ -1060,6 +1352,16 @@ accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.15.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + aes-js@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" @@ -1130,7 +1432,7 @@ ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@6.12.3, ajv@^5.1.0, ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.3, ajv@^6.5.5: +ajv@6.12.3, ajv@^5.1.0, ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.5.5: version "6.12.3" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706" integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA== @@ -1255,11 +1557,89 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b" + integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== + dependencies: + call-bound "^1.0.3" + is-array-buffer "^3.0.5" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +array-includes@^3.1.6, array-includes@^3.1.8: + version "3.1.9" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.9.tgz#1f0ccaa08e90cdbc3eb433210f903ad0f17c3f3a" + integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.0" + es-object-atoms "^1.1.1" + get-intrinsic "^1.3.0" + is-string "^1.1.1" + math-intrinsics "^1.1.0" + +array.prototype.findlast@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + is-array-buffer "^3.0.4" + asap@^2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -1287,6 +1667,11 @@ async-exit-hook@^2.0.1: resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== +async-function@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b" + integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== + async@2.6.4, async@^2.6.0, async@^2.6.1, async@^3.2.3, async@^3.2.4: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" @@ -1297,7 +1682,7 @@ async@2.6.4, async@^2.6.0, async@^2.6.1, async@^3.2.3, async@^3.2.4: asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== at-least-node@^1.0.0: version "1.0.0" @@ -1326,15 +1711,31 @@ aws4@^1.6.0, aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -axios@0.25.0, axios@1.13.5, axios@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.4.tgz#4c8ded1b43683c8dd362973c393f3ede24052aa2" - integrity sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw== +axios@0.25.0: + version "0.25.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" + follow-redirects "^1.14.7" + +axios@1.13.5: + version "1.13.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.13.5.tgz#5e464688fa127e11a660a2c49441c009f6567a43" + integrity sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q== + dependencies: + follow-redirects "^1.15.11" + form-data "^4.0.5" proxy-from-env "^1.1.0" +axios@1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.16.0.tgz#f8e5dd931cef2a5f8c32216d5784eda2f8750eb7" + integrity sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w== + dependencies: + follow-redirects "^1.16.0" + form-data "^4.0.5" + proxy-from-env "^2.1.0" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -1364,7 +1765,12 @@ base64id@2.0.0, base64id@~2.0.0: resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== -base64url@3.0.1, "base64url@git+https://github.com/VerusCoin/base64url.git": +base64url@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" + integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== + +"base64url@git+https://github.com/VerusCoin/base64url.git": version "3.0.1" resolved "git+https://github.com/VerusCoin/base64url.git#3217a593e0e665078aa4a71c9f887f8d2e5424fb" @@ -1725,7 +2131,7 @@ bs58@^3.0.0, bs58@^3.1.0: bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" @@ -1849,11 +2255,6 @@ builder-util@24.13.1: stat-mode "^1.0.0" temp-file "^3.4.0" -builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -1963,7 +2364,7 @@ call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" -call-bind@^1.0.8: +call-bind@^1.0.7, call-bind@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== @@ -1973,7 +2374,7 @@ call-bind@^1.0.8: get-intrinsic "^1.2.4" set-function-length "^1.2.2" -call-bound@^1.0.3, call-bound@^1.0.4: +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== @@ -1986,16 +2387,16 @@ call-limit@^1.1.1: resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.1.tgz#ef15f2670db3f1992557e2d965abc459e6e358d4" integrity sha512-5twvci5b9eRBw2wCfPtN0GmlR2/gadZqyFpPhOK6CvMFoFgA+USnZ6Jpu1lhG9h85pQ3Ouil3PfXWRD4EUaRiQ== +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -2008,7 +2409,7 @@ chainsaw@~0.1.0: dependencies: traverse ">=0.3.0 <0.4" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0: +chalk@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2017,7 +2418,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.2, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -2073,13 +2474,22 @@ cids@^0.7.1: multicodec "^1.0.0" multihashes "~0.4.15" -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.5.tgz#749f80731c7821e9a5fabd51f6998b696f296686" - integrity sha512-xq7ICKB4TMHUx7Tz1L9O2SGKOhYMOTR32oir45Bq28/AQTpHogKgHcoYFSdRbMtddl+ozNXfXY9jWcgYKmde0w== +cipher-base@^1.0.0, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cipher-base@^1.0.1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.7.tgz#bd094bfef42634ccfd9e13b9fc73274997111e39" + integrity sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA== dependencies: inherits "^2.0.4" safe-buffer "^5.2.1" + to-buffer "^1.2.2" class-is@^1.1.0: version "1.1.0" @@ -2135,6 +2545,15 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -2222,11 +2641,6 @@ combined-stream@^1.0.8, combined-stream@~1.0.5, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.12.1: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - commander@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" @@ -2356,11 +2770,29 @@ copy-concurrently@^1.0.0: rimraf "^2.5.4" run-queue "^1.0.0" -core-util-is@1.0.2, core-util-is@~1.0.0: +copyfiles@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-2.4.1.tgz#d2dcff60aaad1015f09d0b66e7f0f1c5cd3c5da5" + integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== + dependencies: + glob "^7.0.5" + minimatch "^3.0.3" + mkdirp "^1.0.4" + noms "0.0.0" + through2 "^2.0.1" + untildify "^4.0.0" + yargs "^16.1.0" + +core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +core-util-is@~1.0.0: + version "1.0.3" + 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.5: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" @@ -2492,6 +2924,15 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + crypto-js@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631" @@ -2527,7 +2968,34 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@2.6.9, debug@3.1.0, debug@4, debug@^2.2.0, debug@^3.1.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@~3.1.0, debug@~4.3.1, debug@~4.3.2: +data-view-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570" + integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-length@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735" + integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-data-view "^1.0.2" + +data-view-byte-offset@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@2.6.9, debug@3.1.0, debug@4, debug@^2.2.0, debug@^3.1.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.3, debug@~3.1.0, debug@~4.3.1, debug@~4.3.2: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -2568,6 +3036,11 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + default-shell@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/default-shell/-/default-shell-1.0.1.tgz#752304bddc6174f49eb29cb988feea0b8813c8bc" @@ -2585,7 +3058,7 @@ defer-to-connect@^2.0.0: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -define-data-property@^1.1.4: +define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -2609,10 +3082,19 @@ define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== delegates@^1.0.0: version "1.0.0" @@ -2657,11 +3139,6 @@ dezalgo@^1.0.0, dezalgo@~1.0.3: asap "^2.0.0" wrappy "1" -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - dir-compare@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/dir-compare/-/dir-compare-3.3.0.tgz#2c749f973b5c4b5d087f11edaae730db31788416" @@ -2698,6 +3175,13 @@ dmg-license@^1.0.11: smart-buffer "^4.0.2" verror "^1.10.0" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + dom-walk@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" @@ -2734,7 +3218,7 @@ drbg.js@^1.0.1: create-hash "^1.1.2" create-hmac "^1.1.4" -dunder-proto@^1.0.1: +dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== @@ -2951,6 +3435,66 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.17.5, es-abstract@^1.23.2, es-abstract@^1.23.3, es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9, es-abstract@^1.24.0, es-abstract@^1.24.1: + version "1.24.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.1.tgz#f0c131ed5ea1bb2411134a8dd94def09c46c7899" + integrity sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw== + dependencies: + array-buffer-byte-length "^1.0.2" + arraybuffer.prototype.slice "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + data-view-buffer "^1.0.2" + data-view-byte-length "^1.0.2" + data-view-byte-offset "^1.0.1" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-set-tostringtag "^2.1.0" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.8" + get-intrinsic "^1.3.0" + get-proto "^1.0.1" + get-symbol-description "^1.1.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + internal-slot "^1.1.0" + is-array-buffer "^3.0.5" + is-callable "^1.2.7" + is-data-view "^1.0.2" + is-negative-zero "^2.0.3" + is-regex "^1.2.1" + is-set "^2.0.3" + is-shared-array-buffer "^1.0.4" + is-string "^1.1.1" + is-typed-array "^1.1.15" + is-weakref "^1.1.1" + math-intrinsics "^1.1.0" + object-inspect "^1.13.4" + object-keys "^1.1.1" + object.assign "^4.1.7" + own-keys "^1.0.1" + regexp.prototype.flags "^1.5.4" + safe-array-concat "^1.1.3" + safe-push-apply "^1.0.0" + safe-regex-test "^1.1.0" + set-proto "^1.0.0" + stop-iteration-iterator "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.3" + typed-array-byte-length "^1.0.3" + typed-array-byte-offset "^1.0.4" + typed-array-length "^1.0.7" + unbox-primitive "^1.1.0" + which-typed-array "^1.1.19" + es-abstract@^1.18.0-next.1: version "1.18.0-next.1" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" @@ -3008,6 +3552,28 @@ es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-iterator-helpers@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz#d979a9f686e2b0b72f88dbead7229924544720bc" + integrity sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.1" + es-errors "^1.3.0" + es-set-tostringtag "^2.1.0" + function-bind "^1.1.2" + get-intrinsic "^1.3.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + iterator.prototype "^1.1.5" + safe-array-concat "^1.1.3" + es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" @@ -3025,6 +3591,13 @@ es-set-tostringtag@^2.1.0: has-tostringtag "^1.0.2" hasown "^2.0.2" +es-shim-unscopables@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== + dependencies: + hasown "^2.0.2" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -3034,6 +3607,15 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== + dependencies: + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" + es5-ext@^0.10.35, es5-ext@^0.10.50: version "0.10.62" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" @@ -3097,11 +3679,131 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +eslint-config-prettier@10.1.8: + version "10.1.8" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" + integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== + +eslint-plugin-react@7.37.5: + version "7.37.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz#2975511472bdda1b272b34d779335c9b0e877065" + integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.3" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.2.1" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.9" + object.fromentries "^2.0.8" + object.values "^1.2.1" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.12" + string.prototype.repeat "^1.0.0" + +eslint-scope@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" + integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" + integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== + +eslint@9.39.2: + version "9.39.2" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.2.tgz#cb60e6d16ab234c0f8369a3fe7cc87967faf4b6c" + integrity sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw== + dependencies: + "@eslint-community/eslint-utils" "^4.8.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.21.1" + "@eslint/config-helpers" "^0.4.2" + "@eslint/core" "^0.17.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "9.39.2" + "@eslint/plugin-kit" "^0.4.1" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.4.0" + eslint-visitor-keys "^4.2.1" + espree "^10.4.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== + dependencies: + acorn "^8.15.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.1" + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esquery@^1.5.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" + integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" @@ -3418,11 +4120,21 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + fd-slicer@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" @@ -3430,11 +4142,23 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" @@ -3479,6 +4203,14 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + fix-path@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fix-path/-/fix-path-2.1.0.tgz#72ece739de9af4bd63fd02da23e9a70c619b4c38" @@ -3486,6 +4218,19 @@ fix-path@2.1.0: dependencies: shell-path "^2.0.0" +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flatted@^3.2.9: + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + flush-write-stream@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" @@ -3494,7 +4239,7 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -follow-redirects@1.15.4, follow-redirects@^1.15.6: +follow-redirects@1.15.4, follow-redirects@^1.14.7, follow-redirects@^1.15.11, follow-redirects@^1.16.0: version "1.15.4" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== @@ -3526,7 +4271,7 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@4.0.4, form-data@^4.0.0, form-data@~2.3.1, form-data@~2.3.2: +form-data@4.0.4, form-data@^4.0.0, form-data@^4.0.5, form-data@~2.3.1, form-data@~2.3.2: version "4.0.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== @@ -3680,7 +4425,19 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functions-have-names@^1.2.2: +function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78" + integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -3699,6 +4456,11 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +generator-function@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2" + integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g== + genfun@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" @@ -3766,7 +4528,7 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: has "^1.0.3" has-symbols "^1.0.3" -get-intrinsic@^1.2.4, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== @@ -3782,7 +4544,7 @@ get-intrinsic@^1.2.4, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: hasown "^2.0.2" math-intrinsics "^1.1.0" -get-proto@^1.0.1: +get-proto@^1.0.0, get-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== @@ -3825,6 +4587,15 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +get-symbol-description@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -3832,6 +4603,13 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob@^10.3.10: version "10.3.10" resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" @@ -3843,6 +4621,18 @@ glob@^10.3.10: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" +glob@^7.0.5: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + 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" + glob@^7.1.1, glob@^7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -3894,6 +4684,16 @@ global@~4.4.0: min-document "^2.19.0" process "^0.11.10" +globals@17.0.0: + version "17.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-17.0.0.tgz#a4196d9cfeb4d627ba165b4647b1f5853bf90a30" + integrity sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw== + +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + globalthis@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9" @@ -3901,6 +4701,14 @@ globalthis@^1.0.1: dependencies: define-properties "^1.1.3" +globalthis@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236" + integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== + dependencies: + define-properties "^1.2.1" + gopd "^1.0.1" + gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" @@ -3996,17 +4804,24 @@ has-property-descriptors@^1.0.2: dependencies: es-define-property "^1.0.0" +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" + has-symbols@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== -has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-symbols@^1.1.0: +has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== @@ -4044,13 +4859,15 @@ hash-base@^2.0.0: dependencies: inherits "^2.0.1" -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= +hash-base@^3.0.0, hash-base@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.2.tgz#79d72def7611c3f6e3c3b5730652638001b10a74" + integrity sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + to-buffer "^1.2.1" hash.js@1.1.3: version "1.1.3" @@ -4228,11 +5045,29 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" +ignore@^5.2.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +ignore@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" @@ -4299,10 +5134,19 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.2" + side-channel "^1.1.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= iocane@1.0.0: version "1.0.0" @@ -4341,11 +5185,31 @@ is-arguments@^1.0.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-async-function@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523" + integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== + dependencies: + async-function "^1.0.0" + call-bound "^1.0.3" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -4353,6 +5217,13 @@ is-bigint@^1.0.1: dependencies: has-bigints "^1.0.1" +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" + is-boolean-object@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" @@ -4361,6 +5232,14 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-boolean-object@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e" + integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + is-callable@^1.1.3, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" @@ -4397,18 +5276,47 @@ is-cidr@^3.0.0: dependencies: cidr-regex "^2.0.10" -is-core-module@^2.2.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" - integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== +is-core-module@^2.13.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: - has "^1.0.3" + hasown "^2.0.2" + +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== + dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + is-typed-array "^1.1.13" is-date-object@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -4431,6 +5339,17 @@ is-function@^1.0.1: resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== +is-generator-function@^1.0.10: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5" + integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA== + dependencies: + call-bound "^1.0.4" + generator-function "^2.0.0" + get-proto "^1.0.1" + has-tostringtag "^1.0.2" + safe-regex-test "^1.1.0" + is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" @@ -4438,6 +5357,13 @@ is-generator-function@^1.0.7: dependencies: has-tostringtag "^1.0.0" +is-glob@^4.0.0, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + is-hex-prefixed@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" @@ -4451,6 +5377,11 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + is-negative-zero@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" @@ -4461,6 +5392,11 @@ is-negative-zero@^2.0.2: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" @@ -4480,6 +5416,14 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + is-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" @@ -4507,6 +5451,21 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== + dependencies: + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -4514,6 +5473,13 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" +is-shared-array-buffer@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== + dependencies: + call-bound "^1.0.3" + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -4526,6 +5492,14 @@ is-string@^1.0.5, is-string@^1.0.7: dependencies: has-tostringtag "^1.0.0" +is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== + dependencies: + call-bound "^1.0.3" + has-tostringtag "^1.0.2" + is-symbol@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -4540,7 +5514,16 @@ is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.14: +is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== + dependencies: + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" + +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: version "1.1.15" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== @@ -4563,6 +5546,11 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -4570,6 +5558,21 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakref@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293" + integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== + dependencies: + call-bound "^1.0.3" + +is-weakset@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== + dependencies: + call-bound "^1.0.3" + get-intrinsic "^1.2.6" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -4583,7 +5586,7 @@ isarray@^2.0.5: isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isbinaryfile@^4.0.8: version "4.0.10" @@ -4605,6 +5608,18 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +iterator.prototype@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" + integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== + dependencies: + define-data-property "^1.1.4" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + get-proto "^1.0.0" + has-symbols "^1.1.0" + set-function-name "^2.0.2" + jackspeak@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" @@ -4644,12 +5659,12 @@ js-sha3@^0.7.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.7.0.tgz#0a5c57b36f79882573b2d84051f8bb85dd1bd63a" integrity sha512-Wpks3yBDm0UcL5qlVhwW9Jr9n9i4FfeWBFOOXP5puDS/SiudJGhw7DPyBqn3487qD4F0lsC0q3zxink37f7zeA== -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1, js-yaml@^3.13.1, js-yaml@^4.1.0: +js-yaml@3.13.1, js-yaml@^4.1.0, js-yaml@^4.1.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -4662,6 +5677,11 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + json-buffer@3.0.1, json-buffer@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -4687,6 +5707,11 @@ json-schema@0.2.3, json-schema@0.4.0: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -4728,6 +5753,16 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + jszip@^3.1.0: version "3.10.1" resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" @@ -4754,6 +5789,13 @@ keyv@^4.0.0: compress-brotli "^1.3.8" json-buffer "3.0.1" +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" @@ -4783,6 +5825,14 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + libcipm@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/libcipm/-/libcipm-4.0.8.tgz#dcea4919e10dfbce420327e63901613b9141bc89" @@ -4955,6 +6005,13 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lock-verify@^2.0.2, lock-verify@^2.1.0: version "2.2.1" resolved "https://registry.yarnpkg.com/lock-verify/-/lock-verify-2.2.1.tgz#81107948c51ed16f97b96ff8b60675affb243fc1" @@ -4999,6 +6056,11 @@ lodash.isfinite@^3.3.2: resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M= +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash.union@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" @@ -5024,6 +6086,13 @@ long@5.2.0: resolved "https://registry.yarnpkg.com/long/-/long-5.2.0.tgz#2696dadf4b4da2ce3f6f6b89186085d94d52fd61" integrity sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w== +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + lowercase-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" @@ -5152,20 +6221,20 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.24" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" - integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== - dependencies: - mime-db "1.40.0" - -mime-types@^2.1.16, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.24" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81" + integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + dependencies: + mime-db "1.40.0" + mime@1.4.1, mime@1.6.0, mime@^2.5.2: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" @@ -5203,7 +6272,7 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@5.1.0, minimatch@^3.0.4, minimatch@^5.1.1, minimatch@^9.0.1: +minimatch@5.1.0, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2, minimatch@^5.1.1, minimatch@^9.0.1, minimatch@^9.0.5: version "5.1.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== @@ -5273,12 +6342,12 @@ mkdirp-promise@^5.0.1: dependencies: mkdirp "*" -mkdirp@*: +mkdirp@*, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -"mkdirp@>=0.5 0", mkdirp@^0.5.3, mkdirp@^0.5.5: +"mkdirp@>=0.5 0", mkdirp@^0.5.5: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -5399,6 +6468,11 @@ nanoassert@^2.0.0: resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + negotiator@0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" @@ -5484,6 +6558,14 @@ nodejs-aes256@1.0.1, nodejs-aes256@^1.0.1: resolved "https://registry.yarnpkg.com/nodejs-aes256/-/nodejs-aes256-1.0.1.tgz#bb68cb3f3591c2888c1a136e9667cc1a8ee15448" integrity sha1-u2jLPzWRwoiMGhNulmfMGo7hVEg= +noms@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/noms/-/noms-0.0.0.tgz#da8ebd9f3af9d6760919b27d9cdc8092a7332859" + integrity sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== + dependencies: + inherits "^2.0.1" + readable-stream "~1.0.31" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -5806,6 +6888,11 @@ object-inspect@^1.12.0, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + object-inspect@^1.8.0: version "1.9.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" @@ -5826,6 +6913,38 @@ object.assign@^4.1.1, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" +object.assign@^4.1.4, object.assign@^4.1.7: + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" + object-keys "^1.1.1" + +object.entries@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" + integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-object-atoms "^1.1.1" + +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + object.getownpropertydescriptors@^2.0.3: version "2.1.1" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" @@ -5835,6 +6954,16 @@ object.getownpropertydescriptors@^2.0.3: define-properties "^1.1.3" es-abstract "^1.18.0-next.1" +object.values@^1.1.6, object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + oboe@2.1.5: version "2.1.5" resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" @@ -5868,6 +6997,18 @@ opener@^1.5.2: resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -5900,6 +7041,15 @@ osx-temperature-sensor@1.0.8: resolved "https://registry.yarnpkg.com/osx-temperature-sensor/-/osx-temperature-sensor-1.0.8.tgz#14665adefb85d5a1e752e755eeb7ce9708d67c49" integrity sha512-Gl3b+bn7+oDDnqPa+4v/cg3yg9lnE8ppS7ivL3opBZh4i7h99JNmkm6zWmo0m2a83UUJu+C9D7lGP0OS8IlehA== +own-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358" + integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== + dependencies: + get-intrinsic "^1.2.6" + object-keys "^1.1.1" + safe-push-apply "^1.0.0" + p-cancelable@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" @@ -5934,6 +7084,13 @@ p-limit@^2.0.0: dependencies: p-try "^2.0.0" +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -5948,6 +7105,13 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -6018,6 +7182,13 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parse-headers@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" @@ -6048,6 +7219,11 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -6068,7 +7244,7 @@ path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@1.0.7, path-parse@^1.0.6: +path-parse@1.0.7, path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -6115,6 +7291,16 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -6167,6 +7353,16 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier@3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.0.tgz#18ec98d62cb0757a5d4eab40253ff3e6d0fc8dea" + integrity sha512-ujSB9uXHJKzM/2GBuE0hBOUgC77CN3Bnpqa+g80bkv3T3A93wL/xlzDATHhnhkzifz/UE2SNOvmbTz5hSkDlHw== + pretty-bytes@~5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.1.0.tgz#6237ecfbdc6525beaef4de722cc60a58ae0e6c6d" @@ -6215,6 +7411,15 @@ promzard@^0.3.0: dependencies: read "1" +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + proto-list@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" @@ -6240,6 +7445,11 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +proxy-from-env@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" + integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -6392,6 +7602,11 @@ rc@^1.0.1, rc@^1.1.6: minimist "^1.2.0" strip-json-comments "~2.0.1" +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + "react-native-cache@git+https://github.com/michaeltout/react-native-cache.git": version "1.1.7" resolved "git+https://github.com/michaeltout/react-native-cache.git#f8c1a72b50177aa93de5e8c329b1523409505dd6" @@ -6507,6 +7722,19 @@ readable-stream@^2.0.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + 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" + readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -6516,6 +7744,16 @@ readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@~1.0.31: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readable-stream@~1.1.10: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" @@ -6536,6 +7774,20 @@ readdir-scoped-modules@^1.0.0, readdir-scoped-modules@^1.1.0: graceful-fs "^4.1.2" once "^1.3.0" +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9" + integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.7" + get-proto "^1.0.1" + which-builtin-type "^1.2.1" + regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" @@ -6545,6 +7797,18 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" +regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19" + integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-errors "^1.3.0" + get-proto "^1.0.1" + gopd "^1.2.0" + set-function-name "^2.0.2" + registry-auth-token@^3.0.1: version "3.4.0" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" @@ -6685,13 +7949,14 @@ resolve@^1.10.0: dependencies: path-parse "^1.0.6" -resolve@^1.3.2: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" responselike@^2.0.0: version "2.0.1" @@ -6737,7 +8002,7 @@ ripemd160@^1.0.0: resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e" integrity sha512-J0YlH2ow/i7d5PJX9RC1XnjmZc7cNNYWe89PIlFszvHeiEtxzA1/VYePkjQ7l1SkUejAcHeDo3IVp2WIzstXXQ== -ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: +ripemd160@^2.0.0, ripemd160@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== @@ -6745,6 +8010,14 @@ ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: hash-base "^3.0.0" inherits "^2.0.1" +ripemd160@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.3.tgz#9be54e4ba5e3559c8eee06a25cd7648bbccdf5a8" + integrity sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA== + dependencies: + hash-base "^3.1.2" + inherits "^2.0.4" + rlp@^2.2.3: version "2.2.6" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" @@ -6778,17 +8051,28 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" + isarray "^2.0.5" + safe-buffer@5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" integrity sha512-cr7dZWLwOeaFBLTIuZeYdkfO7UzGIKhjYENJFAxUOMKWGaWDm2nJM2rzxNRm5Owu0DH3ApwNo6kx5idXZfb/Iw== -safe-buffer@5.2.1, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0: +safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== @@ -6798,6 +8082,23 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-push-apply@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5" + integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== + dependencies: + es-errors "^1.3.0" + isarray "^2.0.5" + +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + is-regex "^1.2.1" + "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -6851,7 +8152,7 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@6.3.1, "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1, semver@^6.2.0, semver@^7.2.1, semver@^7.3.2, semver@^7.3.8, semver@^7.5.3: +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", semver@6.3.1, "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1, semver@^6.2.0, semver@^6.3.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.8, semver@^7.5.2, semver@^7.5.3, semver@^7.7.3: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -6920,6 +8221,25 @@ set-function-length@^1.2.2: gopd "^1.0.1" has-property-descriptors "^1.0.2" +set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" + +set-proto@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e" + integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== + dependencies: + dunder-proto "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + setimmediate@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" @@ -6935,7 +8255,15 @@ setprototypeof@1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -sha.js@^2.3.6, sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8: +sha.js@^2.3.6, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +sha.js@^2.4.0, sha.js@^2.4.11: version "2.4.12" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f" integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== @@ -6999,6 +8327,35 @@ shell-path@^2.0.0: dependencies: shell-env "^0.3.0" +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -7008,6 +8365,17 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -7210,6 +8578,14 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= +stop-iteration-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== + dependencies: + es-errors "^1.3.0" + internal-slot "^1.1.0" + stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -7303,6 +8679,46 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" +string.prototype.matchall@^4.0.12: + version "4.0.12" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0" + integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + regexp.prototype.flags "^1.5.3" + set-function-name "^2.0.2" + side-channel "^1.1.0" + +string.prototype.repeat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a" + integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" + string.prototype.trimend@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" @@ -7320,6 +8736,16 @@ string.prototype.trimend@^1.0.5: define-properties "^1.1.4" es-abstract "^1.19.5" +string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.2" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + string.prototype.trimstart@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" @@ -7337,6 +8763,15 @@ string.prototype.trimstart@^1.0.5: define-properties "^1.1.4" es-abstract "^1.19.5" +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -7427,6 +8862,11 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -7453,6 +8893,11 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + swarm-js@^0.1.40: version "0.1.40" resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99" @@ -7508,7 +8953,7 @@ text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -through2@^2.0.0: +through2@^2.0.0, through2@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -7542,6 +8987,14 @@ tiny-secp256k1@1.1.7, tiny-secp256k1@^1.0.0: elliptic "^6.4.0" nan "^2.13.2" +tinyglobby@^0.2.15: + version "0.2.15" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + tmp-promise@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" @@ -7556,10 +9009,10 @@ tmp@^0.2.0: dependencies: rimraf "^3.0.0" -to-buffer@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.1.tgz#2ce650cdb262e9112a18e65dc29dcb513c8155e0" - integrity sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ== +to-buffer@^1.2.0, to-buffer@^1.2.1, to-buffer@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.2.tgz#ffe59ef7522ada0a2d1cb5dfe03bb8abc3cdc133" + integrity sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw== dependencies: isarray "^2.0.5" safe-buffer "^5.2.1" @@ -7597,47 +9050,21 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" +ts-api-utils@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.4.0.tgz#2690579f96d2790253bdcf1ca35d569ad78f9ad8" + integrity sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA== + tslib@2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== -tslib@^1.13.0, tslib@^1.8.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - tslib@^2.1.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== -tslint@6.1.3: - version "6.1.3" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" - integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== - dependencies: - "@babel/code-frame" "^7.0.0" - builtin-modules "^1.1.1" - chalk "^2.3.0" - commander "^2.12.1" - diff "^4.0.1" - glob "^7.1.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - mkdirp "^0.5.3" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.13.0" - tsutils "^2.29.0" - -tsutils@^2.29.0: - version "2.29.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== - dependencies: - tslib "^1.8.1" - tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -7650,7 +9077,7 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -tx-builder@^0.18.0: +tx-builder@0.18.0, tx-builder@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/tx-builder/-/tx-builder-0.18.0.tgz#efa063790020a5fea63056bad0f44ef0b03d6fa4" integrity sha512-pr6v2JNdT2KXcZm1vaPgSLg5//wrXlYTY+Tw+6O0hEL1f+cH20cmWooTop2DLWikPBN/qnrUiUzxVIRrYkDpYQ== @@ -7667,6 +9094,13 @@ tx-builder@^0.18.0: typeforce "^1.11.1" varuint-bitcoin "^1.0.4" +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-fest@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" @@ -7699,6 +9133,42 @@ typed-array-buffer@^1.0.3: es-errors "^1.3.0" is-typed-array "^1.1.14" +typed-array-byte-length@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== + dependencies: + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" + +typed-array-byte-offset@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + for-each "^0.3.3" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" + +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -7722,10 +9192,20 @@ typeforce@^1.11.1, typeforce@^1.11.3, typeforce@^1.11.5, "typeforce@git+https:// version "1.18.0" resolved "git+https://github.com/michaeltout/typeforce#c9b0abc33ff006d7a6a6150eff034bc7eb8b07de" -typescript@4.4.4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" - integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== +typescript-eslint@8.53.0: + version "8.53.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.53.0.tgz#c35ca6403cd381753aee325f67e10d6101d55f04" + integrity sha512-xHURCQNxZ1dsWn0sdOaOfCSQG0HKeqSj9OexIxrz6ypU6wHYOdX2I3D2b8s8wFSsSOYJb+6q283cLiLlkEsBYw== + dependencies: + "@typescript-eslint/eslint-plugin" "8.53.0" + "@typescript-eslint/parser" "8.53.0" + "@typescript-eslint/typescript-estree" "8.53.0" + "@typescript-eslint/utils" "8.53.0" + +typescript@5.8.3: + version "5.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== typescript@^5.3.3: version "5.4.2" @@ -7752,6 +9232,21 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +unbox-primitive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== + dependencies: + call-bound "^1.0.3" + has-bigints "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + undici-types@~6.19.2: version "6.19.8" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" @@ -7808,6 +9303,11 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + unzip-crx-3@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz#d5324147b104a8aed9ae8639c95521f6f7cda292" @@ -7889,7 +9389,7 @@ utf8@3.0.0: util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util-extend@^1.0.1: version "1.0.3" @@ -7996,7 +9496,7 @@ verror@^1.10.0: "verus-typescript-primitives@git+https://github.com/VerusCoin/verus-typescript-primitives.git": version "1.0.0" - resolved "git+https://github.com/VerusCoin/verus-typescript-primitives.git#6103331a5e1ef229ba89cd4965c7170757eadb87" + resolved "git+https://github.com/VerusCoin/verus-typescript-primitives.git#27e6c076def4416c20a568e31e4c406b10612807" dependencies: base64url "3.0.1" bech32 "2.0.0" @@ -8024,9 +9524,9 @@ verror@^1.10.0: react-native-cache "git+https://github.com/michaeltout/react-native-cache.git" web3 "1.10.0" -"verusd-rpc-ts-client@git+https://github.com/VerusCoin/verusd-rpc-ts-client": +"verusd-rpc-ts-client@git+https://github.com/VerusCoin/verusd-rpc-ts-client.git": version "0.1.0" - resolved "git+https://github.com/VerusCoin/verusd-rpc-ts-client#b558c4d14560eeaa697f84e4d53727214450423d" + resolved "git+https://github.com/VerusCoin/verusd-rpc-ts-client.git#fff4dd8bd94432cd050ec41c5535a1f0233e5178" dependencies: axios "1.13.5" blake2b "https://github.com/VerusCoin/blake2b" @@ -8304,12 +9804,65 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== + dependencies: + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" + +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= which-typed-array@^1.1.16: + version "1.1.20" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.20.tgz#3fdb7adfafe0ea69157b1509f3a1cd892bd1d122" + integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +which-typed-array@^1.1.19: version "1.1.19" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== @@ -8376,6 +9929,11 @@ wif@2.0.6, wif@^2.0.1, wif@^2.0.6: dependencies: bs58check "<3.0.0" +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + worker-farm@^1.6.0, worker-farm@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" @@ -8531,13 +10089,10 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@13.1.2, yargs-parser@^15.0.1, yargs-parser@^21.1.1, yargs-parser@^7.0.0: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@21.1.1, yargs-parser@^15.0.1, yargs-parser@^20.2.2, yargs-parser@^21.1.1, yargs-parser@^7.0.0: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^14.2.3: version "14.2.3" @@ -8556,6 +10111,19 @@ yargs@^14.2.3: y18n "^4.0.0" yargs-parser "^15.0.1" +yargs@^16.1.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + 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" + yargs@^17.6.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" @@ -8595,3 +10163,8 @@ yauzl@^2.10.0: dependencies: buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==