Page MenuHomePhabricator

No OneTemporary

This file is larger than 256 KB, so syntax highlighting was skipped.
diff --git a/cashtab/package-lock.json b/cashtab/package-lock.json
index 09fbf36ef..a968cc727 100644
--- a/cashtab/package-lock.json
+++ b/cashtab/package-lock.json
@@ -1,18992 +1,18992 @@
{
"name": "cashtab",
- "version": "2.26.3",
+ "version": "2.26.4",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "cashtab",
- "version": "2.26.3",
+ "version": "2.26.4",
"dependencies": {
"@bitgo/utxo-lib": "^9.33.0",
"@zxing/browser": "^0.1.4",
"bip39": "^3.0.2",
"bip66": "^1.1.5",
"bitcoinjs-message": "^2.2.0",
"chronik-client": "^0.26.1",
"ecash-coinselect": "^2.2.0",
"ecash-script": "^2.1.2",
"ecashaddrjs": "^1.5.4",
"localforage": "^1.9.0",
"qrcode.react": "^3.1.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-easy-crop": "^5.0.6",
"react-ga": "^3.3.0",
"react-router-dom": "^6.22.0",
"react-toastify": "^10.0.5",
"slp-mdm": "^0.0.6"
},
"devDependencies": {
"@babel/core": "^7.16.0",
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
"@svgr/webpack": "^6.3.1",
"@testing-library/jest-dom": "^6.4.2",
"@testing-library/react": "^14.2.1",
"@testing-library/user-event": "^14.5.2",
"assert": "^2.0.0",
"babel-jest": "^29.7.0",
"babel-loader": "^8.2.3",
"babel-plugin-named-asset-import": "^0.3.8",
"babel-preset-react-app": "^10.0.1",
"bfj": "^7.0.2",
"browserslist": "^4.18.1",
"buffer": "^6.0.3",
"camelcase": "^6.2.1",
"case-sensitive-paths-webpack-plugin": "^2.4.0",
"crypto-browserify": "^3.12.0",
"css-loader": "^6.5.1",
"css-minimizer-webpack-plugin": "^3.2.0",
"dotenv": "^10.0.0",
"dotenv-expand": "^5.1.0",
"eslint": "^8.3.0",
"eslint-config-react-app": "^7.0.0",
"eslint-plugin-etc": "2.0.2",
"eslint-plugin-header": "^3.1.1",
"eslint-plugin-testing-library": "^6.2.0",
"eslint-webpack-plugin": "^3.1.1",
"extensionizer": "^1.0.1",
"fake-indexeddb": "^5.0.2",
"file-loader": "^6.2.0",
"fs-extra": "^10.0.0",
"html-webpack-plugin": "^5.5.0",
"identity-obj-proxy": "^3.0.0",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"jest-junit": "^16.0.0",
"jest-watch-typeahead": "^2.2.2",
"jest-when": "^3.6.0",
"mini-css-extract-plugin": "^2.4.5",
"postcss": "^8.4.4",
"postcss-flexbugs-fixes": "^5.0.2",
"postcss-loader": "^6.2.1",
"postcss-normalize": "^10.0.1",
"postcss-preset-env": "^7.0.1",
"prop-types": "^15.8.1",
"react-app-polyfill": "^3.0.0",
"react-dev-utils": "^12.0.0",
"react-refresh": "^0.11.0",
"resolve": "^1.20.0",
"resolve-url-loader": "^5.0.0",
"sass-loader": "^12.3.0",
"semver": "^7.3.5",
"source-map-loader": "^3.0.0",
"stream-browserify": "^3.0.0",
"style-loader": "^3.3.1",
"styled-components": "^4.4.0",
"tailwindcss": "^3.0.2",
"terser-webpack-plugin": "^5.2.5",
"web-vitals": "^2.1.4",
"webpack": "^5.90.1",
"webpack-dev-server": "^4.6.0",
"webpack-manifest-plugin": "^4.0.2",
"workbox-webpack-plugin": "^6.4.1"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
"version": "1.2.6",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/@adobe/css-tools": {
"version": "4.3.3",
"dev": true,
"license": "MIT"
},
"node_modules/@alloc/quick-lru": {
"version": "5.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@ampproject/remapping": {
"version": "2.2.1",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/code-frame": {
"version": "7.23.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/highlight": "^7.23.4",
"chalk": "^2.4.2"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/compat-data": {
"version": "7.23.5",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
"version": "7.23.9",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.23.5",
"@babel/generator": "^7.23.6",
"@babel/helper-compilation-targets": "^7.23.6",
"@babel/helper-module-transforms": "^7.23.3",
"@babel/helpers": "^7.23.9",
"@babel/parser": "^7.23.9",
"@babel/template": "^7.23.9",
"@babel/traverse": "^7.23.9",
"@babel/types": "^7.23.9",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
"json5": "^2.2.3",
"semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/babel"
}
},
"node_modules/@babel/core/node_modules/semver": {
"version": "6.3.1",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/eslint-parser": {
"version": "7.23.10",
"dev": true,
"license": "MIT",
"dependencies": {
"@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
"eslint-visitor-keys": "^2.1.0",
"semver": "^6.3.1"
},
"engines": {
"node": "^10.13.0 || ^12.13.0 || >=14.0.0"
},
"peerDependencies": {
"@babel/core": "^7.11.0",
"eslint": "^7.5.0 || ^8.0.0"
}
},
"node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": {
"version": "2.1.0",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=10"
}
},
"node_modules/@babel/eslint-parser/node_modules/semver": {
"version": "6.3.1",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/generator": {
"version": "7.23.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.23.6",
"@jridgewell/gen-mapping": "^0.3.2",
"@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-annotate-as-pure": {
"version": "7.22.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
"version": "7.22.15",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.22.15"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
"version": "7.23.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.23.5",
"@babel/helper-validator-option": "^7.23.5",
"browserslist": "^4.22.2",
"lru-cache": "^5.1.1",
"semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-compilation-targets/node_modules/semver": {
"version": "6.3.1",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/helper-create-class-features-plugin": {
"version": "7.23.10",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-function-name": "^7.23.0",
"@babel/helper-member-expression-to-functions": "^7.23.0",
"@babel/helper-optimise-call-expression": "^7.22.5",
"@babel/helper-replace-supers": "^7.22.20",
"@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
"semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
"version": "6.3.1",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/helper-create-regexp-features-plugin": {
"version": "7.22.15",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"regexpu-core": "^5.3.1",
"semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
"version": "6.3.1",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/helper-define-polyfill-provider": {
"version": "0.5.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-compilation-targets": "^7.22.6",
"@babel/helper-plugin-utils": "^7.22.5",
"debug": "^4.1.1",
"lodash.debounce": "^4.0.8",
"resolve": "^1.14.2"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
"node_modules/@babel/helper-environment-visitor": {
"version": "7.22.20",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-function-name": {
"version": "7.23.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.22.15",
"@babel/types": "^7.23.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-hoist-variables": {
"version": "7.22.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-member-expression-to-functions": {
"version": "7.23.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.23.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
"version": "7.22.15",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.22.15"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-module-imports": "^7.22.15",
"@babel/helper-simple-access": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
"@babel/helper-validator-identifier": "^7.22.20"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-optimise-call-expression": {
"version": "7.22.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-plugin-utils": {
"version": "7.22.5",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-remap-async-to-generator": {
"version": "7.22.20",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-wrap-function": "^7.22.20"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-replace-supers": {
"version": "7.22.20",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-member-expression-to-functions": "^7.22.15",
"@babel/helper-optimise-call-expression": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-simple-access": {
"version": "7.22.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
"version": "7.22.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-split-export-declaration": {
"version": "7.22.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.22.20",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
"version": "7.23.5",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-wrap-function": {
"version": "7.22.20",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-function-name": "^7.22.5",
"@babel/template": "^7.22.15",
"@babel/types": "^7.22.19"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
"version": "7.23.9",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.23.9",
"@babel/traverse": "^7.23.9",
"@babel/types": "^7.23.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/highlight": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.22.20",
"chalk": "^2.4.2",
"js-tokens": "^4.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
"version": "7.23.9",
"dev": true,
"license": "MIT",
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
"@babel/plugin-transform-optional-chaining": "^7.23.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.13.0"
}
},
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
"version": "7.23.7",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/plugin-proposal-class-properties": {
"version": "7.18.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.18.6",
"@babel/helper-plugin-utils": "^7.18.6"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-decorators": {
"version": "7.23.9",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.23.9",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-decorators": "^7.23.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
"version": "7.18.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.18.6",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-numeric-separator": {
"version": "7.18.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.18.6",
"@babel/plugin-syntax-numeric-separator": "^7.10.4"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-optional-chaining": {
"version": "7.21.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.20.2",
"@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
"@babel/plugin-syntax-optional-chaining": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-private-methods": {
"version": "7.18.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.18.6",
"@babel/helper-plugin-utils": "^7.18.6"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-proposal-private-property-in-object": {
"version": "7.21.11",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.18.6",
"@babel/helper-create-class-features-plugin": "^7.21.0",
"@babel/helper-plugin-utils": "^7.20.2",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-async-generators": {
"version": "7.8.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-bigint": {
"version": "7.8.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-class-properties": {
"version": "7.12.13",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.12.13"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-class-static-block": {
"version": "7.14.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-decorators": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-dynamic-import": {
"version": "7.8.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-export-namespace-from": {
"version": "7.8.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.3"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-flow": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-import-assertions": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-import-attributes": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-import-meta": {
"version": "7.10.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-json-strings": {
"version": "7.8.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-jsx": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-logical-assignment-operators": {
"version": "7.10.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
"version": "7.8.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-numeric-separator": {
"version": "7.10.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-object-rest-spread": {
"version": "7.8.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-optional-catch-binding": {
"version": "7.8.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-optional-chaining": {
"version": "7.8.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-private-property-in-object": {
"version": "7.14.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-top-level-await": {
"version": "7.14.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-typescript": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-syntax-unicode-sets-regex": {
"version": "7.18.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.18.6",
"@babel/helper-plugin-utils": "^7.18.6"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/plugin-transform-arrow-functions": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
"version": "7.23.9",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-remap-async-to-generator": "^7.22.20",
"@babel/plugin-syntax-async-generators": "^7.8.4"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-async-to-generator": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-remap-async-to-generator": "^7.22.20"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-block-scoped-functions": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-block-scoping": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-class-properties": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-class-static-block": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-class-static-block": "^7.14.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.12.0"
}
},
"node_modules/@babel/plugin-transform-classes": {
"version": "7.23.8",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-compilation-targets": "^7.23.6",
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-function-name": "^7.23.0",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-replace-supers": "^7.22.20",
"@babel/helper-split-export-declaration": "^7.22.6",
"globals": "^11.1.0"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-computed-properties": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/template": "^7.22.15"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-destructuring": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-dotall-regex": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-duplicate-keys": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-dynamic-import": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-dynamic-import": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-exponentiation-operator": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-export-namespace-from": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-flow-strip-types": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-flow": "^7.23.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-for-of": {
"version": "7.23.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-function-name": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-compilation-targets": "^7.22.15",
"@babel/helper-function-name": "^7.23.0",
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-json-strings": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-json-strings": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-literals": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-logical-assignment-operators": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-member-expression-literals": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-modules-amd": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-transforms": "^7.23.3",
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-transforms": "^7.23.3",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-simple-access": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-modules-systemjs": {
"version": "7.23.9",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-module-transforms": "^7.23.3",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-validator-identifier": "^7.22.20"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-modules-umd": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-transforms": "^7.23.3",
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
"version": "7.22.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.22.5",
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/plugin-transform-new-target": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-numeric-separator": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-numeric-separator": "^7.10.4"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-object-rest-spread": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.23.3",
"@babel/helper-compilation-targets": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
"@babel/plugin-transform-parameters": "^7.23.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-object-super": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-replace-supers": "^7.22.20"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-optional-catch-binding": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-optional-chaining": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
"@babel/plugin-syntax-optional-chaining": "^7.8.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-parameters": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-private-methods": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-private-property-in-object": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-create-class-features-plugin": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-property-literals": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-react-constant-elements": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-react-display-name": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-react-jsx": {
"version": "7.23.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-module-imports": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-jsx": "^7.23.3",
"@babel/types": "^7.23.4"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-react-jsx-development": {
"version": "7.22.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/plugin-transform-react-jsx": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-react-pure-annotations": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-regenerator": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"regenerator-transform": "^0.15.2"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-reserved-words": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-runtime": {
"version": "7.23.9",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5",
"babel-plugin-polyfill-corejs2": "^0.4.8",
"babel-plugin-polyfill-corejs3": "^0.9.0",
"babel-plugin-polyfill-regenerator": "^0.5.5",
"semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
"version": "6.3.1",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/plugin-transform-shorthand-properties": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-spread": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-sticky-regex": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-template-literals": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-typeof-symbol": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-typescript": {
"version": "7.23.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-create-class-features-plugin": "^7.23.6",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-typescript": "^7.23.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-unicode-escapes": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-unicode-property-regex": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-unicode-regex": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/plugin-transform-unicode-sets-regex": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/preset-env": {
"version": "7.23.9",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.23.5",
"@babel/helper-compilation-targets": "^7.23.6",
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-validator-option": "^7.23.5",
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3",
"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3",
"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7",
"@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
"@babel/plugin-syntax-async-generators": "^7.8.4",
"@babel/plugin-syntax-class-properties": "^7.12.13",
"@babel/plugin-syntax-class-static-block": "^7.14.5",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-syntax-export-namespace-from": "^7.8.3",
"@babel/plugin-syntax-import-assertions": "^7.23.3",
"@babel/plugin-syntax-import-attributes": "^7.23.3",
"@babel/plugin-syntax-import-meta": "^7.10.4",
"@babel/plugin-syntax-json-strings": "^7.8.3",
"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
"@babel/plugin-syntax-numeric-separator": "^7.10.4",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
"@babel/plugin-syntax-optional-chaining": "^7.8.3",
"@babel/plugin-syntax-private-property-in-object": "^7.14.5",
"@babel/plugin-syntax-top-level-await": "^7.14.5",
"@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
"@babel/plugin-transform-arrow-functions": "^7.23.3",
"@babel/plugin-transform-async-generator-functions": "^7.23.9",
"@babel/plugin-transform-async-to-generator": "^7.23.3",
"@babel/plugin-transform-block-scoped-functions": "^7.23.3",
"@babel/plugin-transform-block-scoping": "^7.23.4",
"@babel/plugin-transform-class-properties": "^7.23.3",
"@babel/plugin-transform-class-static-block": "^7.23.4",
"@babel/plugin-transform-classes": "^7.23.8",
"@babel/plugin-transform-computed-properties": "^7.23.3",
"@babel/plugin-transform-destructuring": "^7.23.3",
"@babel/plugin-transform-dotall-regex": "^7.23.3",
"@babel/plugin-transform-duplicate-keys": "^7.23.3",
"@babel/plugin-transform-dynamic-import": "^7.23.4",
"@babel/plugin-transform-exponentiation-operator": "^7.23.3",
"@babel/plugin-transform-export-namespace-from": "^7.23.4",
"@babel/plugin-transform-for-of": "^7.23.6",
"@babel/plugin-transform-function-name": "^7.23.3",
"@babel/plugin-transform-json-strings": "^7.23.4",
"@babel/plugin-transform-literals": "^7.23.3",
"@babel/plugin-transform-logical-assignment-operators": "^7.23.4",
"@babel/plugin-transform-member-expression-literals": "^7.23.3",
"@babel/plugin-transform-modules-amd": "^7.23.3",
"@babel/plugin-transform-modules-commonjs": "^7.23.3",
"@babel/plugin-transform-modules-systemjs": "^7.23.9",
"@babel/plugin-transform-modules-umd": "^7.23.3",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
"@babel/plugin-transform-new-target": "^7.23.3",
"@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4",
"@babel/plugin-transform-numeric-separator": "^7.23.4",
"@babel/plugin-transform-object-rest-spread": "^7.23.4",
"@babel/plugin-transform-object-super": "^7.23.3",
"@babel/plugin-transform-optional-catch-binding": "^7.23.4",
"@babel/plugin-transform-optional-chaining": "^7.23.4",
"@babel/plugin-transform-parameters": "^7.23.3",
"@babel/plugin-transform-private-methods": "^7.23.3",
"@babel/plugin-transform-private-property-in-object": "^7.23.4",
"@babel/plugin-transform-property-literals": "^7.23.3",
"@babel/plugin-transform-regenerator": "^7.23.3",
"@babel/plugin-transform-reserved-words": "^7.23.3",
"@babel/plugin-transform-shorthand-properties": "^7.23.3",
"@babel/plugin-transform-spread": "^7.23.3",
"@babel/plugin-transform-sticky-regex": "^7.23.3",
"@babel/plugin-transform-template-literals": "^7.23.3",
"@babel/plugin-transform-typeof-symbol": "^7.23.3",
"@babel/plugin-transform-unicode-escapes": "^7.23.3",
"@babel/plugin-transform-unicode-property-regex": "^7.23.3",
"@babel/plugin-transform-unicode-regex": "^7.23.3",
"@babel/plugin-transform-unicode-sets-regex": "^7.23.3",
"@babel/preset-modules": "0.1.6-no-external-plugins",
"babel-plugin-polyfill-corejs2": "^0.4.8",
"babel-plugin-polyfill-corejs3": "^0.9.0",
"babel-plugin-polyfill-regenerator": "^0.5.5",
"core-js-compat": "^3.31.0",
"semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": {
"version": "7.21.0-placeholder-for-preset-env.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/preset-env/node_modules/semver": {
"version": "6.3.1",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/preset-modules": {
"version": "0.1.6-no-external-plugins",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.0.0",
"@babel/types": "^7.4.4",
"esutils": "^2.0.2"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
}
},
"node_modules/@babel/preset-react": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-validator-option": "^7.22.15",
"@babel/plugin-transform-react-display-name": "^7.23.3",
"@babel/plugin-transform-react-jsx": "^7.22.15",
"@babel/plugin-transform-react-jsx-development": "^7.22.5",
"@babel/plugin-transform-react-pure-annotations": "^7.23.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/preset-typescript": {
"version": "7.23.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-validator-option": "^7.22.15",
"@babel/plugin-syntax-jsx": "^7.23.3",
"@babel/plugin-transform-modules-commonjs": "^7.23.3",
"@babel/plugin-transform-typescript": "^7.23.3"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/regjsgen": {
"version": "0.8.0",
"dev": true,
"license": "MIT"
},
"node_modules/@babel/runtime": {
"version": "7.23.9",
"dev": true,
"license": "MIT",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/template": {
"version": "7.23.9",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.23.5",
"@babel/parser": "^7.23.9",
"@babel/types": "^7.23.9"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
"version": "7.23.9",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.23.5",
"@babel/generator": "^7.23.6",
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-function-name": "^7.23.0",
"@babel/helper-hoist-variables": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
"@babel/parser": "^7.23.9",
"@babel/types": "^7.23.9",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/types": {
"version": "7.23.9",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.23.4",
"@babel/helper-validator-identifier": "^7.22.20",
"to-fast-properties": "^2.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@bcoe/v8-coverage": {
"version": "0.2.3",
"dev": true,
"license": "MIT"
},
"node_modules/@bitgo/blake2b": {
"version": "3.2.4",
"license": "ISC",
"dependencies": {
"@bitgo/blake2b-wasm": "^3.2.3",
"nanoassert": "^2.0.0"
}
},
"node_modules/@bitgo/blake2b-wasm": {
"version": "3.2.3",
"license": "MIT",
"dependencies": {
"nanoassert": "^1.0.0"
}
},
"node_modules/@bitgo/blake2b-wasm/node_modules/nanoassert": {
"version": "1.1.0",
"license": "ISC"
},
"node_modules/@bitgo/utxo-lib": {
"version": "9.34.0",
"license": "MIT",
"dependencies": {
"@bitgo/blake2b": "^3.2.4",
"@brandonblack/musig": "^0.0.1-alpha.0",
"@noble/secp256k1": "1.6.3",
"bech32": "^2.0.0",
"bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4",
"bip32": "^3.0.1",
"bitcoin-ops": "^1.3.0",
"bitcoinjs-lib": "npm:@bitgo-forks/bitcoinjs-lib@7.1.0-master.7",
"bn.js": "^5.2.1",
"bs58check": "^2.1.2",
"cashaddress": "^1.1.0",
"create-hash": "^1.2.0",
"create-hmac": "^1.1.7",
"ecpair": "npm:@bitgo/ecpair@2.1.0-rc.0",
"elliptic": "^6.5.2",
"fastpriorityqueue": "^0.7.1",
"typeforce": "^1.11.3",
"varuint-bitcoin": "^1.1.2"
},
"engines": {
"node": ">=10.22.0 <21",
"npm": ">=3.10.10"
}
},
"node_modules/@brandonblack/musig": {
"version": "0.0.1-alpha.1",
"license": "MIT"
},
"node_modules/@csstools/normalize.css": {
"version": "12.1.1",
"dev": true,
"license": "CC0-1.0"
},
"node_modules/@csstools/postcss-cascade-layers": {
"version": "1.1.1",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"@csstools/selector-specificity": "^2.0.2",
"postcss-selector-parser": "^6.0.10"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/@csstools/postcss-color-function": {
"version": "1.1.1",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"@csstools/postcss-progressive-custom-properties": "^1.1.0",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/@csstools/postcss-font-format-keywords": {
"version": "1.0.1",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/@csstools/postcss-hwb-function": {
"version": "1.0.2",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/@csstools/postcss-ic-unit": {
"version": "1.0.1",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"@csstools/postcss-progressive-custom-properties": "^1.1.0",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/@csstools/postcss-is-pseudo-class": {
"version": "2.0.7",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"@csstools/selector-specificity": "^2.0.0",
"postcss-selector-parser": "^6.0.10"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/@csstools/postcss-nested-calc": {
"version": "1.0.0",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/@csstools/postcss-normalize-display-values": {
"version": "1.0.1",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/@csstools/postcss-oklab-function": {
"version": "1.1.1",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"@csstools/postcss-progressive-custom-properties": "^1.1.0",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/@csstools/postcss-progressive-custom-properties": {
"version": "1.3.0",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"peerDependencies": {
"postcss": "^8.3"
}
},
"node_modules/@csstools/postcss-stepped-value-functions": {
"version": "1.0.1",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/@csstools/postcss-text-decoration-shorthand": {
"version": "1.0.0",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/@csstools/postcss-trigonometric-functions": {
"version": "1.0.2",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/@csstools/postcss-unset-value": {
"version": "1.0.2",
"dev": true,
"license": "CC0-1.0",
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/@csstools/selector-specificity": {
"version": "2.2.0",
"dev": true,
"license": "CC0-1.0",
"engines": {
"node": "^14 || ^16 || >=18"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss-selector-parser": "^6.0.10"
}
},
"node_modules/@emotion/is-prop-valid": {
"version": "0.8.8",
"dev": true,
"license": "MIT",
"dependencies": {
"@emotion/memoize": "0.7.4"
}
},
"node_modules/@emotion/memoize": {
"version": "0.7.4",
"dev": true,
"license": "MIT"
},
"node_modules/@emotion/unitless": {
"version": "0.7.5",
"dev": true,
"license": "MIT"
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
"license": "MIT",
"dependencies": {
"eslint-visitor-keys": "^3.3.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"peerDependencies": {
"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
"node_modules/@eslint-community/regexpp": {
"version": "4.10.0",
"license": "MIT",
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
"node_modules/@eslint/eslintrc": {
"version": "2.1.4",
"license": "MIT",
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^9.6.0",
"globals": "^13.19.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
"js-yaml": "^4.1.0",
"minimatch": "^3.1.2",
"strip-json-comments": "^3.1.1"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/@eslint/eslintrc/node_modules/argparse": {
"version": "2.0.1",
"license": "Python-2.0"
},
"node_modules/@eslint/eslintrc/node_modules/globals": {
"version": "13.24.0",
"license": "MIT",
"dependencies": {
"type-fest": "^0.20.2"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@eslint/eslintrc/node_modules/js-yaml": {
"version": "4.1.0",
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/@eslint/eslintrc/node_modules/type-fest": {
"version": "0.20.2",
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@eslint/js": {
"version": "8.56.0",
"license": "MIT",
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"license": "Apache-2.0",
"dependencies": {
"@humanwhocodes/object-schema": "^2.0.2",
"debug": "^4.3.1",
"minimatch": "^3.0.5"
},
"engines": {
"node": ">=10.10.0"
}
},
"node_modules/@humanwhocodes/module-importer": {
"version": "1.0.1",
"license": "Apache-2.0",
"engines": {
"node": ">=12.22"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/nzakas"
}
},
"node_modules/@humanwhocodes/object-schema": {
"version": "2.0.2",
"license": "BSD-3-Clause"
},
"node_modules/@isaacs/cliui": {
"version": "8.0.2",
"dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^5.1.2",
"string-width-cjs": "npm:string-width@^4.2.0",
"strip-ansi": "^7.0.1",
"strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
"wrap-ansi": "^8.1.0",
"wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/@isaacs/cliui/node_modules/ansi-regex": {
"version": "6.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/@isaacs/cliui/node_modules/ansi-styles": {
"version": "6.2.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@isaacs/cliui/node_modules/string-width": {
"version": "5.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"eastasianwidth": "^0.2.0",
"emoji-regex": "^9.2.2",
"strip-ansi": "^7.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@isaacs/cliui/node_modules/strip-ansi": {
"version": "7.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^6.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
"version": "8.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^6.1.0",
"string-width": "^5.0.1",
"strip-ansi": "^7.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"dev": true,
"license": "ISC",
"dependencies": {
"camelcase": "^5.3.1",
"find-up": "^4.1.0",
"get-package-type": "^0.1.0",
"js-yaml": "^3.13.1",
"resolve-from": "^5.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
"version": "5.3.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
"version": "4.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
"version": "5.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"p-locate": "^4.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
"version": "2.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
"version": "4.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@istanbuljs/schema": {
"version": "0.1.3",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/@jest/console": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"jest-message-util": "^29.7.0",
"jest-util": "^29.7.0",
"slash": "^3.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/console/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@jest/console/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@jest/console/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/@jest/console/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/@jest/console/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/@jest/console/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@jest/core": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/console": "^29.7.0",
"@jest/reporters": "^29.7.0",
"@jest/test-result": "^29.7.0",
"@jest/transform": "^29.7.0",
"@jest/types": "^29.6.3",
"@types/node": "*",
"ansi-escapes": "^4.2.1",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"exit": "^0.1.2",
"graceful-fs": "^4.2.9",
"jest-changed-files": "^29.7.0",
"jest-config": "^29.7.0",
"jest-haste-map": "^29.7.0",
"jest-message-util": "^29.7.0",
"jest-regex-util": "^29.6.3",
"jest-resolve": "^29.7.0",
"jest-resolve-dependencies": "^29.7.0",
"jest-runner": "^29.7.0",
"jest-runtime": "^29.7.0",
"jest-snapshot": "^29.7.0",
"jest-util": "^29.7.0",
"jest-validate": "^29.7.0",
"jest-watcher": "^29.7.0",
"micromatch": "^4.0.4",
"pretty-format": "^29.7.0",
"slash": "^3.0.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
"node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
},
"peerDependenciesMeta": {
"node-notifier": {
"optional": true
}
}
},
"node_modules/@jest/core/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@jest/core/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@jest/core/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/@jest/core/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/@jest/core/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/@jest/core/node_modules/pretty-format": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@jest/core/node_modules/react-is": {
"version": "18.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/@jest/core/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@jest/environment": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/fake-timers": "^29.7.0",
"@jest/types": "^29.6.3",
"@types/node": "*",
"jest-mock": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/expect": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"expect": "^29.7.0",
"jest-snapshot": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/expect-utils": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"jest-get-type": "^29.6.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/fake-timers": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/types": "^29.6.3",
"@sinonjs/fake-timers": "^10.0.2",
"@types/node": "*",
"jest-message-util": "^29.7.0",
"jest-mock": "^29.7.0",
"jest-util": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/globals": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/environment": "^29.7.0",
"@jest/expect": "^29.7.0",
"@jest/types": "^29.6.3",
"jest-mock": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/reporters": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@bcoe/v8-coverage": "^0.2.3",
"@jest/console": "^29.7.0",
"@jest/test-result": "^29.7.0",
"@jest/transform": "^29.7.0",
"@jest/types": "^29.6.3",
"@jridgewell/trace-mapping": "^0.3.18",
"@types/node": "*",
"chalk": "^4.0.0",
"collect-v8-coverage": "^1.0.0",
"exit": "^0.1.2",
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
"istanbul-lib-coverage": "^3.0.0",
"istanbul-lib-instrument": "^6.0.0",
"istanbul-lib-report": "^3.0.0",
"istanbul-lib-source-maps": "^4.0.0",
"istanbul-reports": "^3.1.3",
"jest-message-util": "^29.7.0",
"jest-util": "^29.7.0",
"jest-worker": "^29.7.0",
"slash": "^3.0.0",
"string-length": "^4.0.1",
"strip-ansi": "^6.0.0",
"v8-to-istanbul": "^9.0.1"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
"node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
},
"peerDependenciesMeta": {
"node-notifier": {
"optional": true
}
}
},
"node_modules/@jest/reporters/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@jest/reporters/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@jest/reporters/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/@jest/reporters/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/@jest/reporters/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": {
"version": "6.0.1",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"@babel/core": "^7.12.3",
"@babel/parser": "^7.14.7",
"@istanbuljs/schema": "^0.1.2",
"istanbul-lib-coverage": "^3.2.0",
"semver": "^7.5.4"
},
"engines": {
"node": ">=10"
}
},
"node_modules/@jest/reporters/node_modules/jest-worker": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*",
"jest-util": "^29.7.0",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/reporters/node_modules/jest-worker/node_modules/supports-color": {
"version": "8.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/@jest/reporters/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@jest/schemas": {
"version": "29.6.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@sinclair/typebox": "^0.27.8"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/source-map": {
"version": "29.6.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.18",
"callsites": "^3.0.0",
"graceful-fs": "^4.2.9"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/test-result": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/console": "^29.7.0",
"@jest/types": "^29.6.3",
"@types/istanbul-lib-coverage": "^2.0.0",
"collect-v8-coverage": "^1.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/test-sequencer": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/test-result": "^29.7.0",
"graceful-fs": "^4.2.9",
"jest-haste-map": "^29.7.0",
"slash": "^3.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/transform": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.11.6",
"@jest/types": "^29.6.3",
"@jridgewell/trace-mapping": "^0.3.18",
"babel-plugin-istanbul": "^6.1.1",
"chalk": "^4.0.0",
"convert-source-map": "^2.0.0",
"fast-json-stable-stringify": "^2.1.0",
"graceful-fs": "^4.2.9",
"jest-haste-map": "^29.7.0",
"jest-regex-util": "^29.6.3",
"jest-util": "^29.7.0",
"micromatch": "^4.0.4",
"pirates": "^4.0.4",
"slash": "^3.0.0",
"write-file-atomic": "^4.0.2"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/transform/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@jest/transform/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@jest/transform/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/@jest/transform/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/@jest/transform/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/@jest/transform/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@jest/types": {
"version": "29.6.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
"@types/node": "*",
"@types/yargs": "^17.0.8",
"chalk": "^4.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/types/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@jest/types/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@jest/types/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/@jest/types/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/@jest/types/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/@jest/types/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/set-array": "^1.0.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/set-array": {
"version": "1.1.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": {
"version": "0.3.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.15",
"dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.22",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/resolve-uri": "^3.1.0",
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@leichtgewicht/ip-codec": {
"version": "2.0.4",
"dev": true,
"license": "MIT"
},
"node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
"version": "5.1.1-v1",
"dev": true,
"license": "MIT",
"dependencies": {
"eslint-scope": "5.1.1"
}
},
"node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": {
"version": "5.1.1",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": {
"version": "4.3.0",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=4.0"
}
},
"node_modules/@noble/hashes": {
"version": "1.3.3",
"license": "MIT",
"engines": {
"node": ">= 16"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/@noble/secp256k1": {
"version": "1.6.3",
"funding": [
{
"type": "individual",
"url": "https://paulmillr.com/funding/"
}
],
"license": "MIT"
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.stat": {
"version": "2.0.5",
"license": "MIT",
"engines": {
"node": ">= 8"
}
},
"node_modules/@nodelib/fs.walk": {
"version": "1.2.8",
"license": "MIT",
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/@phenomnomnominal/tsquery": {
"version": "4.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"esquery": "^1.0.1"
},
"peerDependencies": {
"typescript": "^3 || ^4"
}
},
"node_modules/@pkgjs/parseargs": {
"version": "0.11.0",
"dev": true,
"license": "MIT",
"optional": true,
"engines": {
"node": ">=14"
}
},
"node_modules/@pmmmwh/react-refresh-webpack-plugin": {
"version": "0.5.11",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-html-community": "^0.0.8",
"common-path-prefix": "^3.0.0",
"core-js-pure": "^3.23.3",
"error-stack-parser": "^2.0.6",
"find-up": "^5.0.0",
"html-entities": "^2.1.0",
"loader-utils": "^2.0.4",
"schema-utils": "^3.0.0",
"source-map": "^0.7.3"
},
"engines": {
"node": ">= 10.13"
},
"peerDependencies": {
"@types/webpack": "4.x || 5.x",
"react-refresh": ">=0.10.0 <1.0.0",
"sockjs-client": "^1.4.0",
"type-fest": ">=0.17.0 <5.0.0",
"webpack": ">=4.43.0 <6.0.0",
"webpack-dev-server": "3.x || 4.x",
"webpack-hot-middleware": "2.x",
"webpack-plugin-serve": "0.x || 1.x"
},
"peerDependenciesMeta": {
"@types/webpack": {
"optional": true
},
"sockjs-client": {
"optional": true
},
"type-fest": {
"optional": true
},
"webpack-dev-server": {
"optional": true
},
"webpack-hot-middleware": {
"optional": true
},
"webpack-plugin-serve": {
"optional": true
}
}
},
"node_modules/@protobufjs/aspromise": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
"integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
},
"node_modules/@protobufjs/base64": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
"integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
},
"node_modules/@protobufjs/codegen": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
},
"node_modules/@protobufjs/eventemitter": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
"integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
},
"node_modules/@protobufjs/fetch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
"integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
"dependencies": {
"@protobufjs/aspromise": "^1.1.1",
"@protobufjs/inquire": "^1.1.0"
}
},
"node_modules/@protobufjs/float": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
"integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
},
"node_modules/@protobufjs/inquire": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
"integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
},
"node_modules/@protobufjs/path": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
"integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
},
"node_modules/@protobufjs/pool": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
"integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
},
"node_modules/@protobufjs/utf8": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
},
"node_modules/@remix-run/router": {
"version": "1.15.0",
"license": "MIT",
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@rollup/plugin-babel": {
"version": "5.3.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.10.4",
"@rollup/pluginutils": "^3.1.0"
},
"engines": {
"node": ">= 10.0.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0",
"@types/babel__core": "^7.1.9",
"rollup": "^1.20.0||^2.0.0"
},
"peerDependenciesMeta": {
"@types/babel__core": {
"optional": true
}
}
},
"node_modules/@rollup/plugin-node-resolve": {
"version": "11.2.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@rollup/pluginutils": "^3.1.0",
"@types/resolve": "1.17.1",
"builtin-modules": "^3.1.0",
"deepmerge": "^4.2.2",
"is-module": "^1.0.0",
"resolve": "^1.19.0"
},
"engines": {
"node": ">= 10.0.0"
},
"peerDependencies": {
"rollup": "^1.20.0||^2.0.0"
}
},
"node_modules/@rollup/plugin-replace": {
"version": "2.4.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@rollup/pluginutils": "^3.1.0",
"magic-string": "^0.25.7"
},
"peerDependencies": {
"rollup": "^1.20.0 || ^2.0.0"
}
},
"node_modules/@rollup/pluginutils": {
"version": "3.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "0.0.39",
"estree-walker": "^1.0.1",
"picomatch": "^2.2.2"
},
"engines": {
"node": ">= 8.0.0"
},
"peerDependencies": {
"rollup": "^1.20.0||^2.0.0"
}
},
"node_modules/@rollup/pluginutils/node_modules/@types/estree": {
"version": "0.0.39",
"dev": true,
"license": "MIT"
},
"node_modules/@rushstack/eslint-patch": {
"version": "1.7.2",
"dev": true,
"license": "MIT"
},
"node_modules/@sinclair/typebox": {
"version": "0.27.8",
"dev": true,
"license": "MIT"
},
"node_modules/@sinonjs/commons": {
"version": "3.0.1",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"type-detect": "4.0.8"
}
},
"node_modules/@sinonjs/fake-timers": {
"version": "10.3.0",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"@sinonjs/commons": "^3.0.0"
}
},
"node_modules/@surma/rollup-plugin-off-main-thread": {
"version": "2.2.3",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"ejs": "^3.1.6",
"json5": "^2.2.0",
"magic-string": "^0.25.0",
"string.prototype.matchall": "^4.0.6"
}
},
"node_modules/@svgr/babel-plugin-add-jsx-attribute": {
"version": "6.5.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
"version": "8.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
"version": "8.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
"version": "6.5.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-svg-dynamic-title": {
"version": "6.5.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-svg-em-dimensions": {
"version": "6.5.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-transform-react-native-svg": {
"version": "6.5.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-plugin-transform-svg-component": {
"version": "6.5.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/babel-preset": {
"version": "6.5.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@svgr/babel-plugin-add-jsx-attribute": "^6.5.1",
"@svgr/babel-plugin-remove-jsx-attribute": "*",
"@svgr/babel-plugin-remove-jsx-empty-expression": "*",
"@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1",
"@svgr/babel-plugin-svg-dynamic-title": "^6.5.1",
"@svgr/babel-plugin-svg-em-dimensions": "^6.5.1",
"@svgr/babel-plugin-transform-react-native-svg": "^6.5.1",
"@svgr/babel-plugin-transform-svg-component": "^6.5.1"
},
"engines": {
"node": ">=10"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@svgr/core": {
"version": "6.5.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.19.6",
"@svgr/babel-preset": "^6.5.1",
"@svgr/plugin-jsx": "^6.5.1",
"camelcase": "^6.2.0",
"cosmiconfig": "^7.0.1"
},
"engines": {
"node": ">=10"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
}
},
"node_modules/@svgr/hast-util-to-babel-ast": {
"version": "6.5.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.20.0",
"entities": "^4.4.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
}
},
"node_modules/@svgr/plugin-jsx": {
"version": "6.5.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.19.6",
"@svgr/babel-preset": "^6.5.1",
"@svgr/hast-util-to-babel-ast": "^6.5.1",
"svg-parser": "^2.0.4"
},
"engines": {
"node": ">=10"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
"@svgr/core": "^6.0.0"
}
},
"node_modules/@svgr/plugin-svgo": {
"version": "6.5.1",
"dev": true,
"license": "MIT",
"dependencies": {
"cosmiconfig": "^7.0.1",
"deepmerge": "^4.2.2",
"svgo": "^2.8.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
},
"peerDependencies": {
"@svgr/core": "*"
}
},
"node_modules/@svgr/webpack": {
"version": "6.5.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.19.6",
"@babel/plugin-transform-react-constant-elements": "^7.18.12",
"@babel/preset-env": "^7.19.4",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.18.6",
"@svgr/core": "^6.5.1",
"@svgr/plugin-jsx": "^6.5.1",
"@svgr/plugin-svgo": "^6.5.1"
},
"engines": {
"node": ">=10"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/gregberge"
}
},
"node_modules/@testing-library/dom": {
"version": "9.3.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.10.4",
"@babel/runtime": "^7.12.5",
"@types/aria-query": "^5.0.1",
"aria-query": "5.1.3",
"chalk": "^4.1.0",
"dom-accessibility-api": "^0.5.9",
"lz-string": "^1.5.0",
"pretty-format": "^27.0.2"
},
"engines": {
"node": ">=14"
}
},
"node_modules/@testing-library/dom/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@testing-library/dom/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/@testing-library/dom/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/@testing-library/dom/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/@testing-library/dom/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/@testing-library/dom/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@testing-library/jest-dom": {
"version": "6.4.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@adobe/css-tools": "^4.3.2",
"@babel/runtime": "^7.9.2",
"aria-query": "^5.0.0",
"chalk": "^3.0.0",
"css.escape": "^1.5.1",
"dom-accessibility-api": "^0.6.3",
"lodash": "^4.17.15",
"redent": "^3.0.0"
},
"engines": {
"node": ">=14",
"npm": ">=6",
"yarn": ">=1"
},
"peerDependencies": {
"@jest/globals": ">= 28",
"@types/bun": "latest",
"@types/jest": ">= 28",
"jest": ">= 28",
"vitest": ">= 0.32"
},
"peerDependenciesMeta": {
"@jest/globals": {
"optional": true
},
"@types/bun": {
"optional": true
},
"@types/jest": {
"optional": true
},
"jest": {
"optional": true
},
"vitest": {
"optional": true
}
}
},
"node_modules/@testing-library/jest-dom/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/@testing-library/jest-dom/node_modules/chalk": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@testing-library/jest-dom/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/@testing-library/jest-dom/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": {
"version": "0.6.3",
"dev": true,
"license": "MIT"
},
"node_modules/@testing-library/jest-dom/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/@testing-library/jest-dom/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/@testing-library/react": {
"version": "14.2.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.12.5",
"@testing-library/dom": "^9.0.0",
"@types/react-dom": "^18.0.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
"react": "^18.0.0",
"react-dom": "^18.0.0"
}
},
"node_modules/@testing-library/user-event": {
"version": "14.5.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12",
"npm": ">=6"
},
"peerDependencies": {
"@testing-library/dom": ">=7.21.4"
}
},
"node_modules/@tootallnate/once": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10"
}
},
"node_modules/@trysound/sax": {
"version": "0.2.0",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/@types/aria-query": {
"version": "5.0.4",
"dev": true,
"license": "MIT"
},
"node_modules/@types/babel__core": {
"version": "7.20.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.20.7",
"@babel/types": "^7.20.7",
"@types/babel__generator": "*",
"@types/babel__template": "*",
"@types/babel__traverse": "*"
}
},
"node_modules/@types/babel__generator": {
"version": "7.6.8",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.0.0"
}
},
"node_modules/@types/babel__template": {
"version": "7.4.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.1.0",
"@babel/types": "^7.0.0"
}
},
"node_modules/@types/babel__traverse": {
"version": "7.20.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.20.7"
}
},
"node_modules/@types/body-parser": {
"version": "1.19.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/connect": "*",
"@types/node": "*"
}
},
"node_modules/@types/bonjour": {
"version": "3.5.13",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/connect": {
"version": "3.4.38",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/connect-history-api-fallback": {
"version": "1.5.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/express-serve-static-core": "*",
"@types/node": "*"
}
},
"node_modules/@types/eslint": {
"version": "8.56.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "*",
"@types/json-schema": "*"
}
},
"node_modules/@types/eslint-scope": {
"version": "3.7.7",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/eslint": "*",
"@types/estree": "*"
}
},
"node_modules/@types/estree": {
"version": "1.0.5",
"dev": true,
"license": "MIT"
},
"node_modules/@types/express": {
"version": "4.17.21",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/body-parser": "*",
"@types/express-serve-static-core": "^4.17.33",
"@types/qs": "*",
"@types/serve-static": "*"
}
},
"node_modules/@types/express-serve-static-core": {
"version": "4.17.43",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*",
"@types/qs": "*",
"@types/range-parser": "*",
"@types/send": "*"
}
},
"node_modules/@types/graceful-fs": {
"version": "4.1.9",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/html-minifier-terser": {
"version": "6.1.0",
"dev": true,
"license": "MIT"
},
"node_modules/@types/http-errors": {
"version": "2.0.4",
"dev": true,
"license": "MIT"
},
"node_modules/@types/http-proxy": {
"version": "1.17.14",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/istanbul-lib-coverage": {
"version": "2.0.6",
"dev": true,
"license": "MIT"
},
"node_modules/@types/istanbul-lib-report": {
"version": "3.0.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/istanbul-lib-coverage": "*"
}
},
"node_modules/@types/istanbul-reports": {
"version": "3.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/istanbul-lib-report": "*"
}
},
"node_modules/@types/jsdom": {
"version": "20.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*",
"@types/tough-cookie": "*",
"parse5": "^7.0.0"
}
},
"node_modules/@types/json-schema": {
"version": "7.0.15",
"dev": true,
"license": "MIT"
},
"node_modules/@types/json5": {
"version": "0.0.29",
"dev": true,
"license": "MIT"
},
"node_modules/@types/long": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
"integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
},
"node_modules/@types/mime": {
"version": "1.3.5",
"dev": true,
"license": "MIT"
},
"node_modules/@types/node": {
"version": "20.11.17",
"license": "MIT",
"dependencies": {
"undici-types": "~5.26.4"
}
},
"node_modules/@types/node-forge": {
"version": "1.3.11",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/parse-json": {
"version": "4.0.2",
"dev": true,
"license": "MIT"
},
"node_modules/@types/prop-types": {
"version": "15.7.11",
"dev": true,
"license": "MIT"
},
"node_modules/@types/qs": {
"version": "6.9.11",
"dev": true,
"license": "MIT"
},
"node_modules/@types/range-parser": {
"version": "1.2.7",
"dev": true,
"license": "MIT"
},
"node_modules/@types/react": {
"version": "18.2.55",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/prop-types": "*",
"@types/scheduler": "*",
"csstype": "^3.0.2"
}
},
"node_modules/@types/react-dom": {
"version": "18.2.19",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/resolve": {
"version": "1.17.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/retry": {
"version": "0.12.0",
"dev": true,
"license": "MIT"
},
"node_modules/@types/scheduler": {
"version": "0.16.8",
"dev": true,
"license": "MIT"
},
"node_modules/@types/semver": {
"version": "7.5.6",
"dev": true,
"license": "MIT"
},
"node_modules/@types/send": {
"version": "0.17.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/mime": "^1",
"@types/node": "*"
}
},
"node_modules/@types/serve-index": {
"version": "1.9.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/express": "*"
}
},
"node_modules/@types/serve-static": {
"version": "1.15.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/http-errors": "*",
"@types/mime": "*",
"@types/node": "*"
}
},
"node_modules/@types/sockjs": {
"version": "0.3.36",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/stack-utils": {
"version": "2.0.3",
"dev": true,
"license": "MIT"
},
"node_modules/@types/tough-cookie": {
"version": "4.0.5",
"dev": true,
"license": "MIT"
},
"node_modules/@types/trusted-types": {
"version": "2.0.7",
"dev": true,
"license": "MIT"
},
"node_modules/@types/ws": {
"version": "8.5.10",
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/yargs": {
"version": "17.0.32",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/yargs-parser": "*"
}
},
"node_modules/@types/yargs-parser": {
"version": "21.0.3",
"dev": true,
"license": "MIT"
},
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "5.62.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.4.0",
"@typescript-eslint/scope-manager": "5.62.0",
"@typescript-eslint/type-utils": "5.62.0",
"@typescript-eslint/utils": "5.62.0",
"debug": "^4.3.4",
"graphemer": "^1.4.0",
"ignore": "^5.2.0",
"natural-compare-lite": "^1.4.0",
"semver": "^7.3.7",
"tsutils": "^3.21.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"@typescript-eslint/parser": "^5.0.0",
"eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/@typescript-eslint/experimental-utils": {
"version": "5.62.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/utils": "5.62.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
"node_modules/@typescript-eslint/parser": {
"version": "5.62.0",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"@typescript-eslint/scope-manager": "5.62.0",
"@typescript-eslint/types": "5.62.0",
"@typescript-eslint/typescript-estree": "5.62.0",
"debug": "^4.3.4"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/@typescript-eslint/scope-manager": {
"version": "5.62.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "5.62.0",
"@typescript-eslint/visitor-keys": "5.62.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
}
},
"node_modules/@typescript-eslint/type-utils": {
"version": "5.62.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/typescript-estree": "5.62.0",
"@typescript-eslint/utils": "5.62.0",
"debug": "^4.3.4",
"tsutils": "^3.21.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"eslint": "*"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/@typescript-eslint/types": {
"version": "5.62.0",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
}
},
"node_modules/@typescript-eslint/typescript-estree": {
"version": "5.62.0",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"@typescript-eslint/types": "5.62.0",
"@typescript-eslint/visitor-keys": "5.62.0",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
"semver": "^7.3.7",
"tsutils": "^3.21.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependenciesMeta": {
"typescript": {
"optional": true
}
}
},
"node_modules/@typescript-eslint/utils": {
"version": "5.62.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@types/json-schema": "^7.0.9",
"@types/semver": "^7.3.12",
"@typescript-eslint/scope-manager": "5.62.0",
"@typescript-eslint/types": "5.62.0",
"@typescript-eslint/typescript-estree": "5.62.0",
"eslint-scope": "^5.1.1",
"semver": "^7.3.7"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
"node_modules/@typescript-eslint/utils/node_modules/eslint-scope": {
"version": "5.1.1",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/@typescript-eslint/utils/node_modules/estraverse": {
"version": "4.3.0",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=4.0"
}
},
"node_modules/@typescript-eslint/visitor-keys": {
"version": "5.62.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "5.62.0",
"eslint-visitor-keys": "^3.3.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
}
},
"node_modules/@ungap/structured-clone": {
"version": "1.2.0",
"license": "ISC"
},
"node_modules/@webassemblyjs/ast": {
"version": "1.11.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/helper-numbers": "1.11.6",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6"
}
},
"node_modules/@webassemblyjs/floating-point-hex-parser": {
"version": "1.11.6",
"dev": true,
"license": "MIT"
},
"node_modules/@webassemblyjs/helper-api-error": {
"version": "1.11.6",
"dev": true,
"license": "MIT"
},
"node_modules/@webassemblyjs/helper-buffer": {
"version": "1.11.6",
"dev": true,
"license": "MIT"
},
"node_modules/@webassemblyjs/helper-numbers": {
"version": "1.11.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/floating-point-hex-parser": "1.11.6",
"@webassemblyjs/helper-api-error": "1.11.6",
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webassemblyjs/helper-wasm-bytecode": {
"version": "1.11.6",
"dev": true,
"license": "MIT"
},
"node_modules/@webassemblyjs/helper-wasm-section": {
"version": "1.11.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/ast": "1.11.6",
"@webassemblyjs/helper-buffer": "1.11.6",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
"@webassemblyjs/wasm-gen": "1.11.6"
}
},
"node_modules/@webassemblyjs/ieee754": {
"version": "1.11.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@xtuc/ieee754": "^1.2.0"
}
},
"node_modules/@webassemblyjs/leb128": {
"version": "1.11.6",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webassemblyjs/utf8": {
"version": "1.11.6",
"dev": true,
"license": "MIT"
},
"node_modules/@webassemblyjs/wasm-edit": {
"version": "1.11.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/ast": "1.11.6",
"@webassemblyjs/helper-buffer": "1.11.6",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
"@webassemblyjs/helper-wasm-section": "1.11.6",
"@webassemblyjs/wasm-gen": "1.11.6",
"@webassemblyjs/wasm-opt": "1.11.6",
"@webassemblyjs/wasm-parser": "1.11.6",
"@webassemblyjs/wast-printer": "1.11.6"
}
},
"node_modules/@webassemblyjs/wasm-gen": {
"version": "1.11.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/ast": "1.11.6",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
"@webassemblyjs/ieee754": "1.11.6",
"@webassemblyjs/leb128": "1.11.6",
"@webassemblyjs/utf8": "1.11.6"
}
},
"node_modules/@webassemblyjs/wasm-opt": {
"version": "1.11.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/ast": "1.11.6",
"@webassemblyjs/helper-buffer": "1.11.6",
"@webassemblyjs/wasm-gen": "1.11.6",
"@webassemblyjs/wasm-parser": "1.11.6"
}
},
"node_modules/@webassemblyjs/wasm-parser": {
"version": "1.11.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/ast": "1.11.6",
"@webassemblyjs/helper-api-error": "1.11.6",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
"@webassemblyjs/ieee754": "1.11.6",
"@webassemblyjs/leb128": "1.11.6",
"@webassemblyjs/utf8": "1.11.6"
}
},
"node_modules/@webassemblyjs/wast-printer": {
"version": "1.11.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@webassemblyjs/ast": "1.11.6",
"@xtuc/long": "4.2.2"
}
},
"node_modules/@xtuc/ieee754": {
"version": "1.2.0",
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/@xtuc/long": {
"version": "4.2.2",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/@zxing/browser": {
"version": "0.1.4",
"license": "MIT",
"optionalDependencies": {
"@zxing/text-encoding": "^0.9.0"
},
"peerDependencies": {
"@zxing/library": "^0.20.0"
}
},
"node_modules/@zxing/library": {
"version": "0.20.0",
"license": "MIT",
"peer": true,
"dependencies": {
"ts-custom-error": "^3.2.1"
},
"engines": {
"node": ">= 10.4.0"
},
"optionalDependencies": {
"@zxing/text-encoding": "~0.9.0"
}
},
"node_modules/@zxing/text-encoding": {
"version": "0.9.0",
"license": "(Unlicense OR Apache-2.0)",
"optional": true
},
"node_modules/abab": {
"version": "2.0.6",
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/accepts": {
"version": "1.3.8",
"dev": true,
"license": "MIT",
"dependencies": {
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/acorn": {
"version": "8.11.3",
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/acorn-globals": {
"version": "7.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"acorn": "^8.1.0",
"acorn-walk": "^8.0.2"
}
},
"node_modules/acorn-import-assertions": {
"version": "1.9.0",
"dev": true,
"license": "MIT",
"peerDependencies": {
"acorn": "^8"
}
},
"node_modules/acorn-jsx": {
"version": "5.3.2",
"license": "MIT",
"peerDependencies": {
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
"node_modules/acorn-walk": {
"version": "8.3.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/address": {
"version": "1.2.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/adjust-sourcemap-loader": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"loader-utils": "^2.0.0",
"regex-parser": "^2.2.11"
},
"engines": {
"node": ">=8.9"
}
},
"node_modules/agent-base": {
"version": "6.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "4"
},
"engines": {
"node": ">= 6.0.0"
}
},
"node_modules/ajv": {
"version": "6.12.6",
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/ajv-formats": {
"version": "2.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"ajv": "^8.0.0"
},
"peerDependencies": {
"ajv": "^8.0.0"
},
"peerDependenciesMeta": {
"ajv": {
"optional": true
}
}
},
"node_modules/ajv-formats/node_modules/ajv": {
"version": "8.12.0",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/ajv-formats/node_modules/json-schema-traverse": {
"version": "1.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/ajv-keywords": {
"version": "3.5.2",
"dev": true,
"license": "MIT",
"peerDependencies": {
"ajv": "^6.9.1"
}
},
"node_modules/ansi-escapes": {
"version": "4.3.2",
"dev": true,
"license": "MIT",
"dependencies": {
"type-fest": "^0.21.3"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ansi-html-community": {
"version": "0.0.8",
"dev": true,
"engines": [
"node >= 0.8.0"
],
"license": "Apache-2.0",
"bin": {
"ansi-html": "bin/ansi-html"
}
},
"node_modules/ansi-regex": {
"version": "5.0.1",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/ansi-styles": {
"version": "3.2.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/any-promise": {
"version": "1.3.0",
"dev": true,
"license": "MIT"
},
"node_modules/anymatch": {
"version": "3.1.3",
"dev": true,
"license": "ISC",
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/arg": {
"version": "5.0.2",
"dev": true,
"license": "MIT"
},
"node_modules/argparse": {
"version": "1.0.10",
"dev": true,
"license": "MIT",
"dependencies": {
"sprintf-js": "~1.0.2"
}
},
"node_modules/aria-query": {
"version": "5.1.3",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"deep-equal": "^2.0.5"
}
},
"node_modules/array-buffer-byte-length": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.5",
"is-array-buffer": "^3.0.4"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/array-flatten": {
"version": "1.1.1",
"dev": true,
"license": "MIT"
},
"node_modules/array-includes": {
"version": "3.1.7",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1",
"get-intrinsic": "^1.2.1",
"is-string": "^1.0.7"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/array-union": {
"version": "2.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/array.prototype.filter": {
"version": "1.0.3",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1",
"es-array-method-boxes-properly": "^1.0.0",
"is-string": "^1.0.7"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/array.prototype.findlastindex": {
"version": "1.2.4",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.5",
"define-properties": "^1.2.1",
"es-abstract": "^1.22.3",
"es-errors": "^1.3.0",
"es-shim-unscopables": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/array.prototype.flat": {
"version": "1.3.2",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1",
"es-shim-unscopables": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/array.prototype.flatmap": {
"version": "1.3.2",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1",
"es-shim-unscopables": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/array.prototype.tosorted": {
"version": "1.1.3",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.5",
"define-properties": "^1.2.1",
"es-abstract": "^1.22.3",
"es-errors": "^1.1.0",
"es-shim-unscopables": "^1.0.2"
}
},
"node_modules/arraybuffer.prototype.slice": {
"version": "1.0.3",
"dev": true,
"license": "MIT",
"dependencies": {
"array-buffer-byte-length": "^1.0.1",
"call-bind": "^1.0.5",
"define-properties": "^1.2.1",
"es-abstract": "^1.22.3",
"es-errors": "^1.2.1",
"get-intrinsic": "^1.2.3",
"is-array-buffer": "^3.0.4",
"is-shared-array-buffer": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/asap": {
"version": "2.0.6",
"dev": true,
"license": "MIT"
},
"node_modules/asn1.js": {
"version": "5.4.1",
"dev": true,
"license": "MIT",
"dependencies": {
"bn.js": "^4.0.0",
"inherits": "^2.0.1",
"minimalistic-assert": "^1.0.0",
"safer-buffer": "^2.1.0"
}
},
"node_modules/asn1.js/node_modules/bn.js": {
"version": "4.12.0",
"dev": true,
"license": "MIT"
},
"node_modules/assert": {
"version": "2.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"is-nan": "^1.3.2",
"object-is": "^1.1.5",
"object.assign": "^4.1.4",
"util": "^0.12.5"
}
},
"node_modules/ast-types-flow": {
"version": "0.0.8",
"dev": true,
"license": "MIT"
},
"node_modules/async": {
"version": "3.2.5",
"dev": true,
"license": "MIT"
},
"node_modules/asynciterator.prototype": {
"version": "1.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
}
},
"node_modules/asynckit": {
"version": "0.4.0",
"license": "MIT"
},
"node_modules/at-least-node": {
"version": "1.0.0",
"dev": true,
"license": "ISC",
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/autoprefixer": {
"version": "10.4.17",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/autoprefixer"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"browserslist": "^4.22.2",
"caniuse-lite": "^1.0.30001578",
"fraction.js": "^4.3.7",
"normalize-range": "^0.1.2",
"picocolors": "^1.0.0",
"postcss-value-parser": "^4.2.0"
},
"bin": {
"autoprefixer": "bin/autoprefixer"
},
"engines": {
"node": "^10 || ^12 || >=14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/available-typed-arrays": {
"version": "1.0.6",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/axe-core": {
"version": "4.7.0",
"dev": true,
"license": "MPL-2.0",
"engines": {
"node": ">=4"
}
},
"node_modules/axios": {
"version": "1.6.8",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
"integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/axobject-query": {
"version": "3.2.1",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"dequal": "^2.0.3"
}
},
"node_modules/babel-jest": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/transform": "^29.7.0",
"@types/babel__core": "^7.1.14",
"babel-plugin-istanbul": "^6.1.1",
"babel-preset-jest": "^29.6.3",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"slash": "^3.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
"@babel/core": "^7.8.0"
}
},
"node_modules/babel-jest/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/babel-jest/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/babel-jest/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/babel-jest/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/babel-jest/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/babel-jest/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/babel-loader": {
"version": "8.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"find-cache-dir": "^3.3.1",
"loader-utils": "^2.0.0",
"make-dir": "^3.1.0",
"schema-utils": "^2.6.5"
},
"engines": {
"node": ">= 8.9"
},
"peerDependencies": {
"@babel/core": "^7.0.0",
"webpack": ">=2"
}
},
"node_modules/babel-loader/node_modules/schema-utils": {
"version": "2.7.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.5",
"ajv": "^6.12.4",
"ajv-keywords": "^3.5.2"
},
"engines": {
"node": ">= 8.9.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/babel-plugin-istanbul": {
"version": "6.1.1",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"@babel/helper-plugin-utils": "^7.0.0",
"@istanbuljs/load-nyc-config": "^1.0.0",
"@istanbuljs/schema": "^0.1.2",
"istanbul-lib-instrument": "^5.0.4",
"test-exclude": "^6.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/babel-plugin-jest-hoist": {
"version": "29.6.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.3.3",
"@babel/types": "^7.3.3",
"@types/babel__core": "^7.1.14",
"@types/babel__traverse": "^7.0.6"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/babel-plugin-macros": {
"version": "3.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.12.5",
"cosmiconfig": "^7.0.0",
"resolve": "^1.19.0"
},
"engines": {
"node": ">=10",
"npm": ">=6"
}
},
"node_modules/babel-plugin-named-asset-import": {
"version": "0.3.8",
"dev": true,
"license": "MIT",
"peerDependencies": {
"@babel/core": "^7.1.0"
}
},
"node_modules/babel-plugin-polyfill-corejs2": {
"version": "0.4.8",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.22.6",
"@babel/helper-define-polyfill-provider": "^0.5.0",
"semver": "^6.3.1"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
"node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
"version": "6.3.1",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/babel-plugin-polyfill-corejs3": {
"version": "0.9.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-define-polyfill-provider": "^0.5.0",
"core-js-compat": "^3.34.0"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
"node_modules/babel-plugin-polyfill-regenerator": {
"version": "0.5.5",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-define-polyfill-provider": "^0.5.0"
},
"peerDependencies": {
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
"node_modules/babel-plugin-styled-components": {
"version": "2.1.4",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-module-imports": "^7.22.5",
"@babel/plugin-syntax-jsx": "^7.22.5",
"lodash": "^4.17.21",
"picomatch": "^2.3.1"
},
"peerDependencies": {
"styled-components": ">= 2"
}
},
"node_modules/babel-plugin-transform-react-remove-prop-types": {
"version": "0.4.24",
"dev": true,
"license": "MIT"
},
"node_modules/babel-preset-current-node-syntax": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/plugin-syntax-async-generators": "^7.8.4",
"@babel/plugin-syntax-bigint": "^7.8.3",
"@babel/plugin-syntax-class-properties": "^7.8.3",
"@babel/plugin-syntax-import-meta": "^7.8.3",
"@babel/plugin-syntax-json-strings": "^7.8.3",
"@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
"@babel/plugin-syntax-numeric-separator": "^7.8.3",
"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
"@babel/plugin-syntax-optional-chaining": "^7.8.3",
"@babel/plugin-syntax-top-level-await": "^7.8.3"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/babel-preset-jest": {
"version": "29.6.3",
"dev": true,
"license": "MIT",
"dependencies": {
"babel-plugin-jest-hoist": "^29.6.3",
"babel-preset-current-node-syntax": "^1.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/babel-preset-react-app": {
"version": "10.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.16.0",
"@babel/plugin-proposal-class-properties": "^7.16.0",
"@babel/plugin-proposal-decorators": "^7.16.4",
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0",
"@babel/plugin-proposal-numeric-separator": "^7.16.0",
"@babel/plugin-proposal-optional-chaining": "^7.16.0",
"@babel/plugin-proposal-private-methods": "^7.16.0",
"@babel/plugin-transform-flow-strip-types": "^7.16.0",
"@babel/plugin-transform-react-display-name": "^7.16.0",
"@babel/plugin-transform-runtime": "^7.16.4",
"@babel/preset-env": "^7.16.4",
"@babel/preset-react": "^7.16.0",
"@babel/preset-typescript": "^7.16.0",
"@babel/runtime": "^7.16.3",
"babel-plugin-macros": "^3.1.0",
"babel-plugin-transform-react-remove-prop-types": "^0.4.24"
}
},
"node_modules/balanced-match": {
"version": "1.0.2",
"license": "MIT"
},
"node_modules/base-x": {
"version": "3.0.9",
"license": "MIT",
"dependencies": {
"safe-buffer": "^5.0.1"
}
},
"node_modules/base64-js": {
"version": "1.5.1",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/batch": {
"version": "0.6.1",
"dev": true,
"license": "MIT"
},
"node_modules/bech32": {
"version": "2.0.0",
"license": "MIT"
},
"node_modules/bfj": {
"version": "7.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"bluebird": "^3.7.2",
"check-types": "^11.2.3",
"hoopy": "^0.1.4",
"jsonpath": "^1.1.1",
"tryer": "^1.0.1"
},
"engines": {
"node": ">= 8.0.0"
}
},
"node_modules/big-integer": {
"version": "1.6.36",
"license": "Unlicense",
"engines": {
"node": ">=0.6"
}
},
"node_modules/big.js": {
"version": "5.2.2",
"dev": true,
"license": "MIT",
"engines": {
"node": "*"
}
},
"node_modules/bigi": {
"version": "1.4.2"
},
"node_modules/bignumber.js": {
"version": "9.1.2",
"license": "MIT",
"engines": {
"node": "*"
}
},
"node_modules/binary-extensions": {
"version": "2.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/bindings": {
"version": "1.5.0",
"license": "MIT",
"dependencies": {
"file-uri-to-path": "1.0.0"
}
},
"node_modules/bip174": {
"name": "@bitgo-forks/bip174",
"version": "3.1.0-master.4",
"license": "MIT",
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/bip32": {
"version": "3.1.0",
"license": "MIT",
"dependencies": {
"bs58check": "^2.1.1",
"create-hash": "^1.2.0",
"create-hmac": "^1.1.7",
"ripemd160": "^2.0.2",
"typeforce": "^1.11.5",
"wif": "^2.0.6"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/bip39": {
"version": "3.1.0",
"license": "ISC",
"dependencies": {
"@noble/hashes": "^1.2.0"
}
},
"node_modules/bip66": {
"version": "1.1.5",
"license": "MIT",
"dependencies": {
"safe-buffer": "^5.0.1"
}
},
"node_modules/bitcoin-ops": {
"version": "1.4.1",
"license": "MIT"
},
"node_modules/bitcoinjs-lib": {
"name": "@bitgo-forks/bitcoinjs-lib",
"version": "7.1.0-master.7",
"license": "MIT",
"dependencies": {
"bech32": "^2.0.0",
"bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4",
"bs58check": "^2.1.2",
"create-hash": "^1.1.0",
"fastpriorityqueue": "^0.7.1",
"json5": "^2.2.3",
"ripemd160": "^2.0.2",
"typeforce": "^1.11.3",
"varuint-bitcoin": "^1.1.2",
"wif": "^2.0.1"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/bitcoinjs-message": {
"version": "2.2.0",
"license": "MIT",
"dependencies": {
"bech32": "^1.1.3",
"bs58check": "^2.1.2",
"buffer-equals": "^1.0.3",
"create-hash": "^1.1.2",
"secp256k1": "^3.0.1",
"varuint-bitcoin": "^1.0.1"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/bitcoinjs-message/node_modules/bech32": {
"version": "1.1.4",
"license": "MIT"
},
"node_modules/bluebird": {
"version": "3.7.2",
"dev": true,
"license": "MIT"
},
"node_modules/bn.js": {
"version": "5.2.1",
"license": "MIT"
},
"node_modules/body-parser": {
"version": "1.20.1",
"dev": true,
"license": "MIT",
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.11.0",
"raw-body": "2.5.1",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/body-parser/node_modules/bytes": {
"version": "3.1.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/body-parser/node_modules/debug": {
"version": "2.6.9",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/body-parser/node_modules/iconv-lite": {
"version": "0.4.24",
"dev": true,
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/body-parser/node_modules/ms": {
"version": "2.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/bonjour-service": {
"version": "1.2.1",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3",
"multicast-dns": "^7.2.5"
}
},
"node_modules/boolbase": {
"version": "1.0.0",
"dev": true,
"license": "ISC"
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"node_modules/braces": {
"version": "3.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"fill-range": "^7.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/brorand": {
"version": "1.1.0",
"license": "MIT"
},
"node_modules/browserify-aes": {
"version": "1.2.0",
"license": "MIT",
"dependencies": {
"buffer-xor": "^1.0.3",
"cipher-base": "^1.0.0",
"create-hash": "^1.1.0",
"evp_bytestokey": "^1.0.3",
"inherits": "^2.0.1",
"safe-buffer": "^5.0.1"
}
},
"node_modules/browserify-cipher": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"browserify-aes": "^1.0.4",
"browserify-des": "^1.0.0",
"evp_bytestokey": "^1.0.0"
}
},
"node_modules/browserify-des": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"cipher-base": "^1.0.1",
"des.js": "^1.0.0",
"inherits": "^2.0.1",
"safe-buffer": "^5.1.2"
}
},
"node_modules/browserify-rsa": {
"version": "4.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"bn.js": "^5.0.0",
"randombytes": "^2.0.1"
}
},
"node_modules/browserify-sign": {
"version": "4.2.2",
"dev": true,
"license": "ISC",
"dependencies": {
"bn.js": "^5.2.1",
"browserify-rsa": "^4.1.0",
"create-hash": "^1.2.0",
"create-hmac": "^1.1.7",
"elliptic": "^6.5.4",
"inherits": "^2.0.4",
"parse-asn1": "^5.1.6",
"readable-stream": "^3.6.2",
"safe-buffer": "^5.2.1"
},
"engines": {
"node": ">= 4"
}
},
"node_modules/browserslist": {
"version": "4.22.3",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"caniuse-lite": "^1.0.30001580",
"electron-to-chromium": "^1.4.648",
"node-releases": "^2.0.14",
"update-browserslist-db": "^1.0.13"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
"node_modules/bs58": {
"version": "4.0.1",
"license": "MIT",
"dependencies": {
"base-x": "^3.0.2"
}
},
"node_modules/bs58check": {
"version": "2.1.2",
"license": "MIT",
"dependencies": {
"bs58": "^4.0.0",
"create-hash": "^1.1.0",
"safe-buffer": "^5.1.2"
}
},
"node_modules/bser": {
"version": "2.1.1",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"node-int64": "^0.4.0"
}
},
"node_modules/buffer": {
"version": "6.0.3",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.2.1"
}
},
"node_modules/buffer-equals": {
"version": "1.0.4",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/buffer-from": {
"version": "1.1.2",
"dev": true,
"license": "MIT"
},
"node_modules/buffer-xor": {
"version": "1.0.3",
"license": "MIT"
},
"node_modules/builtin-modules": {
"version": "3.3.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/bytes": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/call-bind": {
"version": "1.0.6",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.3",
"set-function-length": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/callsites": {
"version": "3.1.0",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/camel-case": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"pascal-case": "^3.1.2",
"tslib": "^2.0.3"
}
},
"node_modules/camelcase": {
"version": "6.3.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/camelcase-css": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/camelize": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/caniuse-api": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"browserslist": "^4.0.0",
"caniuse-lite": "^1.0.0",
"lodash.memoize": "^4.1.2",
"lodash.uniq": "^4.5.0"
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001585",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "CC-BY-4.0"
},
"node_modules/case-sensitive-paths-webpack-plugin": {
"version": "2.4.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/cashaddress": {
"version": "1.1.0",
"license": "MIT",
"dependencies": {
"bigi": "^1.4.2"
}
},
"node_modules/chalk": {
"version": "2.4.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/char-regex": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/check-types": {
"version": "11.2.3",
"dev": true,
"license": "MIT"
},
"node_modules/chokidar": {
"version": "3.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/chokidar/node_modules/glob-parent": {
"version": "5.1.2",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/chrome-trace-event": {
"version": "1.0.3",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.0"
}
},
"node_modules/chronik-client": {
"version": "0.26.1",
"resolved": "https://registry.npmjs.org/chronik-client/-/chronik-client-0.26.1.tgz",
"integrity": "sha512-zw+sf1itzPxPyJbDRmgvshveB5riSVgsHXUDP8DdMakPHeKzI8B547eTgero9TdotVk3t0Y6F9VTqk6bI9uD2A==",
"dependencies": {
"@types/ws": "^8.2.1",
"axios": "^1.6.3",
"ecashaddrjs": "^1.5.6",
"isomorphic-ws": "^4.0.1",
"protobufjs": "^6.8.8",
"ws": "^8.3.0"
}
},
"node_modules/ci-info": {
"version": "3.9.0",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/sibiraj-s"
}
],
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/cipher-base": {
"version": "1.0.4",
"license": "MIT",
"dependencies": {
"inherits": "^2.0.1",
"safe-buffer": "^5.0.1"
}
},
"node_modules/cjs-module-lexer": {
"version": "1.2.3",
"dev": true,
"license": "MIT"
},
"node_modules/clean-css": {
"version": "5.3.3",
"dev": true,
"license": "MIT",
"dependencies": {
"source-map": "~0.6.0"
},
"engines": {
"node": ">= 10.0"
}
},
"node_modules/clean-css/node_modules/source-map": {
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/cliui": {
"version": "8.0.1",
"dev": true,
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/clsx": {
"version": "2.1.0",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/co": {
"version": "4.6.0",
"dev": true,
"license": "MIT",
"engines": {
"iojs": ">= 1.0.0",
"node": ">= 0.12.0"
}
},
"node_modules/collect-v8-coverage": {
"version": "1.0.2",
"dev": true,
"license": "MIT"
},
"node_modules/color-convert": {
"version": "1.9.3",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/color-name": {
"version": "1.1.3",
"dev": true,
"license": "MIT"
},
"node_modules/colord": {
"version": "2.9.3",
"dev": true,
"license": "MIT"
},
"node_modules/colorette": {
"version": "2.0.20",
"dev": true,
"license": "MIT"
},
"node_modules/combined-stream": {
"version": "1.0.8",
"license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/commander": {
"version": "8.3.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 12"
}
},
"node_modules/common-path-prefix": {
"version": "3.0.0",
"dev": true,
"license": "ISC"
},
"node_modules/common-tags": {
"version": "1.8.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/commondir": {
"version": "1.0.1",
"dev": true,
"license": "MIT"
},
"node_modules/compressible": {
"version": "2.0.18",
"dev": true,
"license": "MIT",
"dependencies": {
"mime-db": ">= 1.43.0 < 2"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/compression": {
"version": "1.7.4",
"dev": true,
"license": "MIT",
"dependencies": {
"accepts": "~1.3.5",
"bytes": "3.0.0",
"compressible": "~2.0.16",
"debug": "2.6.9",
"on-headers": "~1.0.2",
"safe-buffer": "5.1.2",
"vary": "~1.1.2"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/compression/node_modules/debug": {
"version": "2.6.9",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/compression/node_modules/ms": {
"version": "2.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/compression/node_modules/safe-buffer": {
"version": "5.1.2",
"dev": true,
"license": "MIT"
},
"node_modules/concat-map": {
"version": "0.0.1",
"license": "MIT"
},
"node_modules/confusing-browser-globals": {
"version": "1.0.11",
"dev": true,
"license": "MIT"
},
"node_modules/connect-history-api-fallback": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8"
}
},
"node_modules/content-disposition": {
"version": "0.5.4",
"dev": true,
"license": "MIT",
"dependencies": {
"safe-buffer": "5.2.1"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/content-type": {
"version": "1.0.5",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/convert-source-map": {
"version": "2.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/cookie": {
"version": "0.5.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/cookie-signature": {
"version": "1.0.6",
"dev": true,
"license": "MIT"
},
"node_modules/core-js": {
"version": "3.35.1",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
}
},
"node_modules/core-js-compat": {
"version": "3.35.1",
"dev": true,
"license": "MIT",
"dependencies": {
"browserslist": "^4.22.2"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
}
},
"node_modules/core-js-pure": {
"version": "3.35.1",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/core-js"
}
},
"node_modules/core-util-is": {
"version": "1.0.3",
"dev": true,
"license": "MIT"
},
"node_modules/cosmiconfig": {
"version": "7.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/parse-json": "^4.0.0",
"import-fresh": "^3.2.1",
"parse-json": "^5.0.0",
"path-type": "^4.0.0",
"yaml": "^1.10.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/create-ecdh": {
"version": "4.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"bn.js": "^4.1.0",
"elliptic": "^6.5.3"
}
},
"node_modules/create-ecdh/node_modules/bn.js": {
"version": "4.12.0",
"dev": true,
"license": "MIT"
},
"node_modules/create-hash": {
"version": "1.2.0",
"license": "MIT",
"dependencies": {
"cipher-base": "^1.0.1",
"inherits": "^2.0.1",
"md5.js": "^1.3.4",
"ripemd160": "^2.0.1",
"sha.js": "^2.4.0"
}
},
"node_modules/create-hmac": {
"version": "1.1.7",
"license": "MIT",
"dependencies": {
"cipher-base": "^1.0.3",
"create-hash": "^1.1.0",
"inherits": "^2.0.1",
"ripemd160": "^2.0.0",
"safe-buffer": "^5.0.1",
"sha.js": "^2.4.8"
}
},
"node_modules/create-jest": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/types": "^29.6.3",
"chalk": "^4.0.0",
"exit": "^0.1.2",
"graceful-fs": "^4.2.9",
"jest-config": "^29.7.0",
"jest-util": "^29.7.0",
"prompts": "^2.0.1"
},
"bin": {
"create-jest": "bin/create-jest.js"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/create-jest/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/create-jest/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/create-jest/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/create-jest/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/create-jest/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/create-jest/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/crypto-browserify": {
"version": "3.12.0",
"dev": true,
"license": "MIT",
"dependencies": {
"browserify-cipher": "^1.0.0",
"browserify-sign": "^4.0.0",
"create-ecdh": "^4.0.0",
"create-hash": "^1.1.0",
"create-hmac": "^1.1.0",
"diffie-hellman": "^5.0.0",
"inherits": "^2.0.1",
"pbkdf2": "^3.0.3",
"public-encrypt": "^4.0.0",
"randombytes": "^2.0.0",
"randomfill": "^1.0.3"
},
"engines": {
"node": "*"
}
},
"node_modules/crypto-random-string": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/css-blank-pseudo": {
"version": "3.0.3",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-selector-parser": "^6.0.9"
},
"bin": {
"css-blank-pseudo": "dist/cli.cjs"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"peerDependencies": {
"postcss": "^8.4"
}
},
"node_modules/css-color-keywords": {
"version": "1.0.0",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=4"
}
},
"node_modules/css-declaration-sorter": {
"version": "6.4.1",
"dev": true,
"license": "ISC",
"engines": {
"node": "^10 || ^12 || >=14"
},
"peerDependencies": {
"postcss": "^8.0.9"
}
},
"node_modules/css-has-pseudo": {
"version": "3.0.4",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-selector-parser": "^6.0.9"
},
"bin": {
"css-has-pseudo": "dist/cli.cjs"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"peerDependencies": {
"postcss": "^8.4"
}
},
"node_modules/css-loader": {
"version": "6.10.0",
"dev": true,
"license": "MIT",
"dependencies": {
"icss-utils": "^5.1.0",
"postcss": "^8.4.33",
"postcss-modules-extract-imports": "^3.0.0",
"postcss-modules-local-by-default": "^4.0.4",
"postcss-modules-scope": "^3.1.1",
"postcss-modules-values": "^4.0.0",
"postcss-value-parser": "^4.2.0",
"semver": "^7.5.4"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"@rspack/core": "0.x || 1.x",
"webpack": "^5.0.0"
},
"peerDependenciesMeta": {
"@rspack/core": {
"optional": true
},
"webpack": {
"optional": true
}
}
},
"node_modules/css-minimizer-webpack-plugin": {
"version": "3.4.1",
"dev": true,
"license": "MIT",
"dependencies": {
"cssnano": "^5.0.6",
"jest-worker": "^27.0.2",
"postcss": "^8.3.5",
"schema-utils": "^4.0.0",
"serialize-javascript": "^6.0.0",
"source-map": "^0.6.1"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^5.0.0"
},
"peerDependenciesMeta": {
"@parcel/css": {
"optional": true
},
"clean-css": {
"optional": true
},
"csso": {
"optional": true
},
"esbuild": {
"optional": true
}
}
},
"node_modules/css-minimizer-webpack-plugin/node_modules/ajv": {
"version": "8.12.0",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
"peerDependencies": {
"ajv": "^8.8.2"
}
},
"node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": {
"version": "1.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": {
"version": "4.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
"ajv-formats": "^2.1.1",
"ajv-keywords": "^5.1.0"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/css-minimizer-webpack-plugin/node_modules/source-map": {
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/css-prefers-color-scheme": {
"version": "6.0.3",
"dev": true,
"license": "CC0-1.0",
"bin": {
"css-prefers-color-scheme": "dist/cli.cjs"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"peerDependencies": {
"postcss": "^8.4"
}
},
"node_modules/css-select": {
"version": "4.3.0",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"boolbase": "^1.0.0",
"css-what": "^6.0.1",
"domhandler": "^4.3.1",
"domutils": "^2.8.0",
"nth-check": "^2.0.1"
},
"funding": {
"url": "https://github.com/sponsors/fb55"
}
},
"node_modules/css-to-react-native": {
"version": "2.3.2",
"dev": true,
"license": "MIT",
"dependencies": {
"camelize": "^1.0.0",
"css-color-keywords": "^1.0.0",
"postcss-value-parser": "^3.3.0"
}
},
"node_modules/css-to-react-native/node_modules/postcss-value-parser": {
"version": "3.3.1",
"dev": true,
"license": "MIT"
},
"node_modules/css-tree": {
"version": "1.1.3",
"dev": true,
"license": "MIT",
"dependencies": {
"mdn-data": "2.0.14",
"source-map": "^0.6.1"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/css-tree/node_modules/source-map": {
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/css-what": {
"version": "6.1.0",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">= 6"
},
"funding": {
"url": "https://github.com/sponsors/fb55"
}
},
"node_modules/css.escape": {
"version": "1.5.1",
"dev": true,
"license": "MIT"
},
"node_modules/cssdb": {
"version": "7.10.0",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
{
"type": "github",
"url": "https://github.com/sponsors/csstools"
}
],
"license": "CC0-1.0"
},
"node_modules/cssesc": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"bin": {
"cssesc": "bin/cssesc"
},
"engines": {
"node": ">=4"
}
},
"node_modules/cssnano": {
"version": "5.1.15",
"dev": true,
"license": "MIT",
"dependencies": {
"cssnano-preset-default": "^5.2.14",
"lilconfig": "^2.0.3",
"yaml": "^1.10.2"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/cssnano"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/cssnano-preset-default": {
"version": "5.2.14",
"dev": true,
"license": "MIT",
"dependencies": {
"css-declaration-sorter": "^6.3.1",
"cssnano-utils": "^3.1.0",
"postcss-calc": "^8.2.3",
"postcss-colormin": "^5.3.1",
"postcss-convert-values": "^5.1.3",
"postcss-discard-comments": "^5.1.2",
"postcss-discard-duplicates": "^5.1.0",
"postcss-discard-empty": "^5.1.1",
"postcss-discard-overridden": "^5.1.0",
"postcss-merge-longhand": "^5.1.7",
"postcss-merge-rules": "^5.1.4",
"postcss-minify-font-values": "^5.1.0",
"postcss-minify-gradients": "^5.1.1",
"postcss-minify-params": "^5.1.4",
"postcss-minify-selectors": "^5.2.1",
"postcss-normalize-charset": "^5.1.0",
"postcss-normalize-display-values": "^5.1.0",
"postcss-normalize-positions": "^5.1.1",
"postcss-normalize-repeat-style": "^5.1.1",
"postcss-normalize-string": "^5.1.0",
"postcss-normalize-timing-functions": "^5.1.0",
"postcss-normalize-unicode": "^5.1.1",
"postcss-normalize-url": "^5.1.0",
"postcss-normalize-whitespace": "^5.1.1",
"postcss-ordered-values": "^5.1.3",
"postcss-reduce-initial": "^5.1.2",
"postcss-reduce-transforms": "^5.1.0",
"postcss-svgo": "^5.1.0",
"postcss-unique-selectors": "^5.1.1"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/cssnano-utils": {
"version": "3.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/csso": {
"version": "4.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"css-tree": "^1.1.2"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/cssom": {
"version": "0.5.0",
"dev": true,
"license": "MIT"
},
"node_modules/cssstyle": {
"version": "2.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"cssom": "~0.3.6"
},
"engines": {
"node": ">=8"
}
},
"node_modules/cssstyle/node_modules/cssom": {
"version": "0.3.8",
"dev": true,
"license": "MIT"
},
"node_modules/csstype": {
"version": "3.1.3",
"dev": true,
"license": "MIT"
},
"node_modules/damerau-levenshtein": {
"version": "1.0.8",
"dev": true,
"license": "BSD-2-Clause"
},
"node_modules/data-urls": {
"version": "3.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"abab": "^2.0.6",
"whatwg-mimetype": "^3.0.0",
"whatwg-url": "^11.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/debug": {
"version": "4.3.4",
"license": "MIT",
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/decimal.js": {
"version": "10.4.3",
"dev": true,
"license": "MIT"
},
"node_modules/dedent": {
"version": "1.5.1",
"dev": true,
"license": "MIT",
"peerDependencies": {
"babel-plugin-macros": "^3.1.0"
},
"peerDependenciesMeta": {
"babel-plugin-macros": {
"optional": true
}
}
},
"node_modules/deep-equal": {
"version": "2.2.3",
"dev": true,
"license": "MIT",
"dependencies": {
"array-buffer-byte-length": "^1.0.0",
"call-bind": "^1.0.5",
"es-get-iterator": "^1.1.3",
"get-intrinsic": "^1.2.2",
"is-arguments": "^1.1.1",
"is-array-buffer": "^3.0.2",
"is-date-object": "^1.0.5",
"is-regex": "^1.1.4",
"is-shared-array-buffer": "^1.0.2",
"isarray": "^2.0.5",
"object-is": "^1.1.5",
"object-keys": "^1.1.1",
"object.assign": "^4.1.4",
"regexp.prototype.flags": "^1.5.1",
"side-channel": "^1.0.4",
"which-boxed-primitive": "^1.0.2",
"which-collection": "^1.0.1",
"which-typed-array": "^1.1.13"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/deep-is": {
"version": "0.1.4",
"license": "MIT"
},
"node_modules/deepmerge": {
"version": "4.3.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/default-gateway": {
"version": "6.0.3",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"execa": "^5.0.0"
},
"engines": {
"node": ">= 10"
}
},
"node_modules/define-data-property": {
"version": "1.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.2",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/define-lazy-prop": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/define-properties": {
"version": "1.2.1",
"dev": true,
"license": "MIT",
"dependencies": {
"define-data-property": "^1.0.1",
"has-property-descriptors": "^1.0.0",
"object-keys": "^1.1.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/depd": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/dequal": {
"version": "2.0.3",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/des.js": {
"version": "1.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"inherits": "^2.0.1",
"minimalistic-assert": "^1.0.0"
}
},
"node_modules/destroy": {
"version": "1.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
}
},
"node_modules/detect-newline": {
"version": "3.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/detect-node": {
"version": "2.1.0",
"dev": true,
"license": "MIT"
},
"node_modules/detect-port-alt": {
"version": "1.1.6",
"dev": true,
"license": "MIT",
"dependencies": {
"address": "^1.0.1",
"debug": "^2.6.0"
},
"bin": {
"detect": "bin/detect-port",
"detect-port": "bin/detect-port"
},
"engines": {
"node": ">= 4.2.1"
}
},
"node_modules/detect-port-alt/node_modules/debug": {
"version": "2.6.9",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/detect-port-alt/node_modules/ms": {
"version": "2.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/didyoumean": {
"version": "1.2.2",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/diff-sequences": {
"version": "29.6.3",
"dev": true,
"license": "MIT",
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/diffie-hellman": {
"version": "5.0.3",
"dev": true,
"license": "MIT",
"dependencies": {
"bn.js": "^4.1.0",
"miller-rabin": "^4.0.0",
"randombytes": "^2.0.0"
}
},
"node_modules/diffie-hellman/node_modules/bn.js": {
"version": "4.12.0",
"dev": true,
"license": "MIT"
},
"node_modules/dir-glob": {
"version": "3.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"path-type": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/dlv": {
"version": "1.1.3",
"dev": true,
"license": "MIT"
},
"node_modules/dns-packet": {
"version": "5.6.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@leichtgewicht/ip-codec": "^2.0.1"
},
"engines": {
"node": ">=6"
}
},
"node_modules/doctrine": {
"version": "3.0.0",
"license": "Apache-2.0",
"dependencies": {
"esutils": "^2.0.2"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/dom-accessibility-api": {
"version": "0.5.16",
"dev": true,
"license": "MIT"
},
"node_modules/dom-converter": {
"version": "0.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"utila": "~0.4"
}
},
"node_modules/dom-serializer": {
"version": "1.4.1",
"dev": true,
"license": "MIT",
"dependencies": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.0",
"entities": "^2.0.0"
},
"funding": {
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
"node_modules/dom-serializer/node_modules/entities": {
"version": "2.2.0",
"dev": true,
"license": "BSD-2-Clause",
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/domelementtype": {
"version": "2.3.0",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fb55"
}
],
"license": "BSD-2-Clause"
},
"node_modules/domexception": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"webidl-conversions": "^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/domhandler": {
"version": "4.3.1",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"domelementtype": "^2.2.0"
},
"engines": {
"node": ">= 4"
},
"funding": {
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
"node_modules/domutils": {
"version": "2.8.0",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"dom-serializer": "^1.0.1",
"domelementtype": "^2.2.0",
"domhandler": "^4.2.0"
},
"funding": {
"url": "https://github.com/fb55/domutils?sponsor=1"
}
},
"node_modules/dot-case": {
"version": "3.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"no-case": "^3.0.4",
"tslib": "^2.0.3"
}
},
"node_modules/dotenv": {
"version": "10.0.0",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=10"
}
},
"node_modules/dotenv-expand": {
"version": "5.1.0",
"dev": true,
"license": "BSD-2-Clause"
},
"node_modules/drbg.js": {
"version": "1.0.1",
"license": "MIT",
"dependencies": {
"browserify-aes": "^1.0.6",
"create-hash": "^1.1.2",
"create-hmac": "^1.1.4"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/duplexer": {
"version": "0.1.2",
"dev": true,
"license": "MIT"
},
"node_modules/eastasianwidth": {
"version": "0.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/ecash-coinselect": {
"version": "2.2.0",
"license": "MIT",
"dependencies": {
"eslint-plugin-header": "^3.1.1",
"mocha-suppress-logs": "^0.3.1"
}
},
"node_modules/ecash-script": {
"version": "2.1.2",
"license": "MIT"
},
"node_modules/ecashaddrjs": {
"version": "1.5.6",
"license": "MIT",
"dependencies": {
"big-integer": "1.6.36",
"bs58check": "^3.0.1"
}
},
"node_modules/ecashaddrjs/node_modules/base-x": {
"version": "4.0.0",
"license": "MIT"
},
"node_modules/ecashaddrjs/node_modules/bs58": {
"version": "5.0.0",
"license": "MIT",
"dependencies": {
"base-x": "^4.0.0"
}
},
"node_modules/ecashaddrjs/node_modules/bs58check": {
"version": "3.0.1",
"license": "MIT",
"dependencies": {
"@noble/hashes": "^1.2.0",
"bs58": "^5.0.0"
}
},
"node_modules/ecpair": {
"name": "@bitgo/ecpair",
"version": "2.1.0-rc.0",
"license": "MIT",
"dependencies": {
"randombytes": "^2.1.0",
"typeforce": "^1.18.0",
"wif": "^2.0.6"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/ee-first": {
"version": "1.1.1",
"dev": true,
"license": "MIT"
},
"node_modules/ejs": {
"version": "3.1.9",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"jake": "^10.8.5"
},
"bin": {
"ejs": "bin/cli.js"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/electron-to-chromium": {
"version": "1.4.664",
"dev": true,
"license": "ISC"
},
"node_modules/elliptic": {
"version": "6.5.4",
"license": "MIT",
"dependencies": {
"bn.js": "^4.11.9",
"brorand": "^1.1.0",
"hash.js": "^1.0.0",
"hmac-drbg": "^1.0.1",
"inherits": "^2.0.4",
"minimalistic-assert": "^1.0.1",
"minimalistic-crypto-utils": "^1.0.1"
}
},
"node_modules/elliptic/node_modules/bn.js": {
"version": "4.12.0",
"license": "MIT"
},
"node_modules/emittery": {
"version": "0.13.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sindresorhus/emittery?sponsor=1"
}
},
"node_modules/emoji-regex": {
"version": "9.2.2",
"dev": true,
"license": "MIT"
},
"node_modules/emojis-list": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/encodeurl": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/enhanced-resolve": {
"version": "5.15.0",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/entities": {
"version": "4.5.0",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
},
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/error-ex": {
"version": "1.3.2",
"dev": true,
"license": "MIT",
"dependencies": {
"is-arrayish": "^0.2.1"
}
},
"node_modules/error-stack-parser": {
"version": "2.1.4",
"dev": true,
"license": "MIT",
"dependencies": {
"stackframe": "^1.3.4"
}
},
"node_modules/es-abstract": {
"version": "1.22.3",
"dev": true,
"license": "MIT",
"dependencies": {
"array-buffer-byte-length": "^1.0.0",
"arraybuffer.prototype.slice": "^1.0.2",
"available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.5",
"es-set-tostringtag": "^2.0.1",
"es-to-primitive": "^1.2.1",
"function.prototype.name": "^1.1.6",
"get-intrinsic": "^1.2.2",
"get-symbol-description": "^1.0.0",
"globalthis": "^1.0.3",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.0",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0",
"internal-slot": "^1.0.5",
"is-array-buffer": "^3.0.2",
"is-callable": "^1.2.7",
"is-negative-zero": "^2.0.2",
"is-regex": "^1.1.4",
"is-shared-array-buffer": "^1.0.2",
"is-string": "^1.0.7",
"is-typed-array": "^1.1.12",
"is-weakref": "^1.0.2",
"object-inspect": "^1.13.1",
"object-keys": "^1.1.1",
"object.assign": "^4.1.4",
"regexp.prototype.flags": "^1.5.1",
"safe-array-concat": "^1.0.1",
"safe-regex-test": "^1.0.0",
"string.prototype.trim": "^1.2.8",
"string.prototype.trimend": "^1.0.7",
"string.prototype.trimstart": "^1.0.7",
"typed-array-buffer": "^1.0.0",
"typed-array-byte-length": "^1.0.0",
"typed-array-byte-offset": "^1.0.0",
"typed-array-length": "^1.0.4",
"unbox-primitive": "^1.0.2",
"which-typed-array": "^1.1.13"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/es-array-method-boxes-properly": {
"version": "1.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/es-errors": {
"version": "1.3.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-get-iterator": {
"version": "1.1.3",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.1.3",
"has-symbols": "^1.0.3",
"is-arguments": "^1.1.1",
"is-map": "^2.0.2",
"is-set": "^2.0.2",
"is-string": "^1.0.7",
"isarray": "^2.0.5",
"stop-iteration-iterator": "^1.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/es-iterator-helpers": {
"version": "1.0.15",
"dev": true,
"license": "MIT",
"dependencies": {
"asynciterator.prototype": "^1.0.0",
"call-bind": "^1.0.2",
"define-properties": "^1.2.1",
"es-abstract": "^1.22.1",
"es-set-tostringtag": "^2.0.1",
"function-bind": "^1.1.1",
"get-intrinsic": "^1.2.1",
"globalthis": "^1.0.3",
"has-property-descriptors": "^1.0.0",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"internal-slot": "^1.0.5",
"iterator.prototype": "^1.1.2",
"safe-array-concat": "^1.0.1"
}
},
"node_modules/es-module-lexer": {
"version": "1.4.1",
"dev": true,
"license": "MIT"
},
"node_modules/es-set-tostringtag": {
"version": "2.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.2.2",
"has-tostringtag": "^1.0.0",
"hasown": "^2.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-shim-unscopables": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"hasown": "^2.0.0"
}
},
"node_modules/es-to-primitive": {
"version": "1.2.1",
"dev": true,
"license": "MIT",
"dependencies": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
"is-symbol": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/escalade": {
"version": "3.1.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"dev": true,
"license": "MIT"
},
"node_modules/escape-string-regexp": {
"version": "1.0.5",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/escodegen": {
"version": "2.1.0",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"esprima": "^4.0.1",
"estraverse": "^5.2.0",
"esutils": "^2.0.2"
},
"bin": {
"escodegen": "bin/escodegen.js",
"esgenerate": "bin/esgenerate.js"
},
"engines": {
"node": ">=6.0"
},
"optionalDependencies": {
"source-map": "~0.6.1"
}
},
"node_modules/escodegen/node_modules/source-map": {
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/eslint": {
"version": "8.56.0",
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.4",
"@eslint/js": "8.56.0",
"@humanwhocodes/config-array": "^0.11.13",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"@ungap/structured-clone": "^1.2.0",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.2.2",
"eslint-visitor-keys": "^3.4.3",
"espree": "^9.6.1",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
"file-entry-cache": "^6.0.1",
"find-up": "^5.0.0",
"glob-parent": "^6.0.2",
"globals": "^13.19.0",
"graphemer": "^1.4.0",
"ignore": "^5.2.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
"is-path-inside": "^3.0.3",
"js-yaml": "^4.1.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
"levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
"optionator": "^0.9.3",
"strip-ansi": "^6.0.1",
"text-table": "^0.2.0"
},
"bin": {
"eslint": "bin/eslint.js"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-config-react-app": {
"version": "7.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.16.0",
"@babel/eslint-parser": "^7.16.3",
"@rushstack/eslint-patch": "^1.1.0",
"@typescript-eslint/eslint-plugin": "^5.5.0",
"@typescript-eslint/parser": "^5.5.0",
"babel-preset-react-app": "^10.0.1",
"confusing-browser-globals": "^1.0.11",
"eslint-plugin-flowtype": "^8.0.3",
"eslint-plugin-import": "^2.25.3",
"eslint-plugin-jest": "^25.3.0",
"eslint-plugin-jsx-a11y": "^6.5.1",
"eslint-plugin-react": "^7.27.1",
"eslint-plugin-react-hooks": "^4.3.0",
"eslint-plugin-testing-library": "^5.0.1"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"eslint": "^8.0.0"
}
},
"node_modules/eslint-config-react-app/node_modules/eslint-plugin-testing-library": {
"version": "5.11.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/utils": "^5.58.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0",
"npm": ">=6"
},
"peerDependencies": {
"eslint": "^7.5.0 || ^8.0.0"
}
},
"node_modules/eslint-etc": {
"version": "5.2.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/experimental-utils": "^5.0.0",
"tsutils": "^3.17.1",
"tsutils-etc": "^1.4.1"
},
"peerDependencies": {
"eslint": "^8.0.0",
"typescript": ">=4.0.0"
}
},
"node_modules/eslint-import-resolver-node": {
"version": "0.3.9",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^3.2.7",
"is-core-module": "^2.13.0",
"resolve": "^1.22.4"
}
},
"node_modules/eslint-import-resolver-node/node_modules/debug": {
"version": "3.2.7",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/eslint-module-utils": {
"version": "2.8.0",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^3.2.7"
},
"engines": {
"node": ">=4"
},
"peerDependenciesMeta": {
"eslint": {
"optional": true
}
}
},
"node_modules/eslint-module-utils/node_modules/debug": {
"version": "3.2.7",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/eslint-plugin-etc": {
"version": "2.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@phenomnomnominal/tsquery": "^4.0.0",
"@typescript-eslint/experimental-utils": "^5.0.0",
"eslint-etc": "^5.1.0",
"requireindex": "~1.2.0",
"tslib": "^2.0.0",
"tsutils": "^3.0.0"
},
"peerDependencies": {
"eslint": "^8.0.0",
"typescript": "^4.0.0"
}
},
"node_modules/eslint-plugin-flowtype": {
"version": "8.0.3",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"lodash": "^4.17.21",
"string-natural-compare": "^3.0.1"
},
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": {
"@babel/plugin-syntax-flow": "^7.14.5",
"@babel/plugin-transform-react-jsx": "^7.14.9",
"eslint": "^8.1.0"
}
},
"node_modules/eslint-plugin-header": {
"version": "3.1.1",
"license": "MIT",
"peerDependencies": {
"eslint": ">=7.7.0"
}
},
"node_modules/eslint-plugin-import": {
"version": "2.29.1",
"dev": true,
"license": "MIT",
"dependencies": {
"array-includes": "^3.1.7",
"array.prototype.findlastindex": "^1.2.3",
"array.prototype.flat": "^1.3.2",
"array.prototype.flatmap": "^1.3.2",
"debug": "^3.2.7",
"doctrine": "^2.1.0",
"eslint-import-resolver-node": "^0.3.9",
"eslint-module-utils": "^2.8.0",
"hasown": "^2.0.0",
"is-core-module": "^2.13.1",
"is-glob": "^4.0.3",
"minimatch": "^3.1.2",
"object.fromentries": "^2.0.7",
"object.groupby": "^1.0.1",
"object.values": "^1.1.7",
"semver": "^6.3.1",
"tsconfig-paths": "^3.15.0"
},
"engines": {
"node": ">=4"
},
"peerDependencies": {
"eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
}
},
"node_modules/eslint-plugin-import/node_modules/debug": {
"version": "3.2.7",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/eslint-plugin-import/node_modules/doctrine": {
"version": "2.1.0",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"esutils": "^2.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/eslint-plugin-import/node_modules/semver": {
"version": "6.3.1",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/eslint-plugin-jest": {
"version": "25.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/experimental-utils": "^5.0.0"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
},
"peerDependencies": {
"@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0",
"eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
},
"peerDependenciesMeta": {
"@typescript-eslint/eslint-plugin": {
"optional": true
},
"jest": {
"optional": true
}
}
},
"node_modules/eslint-plugin-jsx-a11y": {
"version": "6.8.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.2",
"aria-query": "^5.3.0",
"array-includes": "^3.1.7",
"array.prototype.flatmap": "^1.3.2",
"ast-types-flow": "^0.0.8",
"axe-core": "=4.7.0",
"axobject-query": "^3.2.1",
"damerau-levenshtein": "^1.0.8",
"emoji-regex": "^9.2.2",
"es-iterator-helpers": "^1.0.15",
"hasown": "^2.0.0",
"jsx-ast-utils": "^3.3.5",
"language-tags": "^1.0.9",
"minimatch": "^3.1.2",
"object.entries": "^1.1.7",
"object.fromentries": "^2.0.7"
},
"engines": {
"node": ">=4.0"
},
"peerDependencies": {
"eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
}
},
"node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": {
"version": "5.3.0",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"dequal": "^2.0.3"
}
},
"node_modules/eslint-plugin-react": {
"version": "7.33.2",
"dev": true,
"license": "MIT",
"dependencies": {
"array-includes": "^3.1.6",
"array.prototype.flatmap": "^1.3.1",
"array.prototype.tosorted": "^1.1.1",
"doctrine": "^2.1.0",
"es-iterator-helpers": "^1.0.12",
"estraverse": "^5.3.0",
"jsx-ast-utils": "^2.4.1 || ^3.0.0",
"minimatch": "^3.1.2",
"object.entries": "^1.1.6",
"object.fromentries": "^2.0.6",
"object.hasown": "^1.1.2",
"object.values": "^1.1.6",
"prop-types": "^15.8.1",
"resolve": "^2.0.0-next.4",
"semver": "^6.3.1",
"string.prototype.matchall": "^4.0.8"
},
"engines": {
"node": ">=4"
},
"peerDependencies": {
"eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
}
},
"node_modules/eslint-plugin-react-hooks": {
"version": "4.6.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"peerDependencies": {
"eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
}
},
"node_modules/eslint-plugin-react/node_modules/doctrine": {
"version": "2.1.0",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"esutils": "^2.0.2"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/eslint-plugin-react/node_modules/resolve": {
"version": "2.0.0-next.5",
"dev": true,
"license": "MIT",
"dependencies": {
"is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/eslint-plugin-react/node_modules/semver": {
"version": "6.3.1",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/eslint-plugin-testing-library": {
"version": "6.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/utils": "^5.58.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0",
"npm": ">=6"
},
"peerDependencies": {
"eslint": "^7.5.0 || ^8.0.0"
}
},
"node_modules/eslint-scope": {
"version": "7.2.2",
"license": "BSD-2-Clause",
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-visitor-keys": {
"version": "3.4.3",
"license": "Apache-2.0",
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-webpack-plugin": {
"version": "3.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/eslint": "^7.29.0 || ^8.4.1",
"jest-worker": "^28.0.2",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"schema-utils": "^4.0.0"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"eslint": "^7.0.0 || ^8.0.0",
"webpack": "^5.0.0"
}
},
"node_modules/eslint-webpack-plugin/node_modules/ajv": {
"version": "8.12.0",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
"peerDependencies": {
"ajv": "^8.8.2"
}
},
"node_modules/eslint-webpack-plugin/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/eslint-webpack-plugin/node_modules/jest-worker": {
"version": "28.1.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
}
},
"node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": {
"version": "1.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/eslint-webpack-plugin/node_modules/schema-utils": {
"version": "4.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
"ajv-formats": "^2.1.1",
"ajv-keywords": "^5.1.0"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/eslint-webpack-plugin/node_modules/supports-color": {
"version": "8.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/eslint/node_modules/ansi-styles": {
"version": "4.3.0",
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/eslint/node_modules/argparse": {
"version": "2.0.1",
"license": "Python-2.0"
},
"node_modules/eslint/node_modules/chalk": {
"version": "4.1.2",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/eslint/node_modules/color-convert": {
"version": "2.0.1",
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/eslint/node_modules/color-name": {
"version": "1.1.4",
"license": "MIT"
},
"node_modules/eslint/node_modules/escape-string-regexp": {
"version": "4.0.0",
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint/node_modules/globals": {
"version": "13.24.0",
"license": "MIT",
"dependencies": {
"type-fest": "^0.20.2"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint/node_modules/has-flag": {
"version": "4.0.0",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/eslint/node_modules/js-yaml": {
"version": "4.1.0",
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/eslint/node_modules/supports-color": {
"version": "7.2.0",
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/eslint/node_modules/type-fest": {
"version": "0.20.2",
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/espree": {
"version": "9.6.1",
"license": "BSD-2-Clause",
"dependencies": {
"acorn": "^8.9.0",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^3.4.1"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/esprima": {
"version": "4.0.1",
"dev": true,
"license": "BSD-2-Clause",
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/esquery": {
"version": "1.5.0",
"license": "BSD-3-Clause",
"dependencies": {
"estraverse": "^5.1.0"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/esrecurse": {
"version": "4.3.0",
"license": "BSD-2-Clause",
"dependencies": {
"estraverse": "^5.2.0"
},
"engines": {
"node": ">=4.0"
}
},
"node_modules/estraverse": {
"version": "5.3.0",
"license": "BSD-2-Clause",
"engines": {
"node": ">=4.0"
}
},
"node_modules/estree-walker": {
"version": "1.0.1",
"dev": true,
"license": "MIT"
},
"node_modules/esutils": {
"version": "2.0.3",
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/etag": {
"version": "1.8.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/eventemitter3": {
"version": "4.0.7",
"dev": true,
"license": "MIT"
},
"node_modules/events": {
"version": "3.3.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.8.x"
}
},
"node_modules/evp_bytestokey": {
"version": "1.0.3",
"license": "MIT",
"dependencies": {
"md5.js": "^1.3.4",
"safe-buffer": "^5.1.1"
}
},
"node_modules/execa": {
"version": "5.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"cross-spawn": "^7.0.3",
"get-stream": "^6.0.0",
"human-signals": "^2.1.0",
"is-stream": "^2.0.0",
"merge-stream": "^2.0.0",
"npm-run-path": "^4.0.1",
"onetime": "^5.1.2",
"signal-exit": "^3.0.3",
"strip-final-newline": "^2.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
"node_modules/exit": {
"version": "0.1.2",
"dev": true,
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/expect": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/expect-utils": "^29.7.0",
"jest-get-type": "^29.6.3",
"jest-matcher-utils": "^29.7.0",
"jest-message-util": "^29.7.0",
"jest-util": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/express": {
"version": "4.18.2",
"dev": true,
"license": "MIT",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.1",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.5.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "1.2.0",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.7",
"qs": "6.11.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
"serve-static": "1.15.0",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
},
"engines": {
"node": ">= 0.10.0"
}
},
"node_modules/express/node_modules/debug": {
"version": "2.6.9",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/express/node_modules/ms": {
"version": "2.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/extensionizer": {
"version": "1.0.1",
"dev": true,
"license": "ISC"
},
"node_modules/fake-indexeddb": {
"version": "5.0.2",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=18"
}
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"license": "MIT"
},
"node_modules/fast-glob": {
"version": "3.3.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.4"
},
"engines": {
"node": ">=8.6.0"
}
},
"node_modules/fast-glob/node_modules/glob-parent": {
"version": "5.1.2",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"license": "MIT"
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
"license": "MIT"
},
"node_modules/fastpriorityqueue": {
"version": "0.7.4",
"license": "Apache-2.0"
},
"node_modules/fastq": {
"version": "1.17.1",
"license": "ISC",
"dependencies": {
"reusify": "^1.0.4"
}
},
"node_modules/faye-websocket": {
"version": "0.11.4",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"websocket-driver": ">=0.5.1"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/fb-watchman": {
"version": "2.0.2",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"bser": "2.1.1"
}
},
"node_modules/file-entry-cache": {
"version": "6.0.1",
"license": "MIT",
"dependencies": {
"flat-cache": "^3.0.4"
},
"engines": {
"node": "^10.12.0 || >=12.0.0"
}
},
"node_modules/file-loader": {
"version": "6.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"loader-utils": "^2.0.0",
"schema-utils": "^3.0.0"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^4.0.0 || ^5.0.0"
}
},
"node_modules/file-uri-to-path": {
"version": "1.0.0",
"license": "MIT"
},
"node_modules/filelist": {
"version": "1.0.4",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"minimatch": "^5.0.1"
}
},
"node_modules/filelist/node_modules/brace-expansion": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/filelist/node_modules/minimatch": {
"version": "5.1.6",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/filesize": {
"version": "8.0.7",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/fill-range": {
"version": "7.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/finalhandler": {
"version": "1.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"statuses": "2.0.1",
"unpipe": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/finalhandler/node_modules/debug": {
"version": "2.6.9",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/finalhandler/node_modules/ms": {
"version": "2.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/find-cache-dir": {
"version": "3.3.2",
"dev": true,
"license": "MIT",
"dependencies": {
"commondir": "^1.0.1",
"make-dir": "^3.0.2",
"pkg-dir": "^4.1.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/avajs/find-cache-dir?sponsor=1"
}
},
"node_modules/find-up": {
"version": "5.0.0",
"license": "MIT",
"dependencies": {
"locate-path": "^6.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/flat-cache": {
"version": "3.2.0",
"license": "MIT",
"dependencies": {
"flatted": "^3.2.9",
"keyv": "^4.5.3",
"rimraf": "^3.0.2"
},
"engines": {
"node": "^10.12.0 || >=12.0.0"
}
},
"node_modules/flatted": {
"version": "3.2.9",
"license": "ISC"
},
"node_modules/follow-redirects": {
"version": "1.15.6",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/for-each": {
"version": "0.3.3",
"dev": true,
"license": "MIT",
"dependencies": {
"is-callable": "^1.1.3"
}
},
"node_modules/foreground-child": {
"version": "3.1.1",
"dev": true,
"license": "ISC",
"dependencies": {
"cross-spawn": "^7.0.0",
"signal-exit": "^4.0.1"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/foreground-child/node_modules/signal-exit": {
"version": "4.1.0",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/fork-ts-checker-webpack-plugin": {
"version": "6.5.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.8.3",
"@types/json-schema": "^7.0.5",
"chalk": "^4.1.0",
"chokidar": "^3.4.2",
"cosmiconfig": "^6.0.0",
"deepmerge": "^4.2.2",
"fs-extra": "^9.0.0",
"glob": "^7.1.6",
"memfs": "^3.1.2",
"minimatch": "^3.0.4",
"schema-utils": "2.7.0",
"semver": "^7.3.2",
"tapable": "^1.0.0"
},
"engines": {
"node": ">=10",
"yarn": ">=1.0.0"
},
"peerDependencies": {
"eslint": ">= 6",
"typescript": ">= 2.7",
"vue-template-compiler": "*",
"webpack": ">= 4"
},
"peerDependenciesMeta": {
"eslint": {
"optional": true
},
"vue-template-compiler": {
"optional": true
}
}
},
"node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": {
"version": "6.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/parse-json": "^4.0.0",
"import-fresh": "^3.1.0",
"parse-json": "^5.0.0",
"path-type": "^4.0.0",
"yaml": "^1.7.2"
},
"engines": {
"node": ">=8"
}
},
"node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": {
"version": "9.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
"version": "2.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.4",
"ajv": "^6.12.2",
"ajv-keywords": "^3.4.1"
},
"engines": {
"node": ">= 8.9.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": {
"version": "1.1.3",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/form-data": {
"version": "4.0.0",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/forwarded": {
"version": "0.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/fraction.js": {
"version": "4.3.7",
"dev": true,
"license": "MIT",
"engines": {
"node": "*"
},
"funding": {
"type": "patreon",
"url": "https://github.com/sponsors/rawify"
}
},
"node_modules/fresh": {
"version": "0.5.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/fs-extra": {
"version": "10.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/fs-monkey": {
"version": "1.0.5",
"dev": true,
"license": "Unlicense"
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"license": "ISC"
},
"node_modules/function-bind": {
"version": "1.1.2",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/function.prototype.name": {
"version": "1.1.6",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1",
"functions-have-names": "^1.2.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/functions-have-names": {
"version": "1.2.3",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/get-caller-file": {
"version": "2.0.5",
"dev": true,
"license": "ISC",
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
},
"node_modules/get-intrinsic": {
"version": "1.2.4",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-own-enumerable-property-symbols": {
"version": "3.0.2",
"dev": true,
"license": "ISC"
},
"node_modules/get-package-type": {
"version": "0.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/get-stream": {
"version": "6.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/get-symbol-description": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.5",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.4"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/glob": {
"version": "7.2.3",
"license": "ISC",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.1.1",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
},
"engines": {
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/glob-parent": {
"version": "6.0.2",
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.3"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/glob-to-regexp": {
"version": "0.4.1",
"dev": true,
"license": "BSD-2-Clause"
},
"node_modules/global-modules": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"global-prefix": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/global-prefix": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"ini": "^1.3.5",
"kind-of": "^6.0.2",
"which": "^1.3.1"
},
"engines": {
"node": ">=6"
}
},
"node_modules/global-prefix/node_modules/which": {
"version": "1.3.1",
"dev": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"which": "bin/which"
}
},
"node_modules/globals": {
"version": "11.12.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/globalthis": {
"version": "1.0.3",
"dev": true,
"license": "MIT",
"dependencies": {
"define-properties": "^1.1.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/globby": {
"version": "11.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"array-union": "^2.1.0",
"dir-glob": "^3.0.1",
"fast-glob": "^3.2.9",
"ignore": "^5.2.0",
"merge2": "^1.4.1",
"slash": "^3.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/gopd": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.1.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/graceful-fs": {
"version": "4.2.11",
"dev": true,
"license": "ISC"
},
"node_modules/graphemer": {
"version": "1.4.0",
"license": "MIT"
},
"node_modules/gzip-size": {
"version": "6.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"duplexer": "^0.1.2"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/handle-thing": {
"version": "2.0.1",
"dev": true,
"license": "MIT"
},
"node_modules/harmony-reflect": {
"version": "1.6.2",
"dev": true,
"license": "(Apache-2.0 OR MPL-1.1)"
},
"node_modules/has-bigints": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-flag": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/has-property-descriptors": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.2.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-proto": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.0.3",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hash-base": {
"version": "3.1.0",
"license": "MIT",
"dependencies": {
"inherits": "^2.0.4",
"readable-stream": "^3.6.0",
"safe-buffer": "^5.2.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/hash.js": {
"version": "1.1.7",
"license": "MIT",
"dependencies": {
"inherits": "^2.0.3",
"minimalistic-assert": "^1.0.1"
}
},
"node_modules/hasown": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/he": {
"version": "1.2.0",
"dev": true,
"license": "MIT",
"bin": {
"he": "bin/he"
}
},
"node_modules/hmac-drbg": {
"version": "1.0.1",
"license": "MIT",
"dependencies": {
"hash.js": "^1.0.3",
"minimalistic-assert": "^1.0.0",
"minimalistic-crypto-utils": "^1.0.1"
}
},
"node_modules/hoopy": {
"version": "0.1.4",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6.0.0"
}
},
"node_modules/hpack.js": {
"version": "2.1.6",
"dev": true,
"license": "MIT",
"dependencies": {
"inherits": "^2.0.1",
"obuf": "^1.0.0",
"readable-stream": "^2.0.1",
"wbuf": "^1.1.0"
}
},
"node_modules/hpack.js/node_modules/isarray": {
"version": "1.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/hpack.js/node_modules/readable-stream": {
"version": "2.3.8",
"dev": true,
"license": "MIT",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"node_modules/hpack.js/node_modules/safe-buffer": {
"version": "5.1.2",
"dev": true,
"license": "MIT"
},
"node_modules/hpack.js/node_modules/string_decoder": {
"version": "1.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
"node_modules/html-encoding-sniffer": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"whatwg-encoding": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/html-entities": {
"version": "2.4.0",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/mdevils"
},
{
"type": "patreon",
"url": "https://patreon.com/mdevils"
}
],
"license": "MIT"
},
"node_modules/html-escaper": {
"version": "2.0.2",
"dev": true,
"license": "MIT"
},
"node_modules/html-minifier-terser": {
"version": "6.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"camel-case": "^4.1.2",
"clean-css": "^5.2.2",
"commander": "^8.3.0",
"he": "^1.2.0",
"param-case": "^3.0.4",
"relateurl": "^0.2.7",
"terser": "^5.10.0"
},
"bin": {
"html-minifier-terser": "cli.js"
},
"engines": {
"node": ">=12"
}
},
"node_modules/html-webpack-plugin": {
"version": "5.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/html-minifier-terser": "^6.0.0",
"html-minifier-terser": "^6.0.2",
"lodash": "^4.17.21",
"pretty-error": "^4.0.0",
"tapable": "^2.0.0"
},
"engines": {
"node": ">=10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/html-webpack-plugin"
},
"peerDependencies": {
"@rspack/core": "0.x || 1.x",
"webpack": "^5.20.0"
},
"peerDependenciesMeta": {
"@rspack/core": {
"optional": true
},
"webpack": {
"optional": true
}
}
},
"node_modules/htmlparser2": {
"version": "6.1.0",
"dev": true,
"funding": [
"https://github.com/fb55/htmlparser2?sponsor=1",
{
"type": "github",
"url": "https://github.com/sponsors/fb55"
}
],
"license": "MIT",
"dependencies": {
"domelementtype": "^2.0.1",
"domhandler": "^4.0.0",
"domutils": "^2.5.2",
"entities": "^2.0.0"
}
},
"node_modules/htmlparser2/node_modules/entities": {
"version": "2.2.0",
"dev": true,
"license": "BSD-2-Clause",
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/http-deceiver": {
"version": "1.2.7",
"dev": true,
"license": "MIT"
},
"node_modules/http-errors": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"toidentifier": "1.0.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/http-parser-js": {
"version": "0.5.8",
"dev": true,
"license": "MIT"
},
"node_modules/http-proxy": {
"version": "1.18.1",
"dev": true,
"license": "MIT",
"dependencies": {
"eventemitter3": "^4.0.0",
"follow-redirects": "^1.0.0",
"requires-port": "^1.0.0"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/http-proxy-agent": {
"version": "5.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@tootallnate/once": "2",
"agent-base": "6",
"debug": "4"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/http-proxy-middleware": {
"version": "2.0.6",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/http-proxy": "^1.17.8",
"http-proxy": "^1.18.1",
"is-glob": "^4.0.1",
"is-plain-obj": "^3.0.0",
"micromatch": "^4.0.2"
},
"engines": {
"node": ">=12.0.0"
},
"peerDependencies": {
"@types/express": "^4.17.13"
},
"peerDependenciesMeta": {
"@types/express": {
"optional": true
}
}
},
"node_modules/https-proxy-agent": {
"version": "5.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"agent-base": "6",
"debug": "4"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/human-signals": {
"version": "2.1.0",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=10.17.0"
}
},
"node_modules/iconv-lite": {
"version": "0.6.3",
"dev": true,
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/icss-utils": {
"version": "5.1.0",
"dev": true,
"license": "ISC",
"engines": {
"node": "^10 || ^12 || >= 14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/idb": {
"version": "7.1.1",
"dev": true,
"license": "ISC"
},
"node_modules/identity-obj-proxy": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"harmony-reflect": "^1.4.6"
},
"engines": {
"node": ">=4"
}
},
"node_modules/ieee754": {
"version": "1.2.1",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "BSD-3-Clause"
},
"node_modules/ignore": {
"version": "5.3.1",
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/immediate": {
"version": "3.0.6",
"license": "MIT"
},
"node_modules/immer": {
"version": "9.0.21",
"dev": true,
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/immer"
}
},
"node_modules/import-fresh": {
"version": "3.3.0",
"license": "MIT",
"dependencies": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/import-fresh/node_modules/resolve-from": {
"version": "4.0.0",
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/import-local": {
"version": "3.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"pkg-dir": "^4.2.0",
"resolve-cwd": "^3.0.0"
},
"bin": {
"import-local-fixture": "fixtures/cli.js"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/imurmurhash": {
"version": "0.1.4",
"license": "MIT",
"engines": {
"node": ">=0.8.19"
}
},
"node_modules/indent-string": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/inflight": {
"version": "1.0.6",
"license": "ISC",
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"node_modules/inherits": {
"version": "2.0.4",
"license": "ISC"
},
"node_modules/ini": {
"version": "1.3.8",
"dev": true,
"license": "ISC"
},
"node_modules/internal-slot": {
"version": "1.0.7",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"hasown": "^2.0.0",
"side-channel": "^1.0.4"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/ipaddr.js": {
"version": "2.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10"
}
},
"node_modules/is-arguments": {
"version": "1.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-array-buffer": {
"version": "3.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-arrayish": {
"version": "0.2.1",
"dev": true,
"license": "MIT"
},
"node_modules/is-async-function": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-bigint": {
"version": "1.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"has-bigints": "^1.0.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-binary-path": {
"version": "2.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"binary-extensions": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/is-boolean-object": {
"version": "1.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-callable": {
"version": "1.2.7",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-core-module": {
"version": "2.13.1",
"dev": true,
"license": "MIT",
"dependencies": {
"hasown": "^2.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-date-object": {
"version": "1.0.5",
"dev": true,
"license": "MIT",
"dependencies": {
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-docker": {
"version": "2.2.1",
"dev": true,
"license": "MIT",
"bin": {
"is-docker": "cli.js"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-extglob": {
"version": "2.1.1",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-finalizationregistry": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/is-generator-fn": {
"version": "2.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/is-generator-function": {
"version": "1.0.10",
"dev": true,
"license": "MIT",
"dependencies": {
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-map": {
"version": "2.0.2",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-module": {
"version": "1.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/is-nan": {
"version": "1.3.2",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.0",
"define-properties": "^1.1.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-negative-zero": {
"version": "2.0.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-number": {
"version": "7.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/is-number-object": {
"version": "1.0.7",
"dev": true,
"license": "MIT",
"dependencies": {
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-obj": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-path-inside": {
"version": "3.0.3",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/is-plain-obj": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-potential-custom-element-name": {
"version": "1.0.1",
"dev": true,
"license": "MIT"
},
"node_modules/is-regex": {
"version": "1.1.4",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-regexp": {
"version": "1.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-root": {
"version": "2.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/is-set": {
"version": "2.0.2",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-shared-array-buffer": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-stream": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-string": {
"version": "1.0.7",
"dev": true,
"license": "MIT",
"dependencies": {
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-symbol": {
"version": "1.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-typed-array": {
"version": "1.1.13",
"dev": true,
"license": "MIT",
"dependencies": {
"which-typed-array": "^1.1.14"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-weakmap": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-weakref": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-weakset": {
"version": "2.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.1.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-what": {
"version": "3.14.1",
"dev": true,
"license": "MIT"
},
"node_modules/is-wsl": {
"version": "2.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"is-docker": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/isarray": {
"version": "2.0.5",
"dev": true,
"license": "MIT"
},
"node_modules/isexe": {
"version": "2.0.0",
"license": "ISC"
},
"node_modules/isomorphic-ws": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz",
"integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==",
"peerDependencies": {
"ws": "*"
}
},
"node_modules/istanbul-lib-coverage": {
"version": "3.2.2",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=8"
}
},
"node_modules/istanbul-lib-instrument": {
"version": "5.2.1",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"@babel/core": "^7.12.3",
"@babel/parser": "^7.14.7",
"@istanbuljs/schema": "^0.1.2",
"istanbul-lib-coverage": "^3.2.0",
"semver": "^6.3.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/istanbul-lib-instrument/node_modules/semver": {
"version": "6.3.1",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/istanbul-lib-report": {
"version": "3.0.1",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"istanbul-lib-coverage": "^3.0.0",
"make-dir": "^4.0.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/istanbul-lib-report/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/istanbul-lib-report/node_modules/make-dir": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"semver": "^7.5.3"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/istanbul-lib-report/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/istanbul-lib-source-maps": {
"version": "4.0.1",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"debug": "^4.1.1",
"istanbul-lib-coverage": "^3.0.0",
"source-map": "^0.6.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/istanbul-lib-source-maps/node_modules/source-map": {
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/istanbul-reports": {
"version": "3.1.6",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"html-escaper": "^2.0.0",
"istanbul-lib-report": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/iterator.prototype": {
"version": "1.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"define-properties": "^1.2.1",
"get-intrinsic": "^1.2.1",
"has-symbols": "^1.0.3",
"reflect.getprototypeof": "^1.0.4",
"set-function-name": "^2.0.1"
}
},
"node_modules/jackspeak": {
"version": "2.3.6",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
"@isaacs/cliui": "^8.0.2"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
},
"optionalDependencies": {
"@pkgjs/parseargs": "^0.11.0"
}
},
"node_modules/jake": {
"version": "10.8.7",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"async": "^3.2.3",
"chalk": "^4.0.2",
"filelist": "^1.0.4",
"minimatch": "^3.1.2"
},
"bin": {
"jake": "bin/cli.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/jake/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jake/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jake/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jake/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jake/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jake/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/core": "^29.7.0",
"@jest/types": "^29.6.3",
"import-local": "^3.0.2",
"jest-cli": "^29.7.0"
},
"bin": {
"jest": "bin/jest.js"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
"node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
},
"peerDependenciesMeta": {
"node-notifier": {
"optional": true
}
}
},
"node_modules/jest-changed-files": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"execa": "^5.0.0",
"jest-util": "^29.7.0",
"p-limit": "^3.1.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-circus": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/environment": "^29.7.0",
"@jest/expect": "^29.7.0",
"@jest/test-result": "^29.7.0",
"@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"co": "^4.6.0",
"dedent": "^1.0.0",
"is-generator-fn": "^2.0.0",
"jest-each": "^29.7.0",
"jest-matcher-utils": "^29.7.0",
"jest-message-util": "^29.7.0",
"jest-runtime": "^29.7.0",
"jest-snapshot": "^29.7.0",
"jest-util": "^29.7.0",
"p-limit": "^3.1.0",
"pretty-format": "^29.7.0",
"pure-rand": "^6.0.0",
"slash": "^3.0.0",
"stack-utils": "^2.0.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-circus/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-circus/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-circus/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-circus/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-circus/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-circus/node_modules/pretty-format": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-circus/node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-circus/node_modules/react-is": {
"version": "18.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/jest-circus/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-cli": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/core": "^29.7.0",
"@jest/test-result": "^29.7.0",
"@jest/types": "^29.6.3",
"chalk": "^4.0.0",
"create-jest": "^29.7.0",
"exit": "^0.1.2",
"import-local": "^3.0.2",
"jest-config": "^29.7.0",
"jest-util": "^29.7.0",
"jest-validate": "^29.7.0",
"yargs": "^17.3.1"
},
"bin": {
"jest": "bin/jest.js"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
"node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
},
"peerDependenciesMeta": {
"node-notifier": {
"optional": true
}
}
},
"node_modules/jest-cli/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-cli/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-cli/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-cli/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-cli/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-cli/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-config": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.11.6",
"@jest/test-sequencer": "^29.7.0",
"@jest/types": "^29.6.3",
"babel-jest": "^29.7.0",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"deepmerge": "^4.2.2",
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
"jest-circus": "^29.7.0",
"jest-environment-node": "^29.7.0",
"jest-get-type": "^29.6.3",
"jest-regex-util": "^29.6.3",
"jest-resolve": "^29.7.0",
"jest-runner": "^29.7.0",
"jest-util": "^29.7.0",
"jest-validate": "^29.7.0",
"micromatch": "^4.0.4",
"parse-json": "^5.2.0",
"pretty-format": "^29.7.0",
"slash": "^3.0.0",
"strip-json-comments": "^3.1.1"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
"@types/node": "*",
"ts-node": ">=9.0.0"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
},
"ts-node": {
"optional": true
}
}
},
"node_modules/jest-config/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-config/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-config/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-config/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-config/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-config/node_modules/pretty-format": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-config/node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-config/node_modules/react-is": {
"version": "18.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/jest-config/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-diff": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"chalk": "^4.0.0",
"diff-sequences": "^29.6.3",
"jest-get-type": "^29.6.3",
"pretty-format": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-diff/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-diff/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-diff/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-diff/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-diff/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-diff/node_modules/pretty-format": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-diff/node_modules/react-is": {
"version": "18.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/jest-diff/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-docblock": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"detect-newline": "^3.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-each": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/types": "^29.6.3",
"chalk": "^4.0.0",
"jest-get-type": "^29.6.3",
"jest-util": "^29.7.0",
"pretty-format": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-each/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-each/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-each/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-each/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-each/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-each/node_modules/pretty-format": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-each/node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-each/node_modules/react-is": {
"version": "18.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/jest-each/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-environment-jsdom": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/environment": "^29.7.0",
"@jest/fake-timers": "^29.7.0",
"@jest/types": "^29.6.3",
"@types/jsdom": "^20.0.0",
"@types/node": "*",
"jest-mock": "^29.7.0",
"jest-util": "^29.7.0",
"jsdom": "^20.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
"canvas": "^2.5.0"
},
"peerDependenciesMeta": {
"canvas": {
"optional": true
}
}
},
"node_modules/jest-environment-node": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/environment": "^29.7.0",
"@jest/fake-timers": "^29.7.0",
"@jest/types": "^29.6.3",
"@types/node": "*",
"jest-mock": "^29.7.0",
"jest-util": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-get-type": {
"version": "29.6.3",
"dev": true,
"license": "MIT",
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-haste-map": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/types": "^29.6.3",
"@types/graceful-fs": "^4.1.3",
"@types/node": "*",
"anymatch": "^3.0.3",
"fb-watchman": "^2.0.0",
"graceful-fs": "^4.2.9",
"jest-regex-util": "^29.6.3",
"jest-util": "^29.7.0",
"jest-worker": "^29.7.0",
"micromatch": "^4.0.4",
"walker": "^1.0.8"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
},
"optionalDependencies": {
"fsevents": "^2.3.2"
}
},
"node_modules/jest-haste-map/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-haste-map/node_modules/jest-worker": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*",
"jest-util": "^29.7.0",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-haste-map/node_modules/supports-color": {
"version": "8.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/jest-junit": {
"version": "16.0.0",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"mkdirp": "^1.0.4",
"strip-ansi": "^6.0.1",
"uuid": "^8.3.2",
"xml": "^1.0.1"
},
"engines": {
"node": ">=10.12.0"
}
},
"node_modules/jest-leak-detector": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"jest-get-type": "^29.6.3",
"pretty-format": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-leak-detector/node_modules/ansi-styles": {
"version": "5.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-leak-detector/node_modules/pretty-format": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-leak-detector/node_modules/react-is": {
"version": "18.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/jest-matcher-utils": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"chalk": "^4.0.0",
"jest-diff": "^29.7.0",
"jest-get-type": "^29.6.3",
"pretty-format": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-matcher-utils/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-matcher-utils/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-matcher-utils/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-matcher-utils/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-matcher-utils/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-matcher-utils/node_modules/pretty-format": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-matcher-utils/node_modules/react-is": {
"version": "18.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/jest-matcher-utils/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-message-util": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.12.13",
"@jest/types": "^29.6.3",
"@types/stack-utils": "^2.0.0",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"micromatch": "^4.0.4",
"pretty-format": "^29.7.0",
"slash": "^3.0.0",
"stack-utils": "^2.0.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-message-util/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-message-util/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-message-util/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-message-util/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-message-util/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-message-util/node_modules/pretty-format": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-message-util/node_modules/react-is": {
"version": "18.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/jest-message-util/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-mock": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/types": "^29.6.3",
"@types/node": "*",
"jest-util": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-pnp-resolver": {
"version": "1.2.3",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
},
"peerDependencies": {
"jest-resolve": "*"
},
"peerDependenciesMeta": {
"jest-resolve": {
"optional": true
}
}
},
"node_modules/jest-regex-util": {
"version": "29.6.3",
"dev": true,
"license": "MIT",
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-resolve": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"jest-haste-map": "^29.7.0",
"jest-pnp-resolver": "^1.2.2",
"jest-util": "^29.7.0",
"jest-validate": "^29.7.0",
"resolve": "^1.20.0",
"resolve.exports": "^2.0.0",
"slash": "^3.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-resolve-dependencies": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"jest-regex-util": "^29.6.3",
"jest-snapshot": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-resolve/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-resolve/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-resolve/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-resolve/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-resolve/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-resolve/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-runner": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/console": "^29.7.0",
"@jest/environment": "^29.7.0",
"@jest/test-result": "^29.7.0",
"@jest/transform": "^29.7.0",
"@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"emittery": "^0.13.1",
"graceful-fs": "^4.2.9",
"jest-docblock": "^29.7.0",
"jest-environment-node": "^29.7.0",
"jest-haste-map": "^29.7.0",
"jest-leak-detector": "^29.7.0",
"jest-message-util": "^29.7.0",
"jest-resolve": "^29.7.0",
"jest-runtime": "^29.7.0",
"jest-util": "^29.7.0",
"jest-watcher": "^29.7.0",
"jest-worker": "^29.7.0",
"p-limit": "^3.1.0",
"source-map-support": "0.5.13"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-runner/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-runner/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-runner/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-runner/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-runner/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-runner/node_modules/jest-worker": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*",
"jest-util": "^29.7.0",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-runner/node_modules/jest-worker/node_modules/supports-color": {
"version": "8.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/jest-runner/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-runtime": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/environment": "^29.7.0",
"@jest/fake-timers": "^29.7.0",
"@jest/globals": "^29.7.0",
"@jest/source-map": "^29.6.3",
"@jest/test-result": "^29.7.0",
"@jest/transform": "^29.7.0",
"@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"cjs-module-lexer": "^1.0.0",
"collect-v8-coverage": "^1.0.0",
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
"jest-haste-map": "^29.7.0",
"jest-message-util": "^29.7.0",
"jest-mock": "^29.7.0",
"jest-regex-util": "^29.6.3",
"jest-resolve": "^29.7.0",
"jest-snapshot": "^29.7.0",
"jest-util": "^29.7.0",
"slash": "^3.0.0",
"strip-bom": "^4.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-runtime/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-runtime/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-runtime/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-runtime/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-runtime/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-runtime/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-snapshot": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.11.6",
"@babel/generator": "^7.7.2",
"@babel/plugin-syntax-jsx": "^7.7.2",
"@babel/plugin-syntax-typescript": "^7.7.2",
"@babel/types": "^7.3.3",
"@jest/expect-utils": "^29.7.0",
"@jest/transform": "^29.7.0",
"@jest/types": "^29.6.3",
"babel-preset-current-node-syntax": "^1.0.0",
"chalk": "^4.0.0",
"expect": "^29.7.0",
"graceful-fs": "^4.2.9",
"jest-diff": "^29.7.0",
"jest-get-type": "^29.6.3",
"jest-matcher-utils": "^29.7.0",
"jest-message-util": "^29.7.0",
"jest-util": "^29.7.0",
"natural-compare": "^1.4.0",
"pretty-format": "^29.7.0",
"semver": "^7.5.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-snapshot/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-snapshot/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-snapshot/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-snapshot/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-snapshot/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-snapshot/node_modules/pretty-format": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-snapshot/node_modules/react-is": {
"version": "18.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/jest-snapshot/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-util": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/types": "^29.6.3",
"@types/node": "*",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"graceful-fs": "^4.2.9",
"picomatch": "^2.2.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-util/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-util/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-util/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-util/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-util/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-util/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-validate": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/types": "^29.6.3",
"camelcase": "^6.2.0",
"chalk": "^4.0.0",
"jest-get-type": "^29.6.3",
"leven": "^3.1.0",
"pretty-format": "^29.7.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-validate/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-validate/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-validate/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-validate/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-validate/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-validate/node_modules/pretty-format": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-validate/node_modules/react-is": {
"version": "18.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/jest-validate/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-watch-typeahead": {
"version": "2.2.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-escapes": "^6.0.0",
"chalk": "^5.2.0",
"jest-regex-util": "^29.0.0",
"jest-watcher": "^29.0.0",
"slash": "^5.0.0",
"string-length": "^5.0.1",
"strip-ansi": "^7.0.1"
},
"engines": {
"node": "^14.17.0 || ^16.10.0 || >=18.0.0"
},
"peerDependencies": {
"jest": "^27.0.0 || ^28.0.0 || ^29.0.0"
}
},
"node_modules/jest-watch-typeahead/node_modules/ansi-escapes": {
"version": "6.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"type-fest": "^3.0.0"
},
"engines": {
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/jest-watch-typeahead/node_modules/ansi-regex": {
"version": "6.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
"node_modules/jest-watch-typeahead/node_modules/chalk": {
"version": "5.3.0",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-watch-typeahead/node_modules/char-regex": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12.20"
}
},
"node_modules/jest-watch-typeahead/node_modules/slash": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/jest-watch-typeahead/node_modules/string-length": {
"version": "5.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"char-regex": "^2.0.0",
"strip-ansi": "^7.0.1"
},
"engines": {
"node": ">=12.20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/jest-watch-typeahead/node_modules/strip-ansi": {
"version": "7.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^6.0.1"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/jest-watch-typeahead/node_modules/type-fest": {
"version": "3.13.1",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/jest-watcher": {
"version": "29.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jest/test-result": "^29.7.0",
"@jest/types": "^29.6.3",
"@types/node": "*",
"ansi-escapes": "^4.2.1",
"chalk": "^4.0.0",
"emittery": "^0.13.1",
"jest-util": "^29.7.0",
"string-length": "^4.0.1"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-watcher/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/jest-watcher/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/jest-watcher/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/jest-watcher/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/jest-watcher/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-watcher/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/jest-when": {
"version": "3.6.0",
"dev": true,
"license": "MIT",
"peerDependencies": {
"jest": ">= 25"
}
},
"node_modules/jest-worker": {
"version": "27.5.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
"engines": {
"node": ">= 10.13.0"
}
},
"node_modules/jest-worker/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/jest-worker/node_modules/supports-color": {
"version": "8.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/jiti": {
"version": "1.21.0",
"dev": true,
"license": "MIT",
"bin": {
"jiti": "bin/jiti.js"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"license": "MIT"
},
"node_modules/js-yaml": {
"version": "3.14.1",
"dev": true,
"license": "MIT",
"dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/jsdom": {
"version": "20.0.3",
"dev": true,
"license": "MIT",
"dependencies": {
"abab": "^2.0.6",
"acorn": "^8.8.1",
"acorn-globals": "^7.0.0",
"cssom": "^0.5.0",
"cssstyle": "^2.3.0",
"data-urls": "^3.0.2",
"decimal.js": "^10.4.2",
"domexception": "^4.0.0",
"escodegen": "^2.0.0",
"form-data": "^4.0.0",
"html-encoding-sniffer": "^3.0.0",
"http-proxy-agent": "^5.0.0",
"https-proxy-agent": "^5.0.1",
"is-potential-custom-element-name": "^1.0.1",
"nwsapi": "^2.2.2",
"parse5": "^7.1.1",
"saxes": "^6.0.0",
"symbol-tree": "^3.2.4",
"tough-cookie": "^4.1.2",
"w3c-xmlserializer": "^4.0.0",
"webidl-conversions": "^7.0.0",
"whatwg-encoding": "^2.0.0",
"whatwg-mimetype": "^3.0.0",
"whatwg-url": "^11.0.0",
"ws": "^8.11.0",
"xml-name-validator": "^4.0.0"
},
"engines": {
"node": ">=14"
},
"peerDependencies": {
"canvas": "^2.5.0"
},
"peerDependenciesMeta": {
"canvas": {
"optional": true
}
}
},
"node_modules/jsesc": {
"version": "2.5.2",
"dev": true,
"license": "MIT",
"bin": {
"jsesc": "bin/jsesc"
},
"engines": {
"node": ">=4"
}
},
"node_modules/json-buffer": {
"version": "3.0.1",
"license": "MIT"
},
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"dev": true,
"license": "MIT"
},
"node_modules/json-schema": {
"version": "0.4.0",
"dev": true,
"license": "(AFL-2.1 OR BSD-3-Clause)"
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"license": "MIT"
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
"license": "MIT"
},
"node_modules/json5": {
"version": "2.2.3",
"license": "MIT",
"bin": {
"json5": "lib/cli.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/jsonfile": {
"version": "6.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/jsonpath": {
"version": "1.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"esprima": "1.2.2",
"static-eval": "2.0.2",
"underscore": "1.12.1"
}
},
"node_modules/jsonpath/node_modules/esprima": {
"version": "1.2.2",
"dev": true,
"bin": {
"esparse": "bin/esparse.js",
"esvalidate": "bin/esvalidate.js"
},
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/jsonpointer": {
"version": "5.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/jsx-ast-utils": {
"version": "3.3.5",
"dev": true,
"license": "MIT",
"dependencies": {
"array-includes": "^3.1.6",
"array.prototype.flat": "^1.3.1",
"object.assign": "^4.1.4",
"object.values": "^1.1.6"
},
"engines": {
"node": ">=4.0"
}
},
"node_modules/keyv": {
"version": "4.5.4",
"license": "MIT",
"dependencies": {
"json-buffer": "3.0.1"
}
},
"node_modules/kind-of": {
"version": "6.0.3",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/kleur": {
"version": "3.0.3",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/klona": {
"version": "2.0.6",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 8"
}
},
"node_modules/language-subtag-registry": {
"version": "0.3.22",
"dev": true,
"license": "CC0-1.0"
},
"node_modules/language-tags": {
"version": "1.0.9",
"dev": true,
"license": "MIT",
"dependencies": {
"language-subtag-registry": "^0.3.20"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/launch-editor": {
"version": "2.6.1",
"dev": true,
"license": "MIT",
"dependencies": {
"picocolors": "^1.0.0",
"shell-quote": "^1.8.1"
}
},
"node_modules/leven": {
"version": "3.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/levn": {
"version": "0.4.1",
"license": "MIT",
"dependencies": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/lie": {
"version": "3.1.1",
"license": "MIT",
"dependencies": {
"immediate": "~3.0.5"
}
},
"node_modules/lilconfig": {
"version": "2.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/lines-and-columns": {
"version": "1.2.4",
"dev": true,
"license": "MIT"
},
"node_modules/loader-runner": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.11.5"
}
},
"node_modules/loader-utils": {
"version": "2.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
},
"engines": {
"node": ">=8.9.0"
}
},
"node_modules/localforage": {
"version": "1.10.0",
"license": "Apache-2.0",
"dependencies": {
"lie": "3.1.1"
}
},
"node_modules/locate-path": {
"version": "6.0.0",
"license": "MIT",
"dependencies": {
"p-locate": "^5.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"dev": true,
"license": "MIT"
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
"dev": true,
"license": "MIT"
},
"node_modules/lodash.memoize": {
"version": "4.1.2",
"dev": true,
"license": "MIT"
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"license": "MIT"
},
"node_modules/lodash.sortby": {
"version": "4.7.0",
"dev": true,
"license": "MIT"
},
"node_modules/lodash.uniq": {
"version": "4.5.0",
"dev": true,
"license": "MIT"
},
"node_modules/long": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
"integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
},
"node_modules/loose-envify": {
"version": "1.4.0",
"license": "MIT",
"dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0"
},
"bin": {
"loose-envify": "cli.js"
}
},
"node_modules/lower-case": {
"version": "2.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"tslib": "^2.0.3"
}
},
"node_modules/lru-cache": {
"version": "5.1.1",
"dev": true,
"license": "ISC",
"dependencies": {
"yallist": "^3.0.2"
}
},
"node_modules/lz-string": {
"version": "1.5.0",
"dev": true,
"license": "MIT",
"bin": {
"lz-string": "bin/bin.js"
}
},
"node_modules/magic-string": {
"version": "0.25.9",
"dev": true,
"license": "MIT",
"dependencies": {
"sourcemap-codec": "^1.4.8"
}
},
"node_modules/make-dir": {
"version": "3.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"semver": "^6.0.0"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/make-dir/node_modules/semver": {
"version": "6.3.1",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/makeerror": {
"version": "1.0.12",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"tmpl": "1.0.5"
}
},
"node_modules/md5.js": {
"version": "1.3.5",
"license": "MIT",
"dependencies": {
"hash-base": "^3.0.0",
"inherits": "^2.0.1",
"safe-buffer": "^5.1.2"
}
},
"node_modules/mdn-data": {
"version": "2.0.14",
"dev": true,
"license": "CC0-1.0"
},
"node_modules/media-typer": {
"version": "0.3.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/memfs": {
"version": "3.5.3",
"dev": true,
"license": "Unlicense",
"dependencies": {
"fs-monkey": "^1.0.4"
},
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/memoize-one": {
"version": "5.2.1",
"dev": true,
"license": "MIT"
},
"node_modules/merge-anything": {
"version": "2.4.4",
"dev": true,
"license": "MIT",
"dependencies": {
"is-what": "^3.3.1"
}
},
"node_modules/merge-descriptors": {
"version": "1.0.1",
"dev": true,
"license": "MIT"
},
"node_modules/merge-stream": {
"version": "2.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/merge2": {
"version": "1.4.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 8"
}
},
"node_modules/methods": {
"version": "1.1.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/micromatch": {
"version": "4.0.5",
"dev": true,
"license": "MIT",
"dependencies": {
"braces": "^3.0.2",
"picomatch": "^2.3.1"
},
"engines": {
"node": ">=8.6"
}
},
"node_modules/miller-rabin": {
"version": "4.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"bn.js": "^4.0.0",
"brorand": "^1.0.1"
},
"bin": {
"miller-rabin": "bin/miller-rabin"
}
},
"node_modules/miller-rabin/node_modules/bn.js": {
"version": "4.12.0",
"dev": true,
"license": "MIT"
},
"node_modules/mime": {
"version": "1.6.0",
"dev": true,
"license": "MIT",
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mimic-fn": {
"version": "2.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/min-indent": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/mini-css-extract-plugin": {
"version": "2.8.0",
"dev": true,
"license": "MIT",
"dependencies": {
"schema-utils": "^4.0.0",
"tapable": "^2.2.1"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^5.0.0"
}
},
"node_modules/mini-css-extract-plugin/node_modules/ajv": {
"version": "8.12.0",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
"peerDependencies": {
"ajv": "^8.8.2"
}
},
"node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": {
"version": "1.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/mini-css-extract-plugin/node_modules/schema-utils": {
"version": "4.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
"ajv-formats": "^2.1.1",
"ajv-keywords": "^5.1.0"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/minimalistic-assert": {
"version": "1.0.1",
"license": "ISC"
},
"node_modules/minimalistic-crypto-utils": {
"version": "1.0.1",
"license": "MIT"
},
"node_modules/minimatch": {
"version": "3.1.2",
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
},
"engines": {
"node": "*"
}
},
"node_modules/minimist": {
"version": "1.2.8",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/minipass": {
"version": "7.0.4",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
"node_modules/mkdirp": {
"version": "1.0.4",
"dev": true,
"license": "MIT",
"bin": {
"mkdirp": "bin/cmd.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/mocha-suppress-logs": {
"version": "0.3.1",
"license": "MIT"
},
"node_modules/ms": {
"version": "2.1.2",
"license": "MIT"
},
"node_modules/multicast-dns": {
"version": "7.2.5",
"dev": true,
"license": "MIT",
"dependencies": {
"dns-packet": "^5.2.2",
"thunky": "^1.0.2"
},
"bin": {
"multicast-dns": "cli.js"
}
},
"node_modules/mz": {
"version": "2.7.0",
"dev": true,
"license": "MIT",
"dependencies": {
"any-promise": "^1.0.0",
"object-assign": "^4.0.1",
"thenify-all": "^1.0.0"
}
},
"node_modules/nan": {
"version": "2.18.0",
"license": "MIT"
},
"node_modules/nanoassert": {
"version": "2.0.0",
"license": "ISC"
},
"node_modules/nanoid": {
"version": "3.3.7",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/natural-compare": {
"version": "1.4.0",
"license": "MIT"
},
"node_modules/natural-compare-lite": {
"version": "1.4.0",
"dev": true,
"license": "MIT"
},
"node_modules/negotiator": {
"version": "0.6.3",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/neo-async": {
"version": "2.6.2",
"dev": true,
"license": "MIT"
},
"node_modules/no-case": {
"version": "3.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"lower-case": "^2.0.2",
"tslib": "^2.0.3"
}
},
"node_modules/node-forge": {
"version": "1.3.1",
"dev": true,
"license": "(BSD-3-Clause OR GPL-2.0)",
"engines": {
"node": ">= 6.13.0"
}
},
"node_modules/node-int64": {
"version": "0.4.0",
"dev": true,
"license": "MIT"
},
"node_modules/node-releases": {
"version": "2.0.14",
"dev": true,
"license": "MIT"
},
"node_modules/normalize-path": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/normalize-range": {
"version": "0.1.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/normalize-url": {
"version": "6.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/normalize-wheel": {
"version": "1.0.1",
"license": "BSD-3-Clause"
},
"node_modules/npm-run-path": {
"version": "4.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/nth-check": {
"version": "2.1.1",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"boolbase": "^1.0.0"
},
"funding": {
"url": "https://github.com/fb55/nth-check?sponsor=1"
}
},
"node_modules/nwsapi": {
"version": "2.2.7",
"dev": true,
"license": "MIT"
},
"node_modules/object-assign": {
"version": "4.1.1",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-hash": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/object-inspect": {
"version": "1.13.1",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/object-is": {
"version": "1.1.5",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/object-keys": {
"version": "1.1.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/object.assign": {
"version": "4.1.5",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.5",
"define-properties": "^1.2.1",
"has-symbols": "^1.0.3",
"object-keys": "^1.1.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/object.entries": {
"version": "1.1.7",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/object.fromentries": {
"version": "2.0.7",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/object.groupby": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"array.prototype.filter": "^1.0.3",
"call-bind": "^1.0.5",
"define-properties": "^1.2.1",
"es-abstract": "^1.22.3",
"es-errors": "^1.0.0"
}
},
"node_modules/object.hasown": {
"version": "1.1.3",
"dev": true,
"license": "MIT",
"dependencies": {
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/object.values": {
"version": "1.1.7",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/obuf": {
"version": "1.1.2",
"dev": true,
"license": "MIT"
},
"node_modules/on-finished": {
"version": "2.4.1",
"dev": true,
"license": "MIT",
"dependencies": {
"ee-first": "1.1.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/on-headers": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/once": {
"version": "1.4.0",
"license": "ISC",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/onetime": {
"version": "5.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"mimic-fn": "^2.1.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/open": {
"version": "8.4.2",
"dev": true,
"license": "MIT",
"dependencies": {
"define-lazy-prop": "^2.0.0",
"is-docker": "^2.1.1",
"is-wsl": "^2.2.0"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/optionator": {
"version": "0.9.3",
"license": "MIT",
"dependencies": {
"@aashutoshrathi/word-wrap": "^1.2.3",
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
"type-check": "^0.4.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/p-limit": {
"version": "3.1.0",
"license": "MIT",
"dependencies": {
"yocto-queue": "^0.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-locate": {
"version": "5.0.0",
"license": "MIT",
"dependencies": {
"p-limit": "^3.0.2"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-retry": {
"version": "4.6.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/retry": "0.12.0",
"retry": "^0.13.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/p-try": {
"version": "2.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/param-case": {
"version": "3.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"dot-case": "^3.0.4",
"tslib": "^2.0.3"
}
},
"node_modules/parent-module": {
"version": "1.0.1",
"license": "MIT",
"dependencies": {
"callsites": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/parse-asn1": {
"version": "5.1.6",
"dev": true,
"license": "ISC",
"dependencies": {
"asn1.js": "^5.2.0",
"browserify-aes": "^1.0.0",
"evp_bytestokey": "^1.0.0",
"pbkdf2": "^3.0.3",
"safe-buffer": "^5.1.1"
}
},
"node_modules/parse-json": {
"version": "5.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
"json-parse-even-better-errors": "^2.3.0",
"lines-and-columns": "^1.1.6"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/parse5": {
"version": "7.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"entities": "^4.4.0"
},
"funding": {
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
"node_modules/parseurl": {
"version": "1.3.3",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/pascal-case": {
"version": "3.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"no-case": "^3.0.4",
"tslib": "^2.0.3"
}
},
"node_modules/path-exists": {
"version": "4.0.0",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/path-key": {
"version": "3.1.1",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/path-parse": {
"version": "1.0.7",
"dev": true,
"license": "MIT"
},
"node_modules/path-scurry": {
"version": "1.10.1",
"dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
"lru-cache": "^9.1.1 || ^10.0.0",
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/path-scurry/node_modules/lru-cache": {
"version": "10.2.0",
"dev": true,
"license": "ISC",
"engines": {
"node": "14 || >=16.14"
}
},
"node_modules/path-to-regexp": {
"version": "0.1.7",
"dev": true,
"license": "MIT"
},
"node_modules/path-type": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/pbkdf2": {
"version": "3.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"create-hash": "^1.1.2",
"create-hmac": "^1.1.4",
"ripemd160": "^2.0.1",
"safe-buffer": "^5.0.1",
"sha.js": "^2.4.8"
},
"engines": {
"node": ">=0.12"
}
},
"node_modules/performance-now": {
"version": "2.1.0",
"dev": true,
"license": "MIT"
},
"node_modules/picocolors": {
"version": "1.0.0",
"dev": true,
"license": "ISC"
},
"node_modules/picomatch": {
"version": "2.3.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pify": {
"version": "2.3.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/pirates": {
"version": "4.0.6",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/pkg-dir": {
"version": "4.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"find-up": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/pkg-dir/node_modules/find-up": {
"version": "4.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/pkg-dir/node_modules/locate-path": {
"version": "5.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"p-locate": "^4.1.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/pkg-dir/node_modules/p-limit": {
"version": "2.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-dir/node_modules/p-locate": {
"version": "4.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"p-limit": "^2.2.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/pkg-up": {
"version": "3.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"find-up": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/pkg-up/node_modules/find-up": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"locate-path": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/pkg-up/node_modules/locate-path": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/pkg-up/node_modules/p-limit": {
"version": "2.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"p-try": "^2.0.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pkg-up/node_modules/p-locate": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"p-limit": "^2.0.0"
},
"engines": {
"node": ">=6"
}
},
"node_modules/pkg-up/node_modules/path-exists": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/postcss": {
"version": "8.4.35",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/postcss"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.7",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
},
"engines": {
"node": "^10 || ^12 || >=14"
}
},
"node_modules/postcss-attribute-case-insensitive": {
"version": "5.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-selector-parser": "^6.0.10"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-browser-comments": {
"version": "4.0.0",
"dev": true,
"license": "CC0-1.0",
"engines": {
"node": ">=8"
},
"peerDependencies": {
"browserslist": ">=4",
"postcss": ">=8"
}
},
"node_modules/postcss-calc": {
"version": "8.2.4",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-selector-parser": "^6.0.9",
"postcss-value-parser": "^4.2.0"
},
"peerDependencies": {
"postcss": "^8.2.2"
}
},
"node_modules/postcss-clamp": {
"version": "4.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": ">=7.6.0"
},
"peerDependencies": {
"postcss": "^8.4.6"
}
},
"node_modules/postcss-color-functional-notation": {
"version": "4.2.4",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-color-hex-alpha": {
"version": "8.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.4"
}
},
"node_modules/postcss-color-rebeccapurple": {
"version": "7.1.1",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-colormin": {
"version": "5.3.1",
"dev": true,
"license": "MIT",
"dependencies": {
"browserslist": "^4.21.4",
"caniuse-api": "^3.0.0",
"colord": "^2.9.1",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-convert-values": {
"version": "5.1.3",
"dev": true,
"license": "MIT",
"dependencies": {
"browserslist": "^4.21.4",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-custom-media": {
"version": "8.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.3"
}
},
"node_modules/postcss-custom-properties": {
"version": "12.1.11",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-custom-selectors": {
"version": "6.0.3",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-selector-parser": "^6.0.4"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.3"
}
},
"node_modules/postcss-dir-pseudo-class": {
"version": "6.0.5",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-selector-parser": "^6.0.10"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-discard-comments": {
"version": "5.1.2",
"dev": true,
"license": "MIT",
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-discard-duplicates": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-discard-empty": {
"version": "5.1.1",
"dev": true,
"license": "MIT",
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-discard-overridden": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-double-position-gradients": {
"version": "3.1.2",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"@csstools/postcss-progressive-custom-properties": "^1.1.0",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-env-function": {
"version": "4.0.6",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"peerDependencies": {
"postcss": "^8.4"
}
},
"node_modules/postcss-flexbugs-fixes": {
"version": "5.0.2",
"dev": true,
"license": "MIT",
"peerDependencies": {
"postcss": "^8.1.4"
}
},
"node_modules/postcss-focus-visible": {
"version": "6.0.4",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-selector-parser": "^6.0.9"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"peerDependencies": {
"postcss": "^8.4"
}
},
"node_modules/postcss-focus-within": {
"version": "5.0.4",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-selector-parser": "^6.0.9"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"peerDependencies": {
"postcss": "^8.4"
}
},
"node_modules/postcss-font-variant": {
"version": "5.0.0",
"dev": true,
"license": "MIT",
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/postcss-gap-properties": {
"version": "3.0.5",
"dev": true,
"license": "CC0-1.0",
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-image-set-function": {
"version": "4.0.7",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-import": {
"version": "15.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.0.0",
"read-cache": "^1.0.0",
"resolve": "^1.1.7"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"postcss": "^8.0.0"
}
},
"node_modules/postcss-initial": {
"version": "4.0.1",
"dev": true,
"license": "MIT",
"peerDependencies": {
"postcss": "^8.0.0"
}
},
"node_modules/postcss-js": {
"version": "4.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"camelcase-css": "^2.0.1"
},
"engines": {
"node": "^12 || ^14 || >= 16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": "^8.4.21"
}
},
"node_modules/postcss-lab-function": {
"version": "4.2.1",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"@csstools/postcss-progressive-custom-properties": "^1.1.0",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-load-config": {
"version": "4.0.2",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"lilconfig": "^3.0.0",
"yaml": "^2.3.4"
},
"engines": {
"node": ">= 14"
},
"peerDependencies": {
"postcss": ">=8.0.9",
"ts-node": ">=9.0.0"
},
"peerDependenciesMeta": {
"postcss": {
"optional": true
},
"ts-node": {
"optional": true
}
}
},
"node_modules/postcss-load-config/node_modules/lilconfig": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=14"
}
},
"node_modules/postcss-load-config/node_modules/yaml": {
"version": "2.3.4",
"dev": true,
"license": "ISC",
"engines": {
"node": ">= 14"
}
},
"node_modules/postcss-loader": {
"version": "6.2.1",
"dev": true,
"license": "MIT",
"dependencies": {
"cosmiconfig": "^7.0.0",
"klona": "^2.0.5",
"semver": "^7.3.5"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"postcss": "^7.0.0 || ^8.0.1",
"webpack": "^5.0.0"
}
},
"node_modules/postcss-logical": {
"version": "5.0.4",
"dev": true,
"license": "CC0-1.0",
"engines": {
"node": "^12 || ^14 || >=16"
},
"peerDependencies": {
"postcss": "^8.4"
}
},
"node_modules/postcss-media-minmax": {
"version": "5.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/postcss-merge-longhand": {
"version": "5.1.7",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0",
"stylehacks": "^5.1.1"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-merge-rules": {
"version": "5.1.4",
"dev": true,
"license": "MIT",
"dependencies": {
"browserslist": "^4.21.4",
"caniuse-api": "^3.0.0",
"cssnano-utils": "^3.1.0",
"postcss-selector-parser": "^6.0.5"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-minify-font-values": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-minify-gradients": {
"version": "5.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"colord": "^2.9.1",
"cssnano-utils": "^3.1.0",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-minify-params": {
"version": "5.1.4",
"dev": true,
"license": "MIT",
"dependencies": {
"browserslist": "^4.21.4",
"cssnano-utils": "^3.1.0",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-minify-selectors": {
"version": "5.2.1",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-selector-parser": "^6.0.5"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-modules-extract-imports": {
"version": "3.0.0",
"dev": true,
"license": "ISC",
"engines": {
"node": "^10 || ^12 || >= 14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/postcss-modules-local-by-default": {
"version": "4.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"icss-utils": "^5.0.0",
"postcss-selector-parser": "^6.0.2",
"postcss-value-parser": "^4.1.0"
},
"engines": {
"node": "^10 || ^12 || >= 14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/postcss-modules-scope": {
"version": "3.1.1",
"dev": true,
"license": "ISC",
"dependencies": {
"postcss-selector-parser": "^6.0.4"
},
"engines": {
"node": "^10 || ^12 || >= 14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/postcss-modules-values": {
"version": "4.0.0",
"dev": true,
"license": "ISC",
"dependencies": {
"icss-utils": "^5.0.0"
},
"engines": {
"node": "^10 || ^12 || >= 14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/postcss-nested": {
"version": "6.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-selector-parser": "^6.0.11"
},
"engines": {
"node": ">=12.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
"peerDependencies": {
"postcss": "^8.2.14"
}
},
"node_modules/postcss-nesting": {
"version": "10.2.0",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"@csstools/selector-specificity": "^2.0.0",
"postcss-selector-parser": "^6.0.10"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-normalize": {
"version": "10.0.1",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"@csstools/normalize.css": "*",
"postcss-browser-comments": "^4",
"sanitize.css": "*"
},
"engines": {
"node": ">= 12"
},
"peerDependencies": {
"browserslist": ">= 4",
"postcss": ">= 8"
}
},
"node_modules/postcss-normalize-charset": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-display-values": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-positions": {
"version": "5.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-repeat-style": {
"version": "5.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-string": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-timing-functions": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-unicode": {
"version": "5.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"browserslist": "^4.21.4",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-url": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"normalize-url": "^6.0.1",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-normalize-whitespace": {
"version": "5.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-opacity-percentage": {
"version": "1.1.3",
"dev": true,
"funding": [
{
"type": "kofi",
"url": "https://ko-fi.com/mrcgrtz"
},
{
"type": "liberapay",
"url": "https://liberapay.com/mrcgrtz"
}
],
"license": "MIT",
"engines": {
"node": "^12 || ^14 || >=16"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-ordered-values": {
"version": "5.1.3",
"dev": true,
"license": "MIT",
"dependencies": {
"cssnano-utils": "^3.1.0",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-overflow-shorthand": {
"version": "3.0.4",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-page-break": {
"version": "3.0.4",
"dev": true,
"license": "MIT",
"peerDependencies": {
"postcss": "^8"
}
},
"node_modules/postcss-place": {
"version": "7.0.5",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-preset-env": {
"version": "7.8.3",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"@csstools/postcss-cascade-layers": "^1.1.1",
"@csstools/postcss-color-function": "^1.1.1",
"@csstools/postcss-font-format-keywords": "^1.0.1",
"@csstools/postcss-hwb-function": "^1.0.2",
"@csstools/postcss-ic-unit": "^1.0.1",
"@csstools/postcss-is-pseudo-class": "^2.0.7",
"@csstools/postcss-nested-calc": "^1.0.0",
"@csstools/postcss-normalize-display-values": "^1.0.1",
"@csstools/postcss-oklab-function": "^1.1.1",
"@csstools/postcss-progressive-custom-properties": "^1.3.0",
"@csstools/postcss-stepped-value-functions": "^1.0.1",
"@csstools/postcss-text-decoration-shorthand": "^1.0.0",
"@csstools/postcss-trigonometric-functions": "^1.0.2",
"@csstools/postcss-unset-value": "^1.0.2",
"autoprefixer": "^10.4.13",
"browserslist": "^4.21.4",
"css-blank-pseudo": "^3.0.3",
"css-has-pseudo": "^3.0.4",
"css-prefers-color-scheme": "^6.0.3",
"cssdb": "^7.1.0",
"postcss-attribute-case-insensitive": "^5.0.2",
"postcss-clamp": "^4.1.0",
"postcss-color-functional-notation": "^4.2.4",
"postcss-color-hex-alpha": "^8.0.4",
"postcss-color-rebeccapurple": "^7.1.1",
"postcss-custom-media": "^8.0.2",
"postcss-custom-properties": "^12.1.10",
"postcss-custom-selectors": "^6.0.3",
"postcss-dir-pseudo-class": "^6.0.5",
"postcss-double-position-gradients": "^3.1.2",
"postcss-env-function": "^4.0.6",
"postcss-focus-visible": "^6.0.4",
"postcss-focus-within": "^5.0.4",
"postcss-font-variant": "^5.0.0",
"postcss-gap-properties": "^3.0.5",
"postcss-image-set-function": "^4.0.7",
"postcss-initial": "^4.0.1",
"postcss-lab-function": "^4.2.1",
"postcss-logical": "^5.0.4",
"postcss-media-minmax": "^5.0.0",
"postcss-nesting": "^10.2.0",
"postcss-opacity-percentage": "^1.1.2",
"postcss-overflow-shorthand": "^3.0.4",
"postcss-page-break": "^3.0.4",
"postcss-place": "^7.0.5",
"postcss-pseudo-class-any-link": "^7.1.6",
"postcss-replace-overflow-wrap": "^4.0.0",
"postcss-selector-not": "^6.0.1",
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-pseudo-class-any-link": {
"version": "7.1.6",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
"postcss-selector-parser": "^6.0.10"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-reduce-initial": {
"version": "5.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"browserslist": "^4.21.4",
"caniuse-api": "^3.0.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-reduce-transforms": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-replace-overflow-wrap": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"peerDependencies": {
"postcss": "^8.0.3"
}
},
"node_modules/postcss-selector-not": {
"version": "6.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-selector-parser": "^6.0.10"
},
"engines": {
"node": "^12 || ^14 || >=16"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/csstools"
},
"peerDependencies": {
"postcss": "^8.2"
}
},
"node_modules/postcss-selector-parser": {
"version": "6.0.15",
"dev": true,
"license": "MIT",
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
},
"engines": {
"node": ">=4"
}
},
"node_modules/postcss-svgo": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-value-parser": "^4.2.0",
"svgo": "^2.7.0"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-unique-selectors": {
"version": "5.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"postcss-selector-parser": "^6.0.5"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/postcss-value-parser": {
"version": "4.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"license": "MIT",
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/pretty-bytes": {
"version": "5.6.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/pretty-error": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"lodash": "^4.17.20",
"renderkid": "^3.0.0"
}
},
"node_modules/pretty-format": {
"version": "27.5.1",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1",
"ansi-styles": "^5.0.0",
"react-is": "^17.0.1"
},
"engines": {
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
"node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/process-nextick-args": {
"version": "2.0.1",
"dev": true,
"license": "MIT"
},
"node_modules/promise": {
"version": "8.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"asap": "~2.0.6"
}
},
"node_modules/prompts": {
"version": "2.4.2",
"dev": true,
"license": "MIT",
"dependencies": {
"kleur": "^3.0.3",
"sisteransi": "^1.0.5"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/prop-types": {
"version": "15.8.1",
"license": "MIT",
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.13.1"
}
},
"node_modules/prop-types/node_modules/react-is": {
"version": "16.13.1",
"license": "MIT"
},
"node_modules/protobufjs": {
"version": "6.11.4",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz",
"integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==",
"hasInstallScript": true,
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
"@protobufjs/codegen": "^2.0.4",
"@protobufjs/eventemitter": "^1.1.0",
"@protobufjs/fetch": "^1.1.0",
"@protobufjs/float": "^1.0.2",
"@protobufjs/inquire": "^1.1.0",
"@protobufjs/path": "^1.1.2",
"@protobufjs/pool": "^1.1.0",
"@protobufjs/utf8": "^1.1.0",
"@types/long": "^4.0.1",
"@types/node": ">=13.7.0",
"long": "^4.0.0"
},
"bin": {
"pbjs": "bin/pbjs",
"pbts": "bin/pbts"
}
},
"node_modules/proxy-addr": {
"version": "2.0.7",
"dev": true,
"license": "MIT",
"dependencies": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
},
"engines": {
"node": ">= 0.10"
}
},
"node_modules/proxy-addr/node_modules/ipaddr.js": {
"version": "1.9.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.10"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/psl": {
"version": "1.9.0",
"dev": true,
"license": "MIT"
},
"node_modules/public-encrypt": {
"version": "4.0.3",
"dev": true,
"license": "MIT",
"dependencies": {
"bn.js": "^4.1.0",
"browserify-rsa": "^4.0.0",
"create-hash": "^1.1.0",
"parse-asn1": "^5.0.0",
"randombytes": "^2.0.1",
"safe-buffer": "^5.1.2"
}
},
"node_modules/public-encrypt/node_modules/bn.js": {
"version": "4.12.0",
"dev": true,
"license": "MIT"
},
"node_modules/punycode": {
"version": "2.3.1",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/pure-rand": {
"version": "6.0.4",
"dev": true,
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/dubzzz"
},
{
"type": "opencollective",
"url": "https://opencollective.com/fast-check"
}
],
"license": "MIT"
},
"node_modules/qrcode.react": {
"version": "3.1.0",
"license": "ISC",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/qs": {
"version": "6.11.0",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"side-channel": "^1.0.4"
},
"engines": {
"node": ">=0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/querystringify": {
"version": "2.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/queue-microtask": {
"version": "1.2.3",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/raf": {
"version": "3.4.1",
"dev": true,
"license": "MIT",
"dependencies": {
"performance-now": "^2.1.0"
}
},
"node_modules/randombytes": {
"version": "2.1.0",
"license": "MIT",
"dependencies": {
"safe-buffer": "^5.1.0"
}
},
"node_modules/randomfill": {
"version": "1.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"randombytes": "^2.0.5",
"safe-buffer": "^5.1.0"
}
},
"node_modules/range-parser": {
"version": "1.2.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/raw-body": {
"version": "2.5.1",
"dev": true,
"license": "MIT",
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"unpipe": "1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/raw-body/node_modules/bytes": {
"version": "3.1.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/raw-body/node_modules/iconv-lite": {
"version": "0.4.24",
"dev": true,
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react": {
"version": "18.2.0",
"license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-app-polyfill": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"core-js": "^3.19.2",
"object-assign": "^4.1.1",
"promise": "^8.1.0",
"raf": "^3.4.1",
"regenerator-runtime": "^0.13.9",
"whatwg-fetch": "^3.6.2"
},
"engines": {
"node": ">=14"
}
},
"node_modules/react-app-polyfill/node_modules/regenerator-runtime": {
"version": "0.13.11",
"dev": true,
"license": "MIT"
},
"node_modules/react-dev-utils": {
"version": "12.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.16.0",
"address": "^1.1.2",
"browserslist": "^4.18.1",
"chalk": "^4.1.2",
"cross-spawn": "^7.0.3",
"detect-port-alt": "^1.1.6",
"escape-string-regexp": "^4.0.0",
"filesize": "^8.0.6",
"find-up": "^5.0.0",
"fork-ts-checker-webpack-plugin": "^6.5.0",
"global-modules": "^2.0.0",
"globby": "^11.0.4",
"gzip-size": "^6.0.0",
"immer": "^9.0.7",
"is-root": "^2.1.0",
"loader-utils": "^3.2.0",
"open": "^8.4.0",
"pkg-up": "^3.1.0",
"prompts": "^2.4.2",
"react-error-overlay": "^6.0.11",
"recursive-readdir": "^2.2.2",
"shell-quote": "^1.7.3",
"strip-ansi": "^6.0.1",
"text-table": "^0.2.0"
},
"engines": {
"node": ">=14"
}
},
"node_modules/react-dev-utils/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/react-dev-utils/node_modules/chalk": {
"version": "4.1.2",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/react-dev-utils/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/react-dev-utils/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/react-dev-utils/node_modules/escape-string-regexp": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/react-dev-utils/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/react-dev-utils/node_modules/loader-utils": {
"version": "3.2.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 12.13.0"
}
},
"node_modules/react-dev-utils/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/react-dom": {
"version": "18.2.0",
"license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.0"
},
"peerDependencies": {
"react": "^18.2.0"
}
},
"node_modules/react-easy-crop": {
"version": "5.0.6",
"resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-5.0.6.tgz",
"integrity": "sha512-LV8te8NGC72k3l8uAqPAw73D2i9AbRlZqyo1Xz8VetwiMfkSKYgyqE3IFEwf5h+1g7AS1nMxBKk6ZPdhvLw6MQ==",
"dependencies": {
"normalize-wheel": "^1.0.1",
"tslib": "2.0.1"
},
"peerDependencies": {
"react": ">=16.4.0",
"react-dom": ">=16.4.0"
}
},
"node_modules/react-easy-crop/node_modules/tslib": {
"version": "2.0.1",
"license": "0BSD"
},
"node_modules/react-error-overlay": {
"version": "6.0.11",
"dev": true,
"license": "MIT"
},
"node_modules/react-ga": {
"version": "3.3.1",
"license": "Apache-2.0",
"peerDependencies": {
"prop-types": "^15.6.0",
"react": "^15.6.2 || ^16.0 || ^17 || ^18"
}
},
"node_modules/react-is": {
"version": "17.0.2",
"dev": true,
"license": "MIT"
},
"node_modules/react-refresh": {
"version": "0.11.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-router": {
"version": "6.22.0",
"license": "MIT",
"dependencies": {
"@remix-run/router": "1.15.0"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"react": ">=16.8"
}
},
"node_modules/react-router-dom": {
"version": "6.22.0",
"license": "MIT",
"dependencies": {
"@remix-run/router": "1.15.0",
"react-router": "6.22.0"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"react": ">=16.8",
"react-dom": ">=16.8"
}
},
"node_modules/react-toastify": {
"version": "10.0.5",
"license": "MIT",
"dependencies": {
"clsx": "^2.1.0"
},
"peerDependencies": {
"react": ">=18",
"react-dom": ">=18"
}
},
"node_modules/read-cache": {
"version": "1.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"pify": "^2.3.0"
}
},
"node_modules/readable-stream": {
"version": "3.6.2",
"license": "MIT",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/readdirp": {
"version": "3.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/recursive-readdir": {
"version": "2.2.3",
"dev": true,
"license": "MIT",
"dependencies": {
"minimatch": "^3.0.5"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/redent": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"indent-string": "^4.0.0",
"strip-indent": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/reflect.getprototypeof": {
"version": "1.0.5",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.5",
"define-properties": "^1.2.1",
"es-abstract": "^1.22.3",
"es-errors": "^1.0.0",
"get-intrinsic": "^1.2.3",
"globalthis": "^1.0.3",
"which-builtin-type": "^1.1.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/regenerate": {
"version": "1.4.2",
"dev": true,
"license": "MIT"
},
"node_modules/regenerate-unicode-properties": {
"version": "10.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"regenerate": "^1.4.2"
},
"engines": {
"node": ">=4"
}
},
"node_modules/regenerator-runtime": {
"version": "0.14.1",
"dev": true,
"license": "MIT"
},
"node_modules/regenerator-transform": {
"version": "0.15.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.8.4"
}
},
"node_modules/regex-parser": {
"version": "2.3.0",
"dev": true,
"license": "MIT"
},
"node_modules/regexp.prototype.flags": {
"version": "1.5.1",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"set-function-name": "^2.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/regexpu-core": {
"version": "5.3.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/regjsgen": "^0.8.0",
"regenerate": "^1.4.2",
"regenerate-unicode-properties": "^10.1.0",
"regjsparser": "^0.9.1",
"unicode-match-property-ecmascript": "^2.0.0",
"unicode-match-property-value-ecmascript": "^2.1.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/regjsparser": {
"version": "0.9.1",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"jsesc": "~0.5.0"
},
"bin": {
"regjsparser": "bin/parser"
}
},
"node_modules/regjsparser/node_modules/jsesc": {
"version": "0.5.0",
"dev": true,
"bin": {
"jsesc": "bin/jsesc"
}
},
"node_modules/relateurl": {
"version": "0.2.7",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.10"
}
},
"node_modules/renderkid": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"css-select": "^4.1.3",
"dom-converter": "^0.2.0",
"htmlparser2": "^6.1.0",
"lodash": "^4.17.21",
"strip-ansi": "^6.0.1"
}
},
"node_modules/require-directory": {
"version": "2.1.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/require-from-string": {
"version": "2.0.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/requireindex": {
"version": "1.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.5"
}
},
"node_modules/requires-port": {
"version": "1.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/resolve": {
"version": "1.22.8",
"dev": true,
"license": "MIT",
"dependencies": {
"is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
},
"bin": {
"resolve": "bin/resolve"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/resolve-cwd": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"resolve-from": "^5.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/resolve-from": {
"version": "5.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/resolve-url-loader": {
"version": "5.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"adjust-sourcemap-loader": "^4.0.0",
"convert-source-map": "^1.7.0",
"loader-utils": "^2.0.0",
"postcss": "^8.2.14",
"source-map": "0.6.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/resolve-url-loader/node_modules/convert-source-map": {
"version": "1.9.0",
"dev": true,
"license": "MIT"
},
"node_modules/resolve-url-loader/node_modules/source-map": {
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/resolve.exports": {
"version": "2.0.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/retry": {
"version": "0.13.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/reusify": {
"version": "1.0.4",
"license": "MIT",
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
}
},
"node_modules/rimraf": {
"version": "3.0.2",
"license": "ISC",
"dependencies": {
"glob": "^7.1.3"
},
"bin": {
"rimraf": "bin.js"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/ripemd160": {
"version": "2.0.2",
"license": "MIT",
"dependencies": {
"hash-base": "^3.0.0",
"inherits": "^2.0.1"
}
},
"node_modules/rollup": {
"version": "2.79.1",
"dev": true,
"license": "MIT",
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
"node": ">=10.0.0"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/rollup-plugin-terser": {
"version": "7.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.10.4",
"jest-worker": "^26.2.1",
"serialize-javascript": "^4.0.0",
"terser": "^5.0.0"
},
"peerDependencies": {
"rollup": "^2.0.0"
}
},
"node_modules/rollup-plugin-terser/node_modules/has-flag": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/rollup-plugin-terser/node_modules/jest-worker": {
"version": "26.6.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*",
"merge-stream": "^2.0.0",
"supports-color": "^7.0.0"
},
"engines": {
"node": ">= 10.13.0"
}
},
"node_modules/rollup-plugin-terser/node_modules/serialize-javascript": {
"version": "4.0.0",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"randombytes": "^2.1.0"
}
},
"node_modules/rollup-plugin-terser/node_modules/supports-color": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/run-parallel": {
"version": "1.2.0",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"queue-microtask": "^1.2.2"
}
},
"node_modules/safe-array-concat": {
"version": "1.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.5",
"get-intrinsic": "^1.2.2",
"has-symbols": "^1.0.3",
"isarray": "^2.0.5"
},
"engines": {
"node": ">=0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/safe-regex-test": {
"version": "1.0.3",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.6",
"es-errors": "^1.3.0",
"is-regex": "^1.1.4"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"dev": true,
"license": "MIT"
},
"node_modules/sanitize.css": {
"version": "13.0.0",
"dev": true,
"license": "CC0-1.0"
},
"node_modules/sass-loader": {
"version": "12.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"klona": "^2.0.4",
"neo-async": "^2.6.2"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"fibers": ">= 3.1.0",
"node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
"sass": "^1.3.0",
"sass-embedded": "*",
"webpack": "^5.0.0"
},
"peerDependenciesMeta": {
"fibers": {
"optional": true
},
"node-sass": {
"optional": true
},
"sass": {
"optional": true
},
"sass-embedded": {
"optional": true
}
}
},
"node_modules/saxes": {
"version": "6.0.0",
"dev": true,
"license": "ISC",
"dependencies": {
"xmlchars": "^2.2.0"
},
"engines": {
"node": ">=v12.22.7"
}
},
"node_modules/scheduler": {
"version": "0.23.0",
"license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0"
}
},
"node_modules/schema-utils": {
"version": "3.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
"ajv-keywords": "^3.5.2"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/secp256k1": {
"version": "3.8.0",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"bindings": "^1.5.0",
"bip66": "^1.1.5",
"bn.js": "^4.11.8",
"create-hash": "^1.2.0",
"drbg.js": "^1.0.1",
"elliptic": "^6.5.2",
"nan": "^2.14.0",
"safe-buffer": "^5.1.2"
},
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/secp256k1/node_modules/bn.js": {
"version": "4.12.0",
"license": "MIT"
},
"node_modules/select-hose": {
"version": "2.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/selfsigned": {
"version": "2.4.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node-forge": "^1.3.0",
"node-forge": "^1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/semver": {
"version": "7.6.0",
"dev": true,
"license": "ISC",
"dependencies": {
"lru-cache": "^6.0.0"
},
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/semver/node_modules/lru-cache": {
"version": "6.0.0",
"dev": true,
"license": "ISC",
"dependencies": {
"yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/semver/node_modules/yallist": {
"version": "4.0.0",
"dev": true,
"license": "ISC"
},
"node_modules/send": {
"version": "0.18.0",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"mime": "1.6.0",
"ms": "2.1.3",
"on-finished": "2.4.1",
"range-parser": "~1.2.1",
"statuses": "2.0.1"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/send/node_modules/debug": {
"version": "2.6.9",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/send/node_modules/debug/node_modules/ms": {
"version": "2.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/send/node_modules/ms": {
"version": "2.1.3",
"dev": true,
"license": "MIT"
},
"node_modules/serialize-javascript": {
"version": "6.0.2",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"randombytes": "^2.1.0"
}
},
"node_modules/serve-index": {
"version": "1.9.1",
"dev": true,
"license": "MIT",
"dependencies": {
"accepts": "~1.3.4",
"batch": "0.6.1",
"debug": "2.6.9",
"escape-html": "~1.0.3",
"http-errors": "~1.6.2",
"mime-types": "~2.1.17",
"parseurl": "~1.3.2"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/serve-index/node_modules/debug": {
"version": "2.6.9",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/serve-index/node_modules/depd": {
"version": "1.1.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/serve-index/node_modules/http-errors": {
"version": "1.6.3",
"dev": true,
"license": "MIT",
"dependencies": {
"depd": "~1.1.2",
"inherits": "2.0.3",
"setprototypeof": "1.1.0",
"statuses": ">= 1.4.0 < 2"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/serve-index/node_modules/inherits": {
"version": "2.0.3",
"dev": true,
"license": "ISC"
},
"node_modules/serve-index/node_modules/ms": {
"version": "2.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/serve-index/node_modules/setprototypeof": {
"version": "1.1.0",
"dev": true,
"license": "ISC"
},
"node_modules/serve-index/node_modules/statuses": {
"version": "1.5.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/serve-static": {
"version": "1.15.0",
"dev": true,
"license": "MIT",
"dependencies": {
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
"send": "0.18.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/set-function-length": {
"version": "1.2.1",
"dev": true,
"license": "MIT",
"dependencies": {
"define-data-property": "^1.1.2",
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.3",
"gopd": "^1.0.1",
"has-property-descriptors": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/set-function-name": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"define-data-property": "^1.0.1",
"functions-have-names": "^1.2.3",
"has-property-descriptors": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/setprototypeof": {
"version": "1.2.0",
"dev": true,
"license": "ISC"
},
"node_modules/sha.js": {
"version": "2.4.11",
"license": "(MIT AND BSD-3-Clause)",
"dependencies": {
"inherits": "^2.0.1",
"safe-buffer": "^5.0.1"
},
"bin": {
"sha.js": "bin.js"
}
},
"node_modules/shebang-command": {
"version": "2.0.0",
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/shebang-regex": {
"version": "3.0.0",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/shell-quote": {
"version": "1.8.1",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel": {
"version": "1.0.5",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.6",
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.4",
"object-inspect": "^1.13.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/signal-exit": {
"version": "3.0.7",
"dev": true,
"license": "ISC"
},
"node_modules/sisteransi": {
"version": "1.0.5",
"dev": true,
"license": "MIT"
},
"node_modules/slash": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/slp-mdm": {
"version": "0.0.6",
"license": "MIT",
"dependencies": {
"bignumber.js": "^9.0.0"
}
},
"node_modules/sockjs": {
"version": "0.3.24",
"dev": true,
"license": "MIT",
"dependencies": {
"faye-websocket": "^0.11.3",
"uuid": "^8.3.2",
"websocket-driver": "^0.7.4"
}
},
"node_modules/source-list-map": {
"version": "2.0.1",
"dev": true,
"license": "MIT"
},
"node_modules/source-map": {
"version": "0.7.4",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">= 8"
}
},
"node_modules/source-map-js": {
"version": "1.0.2",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-loader": {
"version": "3.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"abab": "^2.0.5",
"iconv-lite": "^0.6.3",
"source-map-js": "^1.0.1"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^5.0.0"
}
},
"node_modules/source-map-support": {
"version": "0.5.13",
"dev": true,
"license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/source-map-support/node_modules/source-map": {
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/sourcemap-codec": {
"version": "1.4.8",
"dev": true,
"license": "MIT"
},
"node_modules/spdy": {
"version": "4.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.1.0",
"handle-thing": "^2.0.0",
"http-deceiver": "^1.2.7",
"select-hose": "^2.0.0",
"spdy-transport": "^3.0.0"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/spdy-transport": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.1.0",
"detect-node": "^2.0.4",
"hpack.js": "^2.1.6",
"obuf": "^1.1.2",
"readable-stream": "^3.0.6",
"wbuf": "^1.7.3"
}
},
"node_modules/sprintf-js": {
"version": "1.0.3",
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/stable": {
"version": "0.1.8",
"dev": true,
"license": "MIT"
},
"node_modules/stack-utils": {
"version": "2.0.6",
"dev": true,
"license": "MIT",
"dependencies": {
"escape-string-regexp": "^2.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/stack-utils/node_modules/escape-string-regexp": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/stackframe": {
"version": "1.3.4",
"dev": true,
"license": "MIT"
},
"node_modules/static-eval": {
"version": "2.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"escodegen": "^1.8.1"
}
},
"node_modules/static-eval/node_modules/escodegen": {
"version": "1.14.3",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"esprima": "^4.0.1",
"estraverse": "^4.2.0",
"esutils": "^2.0.2",
"optionator": "^0.8.1"
},
"bin": {
"escodegen": "bin/escodegen.js",
"esgenerate": "bin/esgenerate.js"
},
"engines": {
"node": ">=4.0"
},
"optionalDependencies": {
"source-map": "~0.6.1"
}
},
"node_modules/static-eval/node_modules/estraverse": {
"version": "4.3.0",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=4.0"
}
},
"node_modules/static-eval/node_modules/levn": {
"version": "0.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"prelude-ls": "~1.1.2",
"type-check": "~0.3.2"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/static-eval/node_modules/optionator": {
"version": "0.8.3",
"dev": true,
"license": "MIT",
"dependencies": {
"deep-is": "~0.1.3",
"fast-levenshtein": "~2.0.6",
"levn": "~0.3.0",
"prelude-ls": "~1.1.2",
"type-check": "~0.3.2",
"word-wrap": "~1.2.3"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/static-eval/node_modules/prelude-ls": {
"version": "1.1.2",
"dev": true,
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/static-eval/node_modules/source-map": {
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
"optional": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/static-eval/node_modules/type-check": {
"version": "0.3.2",
"dev": true,
"license": "MIT",
"dependencies": {
"prelude-ls": "~1.1.2"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/statuses": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/stop-iteration-iterator": {
"version": "1.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"internal-slot": "^1.0.4"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/stream-browserify": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"inherits": "~2.0.4",
"readable-stream": "^3.5.0"
}
},
"node_modules/string_decoder": {
"version": "1.3.0",
"license": "MIT",
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/string-length": {
"version": "4.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"char-regex": "^1.0.2",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/string-natural-compare": {
"version": "3.0.1",
"dev": true,
"license": "MIT"
},
"node_modules/string-width": {
"version": "4.2.3",
"dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/string-width-cjs": {
"name": "string-width",
"version": "4.2.3",
"dev": true,
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/string-width-cjs/node_modules/emoji-regex": {
"version": "8.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/string-width/node_modules/emoji-regex": {
"version": "8.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/string.prototype.matchall": {
"version": "4.0.10",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1",
"get-intrinsic": "^1.2.1",
"has-symbols": "^1.0.3",
"internal-slot": "^1.0.5",
"regexp.prototype.flags": "^1.5.0",
"set-function-name": "^2.0.0",
"side-channel": "^1.0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/string.prototype.trim": {
"version": "1.2.8",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/string.prototype.trimend": {
"version": "1.0.7",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/string.prototype.trimstart": {
"version": "1.0.7",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"es-abstract": "^1.22.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/stringify-object": {
"version": "3.3.0",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"get-own-enumerable-property-symbols": "^3.0.0",
"is-obj": "^1.0.1",
"is-regexp": "^1.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/strip-ansi": {
"version": "6.0.1",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi-cjs": {
"name": "strip-ansi",
"version": "6.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-bom": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/strip-comments": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/strip-final-newline": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/strip-indent": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"min-indent": "^1.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-json-comments": {
"version": "3.1.1",
"license": "MIT",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/style-loader": {
"version": "3.3.4",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^5.0.0"
}
},
"node_modules/styled-components": {
"version": "4.4.1",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.0.0",
"@babel/traverse": "^7.0.0",
"@emotion/is-prop-valid": "^0.8.1",
"@emotion/unitless": "^0.7.0",
"babel-plugin-styled-components": ">= 1",
"css-to-react-native": "^2.2.2",
"memoize-one": "^5.0.0",
"merge-anything": "^2.2.4",
"prop-types": "^15.5.4",
"react-is": "^16.6.0",
"stylis": "^3.5.0",
"stylis-rule-sheet": "^0.0.10",
"supports-color": "^5.5.0"
},
"peerDependencies": {
"react": ">= 16.3.0",
"react-dom": ">= 16.3.0"
}
},
"node_modules/styled-components/node_modules/react-is": {
"version": "16.13.1",
"dev": true,
"license": "MIT"
},
"node_modules/styled-components/node_modules/stylis": {
"version": "3.5.4",
"dev": true,
"license": "MIT"
},
"node_modules/styled-components/node_modules/stylis-rule-sheet": {
"version": "0.0.10",
"dev": true,
"license": "MIT",
"peerDependencies": {
"stylis": "^3.5.0"
}
},
"node_modules/stylehacks": {
"version": "5.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"browserslist": "^4.21.4",
"postcss-selector-parser": "^6.0.4"
},
"engines": {
"node": "^10 || ^12 || >=14.0"
},
"peerDependencies": {
"postcss": "^8.2.15"
}
},
"node_modules/sucrase": {
"version": "3.35.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.2",
"commander": "^4.0.0",
"glob": "^10.3.10",
"lines-and-columns": "^1.1.6",
"mz": "^2.7.0",
"pirates": "^4.0.1",
"ts-interface-checker": "^0.1.9"
},
"bin": {
"sucrase": "bin/sucrase",
"sucrase-node": "bin/sucrase-node"
},
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
"node_modules/sucrase/node_modules/brace-expansion": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/sucrase/node_modules/commander": {
"version": "4.1.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
}
},
"node_modules/sucrase/node_modules/glob": {
"version": "10.3.10",
"dev": true,
"license": "ISC",
"dependencies": {
"foreground-child": "^3.1.0",
"jackspeak": "^2.3.5",
"minimatch": "^9.0.1",
"minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
"path-scurry": "^1.10.1"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/sucrase/node_modules/minimatch": {
"version": "9.0.3",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/supports-color": {
"version": "5.5.0",
"dev": true,
"license": "MIT",
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/svg-parser": {
"version": "2.0.4",
"dev": true,
"license": "MIT"
},
"node_modules/svgo": {
"version": "2.8.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@trysound/sax": "0.2.0",
"commander": "^7.2.0",
"css-select": "^4.1.3",
"css-tree": "^1.1.3",
"csso": "^4.2.0",
"picocolors": "^1.0.0",
"stable": "^0.1.8"
},
"bin": {
"svgo": "bin/svgo"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/svgo/node_modules/commander": {
"version": "7.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10"
}
},
"node_modules/symbol-tree": {
"version": "3.2.4",
"dev": true,
"license": "MIT"
},
"node_modules/tailwindcss": {
"version": "3.4.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"arg": "^5.0.2",
"chokidar": "^3.5.3",
"didyoumean": "^1.2.2",
"dlv": "^1.1.3",
"fast-glob": "^3.3.0",
"glob-parent": "^6.0.2",
"is-glob": "^4.0.3",
"jiti": "^1.19.1",
"lilconfig": "^2.1.0",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"object-hash": "^3.0.0",
"picocolors": "^1.0.0",
"postcss": "^8.4.23",
"postcss-import": "^15.1.0",
"postcss-js": "^4.0.1",
"postcss-load-config": "^4.0.1",
"postcss-nested": "^6.0.1",
"postcss-selector-parser": "^6.0.11",
"resolve": "^1.22.2",
"sucrase": "^3.32.0"
},
"bin": {
"tailwind": "lib/cli.js",
"tailwindcss": "lib/cli.js"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/tapable": {
"version": "2.2.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/temp-dir": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/tempy": {
"version": "0.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"is-stream": "^2.0.0",
"temp-dir": "^2.0.0",
"type-fest": "^0.16.0",
"unique-string": "^2.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/tempy/node_modules/type-fest": {
"version": "0.16.0",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/terser": {
"version": "5.27.0",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.8.2",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
"bin": {
"terser": "bin/terser"
},
"engines": {
"node": ">=10"
}
},
"node_modules/terser-webpack-plugin": {
"version": "5.3.10",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.20",
"jest-worker": "^27.4.5",
"schema-utils": "^3.1.1",
"serialize-javascript": "^6.0.1",
"terser": "^5.26.0"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^5.1.0"
},
"peerDependenciesMeta": {
"@swc/core": {
"optional": true
},
"esbuild": {
"optional": true
},
"uglify-js": {
"optional": true
}
}
},
"node_modules/terser/node_modules/commander": {
"version": "2.20.3",
"dev": true,
"license": "MIT"
},
"node_modules/terser/node_modules/source-map": {
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/terser/node_modules/source-map-support": {
"version": "0.5.21",
"dev": true,
"license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/test-exclude": {
"version": "6.0.0",
"dev": true,
"license": "ISC",
"dependencies": {
"@istanbuljs/schema": "^0.1.2",
"glob": "^7.1.4",
"minimatch": "^3.0.4"
},
"engines": {
"node": ">=8"
}
},
"node_modules/text-table": {
"version": "0.2.0",
"license": "MIT"
},
"node_modules/thenify": {
"version": "3.3.1",
"dev": true,
"license": "MIT",
"dependencies": {
"any-promise": "^1.0.0"
}
},
"node_modules/thenify-all": {
"version": "1.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"thenify": ">= 3.1.0 < 4"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/thunky": {
"version": "1.1.0",
"dev": true,
"license": "MIT"
},
"node_modules/tmpl": {
"version": "1.0.5",
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
"engines": {
"node": ">=8.0"
}
},
"node_modules/toidentifier": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.6"
}
},
"node_modules/tough-cookie": {
"version": "4.1.3",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"psl": "^1.1.33",
"punycode": "^2.1.1",
"universalify": "^0.2.0",
"url-parse": "^1.5.3"
},
"engines": {
"node": ">=6"
}
},
"node_modules/tough-cookie/node_modules/universalify": {
"version": "0.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/tr46": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"punycode": "^2.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/tryer": {
"version": "1.0.1",
"dev": true,
"license": "MIT"
},
"node_modules/ts-custom-error": {
"version": "3.3.1",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/ts-interface-checker": {
"version": "0.1.13",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/tsconfig-paths": {
"version": "3.15.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/json5": "^0.0.29",
"json5": "^1.0.2",
"minimist": "^1.2.6",
"strip-bom": "^3.0.0"
}
},
"node_modules/tsconfig-paths/node_modules/json5": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"minimist": "^1.2.0"
},
"bin": {
"json5": "lib/cli.js"
}
},
"node_modules/tsconfig-paths/node_modules/strip-bom": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/tslib": {
"version": "2.6.2",
"dev": true,
"license": "0BSD"
},
"node_modules/tsutils": {
"version": "3.21.0",
"dev": true,
"license": "MIT",
"dependencies": {
"tslib": "^1.8.1"
},
"engines": {
"node": ">= 6"
},
"peerDependencies": {
"typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
}
},
"node_modules/tsutils-etc": {
"version": "1.4.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/yargs": "^17.0.0",
"yargs": "^17.0.0"
},
"bin": {
"ts-flags": "bin/ts-flags",
"ts-kind": "bin/ts-kind"
},
"peerDependencies": {
"tsutils": "^3.0.0",
"typescript": ">=4.0.0"
}
},
"node_modules/tsutils/node_modules/tslib": {
"version": "1.14.1",
"dev": true,
"license": "0BSD"
},
"node_modules/type-check": {
"version": "0.4.0",
"license": "MIT",
"dependencies": {
"prelude-ls": "^1.2.1"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/type-detect": {
"version": "4.0.8",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/type-fest": {
"version": "0.21.3",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/type-is": {
"version": "1.6.18",
"dev": true,
"license": "MIT",
"dependencies": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/typed-array-buffer": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.6",
"es-errors": "^1.3.0",
"is-typed-array": "^1.1.13"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/typed-array-byte-length": {
"version": "1.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"for-each": "^0.3.3",
"has-proto": "^1.0.1",
"is-typed-array": "^1.1.10"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/typed-array-byte-offset": {
"version": "1.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2",
"for-each": "^0.3.3",
"has-proto": "^1.0.1",
"is-typed-array": "^1.1.10"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/typed-array-length": {
"version": "1.0.4",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"for-each": "^0.3.3",
"is-typed-array": "^1.1.9"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/typeforce": {
"version": "1.18.0",
"license": "MIT"
},
"node_modules/typescript": {
"version": "4.9.5",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=4.2.0"
}
},
"node_modules/unbox-primitive": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"has-bigints": "^1.0.2",
"has-symbols": "^1.0.3",
"which-boxed-primitive": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/underscore": {
"version": "1.12.1",
"dev": true,
"license": "MIT"
},
"node_modules/undici-types": {
"version": "5.26.5",
"license": "MIT"
},
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/unicode-match-property-ecmascript": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"unicode-canonical-property-names-ecmascript": "^2.0.0",
"unicode-property-aliases-ecmascript": "^2.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/unicode-match-property-value-ecmascript": {
"version": "2.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/unicode-property-aliases-ecmascript": {
"version": "2.1.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/unique-string": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"crypto-random-string": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/universalify": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/unpipe": {
"version": "1.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/upath": {
"version": "1.2.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=4",
"yarn": "*"
}
},
"node_modules/update-browserslist-db": {
"version": "1.0.13",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"escalade": "^3.1.1",
"picocolors": "^1.0.0"
},
"bin": {
"update-browserslist-db": "cli.js"
},
"peerDependencies": {
"browserslist": ">= 4.21.0"
}
},
"node_modules/uri-js": {
"version": "4.4.1",
"license": "BSD-2-Clause",
"dependencies": {
"punycode": "^2.1.0"
}
},
"node_modules/url-parse": {
"version": "1.5.10",
"dev": true,
"license": "MIT",
"dependencies": {
"querystringify": "^2.1.1",
"requires-port": "^1.0.0"
}
},
"node_modules/util": {
"version": "0.12.5",
"dev": true,
"license": "MIT",
"dependencies": {
"inherits": "^2.0.3",
"is-arguments": "^1.0.4",
"is-generator-function": "^1.0.7",
"is-typed-array": "^1.1.3",
"which-typed-array": "^1.1.2"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"license": "MIT"
},
"node_modules/utila": {
"version": "0.4.0",
"dev": true,
"license": "MIT"
},
"node_modules/utils-merge": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/uuid": {
"version": "8.3.2",
"dev": true,
"license": "MIT",
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/v8-to-istanbul": {
"version": "9.2.0",
"dev": true,
"license": "ISC",
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.12",
"@types/istanbul-lib-coverage": "^2.0.1",
"convert-source-map": "^2.0.0"
},
"engines": {
"node": ">=10.12.0"
}
},
"node_modules/varuint-bitcoin": {
"version": "1.1.2",
"license": "MIT",
"dependencies": {
"safe-buffer": "^5.1.1"
}
},
"node_modules/vary": {
"version": "1.1.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/w3c-xmlserializer": {
"version": "4.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"xml-name-validator": "^4.0.0"
},
"engines": {
"node": ">=14"
}
},
"node_modules/walker": {
"version": "1.0.8",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"makeerror": "1.0.12"
}
},
"node_modules/watchpack": {
"version": "2.4.0",
"dev": true,
"license": "MIT",
"dependencies": {
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.1.2"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/wbuf": {
"version": "1.7.3",
"dev": true,
"license": "MIT",
"dependencies": {
"minimalistic-assert": "^1.0.0"
}
},
"node_modules/web-vitals": {
"version": "2.1.4",
"dev": true,
"license": "Apache-2.0"
},
"node_modules/webidl-conversions": {
"version": "7.0.0",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=12"
}
},
"node_modules/webpack": {
"version": "5.90.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/eslint-scope": "^3.7.3",
"@types/estree": "^1.0.5",
"@webassemblyjs/ast": "^1.11.5",
"@webassemblyjs/wasm-edit": "^1.11.5",
"@webassemblyjs/wasm-parser": "^1.11.5",
"acorn": "^8.7.1",
"acorn-import-assertions": "^1.9.0",
"browserslist": "^4.21.10",
"chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.15.0",
"es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1",
"events": "^3.2.0",
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.2.9",
"json-parse-even-better-errors": "^2.3.1",
"loader-runner": "^4.2.0",
"mime-types": "^2.1.27",
"neo-async": "^2.6.2",
"schema-utils": "^3.2.0",
"tapable": "^2.1.1",
"terser-webpack-plugin": "^5.3.10",
"watchpack": "^2.4.0",
"webpack-sources": "^3.2.3"
},
"bin": {
"webpack": "bin/webpack.js"
},
"engines": {
"node": ">=10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependenciesMeta": {
"webpack-cli": {
"optional": true
}
}
},
"node_modules/webpack-dev-middleware": {
"version": "5.3.4",
"dev": true,
"license": "MIT",
"dependencies": {
"colorette": "^2.0.10",
"memfs": "^3.4.3",
"mime-types": "^2.1.31",
"range-parser": "^1.2.1",
"schema-utils": "^4.0.0"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^4.0.0 || ^5.0.0"
}
},
"node_modules/webpack-dev-middleware/node_modules/ajv": {
"version": "8.12.0",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/webpack-dev-middleware/node_modules/ajv-keywords": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
"peerDependencies": {
"ajv": "^8.8.2"
}
},
"node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": {
"version": "1.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/webpack-dev-middleware/node_modules/schema-utils": {
"version": "4.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
"ajv-formats": "^2.1.1",
"ajv-keywords": "^5.1.0"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/webpack-dev-server": {
"version": "4.15.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/bonjour": "^3.5.9",
"@types/connect-history-api-fallback": "^1.3.5",
"@types/express": "^4.17.13",
"@types/serve-index": "^1.9.1",
"@types/serve-static": "^1.13.10",
"@types/sockjs": "^0.3.33",
"@types/ws": "^8.5.5",
"ansi-html-community": "^0.0.8",
"bonjour-service": "^1.0.11",
"chokidar": "^3.5.3",
"colorette": "^2.0.10",
"compression": "^1.7.4",
"connect-history-api-fallback": "^2.0.0",
"default-gateway": "^6.0.3",
"express": "^4.17.3",
"graceful-fs": "^4.2.6",
"html-entities": "^2.3.2",
"http-proxy-middleware": "^2.0.3",
"ipaddr.js": "^2.0.1",
"launch-editor": "^2.6.0",
"open": "^8.0.9",
"p-retry": "^4.5.0",
"rimraf": "^3.0.2",
"schema-utils": "^4.0.0",
"selfsigned": "^2.1.1",
"serve-index": "^1.9.1",
"sockjs": "^0.3.24",
"spdy": "^4.0.2",
"webpack-dev-middleware": "^5.3.1",
"ws": "^8.13.0"
},
"bin": {
"webpack-dev-server": "bin/webpack-dev-server.js"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^4.37.0 || ^5.0.0"
},
"peerDependenciesMeta": {
"webpack": {
"optional": true
},
"webpack-cli": {
"optional": true
}
}
},
"node_modules/webpack-dev-server/node_modules/ajv": {
"version": "8.12.0",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/webpack-dev-server/node_modules/ajv-keywords": {
"version": "5.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
"peerDependencies": {
"ajv": "^8.8.2"
}
},
"node_modules/webpack-dev-server/node_modules/json-schema-traverse": {
"version": "1.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/webpack-dev-server/node_modules/schema-utils": {
"version": "4.2.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
"ajv-formats": "^2.1.1",
"ajv-keywords": "^5.1.0"
},
"engines": {
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/webpack-manifest-plugin": {
"version": "4.1.1",
"dev": true,
"license": "MIT",
"dependencies": {
"tapable": "^2.0.0",
"webpack-sources": "^2.2.0"
},
"engines": {
"node": ">=12.22.0"
},
"peerDependencies": {
"webpack": "^4.44.2 || ^5.47.0"
}
},
"node_modules/webpack-manifest-plugin/node_modules/source-map": {
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/webpack-manifest-plugin/node_modules/webpack-sources": {
"version": "2.3.1",
"dev": true,
"license": "MIT",
"dependencies": {
"source-list-map": "^2.0.1",
"source-map": "^0.6.1"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/webpack-sources": {
"version": "3.2.3",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/webpack/node_modules/eslint-scope": {
"version": "5.1.1",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/webpack/node_modules/estraverse": {
"version": "4.3.0",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=4.0"
}
},
"node_modules/websocket-driver": {
"version": "0.7.4",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"http-parser-js": ">=0.5.1",
"safe-buffer": ">=5.1.0",
"websocket-extensions": ">=0.1.1"
},
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/websocket-extensions": {
"version": "0.1.4",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/whatwg-encoding": {
"version": "2.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"iconv-lite": "0.6.3"
},
"engines": {
"node": ">=12"
}
},
"node_modules/whatwg-fetch": {
"version": "3.6.20",
"dev": true,
"license": "MIT"
},
"node_modules/whatwg-mimetype": {
"version": "3.0.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
}
},
"node_modules/whatwg-url": {
"version": "11.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"tr46": "^3.0.0",
"webidl-conversions": "^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/which": {
"version": "2.0.2",
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
"node-which": "bin/node-which"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/which-boxed-primitive": {
"version": "1.0.2",
"dev": true,
"license": "MIT",
"dependencies": {
"is-bigint": "^1.0.1",
"is-boolean-object": "^1.1.0",
"is-number-object": "^1.0.4",
"is-string": "^1.0.5",
"is-symbol": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/which-builtin-type": {
"version": "1.1.3",
"dev": true,
"license": "MIT",
"dependencies": {
"function.prototype.name": "^1.1.5",
"has-tostringtag": "^1.0.0",
"is-async-function": "^2.0.0",
"is-date-object": "^1.0.5",
"is-finalizationregistry": "^1.0.2",
"is-generator-function": "^1.0.10",
"is-regex": "^1.1.4",
"is-weakref": "^1.0.2",
"isarray": "^2.0.5",
"which-boxed-primitive": "^1.0.2",
"which-collection": "^1.0.1",
"which-typed-array": "^1.1.9"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/which-collection": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"is-map": "^2.0.1",
"is-set": "^2.0.1",
"is-weakmap": "^2.0.1",
"is-weakset": "^2.0.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/which-typed-array": {
"version": "1.1.14",
"dev": true,
"license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.6",
"call-bind": "^1.0.5",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
"has-tostringtag": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/wif": {
"version": "2.0.6",
"license": "MIT",
"dependencies": {
"bs58check": "<3.0.0"
}
},
"node_modules/word-wrap": {
"version": "1.2.5",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/workbox-background-sync": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"idb": "^7.0.1",
"workbox-core": "6.6.0"
}
},
"node_modules/workbox-broadcast-update": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"workbox-core": "6.6.0"
}
},
"node_modules/workbox-build": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@apideck/better-ajv-errors": "^0.3.1",
"@babel/core": "^7.11.1",
"@babel/preset-env": "^7.11.0",
"@babel/runtime": "^7.11.2",
"@rollup/plugin-babel": "^5.2.0",
"@rollup/plugin-node-resolve": "^11.2.1",
"@rollup/plugin-replace": "^2.4.1",
"@surma/rollup-plugin-off-main-thread": "^2.2.3",
"ajv": "^8.6.0",
"common-tags": "^1.8.0",
"fast-json-stable-stringify": "^2.1.0",
"fs-extra": "^9.0.1",
"glob": "^7.1.6",
"lodash": "^4.17.20",
"pretty-bytes": "^5.3.0",
"rollup": "^2.43.1",
"rollup-plugin-terser": "^7.0.0",
"source-map": "^0.8.0-beta.0",
"stringify-object": "^3.3.0",
"strip-comments": "^2.0.1",
"tempy": "^0.6.0",
"upath": "^1.2.0",
"workbox-background-sync": "6.6.0",
"workbox-broadcast-update": "6.6.0",
"workbox-cacheable-response": "6.6.0",
"workbox-core": "6.6.0",
"workbox-expiration": "6.6.0",
"workbox-google-analytics": "6.6.0",
"workbox-navigation-preload": "6.6.0",
"workbox-precaching": "6.6.0",
"workbox-range-requests": "6.6.0",
"workbox-recipes": "6.6.0",
"workbox-routing": "6.6.0",
"workbox-strategies": "6.6.0",
"workbox-streams": "6.6.0",
"workbox-sw": "6.6.0",
"workbox-window": "6.6.0"
},
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": {
"version": "0.3.6",
"dev": true,
"license": "MIT",
"dependencies": {
"json-schema": "^0.4.0",
"jsonpointer": "^5.0.0",
"leven": "^3.1.0"
},
"engines": {
"node": ">=10"
},
"peerDependencies": {
"ajv": ">=8"
}
},
"node_modules/workbox-build/node_modules/ajv": {
"version": "8.12.0",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/workbox-build/node_modules/fs-extra": {
"version": "9.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=10"
}
},
"node_modules/workbox-build/node_modules/json-schema-traverse": {
"version": "1.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/workbox-build/node_modules/source-map": {
"version": "0.8.0-beta.0",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"whatwg-url": "^7.0.0"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/workbox-build/node_modules/tr46": {
"version": "1.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"punycode": "^2.1.0"
}
},
"node_modules/workbox-build/node_modules/webidl-conversions": {
"version": "4.0.2",
"dev": true,
"license": "BSD-2-Clause"
},
"node_modules/workbox-build/node_modules/whatwg-url": {
"version": "7.1.0",
"dev": true,
"license": "MIT",
"dependencies": {
"lodash.sortby": "^4.7.0",
"tr46": "^1.0.1",
"webidl-conversions": "^4.0.2"
}
},
"node_modules/workbox-cacheable-response": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"workbox-core": "6.6.0"
}
},
"node_modules/workbox-core": {
"version": "6.6.0",
"dev": true,
"license": "MIT"
},
"node_modules/workbox-expiration": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"idb": "^7.0.1",
"workbox-core": "6.6.0"
}
},
"node_modules/workbox-google-analytics": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"workbox-background-sync": "6.6.0",
"workbox-core": "6.6.0",
"workbox-routing": "6.6.0",
"workbox-strategies": "6.6.0"
}
},
"node_modules/workbox-navigation-preload": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"workbox-core": "6.6.0"
}
},
"node_modules/workbox-precaching": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"workbox-core": "6.6.0",
"workbox-routing": "6.6.0",
"workbox-strategies": "6.6.0"
}
},
"node_modules/workbox-range-requests": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"workbox-core": "6.6.0"
}
},
"node_modules/workbox-recipes": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"workbox-cacheable-response": "6.6.0",
"workbox-core": "6.6.0",
"workbox-expiration": "6.6.0",
"workbox-precaching": "6.6.0",
"workbox-routing": "6.6.0",
"workbox-strategies": "6.6.0"
}
},
"node_modules/workbox-routing": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"workbox-core": "6.6.0"
}
},
"node_modules/workbox-strategies": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"workbox-core": "6.6.0"
}
},
"node_modules/workbox-streams": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"workbox-core": "6.6.0",
"workbox-routing": "6.6.0"
}
},
"node_modules/workbox-sw": {
"version": "6.6.0",
"dev": true,
"license": "MIT"
},
"node_modules/workbox-webpack-plugin": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-json-stable-stringify": "^2.1.0",
"pretty-bytes": "^5.4.1",
"upath": "^1.2.0",
"webpack-sources": "^1.4.3",
"workbox-build": "6.6.0"
},
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"webpack": "^4.4.0 || ^5.9.0"
}
},
"node_modules/workbox-webpack-plugin/node_modules/source-map": {
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/workbox-webpack-plugin/node_modules/webpack-sources": {
"version": "1.4.3",
"dev": true,
"license": "MIT",
"dependencies": {
"source-list-map": "^2.0.0",
"source-map": "~0.6.1"
}
},
"node_modules/workbox-window": {
"version": "6.6.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/trusted-types": "^2.0.2",
"workbox-core": "6.6.0"
}
},
"node_modules/wrap-ansi": {
"version": "7.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs": {
"name": "wrap-ansi",
"version": "7.0.0",
"dev": true,
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/wrap-ansi-cjs/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/wrap-ansi-cjs/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/wrap-ansi/node_modules/ansi-styles": {
"version": "4.3.0",
"dev": true,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/wrap-ansi/node_modules/color-convert": {
"version": "2.0.1",
"dev": true,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/wrap-ansi/node_modules/color-name": {
"version": "1.1.4",
"dev": true,
"license": "MIT"
},
"node_modules/wrappy": {
"version": "1.0.2",
"license": "ISC"
},
"node_modules/write-file-atomic": {
"version": "4.0.2",
"dev": true,
"license": "ISC",
"dependencies": {
"imurmurhash": "^0.1.4",
"signal-exit": "^3.0.7"
},
"engines": {
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
"node_modules/ws": {
"version": "8.16.0",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
},
"node_modules/xml": {
"version": "1.0.1",
"dev": true,
"license": "MIT"
},
"node_modules/xml-name-validator": {
"version": "4.0.0",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=12"
}
},
"node_modules/xmlchars": {
"version": "2.2.0",
"dev": true,
"license": "MIT"
},
"node_modules/y18n": {
"version": "5.0.8",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=10"
}
},
"node_modules/yallist": {
"version": "3.1.1",
"dev": true,
"license": "ISC"
},
"node_modules/yaml": {
"version": "1.10.2",
"dev": true,
"license": "ISC",
"engines": {
"node": ">= 6"
}
},
"node_modules/yargs": {
"version": "17.7.2",
"dev": true,
"license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^21.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/yargs-parser": {
"version": "21.1.1",
"dev": true,
"license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/yocto-queue": {
"version": "0.1.0",
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
}
}
}
diff --git a/cashtab/package.json b/cashtab/package.json
index f8c2af6f6..cea6c935a 100644
--- a/cashtab/package.json
+++ b/cashtab/package.json
@@ -1,113 +1,113 @@
{
"name": "cashtab",
- "version": "2.26.3",
+ "version": "2.26.4",
"private": true,
"scripts": {
"start": "node scripts/start.js",
"build": "node scripts/build.js",
"test": "node scripts/test.js",
"test:coverage": "CI=true npm run test --coverage",
"preextension": "npm i -g browserify",
"extension": "REACT_APP_BUILD_ENV=extension ./scripts/extension.sh"
},
"browserslist": {
"production": [
"chrome >= 67",
"edge >= 79",
"firefox >= 68",
"opera >= 54",
"safari >= 14"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"dependencies": {
"@bitgo/utxo-lib": "^9.33.0",
"@zxing/browser": "^0.1.4",
"bip39": "^3.0.2",
"bip66": "^1.1.5",
"bitcoinjs-message": "^2.2.0",
"chronik-client": "^0.26.1",
"ecash-coinselect": "^2.2.0",
"ecash-script": "^2.1.2",
"ecashaddrjs": "^1.5.4",
"localforage": "^1.9.0",
"qrcode.react": "^3.1.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-easy-crop": "^5.0.6",
"react-ga": "^3.3.0",
"react-router-dom": "^6.22.0",
"react-toastify": "^10.0.5",
"slp-mdm": "^0.0.6"
},
"devDependencies": {
"@babel/core": "^7.16.0",
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
"@svgr/webpack": "^6.3.1",
"@testing-library/jest-dom": "^6.4.2",
"@testing-library/react": "^14.2.1",
"@testing-library/user-event": "^14.5.2",
"assert": "^2.0.0",
"babel-jest": "^29.7.0",
"babel-loader": "^8.2.3",
"babel-plugin-named-asset-import": "^0.3.8",
"babel-preset-react-app": "^10.0.1",
"bfj": "^7.0.2",
"browserslist": "^4.18.1",
"buffer": "^6.0.3",
"camelcase": "^6.2.1",
"case-sensitive-paths-webpack-plugin": "^2.4.0",
"crypto-browserify": "^3.12.0",
"css-loader": "^6.5.1",
"css-minimizer-webpack-plugin": "^3.2.0",
"dotenv": "^10.0.0",
"dotenv-expand": "^5.1.0",
"eslint": "^8.3.0",
"eslint-config-react-app": "^7.0.0",
"eslint-plugin-etc": "2.0.2",
"eslint-plugin-header": "^3.1.1",
"eslint-plugin-testing-library": "^6.2.0",
"eslint-webpack-plugin": "^3.1.1",
"extensionizer": "^1.0.1",
"fake-indexeddb": "^5.0.2",
"file-loader": "^6.2.0",
"fs-extra": "^10.0.0",
"html-webpack-plugin": "^5.5.0",
"identity-obj-proxy": "^3.0.0",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"jest-junit": "^16.0.0",
"jest-watch-typeahead": "^2.2.2",
"jest-when": "^3.6.0",
"mini-css-extract-plugin": "^2.4.5",
"postcss": "^8.4.4",
"postcss-flexbugs-fixes": "^5.0.2",
"postcss-loader": "^6.2.1",
"postcss-normalize": "^10.0.1",
"postcss-preset-env": "^7.0.1",
"prop-types": "^15.8.1",
"react-app-polyfill": "^3.0.0",
"react-dev-utils": "^12.0.0",
"react-refresh": "^0.11.0",
"resolve": "^1.20.0",
"resolve-url-loader": "^5.0.0",
"sass-loader": "^12.3.0",
"semver": "^7.3.5",
"source-map-loader": "^3.0.0",
"stream-browserify": "^3.0.0",
"style-loader": "^3.3.1",
"styled-components": "^4.4.0",
"tailwindcss": "^3.0.2",
"terser-webpack-plugin": "^5.2.5",
"web-vitals": "^2.1.4",
"webpack": "^5.90.1",
"webpack-dev-server": "^4.6.0",
"webpack-manifest-plugin": "^4.0.2",
"workbox-webpack-plugin": "^6.4.1"
}
}
diff --git a/cashtab/src/components/Airdrop/Airdrop.js b/cashtab/src/components/Airdrop/Airdrop.js
index 180bd801e..0ba1b9df1 100644
--- a/cashtab/src/components/Airdrop/Airdrop.js
+++ b/cashtab/src/components/Airdrop/Airdrop.js
@@ -1,507 +1,507 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import React, { useState, useEffect } from 'react';
import { useLocation } from 'react-router-dom';
import PropTypes from 'prop-types';
import { BN } from 'slp-mdm';
import styled from 'styled-components';
import { WalletContext } from 'wallet/context';
-import PrimaryButton, { SecondaryLink } from 'components/Common/PrimaryButton';
+import PrimaryButton, { SecondaryLink } from 'components/Common/Buttons';
import CopyToClipboard from 'components/Common/CopyToClipboard';
import { getMintAddress } from 'chronik';
import {
isValidTokenId,
isValidXecAirdrop,
isValidAirdropExclusionArray,
} from 'validation';
import { SwitchLabel } from 'components/Common/Atoms';
import { getAirdropTx, getEqualAirdropTx } from 'airdrop';
import Communist from 'assets/communist.png';
import { toast } from 'react-toastify';
import CashtabSwitch from 'components/Common/Switch';
import { Input, TextArea, InputFlex } from 'components/Common/Inputs';
import { CopyPasteIcon } from 'components/Common/CustomIcons';
const AirdropForm = styled.div`
margin-top: 24px;
display: flex;
flex-direction: column;
gap: 12px;
svg {
height: 24px;
width: 24px;
}
`;
const FormRow = styled.div`
display: flex;
flex-direction: column;
gap: 12px;
color: ${props => props.theme.contrast};
`;
const SwitchHolder = styled.div`
display: flex;
align-content: center;
gap: 12px;
`;
const AirdropTitle = styled.div`
display: flex;
align-items: flex-start;
gap: 12px;
text-align: center;
justify-content: center;
`;
const Airdrop = ({ passLoadingStatus }) => {
const ContextValue = React.useContext(WalletContext);
const { chronik, cashtabState } = ContextValue;
const { wallets, cashtabCache } = cashtabState;
const wallet = wallets.length > 0 ? wallets[0] : false;
const location = useLocation();
useEffect(() => {
if (location && location.state && location.state.airdropEtokenId) {
setFormData({
...formData,
tokenId: location.state.airdropEtokenId,
});
handleTokenIdInput({
target: {
value: location.state.airdropEtokenId,
},
});
}
}, []);
const [formData, setFormData] = useState({
tokenId: '',
totalAirdrop: '',
});
const [equalDistributionRatio, setEqualDistributionRatio] = useState(false);
const [tokenIdIsValid, setTokenIdIsValid] = useState(null);
const [totalAirdropIsValid, setTotalAirdropIsValid] = useState(null);
const [airdropRecipients, setAirdropRecipients] = useState('');
const [showAirdropOutputs, setShowAirdropOutputs] = useState(false);
const [ignoreOwnAddress, setIgnoreOwnAddress] = useState(false);
const [ignoreMintAddress, setIgnoreMintAddress] = useState(false);
// flag to reflect the exclusion list checkbox
const [ignoreCustomAddresses, setIgnoreCustomAddresses] = useState(false);
// the exclusion list values
const [ignoreCustomAddressesList, setIgnoreCustomAddressesList] =
useState('');
const [
ignoreCustomAddressesListIsValid,
setIgnoreCustomAddressesListIsValid,
] = useState(false);
const [ignoreCustomAddressListError, setIgnoreCustomAddressListError] =
useState(false);
// flag to reflect the ignore minimum etoken balance switch
const [ignoreMinEtokenBalance, setIgnoreMinEtokenBalance] = useState(false);
const [ignoreMinEtokenBalanceAmount, setIgnoreMinEtokenBalanceAmount] =
useState(new BN(0));
const [
ignoreMinEtokenBalanceAmountIsValid,
setIgnoreMinEtokenBalanceAmountIsValid,
] = useState(false);
const [
ignoreMinEtokenBalanceAmountError,
setIgnoreMinEtokenBalanceAmountError,
] = useState(false);
const handleTokenIdInput = e => {
const { name, value } = e.target;
setTokenIdIsValid(isValidTokenId(value));
setFormData(p => ({
...p,
[name]: value,
}));
};
const handleTotalAirdropInput = e => {
const { name, value } = e.target;
setTotalAirdropIsValid(isValidXecAirdrop(value));
setFormData(p => ({
...p,
[name]: value,
}));
};
const handleMinEtokenBalanceChange = e => {
const { value } = e.target;
if (new BN(value).gt(new BN(0))) {
setIgnoreMinEtokenBalanceAmountIsValid(true);
setIgnoreMinEtokenBalanceAmountError(false);
} else {
setIgnoreMinEtokenBalanceAmountError(
'Minimum eToken balance must be greater than 0',
);
setIgnoreMinEtokenBalanceAmountIsValid(false);
}
setIgnoreMinEtokenBalanceAmount(value);
};
const calculateXecAirdrop = async () => {
// Airdrop txs are instant for most tokens, but can take some time for
// tokens with a large amount of holders
passLoadingStatus(true);
// hide any previous airdrop outputs
setShowAirdropOutputs(false);
let tokenUtxos;
try {
tokenUtxos = await chronik.tokenId(formData.tokenId).utxos();
} catch (err) {
console.error(`Error getting token utxos from chronik`, err);
toast.error('Error retrieving airdrop recipients');
// Clear result field from earlier calc, if present, on any error
setAirdropRecipients('');
return passLoadingStatus(false);
}
const excludedAddresses = [];
if (ignoreOwnAddress) {
excludedAddresses.push(wallet.paths.get(1899).address);
}
if (ignoreMintAddress) {
let mintAddress;
try {
mintAddress = await getMintAddress(chronik, formData.tokenId);
excludedAddresses.push(mintAddress);
} catch (err) {
console.error(`Error getting mint address from chronik`, err);
toast.error(
`Error determining mint address for ${formData.tokenId}`,
);
// Clear result field from earlier calc, if present, on any error
setAirdropRecipients('');
return passLoadingStatus(false);
}
}
if (ignoreCustomAddresses && ignoreCustomAddressesListIsValid) {
const addressStringArray = ignoreCustomAddressesList.split(',');
for (const address of addressStringArray) {
excludedAddresses.push(address);
}
}
// Convert user-entered ignoreMinEtokenBalanceAmount to correct decimals
// i.e., "undecimalize it" so it is on the same basis as other amounts in getAirdropTx
const tokenInfo = cashtabCache.tokens.get(formData.tokenId);
let undecimalizedMinTokenAmount;
if (typeof tokenInfo === 'undefined') {
// User may be airdropping to a token they do not hold
// In this case, we must get decimals from chronik
let tokenInfo;
try {
tokenInfo = await chronik.token(formData.tokenId);
undecimalizedMinTokenAmount = new BN(
ignoreMinEtokenBalanceAmount,
)
.times(10 ** tokenInfo.genesisInfo.decimals)
.toString();
} catch (err) {
console.error(`Error getting token utxos from chronik`, err);
toast.error(
`Error determining mint address for ${formData.tokenId}`,
);
// Clear result field from earlier calc, if present, on any error
setAirdropRecipients('');
return passLoadingStatus(false);
}
} else {
// get it from cache if available
undecimalizedMinTokenAmount = new BN(ignoreMinEtokenBalanceAmount)
.times(10 ** tokenInfo.decimals)
.toString();
}
// Get the csv
let csv;
try {
csv = equalDistributionRatio
? getEqualAirdropTx(
tokenUtxos,
excludedAddresses,
formData.totalAirdrop,
undecimalizedMinTokenAmount,
)
: getAirdropTx(
tokenUtxos,
excludedAddresses,
formData.totalAirdrop,
undecimalizedMinTokenAmount,
);
setAirdropRecipients(csv);
// display the airdrop outputs TextArea
setShowAirdropOutputs(true);
} catch (err) {
// Clear result field from earlier calc, if present, on any error
setAirdropRecipients('');
toast.error(`${err}`);
}
return passLoadingStatus(false);
};
const handleIgnoreMinEtokenBalanceAmt = e => {
setIgnoreMinEtokenBalance(e);
// Also reset the balance amount
setIgnoreMinEtokenBalanceAmount(new BN(0));
};
const handleIgnoreOwnAddress = e => {
setIgnoreOwnAddress(e);
};
const handleIgnoreMintAddress = e => {
setIgnoreMintAddress(e);
};
const handleIgnoreCustomAddresses = e => {
setIgnoreCustomAddresses(e);
};
const handleIgnoreCustomAddressesList = e => {
// if the checkbox is not checked then skip the input validation
if (!ignoreCustomAddresses) {
return;
}
let customAddressList = e.target.value;
// validate the exclusion list input
const addressListIsValid =
isValidAirdropExclusionArray(customAddressList);
setIgnoreCustomAddressesListIsValid(addressListIsValid);
if (!addressListIsValid) {
setIgnoreCustomAddressListError(
'Must be a comma-separated list of valid ecash-prefixed addresses with no spaces',
);
} else {
setIgnoreCustomAddressListError(false); // needs to be explicitly set in order to refresh the error state from prior invalidation
}
// commit the ignore list to state
setIgnoreCustomAddressesList(customAddressList);
};
let airdropCalcInputIsValid = tokenIdIsValid && totalAirdropIsValid;
// if the ignore min etoken balance and exclusion list options are in use, add the relevant validation to the total pre-calculation validation
if (ignoreMinEtokenBalance && ignoreCustomAddresses) {
// both enabled
airdropCalcInputIsValid =
ignoreMinEtokenBalanceAmountIsValid &&
tokenIdIsValid &&
totalAirdropIsValid &&
ignoreCustomAddressesListIsValid;
} else if (ignoreMinEtokenBalance && !ignoreCustomAddresses) {
// ignore minimum etoken balance option only
airdropCalcInputIsValid =
ignoreMinEtokenBalanceAmountIsValid &&
tokenIdIsValid &&
totalAirdropIsValid;
} else if (!ignoreMinEtokenBalance && ignoreCustomAddresses) {
// ignore custom addresses only
airdropCalcInputIsValid =
tokenIdIsValid &&
totalAirdropIsValid &&
ignoreCustomAddressesListIsValid;
}
return (
<AirdropForm>
<FormRow>
<InputFlex>
<Input
placeholder="Enter the eToken ID"
name="tokenId"
value={formData.tokenId}
handleInput={handleTokenIdInput}
error={
tokenIdIsValid === false
? 'Invalid eToken ID'
: false
}
/>
</InputFlex>
</FormRow>
<FormRow>
<InputFlex>
<Input
placeholder="Enter the total XEC airdrop"
name="totalAirdrop"
type="number"
value={formData.totalAirdrop}
handleInput={handleTotalAirdropInput}
error={
totalAirdropIsValid === false
? 'Invalid total XEC airdrop'
: false
}
/>
</InputFlex>
</FormRow>
<FormRow>
<SwitchHolder>
<CashtabSwitch
name="Toggle Communism"
on="Pro-Rata"
width={120}
right={86}
bgImageOff={Communist}
checked={!equalDistributionRatio}
handleToggle={() => {
setEqualDistributionRatio(prev => !prev);
}}
/>
<SwitchLabel>
{equalDistributionRatio
? ` Airdrop
the same for everyone`
: ` Airdrop
scaled to token balance`}
</SwitchLabel>
</SwitchHolder>
</FormRow>
<FormRow>
<SwitchHolder>
<CashtabSwitch
name="ignoreOwnAddress"
checked={ignoreOwnAddress}
handleToggle={() =>
handleIgnoreOwnAddress(prev => !prev)
}
/>
<SwitchLabel>Ignore my own address</SwitchLabel>
</SwitchHolder>
</FormRow>
<FormRow>
<SwitchHolder>
<CashtabSwitch
name="Toggle Ignore Mint Address"
checked={ignoreMintAddress}
handleToggle={() =>
handleIgnoreMintAddress(prev => !prev)
}
/>
<SwitchLabel>Ignore eToken minter address</SwitchLabel>
</SwitchHolder>
</FormRow>
<FormRow>
<SwitchHolder>
<CashtabSwitch
name="Toggle Minimum Token Balance"
checked={ignoreMinEtokenBalance}
handleToggle={() =>
handleIgnoreMinEtokenBalanceAmt(prev => !prev)
}
/>
<SwitchLabel>Minimum eToken holder balance</SwitchLabel>
</SwitchHolder>
{ignoreMinEtokenBalance && (
<Input
error={ignoreMinEtokenBalanceAmountError}
placeholder="Minimum eToken balance"
handleInput={handleMinEtokenBalanceChange}
value={ignoreMinEtokenBalanceAmount}
/>
)}
</FormRow>
<FormRow>
<SwitchHolder>
<CashtabSwitch
name="Toggle Ignore Custom Addresses"
checked={ignoreCustomAddresses}
handleToggle={() =>
handleIgnoreCustomAddresses(prev => !prev)
}
/>
<SwitchLabel>Ignore custom addresses</SwitchLabel>
</SwitchHolder>
{ignoreCustomAddresses && (
<TextArea
placeholder={`If more than one XEC address, separate them by comma \ne.g. \necash:qpatql05s9jfavnu0tv6lkjjk25n6tmj9gkpyrlwu8,ecash:qzvydd4n3lm3xv62cx078nu9rg0e3srmqq0knykfed`}
error={ignoreCustomAddressListError}
value={ignoreCustomAddressesList}
name="address"
handleInput={handleIgnoreCustomAddressesList}
disabled={!ignoreCustomAddresses}
/>
)}
</FormRow>
<FormRow>
<PrimaryButton
onClick={() => calculateXecAirdrop()}
disabled={!airdropCalcInputIsValid || !tokenIdIsValid}
>
Calculate Airdrop
</PrimaryButton>
</FormRow>
{showAirdropOutputs && (
<>
<FormRow>
<AirdropTitle>
One to Many Airdrop Payment Outputs
<CopyToClipboard
data={airdropRecipients}
showToast
customMsg={
'Airdrop recipients copied to clipboard'
}
>
<CopyPasteIcon />
</CopyToClipboard>
</AirdropTitle>
<TextArea
name="airdropRecipients"
placeholder="Please input parameters above."
value={airdropRecipients}
rows="10"
readOnly
/>
</FormRow>
<FormRow>
<SecondaryLink
type="text"
to="/send"
state={{
airdropRecipients: airdropRecipients,
airdropTokenId: formData.tokenId,
}}
disabled={!airdropRecipients}
>
Copy to Send screen
</SecondaryLink>
</FormRow>
</>
)}
</AirdropForm>
);
};
/*
passLoadingStatus must receive a default prop that is a function
in order to pass the rendering unit test in Airdrop.test.js
status => {console.info(status)} is an arbitrary stub function
*/
Airdrop.defaultProps = {
passLoadingStatus: status => {
console.info(status);
},
};
Airdrop.propTypes = {
passLoadingStatus: PropTypes.func,
};
export default Airdrop;
diff --git a/cashtab/src/components/Alias/Alias.js b/cashtab/src/components/Alias/Alias.js
index 57957a5f5..7e36a135c 100644
--- a/cashtab/src/components/Alias/Alias.js
+++ b/cashtab/src/components/Alias/Alias.js
@@ -1,641 +1,641 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import React, { useState, useEffect } from 'react';
import styled from 'styled-components';
import { WalletContext } from 'wallet/context';
import PropTypes from 'prop-types';
import { AlertMsg } from 'components/Common/Atoms';
-import PrimaryButton from 'components/Common/PrimaryButton';
+import PrimaryButton from 'components/Common/Buttons';
import { getWalletState } from 'utils/cashMethods';
import { toXec } from 'wallet';
import { meetsAliasSpec } from 'validation';
import { queryAliasServer } from 'alias';
import cashaddr from 'ecashaddrjs';
import CopyToClipboard from 'components/Common/CopyToClipboard';
import appConfig from 'config/app';
import aliasSettings from 'config/alias';
import { explorer } from 'config/explorer';
import { getAliasTargetOutput, getAliasByteCount } from 'opreturn';
import { sendXec } from 'transactions';
import { hasEnoughToken } from 'wallet';
import { toast } from 'react-toastify';
import { AliasInput, Input } from 'components/Common/Inputs';
import Switch from 'components/Common/Switch';
import Modal from 'components/Common/Modal';
const AliasWrapper = styled.div`
color: ${props => props.theme.contrast};
margin: 12px 0;
box-sizing: border-box;
*,
*:before,
*:after {
box-sizing: inherit;
}
`;
export const SwitchContainer = styled.div`
display: flex;
margin-bottom: 12px;
justify-content: flex-start;
align-items: center;
gap: 12px;
`;
const SwitchLabel = styled.div`
display: flex;
font-size: 16px;
`;
const AltAddressHolder = styled.div`
display: flex;
margin-bottom: 12px;
`;
const AliasHeader = styled.div`
color: ${props => props.theme.contrast};
font-weight: bold;
font-size: 20px;
margin: 12px 0;
width: 100%;
`;
const Panel = styled.div`
display: flex;
flex-wrap: wrap;
padding: 12px;
width: 100%;
background-color: ${props => props.theme.panel};
border-radius: 9px;
margin-bottom: 12px;
gap: 12px;
`;
const AliasTag = styled.div`
display: flex;
color: ${props => props.theme.contrast};
background-color: #0074c2;
&:hover {
background-color: ${props => props.theme.eCashPurple};
}
gap: 12px;
border-radius: 3px;
padding: 3px;
font-size: 12px;
`;
// Change mouse cursor to pointer upon hovering over an Alias tag
export const AliasLabel = styled.div`
cursor: pointer;
`;
const AliasRegisteredLink = styled.a`
color: ${props => props.theme.walletBackground};
text-decoration: none;
`;
export const AliasAvailable = styled.span`
color: ${props => props.theme.eCashBlue};
`;
export const AliasPending = styled.span`
color: ${props => props.theme.forms.error};
`;
export const NamespaceCtn = styled.div`
width: 100%;
margin-top: 50px;
margin-bottom: 20px;
overflow-wrap: break-word;
h2 {
color: ${props => props.theme.contrast};
margin: 0 0 20px;
}
h3 {
color: ${props => props.theme.contrast};
margin: 0 0 10px;
}
white-space: pre-wrap;
`;
const Alias = ({ passLoadingStatus }) => {
const ContextValue = React.useContext(WalletContext);
const {
chronik,
refreshAliases,
aliases,
setAliases,
aliasServerError,
aliasPrices,
setAliasPrices,
cashtabState,
} = ContextValue;
const { settings, wallets } = cashtabState;
const wallet = wallets.length > 0 ? wallets[0] : false;
const defaultAddress =
wallet !== false ? wallet.paths.get(1899).address : '';
const walletState = getWalletState(wallet);
const { balanceSats, tokens } = walletState;
const [formData, setFormData] = useState({
aliasName: '',
aliasAddress: defaultAddress,
});
const [registerActiveWallet, setRegisterActiveWallet] = useState(true);
const [isValidAliasInput, setIsValidAliasInput] = useState(false); // tracks whether to activate the registration button
const [isValidAliasAddressInput, setIsValidAliasAddressInput] =
useState(false); // tracks whether to activate the registration button
const [aliasValidationError, setAliasValidationError] = useState(false);
const [aliasAddressValidationError, setAliasAddressValidationError] =
useState(false);
const [aliasDetails, setAliasDetails] = useState(false); // stores the /alias/<alias> endpoint response object
// Stores a conditional warning to the registration confirmation modal
const [aliasWarningMsg, setAliasWarningMsg] = useState(false);
// Show a confirmation modal on alias registrations
const [isModalVisible, setIsModalVisible] = useState(false);
useEffect(() => {
passLoadingStatus(false);
}, [balanceSats]);
useEffect(() => {
if (registerActiveWallet) {
// Set address of active wallet to default alias registration address
handleAliasAddressInput({
target: {
name: 'aliasAddress',
value: defaultAddress,
},
});
} else {
// Clear the form if the user unchecks
handleAliasAddressInput({
target: {
name: 'aliasAddress',
value: '',
},
});
}
}, [registerActiveWallet]);
const handleAliasWalletChange = async () => {
if (defaultAddress !== '') {
await refreshAliases(defaultAddress);
}
// Refresh alias prices if none exist yet
if (aliasPrices === null) {
try {
setAliasPrices(await queryAliasServer('prices'));
} catch (err) {
setAliasValidationError(
`Failed to fetch alias price information from server. Alias registration disabled. Refresh page to try again.`,
);
passLoadingStatus(false);
}
}
// Track when the user stops typing into the aliasName input field for at least
// 'aliasSettings.aliasKeyUpTimeoutMs' and make an API call to check the alias status
const aliasInput = document.getElementsByName('aliasName')[0];
aliasInput?.addEventListener('keyup', function () {
setTimeout(async function () {
// Retrieve alias details
let aliasDetailsResp;
if (meetsAliasSpec(aliasInput.value)) {
try {
// Note: aliasInput.value is used here as formData is not yet
// initialized at the point of useEffect execution
aliasDetailsResp = await queryAliasServer(
'alias',
aliasInput.value,
);
if (aliasDetailsResp.address) {
setAliasValidationError(
`This alias is already taken`,
);
setIsValidAliasInput(false);
}
} catch (err) {
setAliasValidationError(
`Failed to check alias availability from server. Alias registration disabled. Refresh page to try again.`,
);
passLoadingStatus(false);
}
}
}, aliasSettings.aliasKeyUpTimeoutMs);
});
passLoadingStatus(false);
};
useEffect(() => {
// only run this useEffect block if wallet is defined
if (wallet === false || typeof wallet === 'undefined') {
return;
}
passLoadingStatus(true);
// passLoadingStatus(false) will be called after awaiting expected methods
handleAliasWalletChange();
}, [wallet.name]);
const clearInputForms = () => {
setFormData(p => ({
...p,
aliasName: '',
}));
setAliasWarningMsg(false);
setIsValidAliasInput(false);
};
const preparePreviewModal = async () => {
passLoadingStatus(true);
// Retrieve alias details
let aliasDetailsResp;
try {
aliasDetailsResp = await queryAliasServer(
'alias',
formData.aliasName,
);
if (
aliasDetailsResp.pending &&
aliasDetailsResp.pending.length > 0
) {
const thisWalletThisAliasPendingCount = aliases.pending.filter(
pendingAliasObj =>
pendingAliasObj.alias === formData.aliasName,
).length;
const pendingMsgForThisAddress =
thisWalletThisAliasPendingCount > 0
? `, including ${thisWalletThisAliasPendingCount} for this wallet address`
: '';
setAliasWarningMsg(
` There are currently ${aliasDetailsResp.pending.length} pending registration(s) for this alias${pendingMsgForThisAddress}.`,
);
} else {
setAliasWarningMsg(false);
}
} catch (err) {
const errorMsg =
'Error retrieving alias details. Refresh page to try again.';
console.error(`preparePreviewModal(): ${errorMsg}`, err);
// Using a pop up notification since this is a modal block
toast.error(`${errorMsg}`);
passLoadingStatus(false);
return;
}
if (
aliasDetailsResp &&
!aliasDetailsResp.address &&
!aliasDetailsResp.error &&
aliasDetailsResp.registrationFeeSats
) {
// If alias is unregistered
setAliasDetails(aliasDetailsResp);
setIsModalVisible(true);
} else if (aliasDetailsResp && aliasDetailsResp.address) {
// If alias is registered
toast.error(
`The alias "${formData.aliasName}" is already owned by ${aliasDetailsResp.address}. Please try another alias.`,
);
setAliasDetails(false);
} else {
setAliasValidationError(
'Failed to check alias availability from server. Alias registration disabled. Refresh page to try again.',
);
setAliasDetails(false);
}
passLoadingStatus(false);
};
const handleOk = () => {
setIsModalVisible(false);
registerAlias();
};
const handleCancel = () => {
setIsModalVisible(false);
};
const registerAlias = async () => {
passLoadingStatus(true);
// note: input already validated via handleAliasNameInput()
const aliasInput = formData.aliasName;
const aliasAddress = formData.aliasAddress;
if (
!aliasDetails.address &&
!aliasDetails.error &&
aliasDetails.registrationFeeSats
) {
console.info(
'Registration fee for ' +
aliasInput +
' is ' +
aliasDetails.registrationFeeSats +
' sats.',
);
console.info(
`Alias ${aliasInput} is available. Broadcasting registration transaction.`,
);
try {
const targetOutputs = [
getAliasTargetOutput(aliasInput, aliasAddress),
{
address: aliasSettings.aliasPaymentAddress,
value: aliasDetails.registrationFeeSats,
},
];
const txObj = await sendXec(
chronik,
wallet,
targetOutputs,
settings.minFeeSends &&
hasEnoughToken(
tokens,
appConfig.vipSettingsTokenId,
appConfig.vipSettingsTokenQty,
)
? appConfig.minFee
: appConfig.defaultFee,
);
clearInputForms();
toast.success(
<AliasRegisteredLink
href={`${explorer.blockExplorerUrl}/tx/${txObj.response.txid}`}
>
{aliasInput}
</AliasRegisteredLink>,
);
// Append the newly broadcasted alias registration to pending list to
// ensure the alias refresh interval is running in useWallet.js
setAliases(previousAliases => ({
...previousAliases,
pending: [
...previousAliases.pending,
{
alias: aliasInput,
address: defaultAddress,
},
],
}));
} catch (err) {
toast.error(`${err}`);
}
setIsValidAliasInput(true);
} else {
// error notification on alias being unavailable
toast.error(
`Alias "${aliasInput}" has already been taken, please try another alias.`,
);
}
passLoadingStatus(false);
};
const handleAliasNameInput = e => {
const { name, value } = e.target;
const inputMeetsAliasSpec = meetsAliasSpec(value);
if (inputMeetsAliasSpec === true) {
setIsValidAliasInput(true);
setAliasValidationError(false);
} else {
// In this case, inputMeetsAliasSpec is a string explaining why not
setAliasValidationError(inputMeetsAliasSpec);
setIsValidAliasInput(false);
}
setFormData(p => ({
...p,
[name]: value,
}));
};
const handleAliasAddressInput = e => {
/* handleAliasAddressInput
*
* Function called to handle any changes to the aliasAddress input form
*
* May be called programmatically by mocking the usual js event
* of a user updating the addressName input field
*/
let { name, value } = e.target;
// remove any whitespaces
value = value.trim();
// Validate
let decoded;
let isValidAddress = false;
try {
decoded = cashaddr.decode(value, true);
const { hash } = decoded;
// We only support 20-byte payloads
isValidAddress = hash.length === 40;
} catch (err) {
// Invalid cashaddress
// Log to console for user support
console.error(`Invalid address`, err);
}
if (isValidAddress) {
setIsValidAliasAddressInput(true);
setAliasAddressValidationError(false);
} else {
setAliasAddressValidationError(
'Invalid alias registration address.',
);
setIsValidAliasAddressInput(false);
}
setFormData(p => ({
...p,
[name]: value,
}));
};
return (
<>
{isModalVisible && (
<Modal
title={
aliasWarningMsg
? 'Pending registrations detected'
: 'Confirm alias registration'
}
height={aliasWarningMsg ? 350 : 155}
handleOk={handleOk}
handleCancel={handleCancel}
showCancelButton
>
{!aliasWarningMsg &&
aliasDetails &&
Number.isInteger(aliasDetails.registrationFeeSats) && (
<AliasAvailable>
Register &quot;{formData.aliasName}&quot; for{' '}
{toXec(
aliasDetails.registrationFeeSats,
).toLocaleString()}{' '}
XEC ?
</AliasAvailable>
)}
{aliasWarningMsg !== false &&
aliasDetails &&
Number.isInteger(aliasDetails.registrationFeeSats) && (
<AlertMsg>
{` Warning: ${aliasWarningMsg}`}
<br />
<br />
{` Continue the registration anyway for ${toXec(
aliasDetails.registrationFeeSats,
).toLocaleString()} XEC?`}
</AlertMsg>
)}
{!registerActiveWallet &&
!aliasAddressValidationError &&
` Please also note Cashtab will only track alias registrations for ${wallet.name}: ${defaultAddress}.`}
</Modal>
)}
<AliasWrapper>
<h2>eCash Namespace Alias</h2>
<AliasInput
name="aliasName"
value={formData.aliasName}
placeholder="Enter a desired alias"
handleInput={handleAliasNameInput}
error={aliasValidationError}
/>
{(() => {
let aliasLength = getAliasByteCount(formData.aliasName);
if (
aliasLength > 0 &&
isValidAliasInput &&
aliasPrices !== null
) {
// Disable alias registration if the array is not exactly one entry
if (aliasPrices.prices.length !== 1) {
setAliasValidationError(
`Alias registration is temporarily unavailable, please check again later.`,
);
setIsValidAliasInput(false);
return;
}
// TODO Once chronik-client has been upgraded for in-node chronik, update
// this price parsing logic to use the new ws for blockheight comparisons.
// Intention is to reverse loop through `aliasPrices.prices` and parse for
// the latest array entry that has a startHeight within the chain's tipHeight.
let aliasPriceXec = toXec(
aliasPrices.prices[0].fees[aliasLength],
).toLocaleString();
return (
<AliasAvailable>
This {aliasLength} byte alias is available,{' '}
{aliasPriceXec} XEC to register.
</AliasAvailable>
);
}
})()}
<p />
<SwitchContainer>
<Switch
name="register-active-wallet-switch"
checked={registerActiveWallet}
handleToggle={() =>
setRegisterActiveWallet(!registerActiveWallet)
}
></Switch>
<SwitchLabel>Register active wallet</SwitchLabel>
</SwitchContainer>
{!registerActiveWallet && (
<AltAddressHolder>
<Input
placeholder="Enter address for this alias"
value={formData.aliasAddress}
disabled={registerActiveWallet}
name="aliasAddress"
handleInput={handleAliasAddressInput}
error={aliasAddressValidationError}
/>
</AltAddressHolder>
)}
<PrimaryButton
disabled={
!isValidAliasInput ||
!isValidAliasAddressInput ||
aliasValidationError !== false ||
aliasServerError !== false
}
onClick={() => preparePreviewModal()}
>
Register Alias
</PrimaryButton>
<AliasHeader>Registered Aliases</AliasHeader>
<Panel>
{aliases &&
aliases.registered &&
aliases.registered.length > 0
? aliases.registered.map((alias, index) => (
<CopyToClipboard
data={alias.alias + '.xec'}
showToast
key={index}
>
<AliasTag key={index}>
{alias.alias + '.xec'}
</AliasTag>
</CopyToClipboard>
))
: !aliasServerError && (
<AliasHeader>
{'No registered aliases'}
</AliasHeader>
)}
{aliasServerError && aliasValidationError === false && (
<AlertMsg>{aliasServerError}</AlertMsg>
)}
</Panel>
<AliasHeader>Pending Aliases</AliasHeader>
<Panel>
{aliases && aliases.pending && aliases.pending.length > 0
? aliases.pending.map((pendingAlias, index) => (
<CopyToClipboard
data={pendingAlias.alias + '.xec'}
showToast
key={index}
>
<AliasTag key={index}>
{pendingAlias.alias + '.xec'}
</AliasTag>
</CopyToClipboard>
))
: !aliasServerError && (
<AliasHeader>{'No pending aliases'}</AliasHeader>
)}
{aliasServerError && aliasValidationError === false && (
<AlertMsg>{aliasServerError}</AlertMsg>
)}
</Panel>
</AliasWrapper>
</>
);
};
/*
passLoadingStatus must receive a default prop that is a function
in order to pass the rendering unit test in Alias.test.js
status => {console.info(status)} is an arbitrary stub function
*/
Alias.defaultProps = {
passLoadingStatus: status => {
console.info(status);
},
};
Alias.propTypes = {
passLoadingStatus: PropTypes.func,
};
export default Alias;
diff --git a/cashtab/src/components/Common/PrimaryButton.js b/cashtab/src/components/Common/Buttons.js
similarity index 61%
rename from cashtab/src/components/Common/PrimaryButton.js
rename to cashtab/src/components/Common/Buttons.js
index 7da639238..0378efc03 100644
--- a/cashtab/src/components/Common/PrimaryButton.js
+++ b/cashtab/src/components/Common/Buttons.js
@@ -1,99 +1,178 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+import React from 'react';
import styled, { css } from 'styled-components';
import { Link } from 'react-router-dom';
+import { CopyPasteIcon } from 'components/Common/CustomIcons';
+import { toast } from 'react-toastify';
+import PropTypes from 'prop-types';
const BaseButtonOrLinkCss = css`
font-size: 24px;
padding: 20px 0;
border-radius: 9px;
transition: all 0.5s ease;
width: 100%;
margin-bottom: 20px;
cursor: ${props => (props.disabled ? 'not-allowed' : 'pointer')};
:hover {
background-position: right center;
-webkit-box-shadow: ${props => props.theme.buttons.primary.hoverShadow};
-moz-box-shadow: ${props => props.theme.buttons.primary.hoverShadow};
box-shadow: ${props => props.theme.buttons.primary.hoverShadow};
}
@media (max-width: 768px) {
font-size: 16px;
padding: 15px 0;
}
`;
const CashtabBaseButton = styled.button`
${BaseButtonOrLinkCss}
`;
const CashtabBaseLink = styled(Link)`
${BaseButtonOrLinkCss}
`;
const PrimaryButtonOrLinkCss = css`
color: ${props =>
props.disabled
? props.theme.buttons.disabled.color
: props.theme.buttons.primary.color};
border: 1px solid
${props => (props.disabled ? 'none' : props.theme.eCashBlue)};
${props =>
props.disabled
? `background: ${props.theme.buttons.disabled.background};`
: `background-image: ${props.theme.buttons.primary.backgroundImage}; `};
background-size: 200% auto;
svg {
fill: ${props => props.theme.buttons.primary.color};
}
`;
const PrimaryButton = styled(CashtabBaseButton)`
${PrimaryButtonOrLinkCss}
`;
export const PrimaryLink = styled(CashtabBaseLink)`
${PrimaryButtonOrLinkCss}
text-decoration: none;
&:hover {
color: ${props =>
props.disabled
? props.theme.buttons.disabled.color
: props.theme.buttons.primary.color};
text-decoration: none;
}
`;
const SecondaryButtonOrLinkCss = css`
color: ${props =>
props.disabled
? props.theme.buttons.disabled.color
: props.theme.buttons.primary.color};
border: 1px solid
${props => (props.disabled ? 'none' : props.theme.eCashPurple)};
${props =>
props.disabled
? `background: ${props.theme.buttons.disabled.background};`
: `background-image: ${props.theme.buttons.secondary.backgroundImage}; `};
background-size: 200% auto;
svg {
fill: ${props => props.theme.buttons.secondary.color};
}
`;
const SecondaryButton = styled(CashtabBaseButton)`
${SecondaryButtonOrLinkCss}
`;
const SecondaryLink = styled(CashtabBaseLink)`
${SecondaryButtonOrLinkCss}
text-decoration: none;
&:hover {
color: ${props =>
props.disabled
? props.theme.buttons.disabled.color
: props.theme.buttons.primary.color};
text-decoration: none;
}
`;
+const SvgButtonOrLinkCss = css`
+ border: none;
+ background: none;
+ cursor: pointer;
+ svg {
+ height: 24px;
+ width: 24px;
+ fill: ${props => props.theme.eCashBlue};
+ }
+`;
+const SvgButton = styled.button`
+ ${SvgButtonOrLinkCss}
+`;
+
+const IconButton = ({ name, icon, onClick }) => (
+ <SvgButton aria-label={name} onClick={onClick}>
+ {icon}
+ </SvgButton>
+);
+IconButton.propTypes = {
+ name: PropTypes.string,
+ icon: PropTypes.node,
+ onClick: PropTypes.func,
+};
+
+const SvgLink = styled(Link)`
+ ${SvgButtonOrLinkCss}
+`;
+
+const IconLink = ({ name, icon, to, state }) => (
+ <SvgLink aria-label={name} to={to} state={state}>
+ {icon}
+ </SvgLink>
+);
+IconLink.propTypes = {
+ name: PropTypes.string,
+ icon: PropTypes.node,
+ to: PropTypes.string,
+ state: PropTypes.object,
+};
+
+const CopyIconButton = ({
+ name,
+ data,
+ showToast = false,
+ customMsg = false,
+}) => {
+ return (
+ <SvgButton
+ aria-label={name}
+ onClick={() => {
+ if (navigator.clipboard) {
+ navigator.clipboard.writeText(data);
+ }
+ if (showToast) {
+ const toastMsg = customMsg
+ ? customMsg
+ : `"${data}" copied to clipboard`;
+ toast.success(toastMsg);
+ }
+ }}
+ >
+ <CopyPasteIcon />
+ </SvgButton>
+ );
+};
+
+CopyIconButton.propTypes = {
+ name: PropTypes.string,
+ data: PropTypes.string,
+ showToast: PropTypes.bool,
+ customMsg: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
+ children: PropTypes.node,
+};
+
export default PrimaryButton;
-export { SecondaryButton, SecondaryLink };
+export { SecondaryButton, SecondaryLink, IconButton, IconLink, CopyIconButton };
diff --git a/cashtab/src/components/Contacts/__tests__/index.test.js b/cashtab/src/components/Contacts/__tests__/index.test.js
index 5dafecf15..a4c0134e5 100644
--- a/cashtab/src/components/Contacts/__tests__/index.test.js
+++ b/cashtab/src/components/Contacts/__tests__/index.test.js
@@ -1,291 +1,311 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import React from 'react';
import {
walletWithXecAndTokens,
populatedContactList,
} from 'components/App/fixtures/mocks';
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import '@testing-library/jest-dom';
import 'fake-indexeddb/auto';
import localforage from 'localforage';
import { when } from 'jest-when';
import appConfig from 'config/app';
import {
initializeCashtabStateForTests,
clearLocalForage,
} from 'components/App/fixtures/helpers';
import { validSavedWallets } from 'components/App/fixtures/mocks';
import CashtabTestWrapper from 'components/App/fixtures/CashtabTestWrapper';
// https://stackoverflow.com/questions/39830580/jest-test-fails-typeerror-window-matchmedia-is-not-a-function
Object.defineProperty(window, 'matchMedia', {
writable: true,
value: jest.fn().mockImplementation(query => ({
matches: false,
media: query,
onchange: null,
addListener: jest.fn(), // Deprecated
removeListener: jest.fn(), // Deprecated
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
dispatchEvent: jest.fn(),
})),
});
// https://stackoverflow.com/questions/64813447/cannot-read-property-addlistener-of-undefined-react-testing-library
window.matchMedia = query => ({
matches: false,
media: query,
onchange: null,
addListener: jest.fn(), // deprecated
removeListener: jest.fn(), // deprecated
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
dispatchEvent: jest.fn(),
});
// Mock bip39.generateMnemonic() so we can have a consistent test for wallet name
jest.mock('bip39', () => ({
__esModule: true,
...jest.requireActual('bip39'),
generateMnemonic: jest.fn(
() =>
'grant grass sock faculty behave guitar pepper tiger sustain task occur soon',
),
}));
describe('<Contacts />', () => {
let user;
beforeEach(() => {
// Set up userEvent
user = userEvent.setup();
// Mock the fetch call for Cashtab's price API
global.fetch = jest.fn();
const fiatCode = 'usd'; // Use usd until you mock getting settings from localforage
const cryptoId = appConfig.coingeckoId;
// Keep this in the code, because different URLs will have different outputs requiring different parsing
const priceApiUrl = `https://api.coingecko.com/api/v3/simple/price?ids=${cryptoId}&vs_currencies=${fiatCode}&include_last_updated_at=true`;
const xecPrice = 0.00003;
const priceResponse = {
ecash: {
usd: xecPrice,
last_updated_at: 1706644626,
},
};
when(fetch)
.calledWith(priceApiUrl)
.mockResolvedValue({
json: () => Promise.resolve(priceResponse),
});
});
afterEach(async () => {
jest.clearAllMocks();
await clearLocalForage(localforage);
});
it('We can add, delete, rename, contacts from the Configure screen, and add a savedWallet as a contact', async () => {
// localforage defaults
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
// Custom contact list
await localforage.setItem('contactList', populatedContactList);
const savedWallet = validSavedWallets[0];
await localforage.setItem('wallets', [
walletWithXecAndTokens,
savedWallet,
]);
render(
<CashtabTestWrapper chronik={mockedChronik} route="/contacts" />,
);
// Wait for the app to load
await waitFor(() =>
expect(
screen.queryByTitle('Cashtab Loading'),
).not.toBeInTheDocument(),
);
// Contacts component is rendered
expect(screen.getByTitle('Contacts')).toBeInTheDocument();
- // Click the first row Delete button
+ // We can copy a contact's address to the clipboard
+ await user.click(
+ screen.getByRole('button', {
+ name: /Copy alpha/i,
+ }),
+ );
+
+ // Confirm copy success notification is triggered
+ await waitFor(() => {
+ expect(
+ screen.getByText(
+ `"ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6" copied to clipboard`,
+ ),
+ ).toBeInTheDocument();
+ });
+
+ // Delete the first saved wallet, "alpha"
await user.click(
screen.getByRole('button', {
name: /Delete alpha/i,
}),
);
// Type correct confirmation phrase in confirm delete modal
await user.type(
screen.getByPlaceholderText('Type "delete alpha" to confirm'),
'delete alpha',
);
// Click OK
await user.click(screen.getByText('OK'));
// Confirm it has been removed from local storage
const expectedContactsAfterRemovingAlpha = [
{
address: 'ecash:qz2708636snqhsxu8wnlka78h6fdp77ar59jrf5035',
name: 'beta',
},
{
address: 'ecash:qphlhe78677sz227k83hrh542qeehh8el5lcjwk72y',
name: 'gamma',
},
];
const contactListAfterRemove = await localforage.getItem('contactList');
expect(contactListAfterRemove).toEqual(
expectedContactsAfterRemovingAlpha,
);
// Confirm notification is triggered
await waitFor(() => {
expect(
screen.getByText(`"alpha" removed from Contacts`),
).toBeInTheDocument();
});
// Add a contact
await user.click(screen.getByRole('button', { name: 'Add Contact' }));
const nameInput = screen.getByPlaceholderText('Enter contact name');
const addrInput = screen.getByPlaceholderText(
'Enter new eCash address',
);
const address = 'ecash:qqxefwshnmppcsjp0fc6w7rnkdsexc7cagdus7ugd0';
await user.type(nameInput, 'delta');
await user.type(addrInput, address);
// Click OK
await user.click(screen.getByText('OK'));
// Confirm new contact is added in local storage
const contactListAfterAdd = await localforage.getItem('contactList');
expect(contactListAfterAdd).toEqual([
{
address: 'ecash:qz2708636snqhsxu8wnlka78h6fdp77ar59jrf5035',
name: 'beta',
},
{
address: 'ecash:qphlhe78677sz227k83hrh542qeehh8el5lcjwk72y',
name: 'gamma',
},
{
address: 'ecash:qqxefwshnmppcsjp0fc6w7rnkdsexc7cagdus7ugd0',
name: 'delta',
},
]);
// Confirm add contact success notification is triggered
await waitFor(() => {
expect(
screen.getByText(`"delta" (${address}) added to Contacts`),
).toBeInTheDocument();
});
// We are blocked by validation if we try to add a contact that already exists
await user.click(screen.getByRole('button', { name: 'Add Contact' }));
const nameInputRepeat =
screen.getByPlaceholderText('Enter contact name');
const addrInputRepeat = screen.getByPlaceholderText(
'Enter new eCash address',
);
await user.type(nameInputRepeat, 'delta');
await user.type(addrInputRepeat, address);
// OK is disabled and we have a validation error
const okAddContactButtonAgain = screen.getByText('OK');
expect(okAddContactButtonAgain).toHaveProperty('disabled', true);
expect(
screen.getByText(
`${address.slice(6, 9)}...${address.slice(
-3,
)} already in Contacts`,
),
).toBeInTheDocument();
// Close this modal
await user.click(screen.getByText('Cancel'));
// We can rename a contact
await user.click(
screen.getByRole('button', {
name: /Rename beta/i,
}),
);
const editNameInput = screen.getByPlaceholderText(
'Enter new contact name',
);
await user.type(editNameInput, 'omega');
// Click OK
const okRenameContactButton = screen.getByText('OK');
await user.click(okRenameContactButton);
// Confirm first contact (formerly beta) is renamed
const contactListAfterRename = await localforage.getItem('contactList');
expect(contactListAfterRename).toEqual([
{
address: 'ecash:qz2708636snqhsxu8wnlka78h6fdp77ar59jrf5035',
name: 'omega',
},
{
address: 'ecash:qphlhe78677sz227k83hrh542qeehh8el5lcjwk72y',
name: 'gamma',
},
{
address: 'ecash:qqxefwshnmppcsjp0fc6w7rnkdsexc7cagdus7ugd0',
name: 'delta',
},
]);
// Confirm rename success notification is triggered
await waitFor(() => {
expect(
screen.getByText(`"beta" renamed to "omega"`),
).toBeInTheDocument();
});
});
it('We can send a tx to an address in contacts', async () => {
// localforage defaults
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
// Custom contact list
await localforage.setItem('contactList', populatedContactList);
render(
<CashtabTestWrapper chronik={mockedChronik} route="/contacts" />,
);
// Wait for the app to load
await waitFor(() =>
expect(
screen.queryByTitle('Cashtab Loading'),
).not.toBeInTheDocument(),
);
// Click the first row Send button
- await user.click(screen.getAllByTitle('tx-sent')[0]);
+ await user.click(
+ screen.getByRole('link', {
+ name: /Send to alpha/i,
+ }),
+ );
// Now we are on the SendXec page and the address field is filled out
expect(screen.getByPlaceholderText('Address')).toHaveValue(
populatedContactList[0].address,
);
});
});
diff --git a/cashtab/src/components/Contacts/index.js b/cashtab/src/components/Contacts/index.js
index 8d9d8b602..52a39ea2b 100644
--- a/cashtab/src/components/Contacts/index.js
+++ b/cashtab/src/components/Contacts/index.js
@@ -1,362 +1,358 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import React, { useState } from 'react';
-import { Link } from 'react-router-dom';
import { WalletContext } from 'wallet/context';
-import CopyToClipboard from 'components/Common/CopyToClipboard';
import {
- CopyPasteIcon,
TrashcanIcon,
EditIcon,
SendIcon,
} from 'components/Common/CustomIcons';
import Modal from 'components/Common/Modal';
import { ModalInput, InputFlex } from 'components/Common/Inputs';
import { toast } from 'react-toastify';
import PrimaryButton, {
SecondaryButton,
-} from 'components/Common/PrimaryButton';
+ IconButton,
+ IconLink,
+ CopyIconButton,
+} from 'components/Common/Buttons';
import { getContactAddressError, getContactNameError } from 'validation';
import {
ContactList,
ContactsPanel,
Row,
ButtonRow,
ContactListName,
ButtonPanel,
- SvgButton,
} from 'components/Contacts/styles';
const Contacts = () => {
const ContextValue = React.useContext(WalletContext);
const { cashtabState, updateCashtabState } = ContextValue;
const { wallets, contactList } = cashtabState;
const wallet = wallets.length > 0 ? wallets[0] : false;
const emptyFormData = {
renamedContactName: '',
contactToBeDeletedName: '',
newContactName: '',
newContactAddress: '',
};
const emptyFormDataErrors = {
renamedContactName: false,
contactToBeDeletedName: false,
newContactName: false,
newContactAddress: false,
};
// State variables
const [formData, setFormData] = useState(emptyFormData);
const [formDataErrors, setFormDataErrors] = useState(emptyFormDataErrors);
const [contactToBeRenamed, setContactToBeRenamed] = useState(null);
const [contactToBeDeleted, setContactToBeDeleted] = useState(null);
const [showAddNewContactModal, setShowAddNewContactModal] = useState(false);
/**
* Update formData with user input
* @param {Event} e js input event
* e.target.value will be input value
* e.target.name will be name of originating input field
*/
const handleInput = e => {
const { name, value } = e.target;
if (name === 'renamedContactName' || name === 'newContactName') {
const contactNameError = getContactNameError(value, contactList);
setFormDataErrors(previous => ({
...previous,
[name]: contactNameError,
}));
}
if (name === 'contactToBeDeletedName') {
const deleteConfirmationError =
value === 'delete ' + contactToBeDeleted.name
? false
: `Input must exactly match "delete ${contactToBeDeleted.name}"`;
setFormDataErrors(previous => ({
...previous,
[name]: deleteConfirmationError,
}));
}
if (name === 'newContactAddress') {
const newContactAddressError = getContactAddressError(
value,
contactList,
);
setFormDataErrors(previous => ({
...previous,
[name]: newContactAddressError,
}));
}
setFormData(previous => ({
...previous,
[name]: value,
}));
};
const renameContact = async () => {
// Find the contact you want to rename
let contactToUpdate = contactList.find(
contact => contact.address === contactToBeRenamed.address,
);
const oldName = contactToUpdate.name;
// if a match was found
if (typeof contactToUpdate !== 'undefined') {
// update the contact name
contactToUpdate.name = formData.renamedContactName;
// Update localforage and state
await updateCashtabState('contactList', contactList);
toast.success(
`"${oldName}" renamed to "${formData.renamedContactName}"`,
);
} else {
toast.error(`Unable to find contact`);
}
// Clear contactToBeRenamed field to hide the modal
setContactToBeRenamed(null);
// Clear contact rename input
setFormData(previous => ({
...previous,
renamedContactName: '',
}));
};
const deleteContact = async () => {
// filter contact from local contact list array
const updatedContactList = contactList.filter(
contact => contact.address !== contactToBeDeleted.address,
);
// Update localforage and state
await updateCashtabState('contactList', updatedContactList);
toast.success(`"${contactToBeDeleted.name}" removed from Contacts`);
// Reset contactToBeDeleted to hide the modal
setContactToBeDeleted(null);
// Clear contact to delete input
setFormData(previous => ({
...previous,
contactToBeDeletedName: '',
}));
};
const addNewContact = async () => {
// Check to see if the contact exists
// Note: we validate for this before entering the function, should never happen
const contactExists = contactList.find(
contact => contact.address === formData.newContactAddress,
);
if (typeof contactExists !== 'undefined') {
// Contact exists
toast.error(
`${formData.newContactAddress} already exists in Contacts`,
);
} else {
contactList.push({
name: formData.newContactName,
address: formData.newContactAddress,
});
// update localforage and state
await updateCashtabState('contactList', contactList);
toast.success(
`"${formData.newContactName}" (${formData.newContactAddress}) added to Contacts`,
);
}
// Reset relevant state fields
setShowAddNewContactModal(false);
// Clear new contact formData
setFormData(previous => ({
...previous,
newContactAddress: '',
newContactName: '',
}));
};
const exportContactList = contactListArray => {
if (!contactListArray) {
toast.error('Unable to export contact list');
return;
}
// convert object array into csv data
let csvContent =
'data:text/csv;charset=utf-8,' +
contactListArray.map(
element => '\n' + element.name + '|' + element.address,
);
// encode csv
var encodedUri = encodeURI(csvContent);
// hidden DOM node to set the default file name
var csvLink = document.createElement('a');
csvLink.setAttribute('href', encodedUri);
csvLink.setAttribute(
'download',
'Cashtab_Contacts_' + wallet.name + '.csv',
);
document.body.appendChild(csvLink);
csvLink.click();
};
return (
<>
{contactToBeRenamed !== null && (
<Modal
height={180}
title={`Rename "${contactToBeRenamed.name}"?`}
handleOk={renameContact}
handleCancel={() => setContactToBeRenamed(null)}
showCancelButton
disabled={
formDataErrors.renamedContactName !== false ||
formData.renamedContactName === ''
}
>
<ModalInput
placeholder="Enter new contact name"
name="renamedContactName"
value={formData.renamedContactName}
error={formDataErrors.renamedContactName}
handleInput={handleInput}
/>
</Modal>
)}
{contactToBeDeleted !== null && (
<Modal
height={210}
title={`Delete ${contactToBeDeleted.name}?`}
handleOk={deleteContact}
handleCancel={() => setContactToBeDeleted(null)}
showCancelButton
disabled={
formDataErrors.contactToBeDeletedName !== false ||
formData.contactToBeDeletedName === ''
}
>
<ModalInput
placeholder={`Type "delete ${contactToBeDeleted.name}" to confirm`}
name="contactToBeDeletedName"
value={formData.contactToBeDeletedName}
handleInput={handleInput}
error={formDataErrors.contactToBeDeletedName}
/>
</Modal>
)}
{showAddNewContactModal && (
<Modal
height={250}
title={`Add new contact`}
handleOk={addNewContact}
handleCancel={() => setShowAddNewContactModal(false)}
showCancelButton
disabled={
formDataErrors.newContactName !== false ||
formDataErrors.newContactAddress !== false ||
formData.newContactName === '' ||
formData.newContactAddress === ''
}
>
<InputFlex>
<ModalInput
placeholder="Enter contact name"
name="newContactName"
value={formData.newContactName}
error={formDataErrors.newContactName}
handleInput={handleInput}
/>
<ModalInput
placeholder="Enter new eCash address"
name="newContactAddress"
value={formData.newContactAddress}
error={formDataErrors.newContactAddress}
handleInput={handleInput}
/>
</InputFlex>
</Modal>
)}
<ContactList title="Contacts">
<ContactsPanel>
{contactList && contactList.length > 0 ? (
contactList.map((contact, index) => (
<Row key={index}>
<ContactListName>
{contact.name}
</ContactListName>
<ButtonPanel>
- <CopyToClipboard
+ <CopyIconButton
+ name={`Copy ${contact.name}`}
data={contact.address}
showToast
- >
- <CopyPasteIcon />
- </CopyToClipboard>
- <SvgButton
- aria-label={`Rename ${contact.name}`}
+ />
+ <IconButton
+ name={`Rename ${contact.name}`}
+ icon={<EditIcon />}
onClick={() =>
setContactToBeRenamed(contact)
}
- >
- <EditIcon />
- </SvgButton>
- <Link
+ />
+ <IconLink
+ name={`Send to ${contact.name}`}
+ icon={<SendIcon />}
to="/send"
state={{
contactSend: contact.address,
}}
- >
- <SendIcon />
- </Link>
- <SvgButton
- aria-label={`Delete ${contact.name}`}
+ />
+ <IconButton
+ name={`Delete ${contact.name}`}
+ icon={<TrashcanIcon />}
onClick={() =>
setContactToBeDeleted(contact)
}
- >
- <TrashcanIcon />
- </SvgButton>
+ />
</ButtonPanel>
</Row>
))
) : (
<div>
<p>{'Your contact list is empty.'}</p>
<p>
{
'Contacts can be added by clicking on a received transaction and looking for the "Add to contacts" icon or via the "New Contact" button below.'
}
</p>
</div>
)}
</ContactsPanel>
<ButtonRow>
<PrimaryButton
onClick={() => setShowAddNewContactModal(true)}
>
Add Contact
</PrimaryButton>
</ButtonRow>
{contactList && contactList.length > 0 && (
<ButtonRow>
<SecondaryButton
onClick={() => exportContactList(contactList)}
>
Export
</SecondaryButton>
</ButtonRow>
)}
</ContactList>
</>
);
};
export default Contacts;
diff --git a/cashtab/src/components/Contacts/styles.js b/cashtab/src/components/Contacts/styles.js
index a6bac4fa5..546b389de 100644
--- a/cashtab/src/components/Contacts/styles.js
+++ b/cashtab/src/components/Contacts/styles.js
@@ -1,72 +1,61 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import styled from 'styled-components';
export const ContactList = styled.div`
margin-top: 24px;
padding: 12px;
display: flex;
flex-direction: column;
width: 100%;
align-items: center;
gap: 12px;
color: ${props => props.theme.contrast};
- svg {
- height: 24px;
- width: 24px;
- fill: ${props => props.theme.eCashBlue};
- }
box-sizing: border-box;
*,
*:before,
*:after {
box-sizing: inherit;
}
`;
export const ContactsPanel = styled.div`
display: flex;
flex-direction: column;
padding: 12px;
width: 100%;
background-color: ${props => props.theme.panel};
border-radius: 9px;
margin-bottom: 12px;
`;
export const Row = styled.div`
display: flex;
width: 100%;
align-items: center;
justify-content: space-between;
gap: 12px;
flex-wrap: wrap;
border-bottom: 0.5px solid ${props => props.theme.separator};
padding: 6px 0;
`;
export const ButtonRow = styled.div`
display: flex;
width: 100%;
align-items: center;
gap: 12px;
`;
export const ContactListName = styled.div`
display: flex;
text-align: left;
word-break: break-word;
`;
export const ButtonPanel = styled.div`
display: flex;
gap: 9px;
align-items: baseline;
`;
-
-export const SvgButton = styled.button`
- border: none;
- background: none;
- cursor: pointer;
-`;
diff --git a/cashtab/src/components/Etokens/CreateTokenForm.js b/cashtab/src/components/Etokens/CreateTokenForm.js
index b9a292fa9..b5452dbca 100644
--- a/cashtab/src/components/Etokens/CreateTokenForm.js
+++ b/cashtab/src/components/Etokens/CreateTokenForm.js
@@ -1,757 +1,757 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import React, { useState, useCallback } from 'react';
import styled from 'styled-components';
import Modal from 'components/Common/Modal';
import { WalletContext } from 'wallet/context';
import {
isValidTokenName,
isValidTokenTicker,
isValidTokenDecimals,
isValidTokenMintAmount,
isValidTokenDocumentUrl,
isProbablyNotAScam,
} from 'validation';
-import PrimaryButton from 'components/Common/PrimaryButton';
+import PrimaryButton from 'components/Common/Buttons';
import {
Input,
SendTokenInput,
Slider,
CashtabDragger,
} from 'components/Common/Inputs';
import CashtabSwitch from 'components/Common/Switch';
import { TokenParamLabel } from 'components/Common/Atoms';
import Cropper from 'react-easy-crop';
import getCroppedImg from 'components/Etokens/icons/cropImage';
import getRoundImg from 'components/Etokens/icons/roundImage';
import getResizedImage from 'components/Etokens/icons/resizeImage';
import { token as tokenConfig } from 'config/token';
import appConfig from 'config/app';
import { getSlpGenesisTargetOutput, getMaxMintAmount } from 'slpv1';
import { sendXec } from 'transactions';
import { TokenNotificationIcon } from 'components/Common/CustomIcons';
import { explorer } from 'config/explorer';
import { getWalletState } from 'utils/cashMethods';
import { hasEnoughToken } from 'wallet';
import { toast } from 'react-toastify';
import Switch from 'components/Common/Switch';
const Form = styled.div`
display: flex;
flex-direction: column;
gap: 12px;
`;
const SwitchRow = styled.div`
display: flex;
flex-direction: row;
gap: 12px;
align-items: center;
`;
const SwitchLabel = styled.div`
text-align: left;
color: ${props => props.theme.contrast};
font-size: 18px;
`;
const EditIcon = styled.div`
cursor: pointer;
color: ${props => props.theme.contrast};
&:hover {
color: ${props => props.theme.eCashBlue};
}
word-wrap: break-word;
`;
const TokenCreatedLink = styled.a`
color: ${props => props.theme.walletBackground};
text-decoration: none;
`;
const IconModalForm = styled.div`
display: flex;
flex-direction: column;
gap: 12px;
justify-content: center;
`;
const IconModalRow = styled.div`
display: flex;
width: 100%;
gap: 3px;
`;
const SliderLabel = styled.div`
color: ${props => props.theme.contrast};
`;
const SliderBox = styled.div`
width: 100%;
`;
const CropperContainer = styled.div`
height: 200px;
position: relative;
`;
const CreateTokenTitle = styled.h3`
color: ${props => props.theme.contrast};
`;
const TokenCreationSummaryTable = styled.div`
color: ${props => props.theme.contrast};
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
gap: 3px;
`;
const SummaryRow = styled.div`
display: flex;
gap: 12px;
justify-content: flex-start;
align-items: start;
width: 100%;
`;
const TokenParam = styled.div`
word-break: break-word;
`;
const CreateTokenForm = () => {
const { chronik, chaintipBlockheight, cashtabState } =
React.useContext(WalletContext);
const { settings, wallets } = cashtabState;
const wallet = wallets.length > 0 ? wallets[0] : false;
const walletState = getWalletState(wallet);
const { tokens } = walletState;
// eToken icon adds
const [tokenIcon, setTokenIcon] = useState('');
const [loading, setLoading] = useState(false);
const [fileName, setFileName] = useState('');
const [tokenIconFileName, setTokenIconFileName] = useState(undefined);
const [rawImageUrl, setRawImageUrl] = useState('');
const [imageUrl, setImageUrl] = useState(false);
const [showCropModal, setShowCropModal] = useState(false);
const [roundSelection, setRoundSelection] = useState(true);
const [createWithMintBatonAtIndexTwo, setCreateWithMintBatonAtIndexTwo] =
useState(false);
const [crop, setCrop] = useState({ x: 0, y: 0 });
const [rotation, setRotation] = useState(0);
const [zoom, setZoom] = useState(1);
const [croppedAreaPixels, setCroppedAreaPixels] = useState(null);
const onCropComplete = useCallback((croppedArea, croppedAreaPixels) => {
setCroppedAreaPixels(croppedAreaPixels);
}, []);
const showCroppedImage = useCallback(async () => {
setLoading(true);
try {
let imageToResize;
const croppedResult = await getCroppedImg(
rawImageUrl,
croppedAreaPixels,
rotation,
fileName,
);
if (roundSelection) {
imageToResize = await getRoundImg(croppedResult.url, fileName);
} else {
imageToResize = croppedResult;
}
await getResizedImage(
imageToResize.url,
resizedResult => {
setTokenIcon(resizedResult.file);
setImageUrl(resizedResult.url);
},
fileName,
);
} catch (e) {
console.error(e);
} finally {
setLoading(false);
}
}, [croppedAreaPixels, fileName, rawImageUrl, rotation, roundSelection]);
const onClose = useCallback(() => {
setShowCropModal(false);
}, []);
const handleTokenIconImage = (imgFile, callback) =>
new Promise((resolve, reject) => {
setLoading(true);
try {
const reader = new FileReader();
const width = 512;
const height = 512;
reader.readAsDataURL(imgFile);
reader.addEventListener('load', () =>
setRawImageUrl(reader.result),
);
reader.onload = event => {
const img = new Image();
img.src = event.target.result;
img.onload = () => {
const elem = document.createElement('canvas');
elem.width = width;
elem.height = height;
const ctx = elem.getContext('2d');
// img.width and img.height will contain the original dimensions
ctx.drawImage(img, 0, 0, width, height);
if (!HTMLCanvasElement.prototype.toBlob) {
Object.defineProperty(
HTMLCanvasElement.prototype,
'toBlob',
{
value: function (callback, type, quality) {
var dataURL = this.toDataURL(
type,
quality,
).split(',')[1];
setTimeout(function () {
var binStr = atob(dataURL),
len = binStr.length,
arr = new Uint8Array(len);
for (var i = 0; i < len; i++) {
arr[i] = binStr.charCodeAt(i);
}
callback(
new Blob([arr], {
type: type || 'image/png',
}),
);
});
},
},
);
}
ctx.canvas.toBlob(
blob => {
let fileNameParts = imgFile.name.split('.');
fileNameParts.pop();
let fileNamePng =
fileNameParts.join('.') + '.png';
const file = new File([blob], fileNamePng, {
type: 'image/png',
});
setFileName(fileNamePng);
const resultReader = new FileReader();
resultReader.readAsDataURL(file);
setTokenIcon(file);
resultReader.addEventListener('load', () =>
callback(resultReader.result),
);
setLoading(false);
setShowCropModal(true);
resolve();
},
'image/png',
1,
);
};
};
} catch (err) {
console.error(`Error in handleTokenIconImage()`, err);
reject(err);
}
});
const validateTokenIconUpload = file => {
const approvedFileTypes = ['image/png', 'image/jpg', 'image/jpeg'];
try {
if (!approvedFileTypes.includes(file.type)) {
throw new Error('Only jpg or png image files are accepted');
}
setLoading(true);
handleTokenIconImage(file, imageUrl => setImageUrl(imageUrl));
} catch (e) {
toast.error(
`Cashtab can only process jpg or png files for token icon uploads.`,
);
setTokenIconFileName(undefined);
setTokenIcon(undefined);
setImageUrl('');
return false;
}
};
// Token name
const [name, setName] = useState('');
const [newTokenNameIsValid, setNewTokenNameIsValid] = useState(null);
const [newTokenNameIsProbablyNotAScam, setNewTokenNameIsProbablyNotAScam] =
useState(null);
const [tokenNameError, setTokenNameError] = useState(false);
const handleNewTokenNameInput = e => {
const { value } = e.target;
// validation
const validTokenName = isValidTokenName(value);
const probablyNotScam = isProbablyNotAScam(value);
setNewTokenNameIsValid(validTokenName);
setNewTokenNameIsProbablyNotAScam(probablyNotScam);
if (!validTokenName) {
setTokenNameError(
'Token name must be a valid string between 1 and 68 characters long.',
);
}
if (!probablyNotScam) {
setTokenNameError(
'Token name must not conflict with existing crypto or fiat',
);
}
if (validTokenName && probablyNotScam) {
setTokenNameError(false);
}
setName(value);
};
// New Token Ticker
const [ticker, setTicker] = useState('');
const [newTokenTickerIsValid, setNewTokenTickerIsValid] = useState(null);
const [
newTokenTickerIsProbablyNotAScam,
setNewTokenTickerIsProbablyNotAScam,
] = useState(null);
const [tokenTickerError, setTokenTickerError] = useState(false);
const handleNewTokenTickerInput = e => {
const { value } = e.target;
// validation
const validTokenTicker = isValidTokenTicker(value);
const probablyNotScamTicker = isProbablyNotAScam(value);
setNewTokenTickerIsValid(validTokenTicker);
setNewTokenTickerIsProbablyNotAScam(probablyNotScamTicker);
if (!validTokenTicker) {
setTokenTickerError(
'Ticker must be a valid string between 1 and 12 characters long',
);
}
if (!probablyNotScamTicker) {
setTokenTickerError(
'Token ticker must not conflict with existing crypto or fiat',
);
}
if (validTokenTicker && probablyNotScamTicker) {
setTokenTickerError(false);
}
setTicker(value);
};
// New Token Decimals
const [decimals, setDecimals] = useState('');
const [decimalsError, setDecimalsError] = useState(false);
const handleNewTokenDecimalsInput = e => {
const { value } = e.target;
// validation
setDecimalsError(
isValidTokenDecimals(value)
? false
: 'Token decimals must be an integer between 0 and 9',
);
// Also validate the supply here if the form has been touched
// Supply validation may change when decimals changes
if (initialQty !== '') {
const isValidOrErrorMsg = isValidTokenMintAmount(
initialQty,
parseInt(value),
);
setGenesisSupplyError(
typeof isValidOrErrorMsg === 'string'
? isValidOrErrorMsg
: false,
);
}
setDecimals(value);
};
const onMaxGenesis = () => {
// Use 0 for decimals if user has not input decimals yet
const usedDecimals = decimals === '' ? 0 : parseInt(decimals);
const maxGenesisAmount = getMaxMintAmount(usedDecimals);
handleNewTokenInitialQtyInput({
target: {
name: 'initialQty',
value: maxGenesisAmount,
},
});
};
// New Token Initial Quantity
const [initialQty, setInitialQty] = useState('');
const [genesisSupplyError, setGenesisSupplyError] = useState(null);
const handleNewTokenInitialQtyInput = e => {
const { value } = e.target;
// If user has not yet input decimals, assume 0 decimals
const usedDecimalsValue = decimals === '' ? 0 : parseInt(decimals);
// validation
const isValidOrErrorMsg = isValidTokenMintAmount(
value,
usedDecimalsValue,
);
setGenesisSupplyError(
typeof isValidOrErrorMsg === 'string' ? isValidOrErrorMsg : false,
);
setInitialQty(value);
};
// New Token document URL
const [url, setUrl] = useState('');
const [urlError, setUrlError] = useState(false);
const handleNewTokenDocumentUrlInput = e => {
const { value } = e.target;
// validation
setUrlError(
isValidTokenDocumentUrl(value)
? false
: 'Must be a valid URL. Cannot exceed 68 characters.',
);
setUrl(value);
};
// New Token fixed supply
// Only allow creation of fixed supply tokens until Minting support is added
// New Token document hash
// Do not include this; questionable value to casual users and requires significant complication
// Only enable CreateToken button if all form entries are valid
let tokenGenesisDataIsValid =
newTokenNameIsValid &&
newTokenTickerIsValid &&
!decimalsError &&
!genesisSupplyError &&
!urlError &&
newTokenNameIsProbablyNotAScam &&
newTokenTickerIsProbablyNotAScam;
// Modal settings
const [showConfirmCreateToken, setShowConfirmCreateToken] = useState(false);
const submitTokenIcon = async tokenId => {
let formData = new FormData();
const data = {
name,
ticker,
decimals,
url,
initialQty,
tokenIcon,
};
for (let key in data) {
formData.append(key, data[key]);
}
// This function is called after the genesis tx is broadcast, using tokenId as a calling param
formData.append('tokenId', tokenId);
try {
const tokenIconApprovalResponse = await fetch(
tokenConfig.tokenIconSubmitApi,
{
method: 'POST',
//Note: fetch automatically assigns correct header for multipart form based on formData obj
headers: {
Accept: 'application/json',
},
body: formData,
},
);
const tokenIconApprovalResponseJson =
await tokenIconApprovalResponse.json();
if (
typeof tokenIconApprovalResponseJson.status === 'undefined' ||
tokenIconApprovalResponseJson.status !== 'ok'
) {
// Let the user know there was an issue with submitting the token icon
if (tokenIconApprovalResponseJson.msg) {
throw new Error(tokenIconApprovalResponseJson.msg);
} else {
throw new Error(
'Error uploading token icon. Please email icons@e.cash for support.',
);
}
}
toast.success(`Successfully uploaded token icon`);
} catch (err) {
console.error(err.message);
toast.error(
`Error submitting token icon for approval, please contact icons@e.cash for support`,
);
}
};
const createPreviewedToken = async () => {
// If data is for some reason not valid here, bail out
if (!tokenGenesisDataIsValid) {
return;
}
// data must be valid and user reviewed to get here
const configObj = {
name,
ticker,
documentUrl: url === '' ? tokenConfig.newTokenDefaultUrl : url,
decimals,
initialQty,
documentHash: '',
mintBatonVout: createWithMintBatonAtIndexTwo ? 2 : null,
};
// create token with data in state fields
try {
// Get target outputs for an SLP v1 genesis tx
const targetOutputs = getSlpGenesisTargetOutput(
configObj,
wallet.paths.get(1899).address,
);
const { response } = await sendXec(
chronik,
wallet,
targetOutputs,
settings.minFeeSends &&
hasEnoughToken(
tokens,
appConfig.vipSettingsTokenId,
appConfig.vipSettingsTokenQty,
)
? appConfig.minFee
: appConfig.defaultFee,
chaintipBlockheight,
);
toast(
<TokenCreatedLink
href={`${explorer.blockExplorerUrl}/tx/${response.txid}`}
target="_blank"
rel="noopener noreferrer"
>
Token created!
</TokenCreatedLink>,
{
icon: TokenNotificationIcon,
},
);
// If this eToken has an icon, upload to server
if (tokenIcon !== '') {
submitTokenIcon(response.txid);
}
} catch (e) {
toast.error(`${e}`);
}
// Hide the modal
setShowConfirmCreateToken(false);
};
return (
<>
{showConfirmCreateToken && (
<Modal
title={`Your Token`}
handleOk={createPreviewedToken}
handleCancel={() => setShowConfirmCreateToken(false)}
showCancelButton
height={260}
>
<TokenCreationSummaryTable>
<SummaryRow>
<TokenParamLabel>Name:</TokenParamLabel>
<TokenParam>{name}</TokenParam>
</SummaryRow>
<SummaryRow>
<TokenParamLabel>Ticker:</TokenParamLabel>{' '}
<TokenParam>{ticker}</TokenParam>
</SummaryRow>
<SummaryRow>
<TokenParamLabel>Decimals:</TokenParamLabel>
<TokenParam> {decimals}</TokenParam>
</SummaryRow>
<SummaryRow>
<TokenParamLabel>Supply:</TokenParamLabel>
<TokenParam>{initialQty}</TokenParam>
</SummaryRow>
<SummaryRow>
<TokenParamLabel>URL:</TokenParamLabel>
<TokenParam>
{url === ''
? tokenConfig.newTokenDefaultUrl
: url}
</TokenParam>
</SummaryRow>
</TokenCreationSummaryTable>
</Modal>
)}
<CreateTokenTitle>Create a Token</CreateTokenTitle>
<Form>
<Input
placeholder="Enter a name for your token"
name="name"
value={name}
handleInput={handleNewTokenNameInput}
error={tokenNameError}
/>
<Input
placeholder="Enter a ticker for your token"
name="ticker"
value={ticker}
handleInput={handleNewTokenTickerInput}
error={tokenTickerError}
/>
<Input
placeholder="Enter number of decimal places"
name="decimals"
type="number"
value={decimals}
handleInput={handleNewTokenDecimalsInput}
error={decimalsError}
/>
<SendTokenInput
placeholder="Enter the supply of your token"
name="initialQty"
type="string"
value={initialQty}
decimals={decimals}
handleInput={handleNewTokenInitialQtyInput}
error={genesisSupplyError}
handleOnMax={onMaxGenesis}
/>
<Input
placeholder="Enter a website for your token"
name="url"
value={url}
handleInput={handleNewTokenDocumentUrlInput}
error={urlError}
/>
<SwitchRow>
<Switch
name="Toggle Mint Baton"
on="Variable"
off="Fixed"
width={110}
right={74}
checked={createWithMintBatonAtIndexTwo}
handleToggle={() => {
setCreateWithMintBatonAtIndexTwo(
!createWithMintBatonAtIndexTwo,
);
}}
/>
<SwitchLabel>Token supply</SwitchLabel>
</SwitchRow>
<CashtabDragger
name="Cashtab Dragger"
handleFile={validateTokenIconUpload}
imageUrl={imageUrl}
/>
{typeof tokenIconFileName === 'string' && (
<p>{tokenIconFileName.name}</p>
)}
{!loading && tokenIcon && (
<EditIcon onClick={() => setShowCropModal(true)}>
{tokenIcon.name} [edit]
</EditIcon>
)}
{showCropModal && (
<Modal
handleCancel={onClose}
handleOk={() => showCroppedImage() && onClose()}
height={400}
>
<IconModalForm>
<CropperContainer>
<Cropper
showGrid={true}
zoomWithScroll={true}
image={rawImageUrl}
crop={crop}
zoom={zoom}
rotation={rotation}
cropShape={
roundSelection ? 'round' : 'rect'
}
aspect={1 / 1}
onCropChange={setCrop}
onRotationChange={setRotation}
onCropComplete={onCropComplete}
onZoomChange={setZoom}
/>
</CropperContainer>
<IconModalRow>
<CashtabSwitch
off="Square"
on="Round"
name="cropShape"
width={100}
right={66}
checked={roundSelection}
handleToggle={() =>
setRoundSelection(!roundSelection)
}
/>
</IconModalRow>
<IconModalRow>
<SliderLabel>Zoom:</SliderLabel>
<SliderBox>
<Slider
name="zoom"
value={zoom}
handleSlide={setZoom}
min={1}
max={10}
step={0.01}
/>
</SliderBox>
</IconModalRow>
<IconModalRow>
<SliderLabel>Rotation:</SliderLabel>
<SliderBox>
<Slider
name="rotation"
value={rotation}
handleSlide={setRotation}
min={0}
max={360}
step={1}
/>
</SliderBox>
</IconModalRow>
</IconModalForm>
</Modal>
)}
<PrimaryButton
onClick={() => setShowConfirmCreateToken(true)}
disabled={!tokenGenesisDataIsValid}
style={{ marginTop: '30px' }}
>
Create eToken
</PrimaryButton>
</Form>
</>
);
};
export default CreateTokenForm;
diff --git a/cashtab/src/components/Etokens/Etokens.js b/cashtab/src/components/Etokens/Etokens.js
index cbc42ec29..d0319b946 100644
--- a/cashtab/src/components/Etokens/Etokens.js
+++ b/cashtab/src/components/Etokens/Etokens.js
@@ -1,73 +1,73 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import React from 'react';
import styled from 'styled-components';
import { WalletContext } from 'wallet/context';
import { LoadingCtn } from 'components/Common/Atoms';
import TokenList from './TokenList';
import { getWalletState } from 'utils/cashMethods';
import appConfig from 'config/app';
import { getUserLocale } from 'helpers';
-import { PrimaryLink } from 'components/Common/PrimaryButton';
+import { PrimaryLink } from 'components/Common/Buttons';
const EtokensCtn = styled.div`
color: ${props => props.theme.contrast};
width: 100%;
h2 {
margin: 0 0 20px;
margin-top: 10px;
}
padding-top: 24px;
`;
const ButtonHolder = styled.div`
display: flex;
flex-direction: column;
gap: 12px;
align-items: center;
justify-content: center;
`;
const Etokens = () => {
const ContextValue = React.useContext(WalletContext);
const { loading, cashtabState } = ContextValue;
const { wallets, cashtabCache } = cashtabState;
const wallet = wallets.length > 0 ? wallets[0] : false;
const walletState = getWalletState(wallet);
const { tokens } = walletState;
const userLocale = getUserLocale(navigator);
return (
<>
{loading ? (
<LoadingCtn />
) : (
<EtokensCtn title="Wallet Tokens">
<ButtonHolder title="Create eToken">
<PrimaryLink
to={{
pathname: `/create-token`,
}}
>
Create eToken
</PrimaryLink>
</ButtonHolder>
{tokens && tokens.size > 0 ? (
<TokenList
tokens={tokens}
tokenCache={cashtabCache.tokens}
userLocale={userLocale}
/>
) : (
<p>
Tokens sent to your {appConfig.tokenTicker} address
will appear here
</p>
)}
</EtokensCtn>
)}
</>
);
};
export default Etokens;
diff --git a/cashtab/src/components/OnBoarding/OnBoarding.js b/cashtab/src/components/OnBoarding/OnBoarding.js
index f01d53f2f..18211aba8 100644
--- a/cashtab/src/components/OnBoarding/OnBoarding.js
+++ b/cashtab/src/components/OnBoarding/OnBoarding.js
@@ -1,130 +1,128 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import React, { useState } from 'react';
import styled from 'styled-components';
import { WalletContext } from 'wallet/context';
import { Input, InputFlex } from 'components/Common/Inputs';
-import PrimaryButton, {
- SecondaryButton,
-} from 'components/Common/PrimaryButton';
+import PrimaryButton, { SecondaryButton } from 'components/Common/Buttons';
import { Event } from 'components/Common/GoogleAnalytics';
import { validateMnemonic } from 'validation';
import appConfig from 'config/app';
import { createCashtabWallet, generateMnemonic } from 'wallet';
export const WelcomeCtn = styled.div`
margin-top: 20px;
padding: 0px 30px;
color: ${props => props.theme.contrast};
h2 {
color: ${props => props.theme.contrast};
}
`;
export const WelcomeText = styled.p`
width: 100%;
font-size: 16px;
margin-bottom: 60px;
text-align: left;
`;
export const WelcomeLink = styled.a`
text-decoration: underline;
color: ${props => props.theme.eCashBlue};
:hover {
color: ${props => props.theme.eCashPurple} !important;
text-decoration: underline !important;
}
`;
const OnBoarding = () => {
const ContextValue = React.useContext(WalletContext);
const { updateCashtabState, cashtabState } = ContextValue;
const { wallets } = cashtabState;
const [formData, setFormData] = useState({
mnemonic: '',
});
const [seedInput, openSeedInput] = useState(false);
const [isValidMnemonic, setIsValidMnemonic] = useState(false);
async function importWallet() {
if (!formData.mnemonic) {
return;
}
// Event("Category", "Action", "Label")
// Track number of created wallets from onboarding
Event('Onboarding.js', 'Create Wallet', 'Imported');
const importedWallet = await createCashtabWallet(formData.mnemonic);
updateCashtabState('wallets', [...wallets, importedWallet]);
}
async function createNewWallet() {
// Event("Category", "Action", "Label")
// Track number of created wallets from onboarding
Event('Onboarding.js', 'Create Wallet', 'New');
const newWallet = await createCashtabWallet(generateMnemonic());
updateCashtabState('wallets', [...wallets, newWallet]);
}
const handleChange = e => {
const { value, name } = e.target;
// Validate mnemonic on change
// Import button should be disabled unless mnemonic is valid
setIsValidMnemonic(validateMnemonic(value));
setFormData(p => ({ ...p, [name]: value }));
};
return (
<WelcomeCtn>
<h2>Welcome to Cashtab!</h2>
<WelcomeText>
Cashtab is an{' '}
<WelcomeLink
href="https://github.com/bitcoin-abc/bitcoin-abc"
target="_blank"
rel="noreferrer"
>
open source,
</WelcomeLink>{' '}
non-custodial web wallet for {appConfig.name}.
</WelcomeText>
<PrimaryButton onClick={() => createNewWallet()}>
New Wallet
</PrimaryButton>
<SecondaryButton onClick={() => openSeedInput(!seedInput)}>
Import Wallet
</SecondaryButton>
{seedInput && (
<InputFlex>
<Input
type="email"
placeholder="mnemonic (seed phrase)"
name="mnemonic"
value={formData.mnemonic}
error={
isValidMnemonic ? false : 'invalid 12-word mnemonic'
}
autoComplete="off"
handleInput={handleChange}
/>
<SecondaryButton
disabled={!isValidMnemonic}
onClick={() => importWallet()}
>
Import
</SecondaryButton>
</InputFlex>
)}
</WelcomeCtn>
);
};
export default OnBoarding;
diff --git a/cashtab/src/components/Send/SendToken.js b/cashtab/src/components/Send/SendToken.js
index 4c67eb8c1..6ece78cf0 100644
--- a/cashtab/src/components/Send/SendToken.js
+++ b/cashtab/src/components/Send/SendToken.js
@@ -1,1038 +1,1036 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import React, { useState, useEffect } from 'react';
import { Link, useParams } from 'react-router-dom';
import { WalletContext } from 'wallet/context';
-import PrimaryButton, {
- SecondaryButton,
-} from 'components/Common/PrimaryButton';
+import PrimaryButton, { SecondaryButton } from 'components/Common/Buttons';
import { TxLink, SwitchLabel } from 'components/Common/Atoms';
import BalanceHeaderToken from 'components/Common/BalanceHeaderToken';
import { useNavigate } from 'react-router-dom';
import { Event } from 'components/Common/GoogleAnalytics';
import { getWalletState } from 'utils/cashMethods';
import ApiError from 'components/Common/ApiError';
import {
isValidTokenSendOrBurnAmount,
parseAddressInput,
isValidTokenMintAmount,
} from 'validation';
import { formatDate } from 'utils/formatting';
import styled from 'styled-components';
import TokenIcon from 'components/Etokens/TokenIcon';
import { explorer } from 'config/explorer';
import { queryAliasServer } from 'alias';
import aliasSettings from 'config/alias';
import cashaddr from 'ecashaddrjs';
import appConfig from 'config/app';
import { isMobile, getUserLocale } from 'helpers';
import {
getSendTokenInputs,
getSlpSendTargetOutputs,
getSlpBurnTargetOutputs,
getMintBatons,
getMintTargetOutputs,
getMaxMintAmount,
} from 'slpv1';
import { sendXec } from 'transactions';
import { hasEnoughToken, decimalizeTokenAmount } from 'wallet';
import Modal from 'components/Common/Modal';
import { toast } from 'react-toastify';
import {
InputWithScanner,
SendTokenInput,
ModalInput,
InputFlex,
} from 'components/Common/Inputs';
import CopyToClipboard from 'components/Common/CopyToClipboard';
import { CopyPasteIcon } from 'components/Common/CustomIcons';
import { decimalizedTokenQtyToLocaleFormat } from 'utils/formatting';
import Switch from 'components/Common/Switch';
const TokenIconExpandButton = styled.button`
cursor: pointer;
border: none;
background-color: transparent;
`;
const SendTokenForm = styled.div`
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
width: 100%;
margin-bottom: 12px;
`;
const SendTokenFormRow = styled.div`
width: 100%;
display: flex;
justify-content: space-between;
gap: 12px;
margin: 3px;
`;
const InputRow = styled.div`
width: 100%;
`;
const TokenStatsTable = styled.div`
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
width: 100%;
color: ${props => props.theme.contrast};
gap: 12px;
margin-bottom: 12px;
`;
const TokenStatsRow = styled.div`
width: 100%;
display: flex;
flex-wrap: wrap;
align-items: center;
text-align: center;
justify-content: center;
gap: 3px;
`;
const TokenStatsCol = styled.div`
align-items: center;
flex-wrap: wrap;
svg {
height: 20px;
width: 20px;
}
`;
const TokenStatsTableRow = styled.div`
width: 100%;
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: flex-start;
gap: 3px;
`;
const TokenStatsLabel = styled.div`
font-weight: bold;
justify-content: flex-end;
text-align: right;
display: flex;
width: 106px;
`;
const SwitchHolder = styled.div`
width: 100%;
display: flex;
justify-content: flex-start;
gap: 12px;
align-content: center;
align-items: center;
margin: 12px;
`;
const TokenSentLink = styled.a`
color: ${props => props.theme.walletBackground};
text-decoration: none;
`;
const AliasAddressPreviewLabel = styled.div`
text-align: center;
color: ${props => props.theme.forms.text};
padding-left: 1px;
white-space: nowrap;
`;
const SendToken = () => {
let navigate = useNavigate();
const { apiError, cashtabState, chronik, chaintipBlockheight, loading } =
React.useContext(WalletContext);
const { settings, wallets, cashtabCache } = cashtabState;
const wallet = wallets.length > 0 ? wallets[0] : false;
const walletState = getWalletState(wallet);
const { tokens, balanceSats } = walletState;
const params = useParams();
const tokenId = params.tokenId;
const tokenBalance = tokens.get(tokenId);
const cachedInfo =
typeof cashtabCache.tokens.get(tokenId) !== 'undefined'
? cashtabCache.tokens.get(tokenId)
: {
genesisInfo: {
tokenName: 'UNCACHED',
tokenTicker: 'UNCACHED',
decimals: 0,
},
genesisSupply: '0',
genesisMintBatons: 0,
};
const { genesisInfo, genesisSupply } = cachedInfo;
const { tokenName, tokenTicker, url, decimals } = genesisInfo;
const [sendTokenAddressError, setSendTokenAddressError] = useState(false);
const [sendTokenAmountError, setSendTokenAmountError] = useState(false);
const [showConfirmBurnEtoken, setShowConfirmBurnEtoken] = useState(false);
const [burnTokenAmountError, setBurnTokenAmountError] = useState(false);
const [mintAmountError, setMintAmountError] = useState(false);
const [burnConfirmationError, setBurnConfirmationError] = useState(false);
const [confirmationOfEtokenToBeBurnt, setConfirmationOfEtokenToBeBurnt] =
useState('');
const [aliasInputAddress, setAliasInputAddress] = useState(false);
const [showSend, setShowSend] = useState(true);
const [showBurn, setShowBurn] = useState(false);
const [showAirdrop, setShowAirdrop] = useState(false);
const [showMint, setShowMint] = useState(false);
const [showLargeIconModal, setShowLargeIconModal] = useState(false);
const defaultUncachedTokenInfo = {
circulatingSupply: null,
mintBatons: null,
};
const [uncachedTokenInfo, setUncachedTokenInfo] = useState(
defaultUncachedTokenInfo,
);
const [uncachedTokenInfoError, setUncachedTokenInfoError] = useState(false);
// Check if the user has mint batons for this token
// If they don't, disable the mint switch and label why
const mintBatons = getMintBatons(wallet.state.slpUtxos, tokenId);
// Load with QR code open if device is mobile
const openWithScanner =
settings && settings.autoCameraOn === true && isMobile(navigator);
const [isModalVisible, setIsModalVisible] = useState(false);
const emptyFormData = {
amount: '',
address: '',
burnAmount: '',
mintAmount: '',
};
const [formData, setFormData] = useState(emptyFormData);
const userLocale = getUserLocale(navigator);
const getUncachedTokenInfo = async () => {
let tokenUtxos;
try {
tokenUtxos = await chronik.tokenId(tokenId).utxos();
let undecimalizedBigIntCirculatingSupply = 0n;
let mintBatons = 0;
for (const utxo of tokenUtxos.utxos) {
const { token } = utxo;
const { amount, isMintBaton } = token;
undecimalizedBigIntCirculatingSupply += BigInt(amount);
if (isMintBaton) {
mintBatons += 1;
}
}
const circulatingSupply = decimalizeTokenAmount(
undecimalizedBigIntCirculatingSupply.toString(),
decimals,
);
setUncachedTokenInfo({ circulatingSupply, mintBatons });
} catch (err) {
console.error(`Error in chronik.tokenId(${tokenId}).utxos()`, err);
setUncachedTokenInfoError(true);
}
};
useEffect(() => {
// Get token info that is not practical to cache as it is subject to change
getUncachedTokenInfo();
}, []);
useEffect(() => {
if (
loading === false &&
(typeof tokenBalance === 'undefined' ||
typeof cashtabCache.tokens.get(tokenId) === 'undefined')
) {
// token can be undefined when the app is loading
// in practice, this only happens in integration tests or when the user navigates directly
// to send/tokenId screen, as cashtab locks UI while it loads
// token becomes undefined when a user sends or burns all of their balance for this token
// In this case -- loading === true and token === undefined -- navigate to the home page
navigate('/');
}
}, [loading, tokenBalance, cashtabCache]);
// Clears address and amount fields following a send token notification
const clearInputForms = () => {
setFormData(emptyFormData);
setAliasInputAddress(false); // clear alias address preview
};
async function sendToken() {
setFormData({
...formData,
});
if (
!formData.address ||
!formData.amount ||
Number(formData.amount <= 0) ||
sendTokenAmountError
) {
return;
}
// Track number of SLPA send transactions and
// SLPA token IDs
Event('SendToken.js', 'Send', tokenId);
const { address, amount } = formData;
let cleanAddress;
// check state on whether this is an alias or ecash address
if (aliasInputAddress) {
cleanAddress = aliasInputAddress;
} else {
// Get the non-alias param-free address
cleanAddress = address.split('?')[0];
}
try {
// Get input utxos for slpv1 send tx
const tokenInputInfo = getSendTokenInputs(
wallet.state.slpUtxos,
tokenId,
amount,
decimals,
);
// Get targetOutputs for an slpv1 send tx
const tokenSendTargetOutputs = getSlpSendTargetOutputs(
tokenInputInfo,
cleanAddress,
);
// Build and broadcast the tx
const { response } = await sendXec(
chronik,
wallet,
tokenSendTargetOutputs,
settings.minFeeSends &&
hasEnoughToken(
tokens,
appConfig.vipSettingsTokenId,
appConfig.vipSettingsTokenQty,
)
? appConfig.minFee
: appConfig.defaultFee,
chaintipBlockheight,
tokenInputInfo.tokenInputs,
);
toast(
<TokenSentLink
href={`${explorer.blockExplorerUrl}/tx/${response.txid}`}
target="_blank"
rel="noopener noreferrer"
>
eToken sent
</TokenSentLink>,
{
icon: <TokenIcon size={32} tokenId={tokenId} />,
},
);
clearInputForms();
} catch (e) {
console.error(`Error sending token`, e);
toast.error(`${e}`);
}
}
const handleSlpAmountChange = e => {
const { value, name } = e.target;
const isValidAmountOrErrorMsg = isValidTokenSendOrBurnAmount(
value,
tokenBalance,
decimals,
);
setSendTokenAmountError(
isValidAmountOrErrorMsg === true ? false : isValidAmountOrErrorMsg,
);
setFormData(p => ({
...p,
[name]: value,
}));
};
const handleTokenAddressChange = async e => {
setAliasInputAddress(false); // clear alias address preview
const { value, name } = e.target;
// validate for token address
// validate for parameters
// show warning that query strings are not supported
const parsedAddressInput = parseAddressInput(
value,
balanceSats,
userLocale,
);
const address = parsedAddressInput.address.value;
let renderedError = parsedAddressInput.address.error;
if ('queryString' in parsedAddressInput) {
// Token sends do not support a queryString
// If you have one, this is the address validation error
renderedError = 'eToken sends do not support bip21 query strings';
} else if (
parsedAddressInput.address.error &&
cashaddr.isValidCashAddress(address, 'etoken')
) {
// If address is a valid eToken address, no error
// We support sending to etoken: addresses on SendToken screen
renderedError = false;
} else if (
parsedAddressInput.address.isAlias &&
parsedAddressInput.address.error === false
) {
// if input is a valid alias (except for server validation check)
// extract alias without the `.xec`
const aliasName = address.slice(0, address.length - 4);
// retrieve the alias details for `aliasName` from alias-server
let aliasDetails;
try {
aliasDetails = await queryAliasServer('alias', aliasName);
if (!aliasDetails.address) {
renderedError =
'eCash Alias does not exist or yet to receive 1 confirmation';
} else {
// Valid address response returned
setAliasInputAddress(aliasDetails.address);
}
} catch (err) {
console.error(
`handleTokenAddressChange(): error retrieving alias`,
err,
);
renderedError =
'Error resolving alias at indexer, contact admin.';
}
}
setSendTokenAddressError(renderedError);
setFormData(p => ({
...p,
[name]: value,
}));
};
const onMax = async () => {
// Clear this error before updating field
setSendTokenAmountError(false);
try {
let amount = tokenBalance;
setFormData({
...formData,
amount,
});
} catch (err) {
console.error(`Error in onMax:`);
console.error(err);
}
};
const onMaxMint = () => {
const maxMintAmount = getMaxMintAmount(decimals);
handleMintAmountChange({
target: {
name: 'mintAmount',
value: maxMintAmount,
},
});
};
const checkForConfirmationBeforeSendEtoken = () => {
if (settings.sendModal) {
setIsModalVisible(settings.sendModal);
} else {
// if the user does not have the send confirmation enabled in settings then send directly
sendToken();
}
};
const handleOk = () => {
setIsModalVisible(false);
sendToken();
};
const handleCancel = () => {
setIsModalVisible(false);
};
const handleEtokenBurnAmountChange = e => {
const { name, value } = e.target;
const isValidBurnAmountOrErrorMsg = isValidTokenSendOrBurnAmount(
value,
tokenBalance,
decimals,
);
setBurnTokenAmountError(
isValidBurnAmountOrErrorMsg === true
? false
: isValidBurnAmountOrErrorMsg,
);
setFormData(p => ({
...p,
[name]: value,
}));
};
const handleMintAmountChange = e => {
const { name, value } = e.target;
const isValidMintAmountOrErrorMsg = isValidTokenMintAmount(
value,
decimals,
);
setMintAmountError(
isValidMintAmountOrErrorMsg === true
? false
: isValidMintAmountOrErrorMsg,
);
setFormData(p => ({
...p,
[name]: value,
}));
};
const onMaxBurn = () => {
// trigger validation on the inserted max value
handleEtokenBurnAmountChange({
target: {
name: 'burnAmount',
value: tokenBalance,
},
});
};
async function burn() {
if (burnConfirmationError || formData.burnAmount === '') {
return;
}
Event('SendToken.js', 'Burn eToken', tokenId);
try {
// Get input utxos for slpv1 burn tx
// This is done the same way as for an slpv1 send tx
const tokenInputInfo = getSendTokenInputs(
wallet.state.slpUtxos,
tokenId,
formData.burnAmount,
decimals,
);
// Get targetOutputs for an slpv1 burn tx
// this is NOT like an slpv1 send tx
const tokenBurnTargetOutputs =
getSlpBurnTargetOutputs(tokenInputInfo);
// Build and broadcast the tx
const { response } = await sendXec(
chronik,
wallet,
tokenBurnTargetOutputs,
settings.minFeeSends &&
hasEnoughToken(
tokens,
appConfig.vipSettingsTokenId,
appConfig.vipSettingsTokenQty,
)
? appConfig.minFee
: appConfig.defaultFee,
chaintipBlockheight,
tokenInputInfo.tokenInputs,
true, // skip SLP burn checks
);
toast(
<TokenSentLink
href={`${explorer.blockExplorerUrl}/tx/${response.txid}`}
target="_blank"
rel="noopener noreferrer"
>
🔥 Burn successful
</TokenSentLink>,
{
icon: <TokenIcon size={32} tokenId={tokenId} />,
},
);
clearInputForms();
setShowConfirmBurnEtoken(false);
setConfirmationOfEtokenToBeBurnt('');
} catch (e) {
setShowConfirmBurnEtoken(false);
setConfirmationOfEtokenToBeBurnt('');
toast.error(`${e}`);
}
}
async function handleMint() {
Event('SendToken.js', 'Mint eToken', tokenId);
try {
// Get targetOutputs for an slpv1 burn tx
// this is NOT like an slpv1 send tx
const mintTargetOutputs = getMintTargetOutputs(
tokenId,
decimals,
formData.mintAmount,
);
// We should not be able to get here without at least one mint baton,
// as the mint switch would be disabled
// Still, handle
if (mintBatons.length < 1) {
throw new Error(`Unable to find mint baton for ${tokenName}`);
}
// Build and broadcast the tx
const { response } = await sendXec(
chronik,
wallet,
mintTargetOutputs,
settings.minFeeSends &&
hasEnoughToken(
tokens,
appConfig.vipSettingsTokenId,
appConfig.vipSettingsTokenQty,
)
? appConfig.minFee
: appConfig.defaultFee,
chaintipBlockheight,
[mintBatons[0]], // Only use one mint baton
);
toast(
<TokenSentLink
href={`${explorer.blockExplorerUrl}/tx/${response.txid}`}
target="_blank"
rel="noopener noreferrer"
>
⚗️ Minted {formData.mintAmount} {tokenTicker}
</TokenSentLink>,
{
icon: <TokenIcon size={32} tokenId={tokenId} />,
},
);
clearInputForms();
} catch (e) {
toast.error(`${e}`);
}
}
const handleBurnConfirmationInput = e => {
const { value } = e.target;
if (value && value === `burn ${tokenTicker}`) {
setBurnConfirmationError(false);
} else {
setBurnConfirmationError(
`Input must exactly match "burn ${tokenTicker}"`,
);
}
setConfirmationOfEtokenToBeBurnt(value);
};
const handleBurnAmountInput = () => {
if (!burnTokenAmountError) {
setShowConfirmBurnEtoken(true);
}
};
return (
<>
{tokenBalance &&
typeof cashtabCache.tokens.get(tokenId) !== 'undefined' && (
<>
{showLargeIconModal && (
<Modal
height={275}
showButtons={false}
handleCancel={() =>
setShowLargeIconModal(false)
}
>
<TokenIcon size={256} tokenId={tokenId} />
</Modal>
)}
{isModalVisible && (
<Modal
title="Confirm Send"
description={`Send ${formData.amount}${' '}
${tokenTicker} to ${formData.address}?`}
handleOk={handleOk}
handleCancel={handleCancel}
showCancelButton
>
<p>
Are you sure you want to send{' '}
{formData.amount} {tokenTicker} to{' '}
{formData.address}?
</p>
</Modal>
)}
{showConfirmBurnEtoken && (
<Modal
title={`Confirm ${tokenTicker} burn`}
description={`Burn ${formData.burnAmount} ${tokenTicker}?`}
handleOk={burn}
handleCancel={() =>
setShowConfirmBurnEtoken(false)
}
showCancelButton
height={250}
>
<ModalInput
placeholder={`Type "burn ${tokenTicker}" to confirm`}
name="etokenToBeBurnt"
value={confirmationOfEtokenToBeBurnt}
error={burnConfirmationError}
handleInput={handleBurnConfirmationInput}
/>
</Modal>
)}
<BalanceHeaderToken
formattedDecimalizedTokenBalance={decimalizedTokenQtyToLocaleFormat(
tokenBalance,
userLocale,
)}
ticker={tokenTicker}
name={tokenName}
/>
<TokenStatsTable>
<TokenStatsCol>
<TokenIconExpandButton
onClick={() => setShowLargeIconModal(true)}
>
<TokenIcon size={128} tokenId={tokenId} />
</TokenIconExpandButton>
</TokenStatsCol>
<TokenStatsCol>
<TokenStatsTableRow>
<TokenStatsLabel>Token Id:</TokenStatsLabel>
<TokenStatsCol>
<a
href={`${explorer.blockExplorerUrl}/tx/${tokenId}`}
target="_blank"
rel="noopener noreferrer"
>
{tokenId.slice(0, 3)}...
{tokenId.slice(-3)}
</a>
</TokenStatsCol>
<TokenStatsCol>
<CopyToClipboard
data={tokenId}
showToast
>
<CopyPasteIcon
style={{
marginTop: '8px',
fontSize: '12px',
}}
/>
</CopyToClipboard>
</TokenStatsCol>
</TokenStatsTableRow>
<TokenStatsTableRow>
<TokenStatsLabel>decimals:</TokenStatsLabel>
<TokenStatsCol>{decimals}</TokenStatsCol>
</TokenStatsTableRow>
{url && url.startsWith('https://') && (
<TokenStatsTableRow>
<TokenStatsLabel>url:</TokenStatsLabel>
<TokenStatsCol>
<a
href={url}
target="_blank"
rel="noreferrer"
>
{`${url.slice(8, 19)}...`}
</a>
</TokenStatsCol>
</TokenStatsTableRow>
)}
<TokenStatsTableRow>
<TokenStatsLabel>created:</TokenStatsLabel>
<TokenStatsCol>
{typeof cachedInfo.block !== 'undefined'
? formatDate(
cachedInfo.block.timestamp,
navigator.language,
)
: formatDate(
cachedInfo.timeFirstSeen,
navigator.language,
)}
</TokenStatsCol>
</TokenStatsTableRow>
<TokenStatsTableRow>
<TokenStatsLabel>
Genesis Qty:
</TokenStatsLabel>
<TokenStatsCol>
{decimalizedTokenQtyToLocaleFormat(
genesisSupply,
userLocale,
)}
</TokenStatsCol>
</TokenStatsTableRow>
<TokenStatsTableRow>
<TokenStatsLabel>Supply:</TokenStatsLabel>
<TokenStatsCol>
{typeof uncachedTokenInfo.circulatingSupply ===
'string'
? `${decimalizedTokenQtyToLocaleFormat(
uncachedTokenInfo.circulatingSupply,
userLocale,
)}${
uncachedTokenInfo.mintBatons ===
0
? ' (fixed)'
: ' (var.)'
}`
: uncachedTokenInfoError
? 'Error fetching supply'
: 'Loading...'}
</TokenStatsCol>
</TokenStatsTableRow>
</TokenStatsCol>
</TokenStatsTable>
{apiError && <ApiError />}
<SendTokenForm>
<SwitchHolder>
<Switch
name="send-switch"
on="➡️"
off="➡️"
checked={showSend}
handleToggle={() => {
if (!showSend) {
// Make sure all other switches are off
setShowAirdrop(false);
setShowBurn(false);
setShowMint(false);
}
setShowSend(!showSend);
}}
/>
<SwitchLabel>
Send {tokenName} ({tokenTicker})
</SwitchLabel>
</SwitchHolder>
{showSend && (
<>
<SendTokenFormRow>
<InputRow>
<InputWithScanner
placeholder={
aliasSettings.aliasEnabled
? `Address or Alias`
: `Address`
}
name="address"
value={formData.address}
handleInput={
handleTokenAddressChange
}
error={sendTokenAddressError}
loadWithScannerOpen={
openWithScanner
}
/>
<AliasAddressPreviewLabel>
<TxLink
key={aliasInputAddress}
href={`${explorer.blockExplorerUrl}/address/${aliasInputAddress}`}
target="_blank"
rel="noreferrer"
>
{aliasInputAddress &&
`${aliasInputAddress.slice(
0,
10,
)}...${aliasInputAddress.slice(
-5,
)}`}
</TxLink>
</AliasAddressPreviewLabel>
</InputRow>
</SendTokenFormRow>
<SendTokenFormRow>
<SendTokenInput
name="amount"
value={formData.amount}
error={sendTokenAmountError}
placeholder="Amount"
decimals={decimals}
handleInput={handleSlpAmountChange}
handleOnMax={onMax}
/>
</SendTokenFormRow>
<SendTokenFormRow>
<PrimaryButton
style={{ marginTop: '24px' }}
disabled={
apiError ||
sendTokenAmountError ||
sendTokenAddressError
}
onClick={() =>
checkForConfirmationBeforeSendEtoken()
}
>
Send {tokenTicker}
</PrimaryButton>
</SendTokenFormRow>
</>
)}
<SwitchHolder>
<Switch
name="airdrop-switch"
on="🪂"
off="🪂"
checked={showAirdrop}
handleToggle={() => {
if (!showAirdrop) {
// Make sure all other switches are off
setShowBurn(false);
setShowSend(false);
setShowMint(false);
}
setShowAirdrop(!showAirdrop);
}}
/>
<SwitchLabel>
Airdrop XEC to {tokenTicker} holders
</SwitchLabel>
</SwitchHolder>
{showAirdrop && (
<TokenStatsRow>
<Link
style={{ width: '100%' }}
to="/airdrop"
state={{
airdropEtokenId: tokenId,
}}
>
<SecondaryButton
style={{ marginTop: '12px' }}
>
Airdrop Calculator
</SecondaryButton>
</Link>
</TokenStatsRow>
)}
<SwitchHolder>
<Switch
name="Toggle Burn"
on="🔥"
off="🔥"
checked={showBurn}
handleToggle={() => {
if (!showBurn) {
// Make sure all other switches are off
setShowAirdrop(false);
setShowSend(false);
setShowMint(false);
}
setShowBurn(!showBurn);
}}
/>
<SwitchLabel>Burn {tokenTicker}</SwitchLabel>
</SwitchHolder>
{showBurn && (
<TokenStatsRow>
<InputFlex>
<SendTokenInput
name="burnAmount"
value={formData.burnAmount}
error={burnTokenAmountError}
placeholder="Burn Amount"
decimals={decimals}
handleInput={
handleEtokenBurnAmountChange
}
handleOnMax={onMaxBurn}
/>
<SecondaryButton
onClick={handleBurnAmountInput}
disabled={
burnTokenAmountError ||
formData.burnAmount === ''
}
>
Burn {tokenTicker}
</SecondaryButton>
</InputFlex>
</TokenStatsRow>
)}
<SwitchHolder>
<Switch
name="Toggle Mint"
on="⚗️"
off="⚗️"
disabled={mintBatons.length === 0}
checked={showMint}
handleToggle={() => {
if (!showMint) {
// Make sure all other switches are off
setShowAirdrop(false);
setShowBurn(false);
setShowSend(false);
}
setShowMint(!showMint);
}}
/>
<SwitchLabel>
Mint
{mintBatons.length === 0
? ' (disabled, no mint baton in wallet)'
: ''}
</SwitchLabel>
</SwitchHolder>
{showMint && (
<TokenStatsRow>
<InputFlex>
<SendTokenInput
name="mintAmount"
type="number"
value={formData.mintAmount}
error={mintAmountError}
placeholder="Mint Amount"
decimals={decimals}
handleInput={handleMintAmountChange}
handleOnMax={onMaxMint}
/>
<SecondaryButton
onClick={handleMint}
disabled={
mintAmountError ||
formData.mintAmount === ''
}
>
Mint {tokenTicker}
</SecondaryButton>
</InputFlex>
</TokenStatsRow>
)}
</SendTokenForm>
</>
)}
</>
);
};
export default SendToken;
diff --git a/cashtab/src/components/Send/SendXec.js b/cashtab/src/components/Send/SendXec.js
index c9a15d799..69dc704e9 100644
--- a/cashtab/src/components/Send/SendXec.js
+++ b/cashtab/src/components/Send/SendXec.js
@@ -1,1107 +1,1107 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import React, { useState, useEffect } from 'react';
import { useLocation } from 'react-router-dom';
import { WalletContext } from 'wallet/context';
import { CashReceivedNotificationIcon } from 'components/Common/CustomIcons';
import Modal from 'components/Common/Modal';
-import PrimaryButton from 'components/Common/PrimaryButton';
+import PrimaryButton from 'components/Common/Buttons';
import { toSatoshis, toXec } from 'wallet';
import { getMaxSendAmountSatoshis } from 'ecash-coinselect';
import { sumOneToManyXec } from 'utils/cashMethods';
import { Event } from 'components/Common/GoogleAnalytics';
import {
isValidMultiSendUserInput,
shouldSendXecBeDisabled,
parseAddressInput,
isValidXecSendAmount,
getOpReturnRawError,
} from 'validation';
import { ConvertAmount, AlertMsg, TxLink } from 'components/Common/Atoms';
import { getWalletState } from 'utils/cashMethods';
import {
sendXec,
getMultisendTargetOutputs,
ignoreUnspendableUtxos,
} from 'transactions';
import {
getCashtabMsgTargetOutput,
getAirdropTargetOutput,
getCashtabMsgByteCount,
getOpreturnParamTargetOutput,
parseOpReturnRaw,
} from 'opreturn';
import ApiError from 'components/Common/ApiError';
import { formatFiatBalance, formatBalance } from 'utils/formatting';
import styled from 'styled-components';
import { opReturn as opreturnConfig } from 'config/opreturn';
import { explorer } from 'config/explorer';
import { queryAliasServer } from 'alias';
import { supportedFiatCurrencies } from 'config/cashtabSettings';
import appConfig from 'config/app';
import aliasSettings from 'config/alias';
import { isMobile, getUserLocale } from 'helpers';
import { hasEnoughToken, fiatToSatoshis } from 'wallet';
import { toast } from 'react-toastify';
import {
InputWithScanner,
SendXecInput,
TextArea,
} from 'components/Common/Inputs';
import Switch from 'components/Common/Switch';
import { opReturn } from 'config/opreturn';
const SendXecForm = styled.div`
margin: 12px 0;
display: flex;
flex-direction: column;
gap: 12px;
`;
const SendXecRow = styled.div``;
const SwitchAndLabel = styled.div`
display: flex;
flex-direction: row;
align-items: center;
gap: 12px;
`;
const SwitchLabel = styled.div`
color: ${props => props.theme.contrast};
`;
const SwitchContainer = styled.div`
display: flex;
align-items: center;
justify-content: flex-start;
color: ${props => props.theme.forms.text};
white-space: nowrap;
margin: 12px 0;
`;
const SentLink = styled.a`
color: ${props => props.theme.walletBackground};
text-decoration: none;
`;
const AppCreatedTxSummary = styled.div`
font-size: 24px;
margin-top: -33px;
padding: 0;
color: ${props => props.theme.eCashPurple};
`;
const AliasAddressPreviewLabel = styled.div`
text-align: center;
color: ${props => props.theme.forms.text};
padding-left: 1px;
white-space: nowrap;
`;
const AmountPreviewCtn = styled.div`
margin: 12px;
display: flex;
flex-direction: column;
justify-content: center;
`;
const ParsedOpReturnRawRow = styled.div`
display: flex;
flex-direction: column;
word-break: break-word;
`;
const ParsedOpReturnRawLabel = styled.div`
color: ${props => props.theme.contrast};
text-align: left;
width: 100%;
`;
const ParsedOpReturnRaw = styled.div`
background-color: #fff2f0;
border-radius: 12px;
color: ${props => props.theme.eCashBlue};
padding: 12px;
text-align: left;
`;
const LocaleFormattedValue = styled.div`
color: ${props => props.theme.contrast};
font-weight: bold;
font-size: 1.17em;
margin-bottom: 0;
`;
const SendToOneHolder = styled.div``;
const SendToManyHolder = styled.div``;
const SendToOneInputForm = styled.div`
display: flex;
flex-direction: column;
gap: 12px;
`;
const InputAndAliasPreviewHolder = styled.div`
displaly: flex;
flex-direction: column;
`;
const InputModesHolder = styled.div`
min-height: 9rem;
${SendToOneHolder} {
overflow: hidden;
transition: ${props =>
props.open
? 'max-height 200ms ease-in, opacity 200ms ease-out'
: 'max-height 200ms cubic-bezier(0, 1, 0, 1), opacity 200ms ease-in'};
max-height: ${props => (props.open ? '0rem' : '12rem')};
opacity: ${props => (props.open ? 0 : 1)};
}
${SendToManyHolder} {
overflow: hidden;
transition: ${props =>
props.open
? 'max-height 200ms ease-in, transform 200ms ease-out, opacity 200ms ease-in'
: 'max-height 200ms cubic-bezier(0, 1, 0, 1), transform 200ms ease-out'};
max-height: ${props => (props.open ? '12rem' : '0rem')};
transform: ${props =>
props.open ? 'translateY(0%)' : 'translateY(100%)'};
opacity: ${props => (props.open ? 1 : 0)};
}
`;
const SendXec = () => {
const ContextValue = React.useContext(WalletContext);
const location = useLocation();
const { chaintipBlockheight, fiatPrice, apiError, cashtabState, chronik } =
ContextValue;
const { settings, wallets } = cashtabState;
const wallet = wallets.length > 0 ? wallets[0] : false;
const walletState = getWalletState(wallet);
const { balanceSats, nonSlpUtxos, tokens } = walletState;
// Use spendable utxos instead of all nonSlpUtxos for onMax function
const spendableUtxos = ignoreUnspendableUtxos(
nonSlpUtxos,
chaintipBlockheight,
);
const [isOneToManyXECSend, setIsOneToManyXECSend] = useState(false);
const [sendWithCashtabMsg, setSendWithCashtabMsg] = useState(false);
const [sendWithOpReturnRaw, setSendWithOpReturnRaw] = useState(false);
const [opReturnRawError, setOpReturnRawError] = useState(false);
const [parsedOpReturnRaw, setParsedOpReturnRaw] = useState({
protocol: '',
data: '',
});
// Load with QR code open if device is mobile
const openWithScanner =
settings && settings.autoCameraOn === true && isMobile(navigator);
const emptyFormData = {
amount: '',
address: '',
multiAddressInput: '',
airdropTokenId: '',
cashtabMsg: '',
opReturnRaw: '',
};
const [formData, setFormData] = useState(emptyFormData);
const [sendAddressError, setSendAddressError] = useState(false);
const [multiSendAddressError, setMultiSendAddressError] = useState(false);
const [sendAmountError, setSendAmountError] = useState(false);
const [cashtabMsgError, setCashtabMsgError] = useState(false);
const [aliasInputAddress, setAliasInputAddress] = useState(false);
const [selectedCurrency, setSelectedCurrency] = useState(appConfig.ticker);
const [parsedAddressInput, setParsedAddressInput] = useState(
parseAddressInput(''),
);
// Support cashtab button from web pages
const [txInfoFromUrl, setTxInfoFromUrl] = useState(false);
// Show a confirmation modal on transactions created by populating form from web page button
const [isModalVisible, setIsModalVisible] = useState(false);
// Airdrop transactions embed the additional tokenId (32 bytes), along with prefix (4 bytes) and two pushdata (2 bytes)
// hence setting airdrop tx message limit to 38 bytes less than opreturnConfig.cashtabMsgByteLimit
const pushDataByteCount = 1;
const prefixByteCount = 4;
const tokenIdByteCount = 32;
const localAirdropTxAddedBytes =
pushDataByteCount +
tokenIdByteCount +
pushDataByteCount +
prefixByteCount; // 38
const [airdropFlag, setAirdropFlag] = useState(false);
const userLocale = getUserLocale(navigator);
const clearInputForms = () => {
setFormData(emptyFormData);
setAliasInputAddress(false); // clear alias address preview
setParsedAddressInput(parseAddressInput(''));
// Reset to XEC
// Note, this ensures we never are in fiat send mode for multi-send
setSelectedCurrency(appConfig.ticker);
};
const checkForConfirmationBeforeSendXec = () => {
if (settings.sendModal) {
setIsModalVisible(settings.sendModal);
} else {
// if the user does not have the send confirmation enabled in settings then send directly
send();
}
};
const handleOk = () => {
setIsModalVisible(false);
send();
};
const handleCancel = () => {
setIsModalVisible(false);
};
useEffect(() => {
// Manually parse for txInfo object on page load when Send.js is loaded with a query string
// if this was routed from Wallet screen's Reply to message link then prepopulate the address and value field
if (location && location.state && location.state.replyAddress) {
// Populate a dust tx to the reply address
setFormData({
...formData,
address: location.state.replyAddress,
amount: `${toXec(appConfig.dustSats)}`,
});
// Turn on the Cashtab Msg switch
setSendWithCashtabMsg(true);
}
// if this was routed from the Contact List
if (location && location.state && location.state.contactSend) {
// explicitly trigger the address validation upon navigation from contact list
handleAddressChange({
target: {
name: 'address',
value: location.state.contactSend,
},
});
}
// if this was routed from the Airdrop screen's Airdrop Calculator then
// switch to multiple recipient mode and prepopulate the recipients field
if (
location &&
location.state &&
location.state.airdropRecipients &&
location.state.airdropTokenId
) {
setIsOneToManyXECSend(true);
setFormData({
multiAddressInput: location.state.airdropRecipients,
airdropTokenId: location.state.airdropTokenId,
});
// validate the airdrop outputs from the calculator
handleMultiAddressChange({
target: {
value: location.state.airdropRecipients,
},
});
setAirdropFlag(true);
}
// Do not set txInfo in state if query strings are not present
if (
!window.location ||
!window.location.hash ||
window.location.hash === '#/send'
) {
return;
}
// Get everything after the first ? mark
const hashRoute = window.location.hash;
// The "+1" is because we want to also omit the first question mark
// So we need to slice at 1 character past it
const txInfoStr = hashRoute.slice(hashRoute.indexOf('?') + 1);
const txInfo = {};
// If bip21 is the first param, parse the whole string as a bip21 param string
const parseAllAsBip21 = txInfoStr.startsWith('bip21');
if (parseAllAsBip21) {
// Cashtab requires param string to start with bip21 if this is requesting bip21 validation
txInfo.bip21 = txInfoStr.slice('bip21='.length);
} else {
// Parse for legacy amount and value params
const legacyParams = new URLSearchParams(txInfoStr);
// Check for duplicated params
const duplicatedParams =
new Set(legacyParams.keys()).size !==
Array.from(legacyParams.keys()).length;
if (!duplicatedParams) {
const supportedLegacyParams = ['address', 'value'];
// Iterate over
for (const paramKeyValue of legacyParams) {
const paramKey = paramKeyValue[0];
if (!supportedLegacyParams.includes(paramKey)) {
// ignore unsupported params
continue;
}
txInfo[paramKey] = paramKeyValue[1];
}
}
}
// Only set txInfoFromUrl if you have valid legacy params or bip21
let validUrlParams =
(parseAllAsBip21 && 'bip21' in txInfo) ||
// Good if we have both address and value
('address' in txInfo && 'value' in txInfo) ||
// Good if we have address and no value
('address' in txInfo && !('value' in txInfo));
// If we 'value' key with no address, no good
// Note: because only the address and value keys are handled below,
// it's not an issue if we get all kinds of other garbage params
if (validUrlParams) {
// This is a tx request from the URL
// Save this flag in state var so it can be parsed in useEffect
txInfo.parseAllAsBip21 = parseAllAsBip21;
setTxInfoFromUrl(txInfo);
}
}, []);
useEffect(() => {
if (txInfoFromUrl === false) {
return;
}
if (txInfoFromUrl.parseAllAsBip21) {
handleAddressChange({
target: {
name: 'address',
value: txInfoFromUrl.bip21,
},
});
} else {
// Enter address into input field and trigger handleAddressChange for validation
handleAddressChange({
target: {
name: 'address',
value: txInfoFromUrl.address,
},
});
if (
'value' in txInfoFromUrl &&
!Number.isNaN(parseFloat(txInfoFromUrl.value))
) {
// Only update the amount field if txInfo.value is a good input
// Sometimes we want this field to be adjusted by the user, e.g. a donation amount
// Do not populate the field if the value param is not parseable as a number
// the strings 'undefined' and 'null', which PayButton passes to signify 'no amount', fail this test
// TODO deprecate this support once PayButton and cashtab-components do not require it
handleAmountChange({
target: {
name: 'amount',
value: txInfoFromUrl.value,
},
});
}
}
// We re-run this when balanceSats changes because validation of send amounts depends on balanceSats
}, [txInfoFromUrl, balanceSats]);
function handleSendXecError(errorObj) {
let message;
if (
errorObj.error &&
errorObj.error.includes(
'too-long-mempool-chain, too many unconfirmed ancestors [limit: 50] (code 64)',
)
) {
message = `The ${appConfig.ticker} you are trying to send has too many unconfirmed ancestors to send (limit 50). Sending will be possible after a block confirmation. Try again in about 10 minutes.`;
} else {
message =
errorObj.message || errorObj.error || JSON.stringify(errorObj);
}
toast.error(`${message}`);
}
async function send() {
setFormData({
...formData,
});
// Initialize targetOutputs for this tx
let targetOutputs = [];
// If you have an OP_RETURN output, add it at index 0
// Aesthetic choice, easier to see when checking on block explorer
if (airdropFlag) {
// Airdrop txs require special OP_RETURN handling
targetOutputs.push(
getAirdropTargetOutput(
formData.airdropTokenId,
formData.cashtabMsg,
),
);
} else if (sendWithCashtabMsg && formData.cashtabMsg !== '') {
// Send this tx with a Cashtab msg if the user has the switch enabled and the input field is not empty
targetOutputs.push(getCashtabMsgTargetOutput(formData.cashtabMsg));
} else if (formData.opReturnRaw !== '' && opReturnRawError === false) {
targetOutputs.push(
getOpreturnParamTargetOutput(formData.opReturnRaw),
);
}
if (isOneToManyXECSend) {
// Handle XEC send to multiple addresses
targetOutputs = targetOutputs.concat(
getMultisendTargetOutputs(formData.multiAddressInput),
);
Event('Send.js', 'SendToMany', selectedCurrency);
} else {
// Handle XEC send to one address
let cleanAddress;
// check state on whether this is an alias or ecash address
if (aliasInputAddress) {
cleanAddress = aliasInputAddress;
} else {
// Get the non-alias param-free address
cleanAddress = formData.address.split('?')[0];
}
const satoshisToSend =
selectedCurrency === 'XEC'
? toSatoshis(formData.amount)
: fiatToSatoshis(formData.amount, fiatPrice);
targetOutputs.push({
address: cleanAddress,
value: satoshisToSend,
});
Event('Send.js', 'Send', selectedCurrency);
}
// Send and notify
try {
const txObj = await sendXec(
chronik,
wallet,
targetOutputs,
settings.minFeeSends &&
hasEnoughToken(
tokens,
appConfig.vipSettingsTokenId,
appConfig.vipSettingsTokenQty,
)
? appConfig.minFee
: appConfig.defaultFee,
chaintipBlockheight,
);
toast(
<SentLink
href={`${explorer.blockExplorerUrl}/tx/${txObj.response.txid}`}
target="_blank"
rel="noopener noreferrer"
>
eCash sent
</SentLink>,
{
icon: CashReceivedNotificationIcon,
},
);
clearInputForms();
setAirdropFlag(false);
if (txInfoFromUrl) {
// Close window after successful tx
window.close();
}
} catch (err) {
handleSendXecError(err);
}
}
const handleAddressChange = async e => {
setAliasInputAddress(false); // clear alias address preview
const { value, name } = e.target;
const parsedAddressInput = parseAddressInput(
value,
balanceSats,
userLocale,
);
// Set in state as various param outputs determine app rendering
// For example, a valid amount param should disable user amount input
setParsedAddressInput(parsedAddressInput);
const address = parsedAddressInput.address.value;
let renderedSendToError = parsedAddressInput.address.error;
if (
'queryString' in parsedAddressInput &&
typeof parsedAddressInput.queryString.error === 'string'
) {
// If you have a bad queryString, this should be the rendered error
renderedSendToError = parsedAddressInput.queryString.error;
} else if (
parsedAddressInput.address.isAlias &&
parsedAddressInput.address.error === false
) {
// If we have a valid alias input, check the server for full validation
// extract alias without the `.xec`
const aliasName = address.slice(0, address.length - 4);
// retrieve the alias details for `aliasName` from alias-server
let aliasDetails;
try {
aliasDetails = await queryAliasServer('alias', aliasName);
if (!aliasDetails.address) {
renderedSendToError =
'eCash Alias does not exist or yet to receive 1 confirmation';
setAliasInputAddress(false);
} else {
// Valid address response returned
setAliasInputAddress(aliasDetails.address);
}
} catch (err) {
setAliasInputAddress(false);
renderedSendToError =
'Error resolving alias at indexer, contact admin.';
}
}
// Handle errors in op_return_raw as an address error if no other error is set
if (
renderedSendToError === false &&
'op_return_raw' in parsedAddressInput &&
typeof parsedAddressInput.op_return_raw.error === 'string'
) {
renderedSendToError = parsedAddressInput.op_return_raw.error;
}
setSendAddressError(renderedSendToError);
// Set amount if it's in the query string
if ('amount' in parsedAddressInput) {
// Set currency to non-fiat
setSelectedCurrency(appConfig.ticker);
// Use this object to mimic user input and get validation for the value
let amountObj = {
target: {
name: 'amount',
value: parsedAddressInput.amount.value,
},
};
handleAmountChange(amountObj);
}
// Set op_return_raw if it's in the query string
if ('op_return_raw' in parsedAddressInput) {
// Turn on sendWithOpReturnRaw
setSendWithOpReturnRaw(true);
// Update the op_return_raw field and trigger its validation
handleOpReturnRawInput({
target: {
name: 'opReturnRaw',
value: parsedAddressInput.op_return_raw.value,
},
});
}
// Set address field to user input
setFormData(p => ({
...p,
[name]: value,
}));
};
const handleMultiAddressChange = e => {
const { value, name } = e.target;
let errorOrIsValid = isValidMultiSendUserInput(
value,
balanceSats,
userLocale,
);
// If you get an error msg, set it. If validation is good, clear error msg.
setMultiSendAddressError(
typeof errorOrIsValid === 'string' ? errorOrIsValid : false,
);
// Set address field to user input
setFormData(p => ({
...p,
[name]: value,
}));
};
const handleSelectedCurrencyChange = e => {
setSelectedCurrency(e.target.value);
// Clear input field to prevent accidentally sending 1 XEC instead of 1 USD
setFormData(p => ({
...p,
amount: '',
}));
};
const handleAmountChange = e => {
const { value, name } = e.target;
// Validate user input send amount
const isValidAmountOrErrorMsg = isValidXecSendAmount(
value,
balanceSats,
userLocale,
selectedCurrency,
fiatPrice,
);
setSendAmountError(
isValidAmountOrErrorMsg !== true ? isValidAmountOrErrorMsg : false,
);
setFormData(p => ({
...p,
[name]: value,
}));
};
const handleOpReturnRawInput = e => {
const { name, value } = e.target;
// Validate input
const error = getOpReturnRawError(value);
setOpReturnRawError(error);
// Update formdata
setFormData(p => ({
...p,
[name]: value,
}));
// Update parsedOpReturn if we have no opReturnRawError
if (error === false) {
// Need to gate this for no error as parseOpReturnRaw expects a validated op_return_raw
setParsedOpReturnRaw(parseOpReturnRaw(value));
}
};
const handleCashtabMsgChange = e => {
const { name, value } = e.target;
let cashtabMsgError = false;
const msgByteSize = getCashtabMsgByteCount(value);
const maxSize =
location && location.state && location.state.airdropTokenId
? opreturnConfig.cashtabMsgByteLimit - localAirdropTxAddedBytes
: opreturnConfig.cashtabMsgByteLimit;
if (msgByteSize > maxSize) {
cashtabMsgError = `Message can not exceed ${maxSize} bytes`;
}
setCashtabMsgError(cashtabMsgError);
setFormData(p => ({
...p,
[name]: value,
}));
};
const onMax = () => {
// Clear amt error
setSendAmountError(false);
// Set currency to XEC
setSelectedCurrency(appConfig.ticker);
// Account for CashtabMsg if it is set
const intendedTargetOutputs =
sendWithCashtabMsg && formData.cashtabMsg !== ''
? getCashtabMsgTargetOutput(formData.cashtabMsg)
: [];
// Get max send amount in satoshis
let maxSendSatoshis;
try {
// An error will be thrown if the wallet has insufficient funds to send more than dust
maxSendSatoshis = getMaxSendAmountSatoshis(
spendableUtxos,
settings.minFeeSends &&
hasEnoughToken(
tokens,
appConfig.vipSettingsTokenId,
appConfig.vipSettingsTokenQty,
)
? appConfig.minFee
: appConfig.defaultFee,
intendedTargetOutputs,
);
} catch (err) {
// Set to zero. In this case, 0 is the max amount we can send, and we know
// this will trigger the expected dust validation error
maxSendSatoshis = 0;
}
// Convert to XEC to set in form
const maxSendXec = toXec(maxSendSatoshis);
// Update value in the send field
// Note, if we are updating it to 0, we will get a 'dust' error
handleAmountChange({
target: {
name: 'amount',
value: maxSendXec,
},
});
};
// Display price in USD below input field for send amount, if it can be calculated
let fiatPriceString = '';
let multiSendTotal =
typeof formData.multiAddressInput === 'string'
? sumOneToManyXec(formData.multiAddressInput.split('\n'))
: 0;
if (isNaN(multiSendTotal)) {
multiSendTotal = 0;
}
if (fiatPrice !== null && !isNaN(formData.amount)) {
if (selectedCurrency === appConfig.ticker) {
// insert symbol and currency before/after the locale formatted fiat balance
fiatPriceString = isOneToManyXECSend
? `${
settings
? `${
supportedFiatCurrencies[settings.fiatCurrency]
.symbol
} `
: '$ '
} ${(fiatPrice * multiSendTotal).toLocaleString(userLocale, {
minimumFractionDigits: appConfig.cashDecimals,
maximumFractionDigits: appConfig.cashDecimals,
})} ${
settings && settings.fiatCurrency
? settings.fiatCurrency.toUpperCase()
: 'USD'
}`
: `${
settings
? `${
supportedFiatCurrencies[settings.fiatCurrency]
.symbol
} `
: '$ '
} ${(fiatPrice * formData.amount).toLocaleString(userLocale, {
minimumFractionDigits: appConfig.cashDecimals,
maximumFractionDigits: appConfig.cashDecimals,
})} ${
settings && settings.fiatCurrency
? settings.fiatCurrency.toUpperCase()
: 'USD'
}`;
} else {
fiatPriceString = `${
formData.amount !== 0
? formatFiatBalance(
toXec(fiatToSatoshis(formData.amount, fiatPrice)),
userLocale,
)
: formatFiatBalance(0, userLocale)
} ${appConfig.ticker}`;
}
}
const priceApiError = fiatPrice === null && selectedCurrency !== 'XEC';
const disableSendButton = shouldSendXecBeDisabled(
formData,
balanceSats,
apiError,
sendAmountError,
sendAddressError,
multiSendAddressError,
sendWithCashtabMsg,
cashtabMsgError,
sendWithOpReturnRaw,
opReturnRawError,
priceApiError,
isOneToManyXECSend,
);
return (
<>
{isModalVisible && (
<Modal
title="Confirm Send"
description={
isOneToManyXECSend
? `Send
${multiSendTotal.toLocaleString(userLocale, {
maximumFractionDigits: 2,
})}
XEC to multiple recipients?`
: `Send ${formData.amount}${' '}
${selectedCurrency} to ${parsedAddressInput.address.value}`
}
handleOk={handleOk}
handleCancel={handleCancel}
showCancelButton
/>
)}
{txInfoFromUrl && (
<AppCreatedTxSummary>Webapp Tx Request</AppCreatedTxSummary>
)}
<SwitchContainer>
<Switch
name="Toggle Multisend"
on="Send to many"
off="Send to one"
width={150}
right={115}
checked={isOneToManyXECSend}
disabled={
txInfoFromUrl || 'queryString' in parsedAddressInput
}
handleToggle={() =>
setIsOneToManyXECSend(!isOneToManyXECSend)
}
/>
</SwitchContainer>
<InputModesHolder open={isOneToManyXECSend}>
<SendToOneHolder>
<SendToOneInputForm>
<InputAndAliasPreviewHolder>
<InputWithScanner
placeholder={
aliasSettings.aliasEnabled
? `Address or Alias`
: `Address`
}
name="address"
value={formData.address}
disabled={txInfoFromUrl !== false}
handleInput={handleAddressChange}
error={sendAddressError}
loadWithScannerOpen={openWithScanner}
/>
<AliasAddressPreviewLabel>
<TxLink
key={aliasInputAddress}
href={`${explorer.blockExplorerUrl}/address/${aliasInputAddress}`}
target="_blank"
rel="noreferrer"
>
{aliasInputAddress &&
`${aliasInputAddress.slice(
0,
10,
)}...${aliasInputAddress.slice(-5)}`}
</TxLink>
</AliasAddressPreviewLabel>
</InputAndAliasPreviewHolder>
<SendXecInput
name="amount"
value={formData.amount}
selectValue={selectedCurrency}
selectDisabled={
'amount' in parsedAddressInput || txInfoFromUrl
}
inputDisabled={
priceApiError ||
(txInfoFromUrl !== false &&
'value' in txInfoFromUrl &&
txInfoFromUrl.value !== 'null' &&
txInfoFromUrl.value !== 'undefined') ||
'amount' in parsedAddressInput
}
fiatCode={settings.fiatCurrency.toUpperCase()}
error={sendAmountError}
handleInput={handleAmountChange}
handleSelect={handleSelectedCurrencyChange}
handleOnMax={onMax}
/>
</SendToOneInputForm>
</SendToOneHolder>
{priceApiError && (
<AlertMsg>
Error fetching fiat price. Setting send by{' '}
{supportedFiatCurrencies[
settings.fiatCurrency
].slug.toUpperCase()}{' '}
disabled
</AlertMsg>
)}
<SendToManyHolder>
<TextArea
placeholder={`One address & amount per line, separated by comma \ne.g. \necash:qpatql05s9jfavnu0tv6lkjjk25n6tmj9gkpyrlwu8,500 \necash:qzvydd4n3lm3xv62cx078nu9rg0e3srmqq0knykfed,700`}
name="multiAddressInput"
handleInput={e => handleMultiAddressChange(e)}
value={formData.multiAddressInput}
error={multiSendAddressError}
/>
</SendToManyHolder>
</InputModesHolder>
<SendXecForm>
<SendXecRow>
<SwitchAndLabel>
<Switch
name="Toggle Cashtab Msg"
on="✉️"
off="✉️"
checked={sendWithCashtabMsg}
disabled={
txInfoFromUrl ||
'queryString' in parsedAddressInput
}
handleToggle={() => {
// If we are sending a Cashtab msg, toggle off op_return_raw
if (
!sendWithCashtabMsg &&
sendWithOpReturnRaw
) {
setSendWithOpReturnRaw(false);
}
setSendWithCashtabMsg(!sendWithCashtabMsg);
}}
/>
<SwitchLabel>Cashtab Msg</SwitchLabel>
</SwitchAndLabel>
</SendXecRow>
{sendWithCashtabMsg && (
<SendXecRow>
<TextArea
name="cashtabMsg"
height={62}
placeholder={`Include a public Cashtab msg with this tx ${
location &&
location.state &&
location.state.airdropTokenId
? `(max ${
opreturnConfig.cashtabMsgByteLimit -
localAirdropTxAddedBytes
} bytes)`
: `(max ${opreturnConfig.cashtabMsgByteLimit} bytes)`
}`}
value={formData.cashtabMsg}
error={cashtabMsgError}
showCount
customCount={getCashtabMsgByteCount(
formData.cashtabMsg,
)}
max={
location &&
location.state &&
location.state.airdropTokenId
? opreturnConfig.cashtabMsgByteLimit -
localAirdropTxAddedBytes
: opreturnConfig.cashtabMsgByteLimit
}
handleInput={e => handleCashtabMsgChange(e)}
onKeyDown={e =>
e.keyCode == 13 ? e.preventDefault() : ''
}
/>
</SendXecRow>
)}
<SendXecRow>
<SwitchAndLabel>
<Switch
name="Toggle op_return_raw"
checked={sendWithOpReturnRaw}
disabled={
txInfoFromUrl ||
'queryString' in parsedAddressInput
}
handleToggle={() => {
// If we are sending with op_return_raw, toggle off CashtabMsg
if (
!sendWithOpReturnRaw &&
sendWithCashtabMsg
) {
setSendWithCashtabMsg(false);
}
setSendWithOpReturnRaw(!sendWithOpReturnRaw);
}}
/>
<SwitchLabel>op_return_raw</SwitchLabel>
</SwitchAndLabel>
</SendXecRow>
{sendWithOpReturnRaw && (
<>
<SendXecRow>
<TextArea
name="opReturnRaw"
height={62}
placeholder={`(Advanced) Enter raw hex to be included with this transaction's OP_RETURN`}
value={formData.opReturnRaw}
error={opReturnRawError}
disabled={
txInfoFromUrl ||
'queryString' in parsedAddressInput
}
showCount
max={2 * opReturn.opreturnParamByteLimit}
handleInput={handleOpReturnRawInput}
/>
</SendXecRow>
{opReturnRawError === false &&
formData.opReturnRaw !== '' && (
<SendXecRow>
<ParsedOpReturnRawRow>
<ParsedOpReturnRawLabel>
Parsed op_return_raw
</ParsedOpReturnRawLabel>
<ParsedOpReturnRaw>
<b>{parsedOpReturnRaw.protocol}</b>
<br />
{parsedOpReturnRaw.data}
</ParsedOpReturnRaw>
</ParsedOpReturnRawRow>
</SendXecRow>
)}
</>
)}
</SendXecForm>
<AmountPreviewCtn>
{!priceApiError && (
<>
{isOneToManyXECSend ? (
<LocaleFormattedValue>
{formatBalance(multiSendTotal, userLocale) +
' ' +
selectedCurrency}
</LocaleFormattedValue>
) : (
<LocaleFormattedValue>
{!isNaN(formData.amount)
? formatBalance(
formData.amount,
userLocale,
) +
' ' +
selectedCurrency
: ''}
</LocaleFormattedValue>
)}
<ConvertAmount>
{fiatPriceString !== '' && '='} {fiatPriceString}
</ConvertAmount>
</>
)}
</AmountPreviewCtn>
<PrimaryButton
style={{ marginTop: '12px' }}
disabled={disableSendButton}
onClick={() => {
checkForConfirmationBeforeSendXec();
}}
>
Send
</PrimaryButton>
{apiError && <ApiError />}
</>
);
};
export default SendXec;
diff --git a/cashtab/src/components/SignVerifyMsg/SignVerifyMsg.js b/cashtab/src/components/SignVerifyMsg/SignVerifyMsg.js
index 294172db3..d2b832bec 100644
--- a/cashtab/src/components/SignVerifyMsg/SignVerifyMsg.js
+++ b/cashtab/src/components/SignVerifyMsg/SignVerifyMsg.js
@@ -1,270 +1,268 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import React, { useState } from 'react';
import styled from 'styled-components';
import { TextArea, Input } from 'components/Common/Inputs';
import Switch from 'components/Common/Switch';
import { WalletContext } from 'wallet/context';
import CopyToClipboard from 'components/Common/CopyToClipboard';
-import PrimaryButton, {
- SecondaryButton,
-} from 'components/Common/PrimaryButton';
+import PrimaryButton, { SecondaryButton } from 'components/Common/Buttons';
import xecMessage from 'bitcoinjs-message';
import * as utxolib from '@bitgo/utxo-lib';
import cashaddr from 'ecashaddrjs';
import { toast } from 'react-toastify';
import { theme } from 'assets/styles/theme';
const SignVerifyForm = styled.div`
margin-top: 24px;
display: flex;
flex-direction: column;
gap: 12px;
width: 100%;
`;
const Row = styled.div`
width: 100%;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
gap: 12px;
`;
const SignatureLabel = styled.div`
font-size: 18px;
color: ${props => props.theme.contrast};
text-align: left;
font-weight: bold;
width: 100%;
`;
const SignatureHolder = styled.code`
width: 100%;
color: ${props => props.theme.contrast};
word-break: break-all;
`;
const SignVerifyMsg = () => {
const ContextValue = React.useContext(WalletContext);
const { cashtabState } = ContextValue;
const { wallets } = cashtabState;
const wallet = wallets.length > 0 ? wallets[0] : false;
// Cap msg length to prevent significant computation
// Note that emojis etc could have larger impact than length
// However, it is not that important, we do not need to get a bytecount for this component
const CASHTAB_MESSAGE_MAX_LENGTH = 200;
const ECASH_SIGNED_MSG_LENGTH = 88;
const emptyFormData = {
msgToSign: '',
msgToVerify: '',
addressToVerify: '',
signatureToVerify: '',
};
const emptyFormDataError = {
msgToSign: false,
msgToVerify: false,
addressToVerify: false,
signatureToVerify: false,
};
const [formData, setFormData] = useState(emptyFormData);
const [formDataError, setFormDataError] = useState(emptyFormDataError);
const [signMsgMode, setSignMsgMode] = useState(true);
const [messageSignature, setMessageSignature] = useState('');
const signMsg = () => {
// We get the msgToSign from formData in state
const { msgToSign } = formData;
// Wrap signing in try...catch to handle any errors
try {
// First, get required params
const keyPair = utxolib.ECPair.fromWIF(
wallet.paths.get(1899).wif,
utxolib.networks.ecash,
);
// Now you can get the local signature
const messageSignature = xecMessage
.sign(
msgToSign,
keyPair.__D,
keyPair.compressed,
utxolib.networks.ecash.messagePrefix,
)
.toString('base64');
setMessageSignature(messageSignature);
toast.success('Message Signed');
} catch (err) {
toast.error(`${err}`);
throw err;
}
};
/**
* Update formData with user input
* @param {Event} e js input event
* e.target.value will be input value
* e.target.name will be name of originating input field
*/
const handleInput = e => {
const { name, value } = e.target;
// We arbitrarily cap input length on all formData fields on this page
if (name !== 'addressToVerify') {
setFormDataError(previous => ({
...previous,
[name]:
value.length > CASHTAB_MESSAGE_MAX_LENGTH
? `Cashtab supports msgs up to ${CASHTAB_MESSAGE_MAX_LENGTH} characters.`
: false,
}));
} else if (name === 'addressToVerify') {
// Validate addressToVerify
const isValidAddr = cashaddr.isValidCashAddress(value, 'ecash');
setFormDataError(previous => ({
...previous,
[name]: isValidAddr ? false : 'Invalid cash address',
}));
} else if (name === 'signatureToVerify') {
setFormDataError(previous => ({
...previous,
[name]:
value.length !== ECASH_SIGNED_MSG_LENGTH
? `Invalid eCash signature length`
: false,
}));
}
setFormData(previous => ({
...previous,
[name]: value,
}));
};
const verifyMessage = () => {
let verification;
try {
verification = xecMessage.verify(
formData.msgToVerify,
cashaddr.toLegacy(formData.addressToVerify),
formData.signatureToVerify,
utxolib.networks.ecash.messagePrefix,
);
} catch (err) {
toast.error(`${err}`);
}
if (verification) {
toast.success(
`Signature verified. Message "${formData.msgToVerify}" was signed by ${formData.addressToVerify}`,
);
} else {
toast.error('Signature does not match address and message');
}
};
return (
<SignVerifyForm title="Sign & Verify">
<Row>
<Switch
name="Toggle Sign Verify"
on="✍️ Sign"
off="✅ Verify"
bgColorOff={theme.genesisGreen}
width={110}
right={76}
checked={signMsgMode}
handleToggle={() => setSignMsgMode(!signMsgMode)}
/>
</Row>
{signMsgMode ? (
<>
<Row>
<TextArea
placeholder={`Enter message to sign`}
name="msgToSign"
handleInput={handleInput}
value={formData.msgToSign}
error={formDataError.msgToSign}
showCount
max={`${CASHTAB_MESSAGE_MAX_LENGTH}`}
/>
</Row>
<Row>
<PrimaryButton
onClick={signMsg}
disabled={formData.msgToSign === ''}
>
Sign
</PrimaryButton>
</Row>
{messageSignature !== '' && (
<>
<Row>
<SignatureLabel>Signature:</SignatureLabel>
</Row>
<Row>
<CopyToClipboard
data={messageSignature}
showToast
>
<SignatureHolder>
{messageSignature}
</SignatureHolder>
</CopyToClipboard>
</Row>
</>
)}
</>
) : (
<>
<Row>
<TextArea
placeholder={`Enter message to verify`}
name="msgToVerify"
handleInput={handleInput}
value={formData.msgToVerify}
error={formDataError.msgToVerify}
showCount
max={`${CASHTAB_MESSAGE_MAX_LENGTH}`}
/>
</Row>
<Row>
<Input
name="addressToVerify"
placeholder="Enter address of signature to verify"
value={formData.addressToVerify}
error={formDataError.addressToVerify}
handleInput={handleInput}
/>
</Row>
<Row>
<TextArea
placeholder={`Enter signature to verify`}
name="signatureToVerify"
handleInput={handleInput}
value={formData.signatureToVerify}
error={formDataError.signatureToVerify}
/>
</Row>
<Row>
<SecondaryButton
onClick={verifyMessage}
disabled={
formDataError.msgToVerify !== false ||
formDataError.addressToVerify !== false ||
formDataError.signatureToVerify !== false
}
>
Verify
</SecondaryButton>
</Row>
</>
)}
</SignVerifyForm>
);
};
export default SignVerifyMsg;
diff --git a/cashtab/src/components/Swap/Swap.js b/cashtab/src/components/Swap/Swap.js
index b88bef338..4234c43c2 100644
--- a/cashtab/src/components/Swap/Swap.js
+++ b/cashtab/src/components/Swap/Swap.js
@@ -1,31 +1,31 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import React from 'react';
import styled from 'styled-components';
-import PrimaryButton from 'components/Common/PrimaryButton';
+import PrimaryButton from 'components/Common/Buttons';
import { isValidSideshiftObj } from 'validation';
import { AlertMsg } from 'components/Common/Atoms';
export const SwapCtn = styled.div`
width: 100%;
margin-top: 24px;
`;
const Swap = () => {
const sideshift = window.sideshift;
return (
<SwapCtn>
{isValidSideshiftObj(sideshift) ? (
<PrimaryButton onClick={() => sideshift.show()}>
Open SideShift
</PrimaryButton>
) : (
<AlertMsg>`Error: Unable to load SideShift`</AlertMsg>
)}
</SwapCtn>
);
};
export default Swap;
diff --git a/cashtab/src/components/Wallets/__tests__/index.test.js b/cashtab/src/components/Wallets/__tests__/index.test.js
index 572335caa..48c341091 100644
--- a/cashtab/src/components/Wallets/__tests__/index.test.js
+++ b/cashtab/src/components/Wallets/__tests__/index.test.js
@@ -1,446 +1,503 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import React from 'react';
import {
walletWithXecAndTokens,
populatedContactList,
} from 'components/App/fixtures/mocks';
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import '@testing-library/jest-dom';
import 'fake-indexeddb/auto';
import localforage from 'localforage';
import { when } from 'jest-when';
import appConfig from 'config/app';
import {
initializeCashtabStateForTests,
prepareMockedChronikCallsForWallet,
clearLocalForage,
} from 'components/App/fixtures/helpers';
import { validSavedWallets } from 'components/App/fixtures/mocks';
import CashtabTestWrapper from 'components/App/fixtures/CashtabTestWrapper';
import * as bip39 from 'bip39';
import { cashtabWalletsFromJSON } from 'helpers';
// https://stackoverflow.com/questions/39830580/jest-test-fails-typeerror-window-matchmedia-is-not-a-function
Object.defineProperty(window, 'matchMedia', {
writable: true,
value: jest.fn().mockImplementation(query => ({
matches: false,
media: query,
onchange: null,
addListener: jest.fn(), // Deprecated
removeListener: jest.fn(), // Deprecated
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
dispatchEvent: jest.fn(),
})),
});
// https://stackoverflow.com/questions/64813447/cannot-read-property-addlistener-of-undefined-react-testing-library
window.matchMedia = query => ({
matches: false,
media: query,
onchange: null,
addListener: jest.fn(), // deprecated
removeListener: jest.fn(), // deprecated
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
dispatchEvent: jest.fn(),
});
// Mock bip39.generateMnemonic() so we can have a consistent test for wallet name
jest.mock('bip39', () => ({
__esModule: true,
...jest.requireActual('bip39'),
generateMnemonic: jest.fn(
() =>
'grant grass sock faculty behave guitar pepper tiger sustain task occur soon',
),
}));
describe('<Wallets />', () => {
let user;
beforeEach(() => {
// Set up userEvent
user = userEvent.setup();
// Mock the fetch call for Cashtab's price API
global.fetch = jest.fn();
const fiatCode = 'usd'; // Use usd until you mock getting settings from localforage
const cryptoId = appConfig.coingeckoId;
// Keep this in the code, because different URLs will have different outputs requiring different parsing
const priceApiUrl = `https://api.coingecko.com/api/v3/simple/price?ids=${cryptoId}&vs_currencies=${fiatCode}&include_last_updated_at=true`;
const xecPrice = 0.00003;
const priceResponse = {
ecash: {
usd: xecPrice,
last_updated_at: 1706644626,
},
};
when(fetch)
.calledWith(priceApiUrl)
.mockResolvedValue({
json: () => Promise.resolve(priceResponse),
});
});
afterEach(async () => {
jest.clearAllMocks();
await clearLocalForage(localforage);
});
it('We can add a savedWallet as a contact', async () => {
// localforage defaults
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
// Custom contact list
await localforage.setItem('contactList', populatedContactList);
const savedWallet = validSavedWallets[0];
// Add a new saved wallet that can be rendered
const addedSavedWalletContact = {
address: savedWallet.paths.get(1899).address,
name: savedWallet.name,
};
await localforage.setItem('wallets', [
walletWithXecAndTokens,
savedWallet,
]);
render(<CashtabTestWrapper chronik={mockedChronik} route="/wallets" />);
// Wait for the app to load
await waitFor(() =>
expect(
screen.queryByTitle('Cashtab Loading'),
).not.toBeInTheDocument(),
);
// We can add a savedWallet as a contact
// We see expected saved wallets
expect((await screen.findAllByText('alpha'))[1]).toBeInTheDocument();
// Click button to add this saved wallet to contacts
- // Note we want index 1 of these buttons, as index 0 is the active wallet
- await user.click(screen.getAllByTitle('add-contact')[1]);
+ await user.click(
+ screen.getByRole('button', {
+ name: /Add alpha to contacts/i,
+ }),
+ );
// Confirm new wallet added to contacts
await waitFor(async () =>
expect(await localforage.getItem('contactList')).toEqual(
populatedContactList.concat(addedSavedWalletContact),
),
);
expect(
await screen.findByText(
`${addedSavedWalletContact.name} (${addedSavedWalletContact.address}) added to Contact List`,
),
).toBeInTheDocument();
});
+ it('We can copy the address of a savedWallet to the clipboard', async () => {
+ // localforage defaults
+ const mockedChronik = await initializeCashtabStateForTests(
+ walletWithXecAndTokens,
+ localforage,
+ );
+
+ // Custom contact list
+ await localforage.setItem('contactList', populatedContactList);
+
+ const savedWallet = validSavedWallets[0];
+
+ await localforage.setItem('wallets', [
+ walletWithXecAndTokens,
+ savedWallet,
+ ]);
+
+ render(<CashtabTestWrapper chronik={mockedChronik} route="/wallets" />);
+
+ // Wait for the app to load
+ await waitFor(() =>
+ expect(
+ screen.queryByTitle('Cashtab Loading'),
+ ).not.toBeInTheDocument(),
+ );
+
+ // Click button to add this saved wallet to contacts
+ await user.click(
+ screen.getByRole('button', {
+ name: /Copy address of alpha/i,
+ }),
+ );
+
+ // Confirm copy success notification is triggered
+ await waitFor(() => {
+ expect(
+ screen.getByText(
+ `"ecash:qzs4zzxs0gvfrc6e2wqhkmvj4dmmh332cvfpd7yjep" copied to clipboard`,
+ ),
+ ).toBeInTheDocument();
+ });
+ });
it('Confirm mocked bip39.generateMnemonic() returns the expected seed', () => {
expect(bip39.generateMnemonic()).toBe(
'grant grass sock faculty behave guitar pepper tiger sustain task occur soon',
);
});
it('We can rename the active wallet or a saved wallet, we can add a wallet, we can import a wallet, we can delete a wallet', async () => {
// localforage defaults
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
// Add 5 valid saved wallets with no state
await localforage.setItem(
'wallets',
[walletWithXecAndTokens].concat(validSavedWallets),
);
const walletToBeActivatedLaterInTest = validSavedWallets.find(
wallet => wallet.name === 'bravo',
);
// Mock utxos for wallet we will activate
prepareMockedChronikCallsForWallet(
mockedChronik,
walletToBeActivatedLaterInTest,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/wallets" />);
// Wait for the app to load
await waitFor(() =>
expect(
screen.queryByTitle('Cashtab Loading'),
).not.toBeInTheDocument(),
);
// We see expected saved wallets
// Note, we see these in the wallet header dropdown and in the savedWallets list
expect((await screen.findAllByText('alpha'))[1]).toBeInTheDocument();
expect((await screen.findAllByText('bravo'))[1]).toBeInTheDocument();
expect((await screen.findAllByText('charlie'))[1]).toBeInTheDocument();
expect((await screen.findAllByText('delta'))[1]).toBeInTheDocument();
expect((await screen.findAllByText('echo'))[1]).toBeInTheDocument();
// Let's rename alpha. Its button will be the second edit button, as the first is for the active wallet.
- await user.click(screen.getAllByTitle('edit')[1]);
+ await user.click(
+ screen.getByRole('button', {
+ name: /Rename alpha/i,
+ }),
+ );
// We see a modal.
expect(await screen.findByText(`Rename "alpha"?`)).toBeInTheDocument();
// Try to rename it to an already existing name
await user.type(
screen.getByPlaceholderText('Enter new wallet name'),
'bravo',
);
// We see expected validation error
expect(
screen.getByText(`Wallet name "bravo" already exists`),
).toBeInTheDocument();
// Rename OK button is disabled
expect(screen.getByText('OK')).toHaveProperty('disabled', true);
// Clear the input
await user.clear(screen.getByPlaceholderText('Enter new wallet name'));
await user.type(
await screen.findByPlaceholderText('Enter new wallet name'),
'ALPHA PRIME',
);
// Click ok
await user.click(screen.getByRole('button', { name: 'OK' }));
// We get a confirmation modal
expect(
await screen.findByText('"alpha" renamed to "ALPHA PRIME"'),
).toBeInTheDocument();
// The wallet has been renamed
expect(
(await screen.findAllByText('ALPHA PRIME'))[1],
).toBeInTheDocument();
// Now let's rename the active wallet
- await user.click(screen.getAllByTitle('edit')[0]);
+ await user.click(
+ screen.getByRole('button', {
+ name: /Rename Transaction Fixtures/i,
+ }),
+ );
await user.type(
await screen.findByPlaceholderText('Enter new wallet name'),
'ACTIVE WALLET',
);
// Click ok
await user.click(screen.getByRole('button', { name: 'OK' }));
// We get a confirmation modal
expect(
await screen.findByText(
'"Transaction Fixtures" renamed to "ACTIVE WALLET"',
),
).toBeInTheDocument();
// The wallet has been renamed. The new name is updated in all locations.
const activeWalletLabels = await screen.findAllByText('ACTIVE WALLET');
const EXPECTED_ACTIVE_WALLET_LABELS_IN_DOCUMENT = 2;
expect(activeWalletLabels.length).toBe(
EXPECTED_ACTIVE_WALLET_LABELS_IN_DOCUMENT,
);
// We can delete a wallet
// Delete the first wallet in the savedWallets list
// It's the first appearance of the trashcan button bc we do not support deleting the active wallet
- await user.click(screen.getAllByTitle('trashcan')[0]);
+ await user.click(
+ screen.getByRole('button', {
+ name: /Delete ALPHA PRIME/i,
+ }),
+ );
// We see a confirmation modal
expect(
await screen.findByText(`Delete "ALPHA PRIME"?`),
).toBeInTheDocument();
// Type deletion confirmation
await user.type(
screen.getByPlaceholderText(`Type "delete ALPHA PRIME" to confirm`),
`delete ALPHA PRIME`,
);
// Click ok to delete the wallet
await user.click(screen.getByRole('button', { name: 'OK' }));
// We get a modal confirming successful wallet deletion
expect(
await screen.findByText('"ALPHA PRIME" deleted'),
).toBeInTheDocument();
// wallet ALPHA PRIME is no longer in savedWallets list
await waitFor(() =>
expect(screen.queryByText('ALPHA PRIME')).not.toBeInTheDocument(),
);
// nor is it in localforage
const walletsNow = cashtabWalletsFromJSON(
await localforage.getItem('wallets'),
);
const expectedWalletsNow = [
...[walletWithXecAndTokens].concat(validSavedWallets),
];
// The active wallet has been renamed
expectedWalletsNow[0].name = 'ACTIVE WALLET';
// We no longer have wallet alpha -- delete it
const alphaIndex = expectedWalletsNow.findIndex(
wallet => wallet.name === 'alpha',
);
expectedWalletsNow.splice(alphaIndex, 1);
expect(walletsNow).toEqual(expectedWalletsNow);
// We can add a wallet without specifying any mnemonic
await user.click(
screen.getByRole('button', {
name: /New Wallet/,
}),
);
// Wallet added success notification
expect(
await screen.findByText(`New wallet "qrj4p" added to wallets`),
).toBeInTheDocument();
// We see the new wallet
expect((await screen.findAllByText('qrj4p'))[1]).toBeInTheDocument();
// It is added to the end of the wallets array
// It will be organized alphabetically when the user refreshes and loadCashtabState runs
// We want it added at the end so it's easy for a user to see what wallet was just added
const walletsAfterAdd = await localforage.getItem('wallets');
expect(walletsAfterAdd[walletsAfterAdd.length - 1].name).toBe('qrj4p');
// We can import a wallet by specifying a mnemonic
await user.click(
screen.getByRole('button', {
name: /Import Wallet/,
}),
);
// We see import modal
// Import button is disabled
const importBtn = screen.getByRole('button', {
name: 'OK',
});
expect(importBtn).toHaveProperty('disabled', true);
// Type in most of a mnemonic
await user.type(
screen.getByPlaceholderText('mnemonic (seed phrase)'),
'pioneer waste next tired armed course expand stairs load brick asthma ',
);
// The validation msg is in the document
expect(screen.getByText('Invalid mnemonic')).toBeInTheDocument();
// Type in the rest
await user.type(
screen.getByPlaceholderText('mnemonic (seed phrase)'),
'budget',
);
// The validation msg is not in the document
expect(screen.queryByText('Invalid mnemonic')).not.toBeInTheDocument();
// The button is not disabled
expect(importBtn).toHaveProperty('disabled', false);
// Click import
await user.click(importBtn);
// Wallet imported success modal
expect(
await screen.findByText(
`New imported wallet "qzxep" added to your saved wallets`,
),
).toBeInTheDocument();
// We see the new wallet
expect((await screen.findAllByText('qzxep'))[1]).toBeInTheDocument();
// It is added to the end of the wallets array
// It will be organized alphabetically when the user refreshes and loadCashtabState runs
// We want it added at the end so it's easy for a user to see what wallet was just added
const walletsAfterImport = await localforage.getItem('wallets');
expect(walletsAfterImport[walletsAfterImport.length - 1].name).toBe(
'qzxep',
);
// Wait for mnemonic input to be cleared
await waitFor(() =>
expect(
screen.getByPlaceholderText('mnemonic (seed phrase)'),
).toHaveValue(''),
);
// Bring up the import modal again
await user.click(
screen.getByRole('button', {
name: /Import Wallet/,
}),
);
// If we try to import the same wallet again, we get an error and wallets is unchanged
await user.type(
screen.getByPlaceholderText('mnemonic (seed phrase)'),
'pioneer waste next tired armed course expand stairs load brick asthma budget',
);
// The button is not disabled
expect(importBtn).toHaveProperty('disabled', false);
// Click import
await user.click(importBtn);
// Wallet imported failure modal
expect(
await screen.findByText(
`Cannot import: wallet already exists (name: "qzxep")`,
),
).toBeInTheDocument();
// We can change the active wallet
- // Activate the first wallet in the list
+ // Activate bravo
// Since ALPHA PRIME has been deleted, "bravo" is the first wallet in the list
await user.click(
- screen.getAllByRole('button', { name: 'Activate' })[0],
+ screen.getByRole('button', { name: /Activate bravo/ }),
);
// Now "bravo" is the active wallet
const newActiveWalletLabels = await screen.findAllByText('bravo');
expect(newActiveWalletLabels.length).toBe(
EXPECTED_ACTIVE_WALLET_LABELS_IN_DOCUMENT,
);
// If we try to add a wallet that has the same name as an already existing wallet
// We get an error modal
// We can add a wallet without specifying any mnemonic
// Since we already did this earlier in the test, and we have mocked generateMnemonic() in this test,
// we will get the same wallet that already exists
// Confirm this edge case is not allowed
await user.click(
screen.getByRole('button', {
name: /New Wallet/,
}),
);
// We get the once-in-a-blue-moon modal error
expect(
await screen.findByText(
`By a vanishingly small chance, "qrj4p" already existed in saved wallets. Please try again.`,
),
).toBeInTheDocument();
});
});
diff --git a/cashtab/src/components/Wallets/index.js b/cashtab/src/components/Wallets/index.js
index fa9e819e9..ab2c3be5e 100644
--- a/cashtab/src/components/Wallets/index.js
+++ b/cashtab/src/components/Wallets/index.js
@@ -1,474 +1,472 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import React, { useState } from 'react';
import { WalletContext } from 'wallet/context';
-import CopyToClipboard from 'components/Common/CopyToClipboard';
import {
- CopyPasteIcon,
TrashcanIcon,
EditIcon,
AddContactIcon,
} from 'components/Common/CustomIcons';
import Modal from 'components/Common/Modal';
import { ModalInput } from 'components/Common/Inputs';
import { toast } from 'react-toastify';
import PrimaryButton, {
SecondaryButton,
-} from 'components/Common/PrimaryButton';
+ IconButton,
+ CopyIconButton,
+} from 'components/Common/Buttons';
import {
WalletsList,
WalletsPanel,
Wallet,
WalletRow,
ActionsRow,
ActiveWalletName,
WalletName,
ButtonPanel,
SvgButtonPanel,
WalletBalance,
ActivateButton,
- SvgButton,
} from 'components/Wallets/styles';
import { getWalletNameError, validateMnemonic } from 'validation';
import {
createCashtabWallet,
generateMnemonic,
getWalletsForNewActiveWallet,
} from 'wallet';
import { getUserLocale } from 'helpers';
import { Event } from 'components/Common/GoogleAnalytics';
import { toFormattedXec } from 'utils/formatting';
const Wallets = () => {
const ContextValue = React.useContext(WalletContext);
const { cashtabState, updateCashtabState } = ContextValue;
const { wallets, contactList } = cashtabState;
const userLocale = getUserLocale(navigator);
const emptyFormData = {
renamedWalletName: '',
walletToBeDeletedName: '',
newWalletName: '',
mnemonic: '',
};
const emptyFormDataErrors = {
renamedWalletName: false,
walletToBeDeletedName: false,
newWalletName: false,
mnemonic: false,
};
// State variables
const [formData, setFormData] = useState(emptyFormData);
const [formDataErrors, setFormDataErrors] = useState(emptyFormDataErrors);
const [walletToBeRenamed, setWalletToBeRenamed] = useState(null);
const [walletToBeDeleted, setWalletToBeDeleted] = useState(null);
const [showImportWalletModal, setShowImportWalletModal] = useState(false);
/**
* Update formData with user input
* @param {Event} e js input event
* e.target.value will be input value
* e.target.name will be name of originating input field
*/
const handleInput = e => {
const { name, value } = e.target;
if (name === 'renamedWalletName') {
setFormDataErrors(previous => ({
...previous,
[name]: getWalletNameError(value, wallets),
}));
}
if (name === 'walletToBeDeletedName') {
const walletToBeDeletedNameError =
value === 'delete ' + walletToBeDeleted.name
? false
: `Input must exactly match "delete ${walletToBeDeleted.name}"`;
setFormDataErrors(previous => ({
...previous,
[name]: walletToBeDeletedNameError,
}));
}
if (name === 'mnemonic') {
setFormDataErrors(previous => ({
...previous,
[name]:
validateMnemonic(value) === true
? false
: 'Invalid mnemonic',
}));
}
setFormData(previous => ({
...previous,
[name]: value,
}));
};
const renameWallet = async () => {
// Find the wallet you want to rename
let walletToUpdate = wallets.find(
wallet => wallet.mnemonic === walletToBeRenamed.mnemonic,
);
const oldName = walletToUpdate.name;
// if a match was found
if (typeof walletToUpdate !== 'undefined') {
// update the walllet name
walletToUpdate.name = formData.renamedWalletName;
// Update localforage and state
await updateCashtabState('wallets', wallets);
toast.success(
`"${oldName}" renamed to "${formData.renamedWalletName}"`,
);
} else {
toast.error(`Unable to find wallet ${walletToBeRenamed.name}`);
}
// Clear walletToBeRenamed field to hide the modal
setWalletToBeRenamed(null);
// Clear wallet rename input
setFormData(previous => ({
...previous,
renamedWalletName: '',
}));
};
const deleteWallet = async () => {
// filter wallet from wallets
const updatedWallets = wallets.filter(
wallet => wallet.mnemonic !== walletToBeDeleted.mnemonic,
);
// Update localforage and state
await updateCashtabState('wallets', updatedWallets);
toast.success(`"${walletToBeDeleted.name}" deleted`);
// Reset walletToBeDeleted to hide the modal
setWalletToBeDeleted(null);
// Clear wallet to delete input
setFormData(previous => ({
...previous,
walletToBeDeletedName: '',
}));
};
const addNewWallet = async () => {
// Generate a new wallet with a new mnemonic
const mnemonic = generateMnemonic();
const newAddedWallet = await createCashtabWallet(mnemonic);
// Note: technically possible though highly unlikley that a wallet already exists with this name
// Also technically possible though ... er, almost impossibly improbable for wallet with same mnemonic to exist
// In both cases, the odds are tremendously low.
// Let's cover the edge case anyway though. It's easy enough for the user to just create
// a wallet again if we some crazy how get here
const walletAlreadyInWalletsSomehow = wallets.find(
wallet =>
wallet.name === newAddedWallet.name ||
wallet.mnemonic === newAddedWallet.mnemonic,
);
if (typeof walletAlreadyInWalletsSomehow !== 'undefined') {
toast.error(
`By a vanishingly small chance, "${newAddedWallet.name}" already existed in saved wallets. Please try again.`,
);
// Do not add this wallet
return;
}
// Event("Category", "Action", "Label")
// Track number of times a different wallet is activated
Event('Configure.js', 'Create Wallet', 'New');
// Add it to the end of the wallets object
updateCashtabState('wallets', [...wallets, newAddedWallet]);
toast.success(`New wallet "${newAddedWallet.name}" added to wallets`);
};
/**
* Add a new imported wallet to cashtabState wallets object
* @param {mnemonic} string
*/
async function importNewWallet() {
// Make sure no existing wallets have this mnemonic
const walletInWallets = wallets.find(
wallet => wallet.mnemonic === formData.mnemonic,
);
if (typeof walletInWallets !== 'undefined') {
// Import error modal
console.error(
`Cannot import: wallet already exists (name: "${walletInWallets.name}")`,
);
toast.error(
`Cannot import: wallet already exists (name: "${walletInWallets.name}")`,
);
// Do not clear form data in this case
return;
}
// Create a new wallet from mnemonic
const newImportedWallet = await createCashtabWallet(formData.mnemonic);
// Handle edge case of another wallet having the same name
const existingWalletHasSameName = wallets.find(
wallet => wallet.name === newImportedWallet,
);
if (typeof existingWalletHasSameName !== 'undefined') {
// Import error modal for wallet existing with the same name
console.error(
`Cannot import: wallet with same name already exists (name: "${existingWalletHasSameName.name}")`,
);
toast.error(
`Cannot import: wallet with same name already exists (name: "${existingWalletHasSameName.name}")`,
);
// Do not clear form data in this case
return;
}
// Event("Category", "Action", "Label")
// Track number of times a different wallet is activated
Event('Configure.js', 'Create Wallet', 'Imported');
// Add it to the end of the wallets object
updateCashtabState('wallets', [...wallets, newImportedWallet]);
// Import success modal
toast.success(
`New imported wallet "${newImportedWallet.name}" added to your saved wallets`,
);
// Clear formdata
setFormData({ ...formData, mnemonic: '' });
}
/**
* Add a wallet to contacts
* @param {{name: string; paths: new Map([[1899, string;]])}} wallet
*/
const addWalletToContacts = async wallet => {
const addressToAdd = wallet.paths.get(1899).address;
// Check to see if the contact exists
const contactExists = contactList.find(
contact => contact.address === addressToAdd,
);
if (typeof contactExists !== 'undefined') {
// Contact exists
// Not expected to ever happen from Tx.js as user should not see option to
// add an existing contact
toast.error(`${addressToAdd} already exists in Contacts`);
} else {
contactList.push({
name: wallet.name,
address: addressToAdd,
});
// update localforage and state
await updateCashtabState('contactList', contactList);
toast.success(
`${wallet.name} (${addressToAdd}) added to Contact List`,
);
}
};
const activateWallet = (walletToActivate, wallets) => {
// Get desired wallets array after activating walletToActivate
const walletsAfterActivation = getWalletsForNewActiveWallet(
walletToActivate,
wallets,
);
// Event("Category", "Action", "Label")
// Track number of times a different wallet is activated
Event('Configure.js', 'Activate', '');
// Update wallets to activate this wallet
updateCashtabState('wallets', walletsAfterActivation);
};
return (
<>
{walletToBeRenamed !== null && (
<Modal
height={180}
title={`Rename "${walletToBeRenamed.name}"?`}
handleOk={renameWallet}
handleCancel={() => setWalletToBeRenamed(null)}
showCancelButton
disabled={
formDataErrors.renamedWalletName !== false ||
formData.renamedWalletName === ''
}
>
<ModalInput
placeholder="Enter new wallet name"
name="renamedWalletName"
value={formData.renamedWalletName}
error={formDataErrors.renamedWalletName}
handleInput={handleInput}
/>
</Modal>
)}
{walletToBeDeleted !== null && (
<Modal
height={210}
title={`Delete "${walletToBeDeleted.name}"?`}
handleOk={deleteWallet}
handleCancel={() => setWalletToBeDeleted(null)}
showCancelButton
disabled={
formDataErrors.walletToBeDeletedName !== false ||
formData.walletToBeDeletedName === ''
}
>
<ModalInput
placeholder={`Type "delete ${walletToBeDeleted.name}" to confirm`}
name="walletToBeDeletedName"
value={formData.walletToBeDeletedName}
handleInput={handleInput}
error={formDataErrors.walletToBeDeletedName}
/>
</Modal>
)}
{showImportWalletModal && (
<Modal
height={180}
title={`Import wallet`}
handleOk={importNewWallet}
handleCancel={() => setShowImportWalletModal(false)}
showCancelButton
disabled={
formDataErrors.mnemonic !== false ||
formData.mnemonic === ''
}
>
<ModalInput
type="email"
placeholder="mnemonic (seed phrase)"
name="mnemonic"
value={formData.mnemonic}
error={formDataErrors.mnemonic}
handleInput={handleInput}
/>
</Modal>
)}
<WalletsList title="Wallets">
<WalletsPanel>
{wallets.map((wallet, index) =>
index === 0 ? (
<WalletRow key={`${wallet.name}_${index}`}>
<ActiveWalletName className="notranslate">
{wallet.name}
</ActiveWalletName>
<h4>(active)</h4>
<SvgButtonPanel>
- <CopyToClipboard
+ <CopyIconButton
+ name={`Copy address of ${wallet.name}`}
data={wallet.paths.get(1899).address}
showToast
- >
- <CopyPasteIcon />
- </CopyToClipboard>
- <SvgButton
+ />
+ <IconButton
+ name={`Rename ${wallet.name}`}
+ icon={<EditIcon />}
onClick={() =>
setWalletToBeRenamed(wallet)
}
- >
- <EditIcon />
- </SvgButton>
- <SvgButton
+ />
+ <IconButton
+ name={`Add ${wallet.name} to contacts`}
+ icon={<AddContactIcon />}
onClick={() =>
addWalletToContacts(wallet)
}
- >
- <AddContactIcon />
- </SvgButton>
+ />
</SvgButtonPanel>
</WalletRow>
) : (
<Wallet key={`${wallet.name}_${index}`}>
<WalletRow>
<WalletName>
<h3 className="overflow notranslate">
{wallet.name}
</h3>
</WalletName>
<WalletBalance>
{wallet?.state?.balanceSats !== 0
? `${toFormattedXec(
wallet.state.balanceSats,
userLocale,
)} XEC`
: '-'}
</WalletBalance>
</WalletRow>
<ActionsRow>
<ButtonPanel>
<SvgButtonPanel>
- <CopyToClipboard
+ <CopyIconButton
+ name={`Copy address of ${wallet.name}`}
data={
wallet.paths.get(1899)
.address
}
showToast
- >
- <CopyPasteIcon />
- </CopyToClipboard>
- <SvgButton
+ />
+ <IconButton
+ name={`Rename ${wallet.name}`}
+ icon={<EditIcon />}
onClick={() =>
setWalletToBeRenamed(wallet)
}
- >
- <EditIcon />
- </SvgButton>
- <SvgButton
+ />
+ <IconButton
+ name={`Add ${wallet.name} to contacts`}
+ icon={<AddContactIcon />}
onClick={() =>
addWalletToContacts(wallet)
}
- >
- <AddContactIcon />
- </SvgButton>
- <SvgButton
+ />
+ <IconButton
+ name={`Delete ${wallet.name}`}
+ icon={<TrashcanIcon />}
onClick={() =>
setWalletToBeDeleted(wallet)
}
- >
- <TrashcanIcon />
- </SvgButton>
+ />
</SvgButtonPanel>
<ActivateButton
+ aria-label={`Activate ${wallet.name}`}
onClick={() =>
activateWallet(wallet, wallets)
}
>
Activate
</ActivateButton>
</ButtonPanel>
</ActionsRow>
</Wallet>
),
)}
</WalletsPanel>
<WalletRow>
<PrimaryButton onClick={() => addNewWallet()}>
New Wallet
</PrimaryButton>
</WalletRow>
<WalletRow>
<SecondaryButton
onClick={() => setShowImportWalletModal(true)}
>
Import Wallet
</SecondaryButton>
</WalletRow>
</WalletsList>
</>
);
};
export default Wallets;
diff --git a/cashtab/src/components/Wallets/styles.js b/cashtab/src/components/Wallets/styles.js
index 4d31346f2..d6a19a210 100644
--- a/cashtab/src/components/Wallets/styles.js
+++ b/cashtab/src/components/Wallets/styles.js
@@ -1,99 +1,88 @@
// Copyright (c) 2024 The Bitcoin developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
import styled from 'styled-components';
export const WalletsList = styled.div`
margin-top: 24px;
padding: 12px;
display: flex;
flex-direction: column;
width: 100%;
align-items: center;
gap: 12px;
color: ${props => props.theme.contrast};
- svg {
- height: 24px;
- width: 24px;
- fill: ${props => props.theme.eCashBlue};
- }
box-sizing: border-box;
*,
*:before,
*:after {
box-sizing: inherit;
}
`;
export const WalletsPanel = styled.div`
display: flex;
flex-direction: column;
padding: 12px;
width: 100%;
background-color: ${props => props.theme.panel};
border-radius: 9px;
margin-bottom: 12px;
`;
export const Wallet = styled.div`
display: flex;
flex-direction: column;
border-top: 0.5px solid ${props => props.theme.separator};
gap: 0 12px;
padding: 6px 0;
`;
export const WalletRow = styled.div`
display: flex;
width: 100%;
align-items: center;
justify-content: space-between;
`;
export const ActionsRow = styled.div``;
export const WalletName = styled.div`
display: flex;
text-align: left;
word-break: break-word;
`;
export const ActiveWalletName = styled(WalletName)`
font-weight: bold;
color: ${props => props.theme.eCashBlue};
`;
export const SvgButtonPanel = styled.div`
display: flex;
- gap: 9px;
align-items: baseline;
`;
export const ButtonPanel = styled.div`
display: flex;
gap: 9px;
align-items: center;
justify-content: center;
`;
-export const SvgButton = styled.div`
- border: none;
- background: none;
- cursor: pointer;
-`;
export const WalletBalance = styled.div`
display: flex;
align-items: center;
justify-content: center;
word-wrap: break-word;
hyphens: auto;
`;
export const ActivateButton = styled.button`
cursor: pointer;
color: ${props => props.theme.eCashBlue};
border-radius: 9px;
border: 2px solid ${props => props.theme.eCashBlue};
background: transparent;
:hover {
background-color: ${props => props.theme.eCashBlue};
color: ${props => props.theme.contrast};
}
`;

File Metadata

Mime Type
text/x-diff
Expires
Sun, Mar 2, 09:36 (1 d, 1 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5187225
Default Alt Text
(853 KB)

Event Timeline