Page MenuHomePhabricator

No OneTemporary

This file is larger than 256 KB, so syntax highlighting was skipped.
diff --git a/cashtab/extension/public/manifest.json b/cashtab/extension/public/manifest.json
index b6879a698..5fbb591c7 100644
--- a/cashtab/extension/public/manifest.json
+++ b/cashtab/extension/public/manifest.json
@@ -1,36 +1,36 @@
{
"manifest_version": 3,
"name": "Cashtab",
"description": "A browser-integrated eCash wallet from Bitcoin ABC",
- "version": "3.15.0",
+ "version": "3.16.0",
"content_scripts": [
{
"matches": ["file://*/*", "http://*/*", "https://*/*"],
"js": ["contentscript.js"],
"run_at": "document_idle",
"all_frames": true
}
],
"background": {
"service_worker": "service_worker.js"
},
"action": {
"default_popup": "index.html",
"default_title": "Cashtab"
},
"icons": {
"16": "ecash16.png",
"48": "ecash48.png",
"128": "ecash128.png",
"192": "ecash192.png",
"512": "ecash512.png"
},
"permissions": ["storage", "tabs"],
"web_accessible_resources": [
{
"resources": ["script.js"],
"matches": ["<all_urls>"]
}
]
}
diff --git a/cashtab/package-lock.json b/cashtab/package-lock.json
index 72d64faa2..635e84949 100644
--- a/cashtab/package-lock.json
+++ b/cashtab/package-lock.json
@@ -1,19833 +1,19833 @@
{
"name": "cashtab",
- "version": "2.15.1",
+ "version": "2.16.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "cashtab",
- "version": "2.15.1",
+ "version": "2.16.0",
"dependencies": {
"@ant-design/icons": "^5.3.0",
"@bitgo/utxo-lib": "^9.33.0",
"@zxing/browser": "^0.1.4",
"antd": "^5.13.3",
"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/@ant-design/colors": {
"version": "7.0.2",
"license": "MIT",
"dependencies": {
"@ctrl/tinycolor": "^3.6.1"
}
},
"node_modules/@ant-design/cssinjs": {
"version": "1.18.4",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.11.1",
"@emotion/hash": "^0.8.0",
"@emotion/unitless": "^0.7.5",
"classnames": "^2.3.1",
"csstype": "^3.1.3",
"rc-util": "^5.35.0",
"stylis": "^4.0.13"
},
"peerDependencies": {
"react": ">=16.0.0",
"react-dom": ">=16.0.0"
}
},
"node_modules/@ant-design/icons": {
"version": "5.3.0",
"license": "MIT",
"dependencies": {
"@ant-design/colors": "^7.0.0",
"@ant-design/icons-svg": "^4.4.0",
"@babel/runtime": "^7.11.2",
"classnames": "^2.2.6",
"rc-util": "^5.31.1"
},
"engines": {
"node": ">=8"
},
"peerDependencies": {
"react": ">=16.0.0",
"react-dom": ">=16.0.0"
}
},
"node_modules/@ant-design/icons-svg": {
"version": "4.4.2",
"license": "MIT"
},
"node_modules/@ant-design/react-slick": {
"version": "1.0.2",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.4",
"classnames": "^2.2.5",
"json2mq": "^0.2.0",
"resize-observer-polyfill": "^1.5.1",
"throttle-debounce": "^5.0.0"
},
"peerDependencies": {
"react": ">=16.9.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",
"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/@ctrl/tinycolor": {
"version": "3.6.1",
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/@emotion/hash": {
"version": "0.8.0",
"license": "MIT"
},
"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",
"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/@rc-component/color-picker": {
"version": "1.5.1",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.6",
"@ctrl/tinycolor": "^3.6.1",
"classnames": "^2.2.6",
"rc-util": "^5.38.1"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/@rc-component/context": {
"version": "1.4.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"rc-util": "^5.27.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/@rc-component/mini-decimal": {
"version": "1.1.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.18.0"
},
"engines": {
"node": ">=8.x"
}
},
"node_modules/@rc-component/mutate-observer": {
"version": "1.1.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.18.0",
"classnames": "^2.3.2",
"rc-util": "^5.24.4"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/@rc-component/portal": {
"version": "1.1.2",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.18.0",
"classnames": "^2.3.2",
"rc-util": "^5.24.4"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/@rc-component/tour": {
"version": "1.12.3",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.18.0",
"@rc-component/portal": "^1.0.0-9",
"@rc-component/trigger": "^1.3.6",
"classnames": "^2.3.2",
"rc-util": "^5.24.4"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/@rc-component/trigger": {
"version": "1.18.3",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.2",
"@rc-component/portal": "^1.1.0",
"classnames": "^2.3.2",
"rc-motion": "^2.0.0",
"rc-resize-observer": "^1.3.1",
"rc-util": "^5.38.0"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"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/antd": {
"version": "5.14.0",
"license": "MIT",
"dependencies": {
"@ant-design/colors": "^7.0.2",
"@ant-design/cssinjs": "^1.18.4",
"@ant-design/icons": "^5.3.0",
"@ant-design/react-slick": "~1.0.2",
"@ctrl/tinycolor": "^3.6.1",
"@rc-component/color-picker": "~1.5.1",
"@rc-component/mutate-observer": "^1.1.0",
"@rc-component/tour": "~1.12.3",
"@rc-component/trigger": "^1.18.3",
"classnames": "^2.5.1",
"copy-to-clipboard": "^3.3.3",
"dayjs": "^1.11.10",
"qrcode.react": "^3.1.0",
"rc-cascader": "~3.21.2",
"rc-checkbox": "~3.1.0",
"rc-collapse": "~3.7.2",
"rc-dialog": "~9.3.4",
"rc-drawer": "~7.0.0",
"rc-dropdown": "~4.1.0",
"rc-field-form": "~1.41.0",
"rc-image": "~7.5.1",
"rc-input": "~1.4.3",
"rc-input-number": "~9.0.0",
"rc-mentions": "~2.10.1",
"rc-menu": "~9.12.4",
"rc-motion": "^2.9.0",
"rc-notification": "~5.3.0",
"rc-pagination": "~4.0.4",
"rc-picker": "~4.0.0-alpha.43",
"rc-progress": "~3.5.1",
"rc-rate": "~2.12.0",
"rc-resize-observer": "^1.4.0",
"rc-segmented": "~2.3.0",
"rc-select": "~14.11.0",
"rc-slider": "~10.5.0",
"rc-steps": "~6.0.1",
"rc-switch": "~4.1.0",
"rc-table": "~7.39.0",
"rc-tabs": "~14.0.0",
"rc-textarea": "~1.6.3",
"rc-tooltip": "~6.1.3",
"rc-tree": "~5.8.5",
"rc-tree-select": "~5.17.0",
"rc-upload": "~4.5.2",
"rc-util": "^5.38.1",
"scroll-into-view-if-needed": "^3.1.0",
"throttle-debounce": "^5.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/ant-design"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"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-tree-filter": {
"version": "2.1.0",
"license": "MIT"
},
"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/async-validator": {
"version": "4.2.5",
"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/classnames": {
"version": "2.5.1",
"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/compute-scroll-into-view": {
"version": "3.1.0",
"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/copy-to-clipboard": {
"version": "3.3.3",
"license": "MIT",
"dependencies": {
"toggle-selection": "^1.0.6"
}
},
"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",
"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/dayjs": {
"version": "1.11.10",
"license": "MIT"
},
"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/json2mq": {
"version": "0.2.0",
"license": "MIT",
"dependencies": {
"string-convert": "^0.2.0"
}
},
"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/rc-cascader": {
"version": "3.21.2",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.12.5",
"array-tree-filter": "^2.1.0",
"classnames": "^2.3.1",
"rc-select": "~14.11.0",
"rc-tree": "~5.8.1",
"rc-util": "^5.37.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-checkbox": {
"version": "3.1.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"classnames": "^2.3.2",
"rc-util": "^5.25.2"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-collapse": {
"version": "3.7.2",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"classnames": "2.x",
"rc-motion": "^2.3.4",
"rc-util": "^5.27.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-dialog": {
"version": "9.3.4",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"@rc-component/portal": "^1.0.0-8",
"classnames": "^2.2.6",
"rc-motion": "^2.3.0",
"rc-util": "^5.21.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-drawer": {
"version": "7.0.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"@rc-component/portal": "^1.1.1",
"classnames": "^2.2.6",
"rc-motion": "^2.6.1",
"rc-util": "^5.36.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-dropdown": {
"version": "4.1.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.18.3",
"@rc-component/trigger": "^1.7.0",
"classnames": "^2.2.6",
"rc-util": "^5.17.0"
},
"peerDependencies": {
"react": ">=16.11.0",
"react-dom": ">=16.11.0"
}
},
"node_modules/rc-field-form": {
"version": "1.41.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.18.0",
"async-validator": "^4.1.0",
"rc-util": "^5.32.2"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-image": {
"version": "7.5.1",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.11.2",
"@rc-component/portal": "^1.0.2",
"classnames": "^2.2.6",
"rc-dialog": "~9.3.4",
"rc-motion": "^2.6.2",
"rc-util": "^5.34.1"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-input": {
"version": "1.4.3",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.11.1",
"classnames": "^2.2.1",
"rc-util": "^5.18.1"
},
"peerDependencies": {
"react": ">=16.0.0",
"react-dom": ">=16.0.0"
}
},
"node_modules/rc-input-number": {
"version": "9.0.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"@rc-component/mini-decimal": "^1.0.1",
"classnames": "^2.2.5",
"rc-input": "~1.4.0",
"rc-util": "^5.28.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-mentions": {
"version": "2.10.1",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.22.5",
"@rc-component/trigger": "^1.5.0",
"classnames": "^2.2.6",
"rc-input": "~1.4.0",
"rc-menu": "~9.12.0",
"rc-textarea": "~1.6.1",
"rc-util": "^5.34.1"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-menu": {
"version": "9.12.4",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"@rc-component/trigger": "^1.17.0",
"classnames": "2.x",
"rc-motion": "^2.4.3",
"rc-overflow": "^1.3.1",
"rc-util": "^5.27.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-motion": {
"version": "2.9.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.11.1",
"classnames": "^2.2.1",
"rc-util": "^5.21.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-notification": {
"version": "5.3.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"classnames": "2.x",
"rc-motion": "^2.9.0",
"rc-util": "^5.20.1"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-overflow": {
"version": "1.3.2",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.11.1",
"classnames": "^2.2.1",
"rc-resize-observer": "^1.0.0",
"rc-util": "^5.37.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-pagination": {
"version": "4.0.4",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"classnames": "^2.3.2",
"rc-util": "^5.38.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-picker": {
"version": "4.0.0-alpha.44",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"@rc-component/trigger": "^1.5.0",
"classnames": "^2.2.1",
"rc-overflow": "^1.3.2",
"rc-resize-observer": "^1.4.0",
"rc-util": "^5.38.1"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"date-fns": ">= 2.x",
"dayjs": ">= 1.x",
"luxon": ">= 3.x",
"moment": ">= 2.x",
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
},
"peerDependenciesMeta": {
"date-fns": {
"optional": true
},
"dayjs": {
"optional": true
},
"luxon": {
"optional": true
},
"moment": {
"optional": true
}
}
},
"node_modules/rc-progress": {
"version": "3.5.1",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"classnames": "^2.2.6",
"rc-util": "^5.16.1"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-rate": {
"version": "2.12.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"classnames": "^2.2.5",
"rc-util": "^5.0.1"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-resize-observer": {
"version": "1.4.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.20.7",
"classnames": "^2.2.1",
"rc-util": "^5.38.0",
"resize-observer-polyfill": "^1.5.1"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-segmented": {
"version": "2.3.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.11.1",
"classnames": "^2.2.1",
"rc-motion": "^2.4.4",
"rc-util": "^5.17.0"
},
"peerDependencies": {
"react": ">=16.0.0",
"react-dom": ">=16.0.0"
}
},
"node_modules/rc-select": {
"version": "14.11.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"@rc-component/trigger": "^1.5.0",
"classnames": "2.x",
"rc-motion": "^2.0.1",
"rc-overflow": "^1.3.1",
"rc-util": "^5.16.1",
"rc-virtual-list": "^3.5.2"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"react": "*",
"react-dom": "*"
}
},
"node_modules/rc-slider": {
"version": "10.5.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"classnames": "^2.2.5",
"rc-util": "^5.27.0"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-steps": {
"version": "6.0.1",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.16.7",
"classnames": "^2.2.3",
"rc-util": "^5.16.1"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-switch": {
"version": "4.1.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.21.0",
"classnames": "^2.2.1",
"rc-util": "^5.30.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-table": {
"version": "7.39.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"@rc-component/context": "^1.4.0",
"classnames": "^2.2.5",
"rc-resize-observer": "^1.1.0",
"rc-util": "^5.37.0",
"rc-virtual-list": "^3.11.1"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-tabs": {
"version": "14.0.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.11.2",
"classnames": "2.x",
"rc-dropdown": "~4.1.0",
"rc-menu": "~9.12.0",
"rc-motion": "^2.6.2",
"rc-resize-observer": "^1.0.0",
"rc-util": "^5.34.1"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-textarea": {
"version": "1.6.3",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"classnames": "^2.2.1",
"rc-input": "~1.4.0",
"rc-resize-observer": "^1.0.0",
"rc-util": "^5.27.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-tooltip": {
"version": "6.1.3",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.11.2",
"@rc-component/trigger": "^1.18.0",
"classnames": "^2.3.1"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-tree": {
"version": "5.8.5",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"classnames": "2.x",
"rc-motion": "^2.0.1",
"rc-util": "^5.16.1",
"rc-virtual-list": "^3.5.1"
},
"engines": {
"node": ">=10.x"
},
"peerDependencies": {
"react": "*",
"react-dom": "*"
}
},
"node_modules/rc-tree-select": {
"version": "5.17.0",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.10.1",
"classnames": "2.x",
"rc-select": "~14.11.0-0",
"rc-tree": "~5.8.1",
"rc-util": "^5.16.1"
},
"peerDependencies": {
"react": "*",
"react-dom": "*"
}
},
"node_modules/rc-upload": {
"version": "4.5.2",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.18.3",
"classnames": "^2.2.5",
"rc-util": "^5.2.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-util": {
"version": "5.38.1",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.18.3",
"react-is": "^18.2.0"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/rc-util/node_modules/react-is": {
"version": "18.2.0",
"license": "MIT"
},
"node_modules/rc-virtual-list": {
"version": "3.11.4",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.20.0",
"classnames": "^2.2.6",
"rc-resize-observer": "^1.0.0",
"rc-util": "^5.36.0"
},
"engines": {
"node": ">=8.x"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.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",
"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/resize-observer-polyfill": {
"version": "1.5.1",
"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/scroll-into-view-if-needed": {
"version": "3.1.0",
"license": "MIT",
"dependencies": {
"compute-scroll-into-view": "^3.0.2"
}
},
"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-convert": {
"version": "0.2.1",
"license": "MIT"
},
"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/stylis": {
"version": "4.3.1",
"license": "MIT"
},
"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/throttle-debounce": {
"version": "5.0.0",
"license": "MIT",
"engines": {
"node": ">=12.22"
}
},
"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/toggle-selection": {
"version": "1.0.6",
"license": "MIT"
},
"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 40a8b7116..e7de07ca4 100644
--- a/cashtab/package.json
+++ b/cashtab/package.json
@@ -1,115 +1,115 @@
{
"name": "cashtab",
- "version": "2.15.1",
+ "version": "2.16.0",
"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": {
"@ant-design/icons": "^5.3.0",
"@bitgo/utxo-lib": "^9.33.0",
"@zxing/browser": "^0.1.4",
"antd": "^5.13.3",
"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/Common/Atoms.js b/cashtab/src/components/Common/Atoms.js
index af5c3c141..40e1f6400 100644
--- a/cashtab/src/components/Common/Atoms.js
+++ b/cashtab/src/components/Common/Atoms.js
@@ -1,80 +1,76 @@
// 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';
import { Link } from 'react-router-dom';
export const WarningFont = styled.div`
color: ${props => props.theme.wallet.text.primary};
`;
export const LoadingCtn = styled.div`
width: 100%;
display: flex;
align-items: center;
justify-content: center;
height: 400px;
flex-direction: column;
svg {
width: 50px;
height: 50px;
fill: ${props => props.theme.eCashBlue};
}
`;
export const TxLink = styled.a`
color: ${props => props.theme.primary};
`;
export const FormLabel = styled.label`
font-size: 16px;
margin-bottom: 5px;
text-align: left;
width: 100%;
display: inline-block;
color: ${props => props.theme.contrast};
`;
export const WalletInfoCtn = styled.div`
background: ${props => props.theme.walletInfoContainer};
padding: 12px 20px;
`;
export const TokenParamLabel = styled.span`
font-weight: bold;
`;
export const AlertMsg = styled.p`
color: ${props => props.theme.forms.error} !important;
`;
-export const MsgBytesizeError = styled.p`
- color: ${props => props.theme.forms.error} !important;
-`;
-
export const ConvertAmount = styled.div`
color: ${props => props.theme.contrast};
width: 100%;
font-size: 14px;
margin-bottom: 10px;
@media (max-width: 768px) {
font-size: 12px;
}
`;
export const StyledLink = styled(Link)`
color: ${props => props.theme.buttons.styledLink};
text-decoration: none;
padding: 8px;
position: relative;
border: solid 1px silver;
border-radius: 10px;
`;
export const SwitchLabel = styled.div`
text-align: left;
color: ${props => props.theme.contrast};
font-size: 18px;
`;
diff --git a/cashtab/src/components/Common/CustomIcons.js b/cashtab/src/components/Common/CustomIcons.js
index 7d7051126..9845fbd4c 100644
--- a/cashtab/src/components/Common/CustomIcons.js
+++ b/cashtab/src/components/Common/CustomIcons.js
@@ -1,252 +1,243 @@
// 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 * as React from 'react';
import styled from 'styled-components';
import {
CopyOutlined,
DollarOutlined,
LoadingOutlined,
WalletOutlined,
SettingOutlined,
LockOutlined,
ContactsOutlined,
FireOutlined,
UserAddOutlined,
WarningOutlined,
SwapOutlined,
AppstoreAddOutlined,
GithubOutlined,
} from '@ant-design/icons';
import { Image } from 'antd';
import { ReactComponent as QRCode } from 'assets/qrcode.svg';
import { ReactComponent as Send } from 'assets/send.svg';
import { ReactComponent as Receive } from 'assets/receive.svg';
import { ReactComponent as Genesis } from 'assets/flask.svg';
import { ReactComponent as Unparsed } from 'assets/alert-circle.svg';
import { ReactComponent as Home } from 'assets/home.svg';
import { ReactComponent as Settings } from 'assets/cog.svg';
import { ReactComponent as CopySolid } from 'assets/copy.svg';
import { ReactComponent as LinkSolid } from 'assets/external-link-square-alt.svg';
import { ReactComponent as Airdrop } from 'assets/airdrop-icon.svg';
import { ReactComponent as Pdf } from 'assets/file-pdf.svg';
import { ReactComponent as Plus } from 'assets/plus.svg';
import { ReactComponent as Download } from 'assets/download.svg';
import { ReactComponent as Edit } from 'assets/edit.svg';
import { ReactComponent as Trashcan } from 'assets/trashcan.svg';
import { ReactComponent as Audit } from 'assets/audit.svg';
-import { ReactComponent as Mail } from 'assets/mail.svg';
export const CashLoadingIcon = <LoadingOutlined className="cashLoadingIcon" />;
import { ReactComponent as User } from 'assets/user.svg';
import { ReactComponent as XLogo } from 'assets/xlogo.svg';
import { ReactComponent as Facebook } from 'assets/Facebook_Logo.svg';
import appConfig from 'config/app';
export const CashReceivedNotificationIcon = () => (
<Image
height={'24px'}
width={'24px'}
src={appConfig.logo}
preview={false}
/>
);
export const TokenNotificationIcon = () => (
<Image
src={appConfig.tokenLogo}
height={'24px'}
width={'24px'}
preview={false}
/>
);
export const ThemedBurnOutlined = styled(FireOutlined)`
color: ${props => props.theme.eCashPurple} !important;
`;
export const ThemedCopyOutlined = styled(CopyOutlined)`
color: ${props => props.theme.icons.outlined} !important;
`;
export const ThemedDollarOutlined = styled(DollarOutlined)`
color: ${props => props.theme.icons.outlined} !important;
`;
export const ThemedWalletOutlined = styled(WalletOutlined)`
color: ${props => props.theme.icons.outlined} !important;
`;
export const ThemedSettingOutlined = styled(SettingOutlined)`
color: ${props => props.theme.icons.outlined} !important;
`;
export const ThemedLockOutlined = styled(LockOutlined)`
color: ${props => props.theme.icons.outlined} !important;
`;
export const ThemedContactsOutlined = styled(ContactsOutlined)`
color: ${props => props.theme.icons.outlined} !important;
`;
export const ThemedContactSendOutlined = styled(Send)`
color: ${props => props.theme.icons.outlined} !important;
transform: rotate(-35deg);
padding: 0.15rem 0rem 0.18rem 0rem;
height: 1.3em;
width: 1.3em;
`;
export const ThemedCopySolid = styled(CopySolid)`
fill: ${props => props.theme.contrast};
padding: 0rem 0rem 0.27rem 0rem;
height: 1.3em;
width: 1.3em;
cursor: pointer;
`;
export const ThemedLinkSolid = styled(LinkSolid)`
fill: ${props => props.theme.contrast};
padding: 0.15rem 0rem 0.18rem 0rem;
height: 1.3em;
width: 1.3em;
`;
export const ThemedPdfSolid = styled(Pdf)`
fill: ${props => props.theme.contrast};
padding: 0.15rem 0rem 0.18rem 0rem;
height: 1.3em;
width: 1.3em;
`;
export const ThemedPlusOutlined = styled(Plus)`
fill: ${props => props.theme.contrast};
padding: 0.15rem 0rem 0.18rem 0rem;
height: 1.3em;
width: 1.3em;
`;
export const ThemedDownloadOutlined = styled(Download)`
fill: ${props => props.theme.contrast};
padding: 0.15rem 0rem 0.18rem 0rem;
height: 1.3em;
width: 1.3em;
`;
export const ThemedEditOutlined = styled(Edit)`
stroke: ${props => props.theme.eCashBlue};
fill: ${props => props.theme.eCashBlue};
width: 20px;
height: 20px;
cursor: pointer;
`;
export const ThemedTrashcanOutlined = styled(Trashcan)`
stroke: ${props => props.theme.eCashBlue};
fill: ${props => props.theme.eCashBlue};
width: 20px;
height: 20px;
cursor: pointer;
`;
-export const ThemedMailOutlined = styled(Mail)`
- stroke: ${props => props.theme.eCashBlue};
- fill: ${props => props.theme.eCashBlue};
- width: 20px;
- height: 20px;
- cursor: pointer;
-`;
-
export const ThemedSignAndVerifyMsg = styled(Audit)`
min-width: 24px;
`;
export const ThemedUserProfileIcon = styled(User)`
height: 33px;
width: 30px;
`;
export const SocialContainer = styled.div`
margin: auto;
display: flex;
align-items: center;
justify-content: space-between;
width: 220px;
height: 42px;
`;
// The :not(#F) is so the F in the Facebook logo is not filled on hover
export const SocialLink = styled.a`
width: 100%;
height: 100%;
@media (hover: hover) {
:hover {
svg {
fill: ${props => props.theme.eCashPurple};
path:not(#F) {
fill: ${props => props.theme.eCashPurple};
}
}
}
}
`;
export const ThemedXIcon = styled(XLogo)`
height: 42px;
width: 100%;
`;
export const ThemedFacebookIcon = styled(Facebook)`
height: 42px;
width: 100%;
`;
export const ThemedGithubIcon = styled(GithubOutlined)`
svg {
fill: ${props => props.theme.contrast} !important;
}
font-size: 42px;
@media (hover: hover) {
:hover {
svg {
fill: ${props => props.theme.eCashPurple} !important;
}
}
}
`;
export const ThemedAliasOutlined = styled(User)`
fill: ${props => props.theme.icons.outlined} !important;
height: 12px;
width: 12px;
`;
export const LoadingBlock = styled.div`
width: 100%;
display: flex;
align-items: center;
justify-content: center;
padding: 24px;
flex-direction: column;
svg {
width: 50px;
height: 50px;
fill: ${props => props.theme.eCashBlue};
}
`;
export const CashLoader = () => (
<LoadingBlock>
<LoadingOutlined data-testid="cash-loader" />
</LoadingBlock>
);
export const ReceiveIcon = () => <Receive />;
export const QRCodeIcon = () => <QRCode />;
export const GenesisIcon = () => <Genesis />;
export const UnparsedIcon = () => <Unparsed />;
export const HomeIcon = () => <Home />;
export const SettingsIcon = () => <Settings height={'33px'} width={'30px'} />;
export const PendingAliasWarningIcon = () => (
<WarningOutlined style={{ fontSize: 25 }} />
);
export const WarningIcon = () => <WarningOutlined style={{ fontSize: 45 }} />;
export const AirdropIcon = () => <Airdrop height={'33px'} width={'30px'} />;
export const SwapIcon = () => <SwapOutlined style={{ fontSize: 24 }} />;
export const EtokensIcon = () => (
<AppstoreAddOutlined style={{ fontSize: 24 }} />
);
export const SendIcon = styled(Send)`
transform: rotate(-35deg);
`;
export const AliasRegisterIcon = () => (
<UserAddOutlined style={{ fontSize: 20 }} />
);
export const AliasIcon = styled(User)``;
export const CustomSpinner = <LoadingOutlined style={{ fontSize: 24 }} spin />;
diff --git a/cashtab/src/components/Common/Inputs.js b/cashtab/src/components/Common/Inputs.js
index a45a612a8..ed1d7bcda 100644
--- a/cashtab/src/components/Common/Inputs.js
+++ b/cashtab/src/components/Common/Inputs.js
@@ -1,522 +1,557 @@
// 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 PropTypes from 'prop-types';
import styled from 'styled-components';
import ScanQRCode from './ScanQRCode';
import appConfig from 'config/app';
const CashtabInputWrapper = styled.div`
box-sizing: border-box;
*,
*:before,
*:after {
box-sizing: inherit;
}
width: 100%;
`;
const InputRow = styled.div`
display: flex;
align-items: stretch;
input,
button,
select {
border: ${props =>
props.invalid
? `1px solid ${props.theme.forms.error}`
: `1px solid ${props.theme.forms.border}`};
}
button,
select {
color: ${props =>
props.invalid ? props.theme.forms.error : props.theme.contrast};
}
`;
const CashtabInput = styled.input`
background-color: ${props => props.theme.forms.selectionBackground};
font-size: 18px;
padding: 16px 12px;
border-radius: 9px;
width: 100%;
color: ${props => props.theme.forms.text};
:focus-visible {
outline: none;
}
`;
const ModalInputField = styled(CashtabInput)`
background-color: transparent;
border: ${props =>
props.invalid
? `1px solid ${props.theme.forms.error}`
: `1px solid ${props.theme.eCashBlue} !important`};
`;
const CashtabTextArea = styled.textarea`
background-color: ${props => props.theme.forms.selectionBackground};
font-size: 12px;
padding: 16px 12px;
border-radius: 9px;
width: 100%;
color: ${props => props.theme.forms.text};
:focus-visible {
outline: none;
}
height: 142px;
`;
const LeftInput = styled(CashtabInput)`
border-radius: 9px 0 0 9px;
`;
const OnMaxBtn = styled.button`
cursor: ${props => (props.disabled ? 'not-allowed' : 'pointer')};
color: ${props =>
props.invalid ? props.theme.forms.error : props.theme.contrast};
border-radius 0 9px 9px 0;
background-color: ${props => props.theme.forms.selectionBackground};
border-left: none !important;
font-size: 18px;
padding: 16px;
`;
const OnMaxBtnToken = styled(OnMaxBtn)`
padding: 12px;
min-width: 59px;
`;
const CurrencyDropdown = styled.select`
width: 100px;
cursor: pointer;
font-size: 18px;
padding: 6px;
color: ${props =>
props.invalid ? props.theme.forms.error : props.theme.contrast};
border-left: none !important;
background-color: ${props => props.theme.forms.selectionBackground};
:focus-visible {
outline: none;
}
`;
const CurrencyOption = styled.option`
text-align: left;
background-color: ${props => props.theme.forms.selectionBackground};
:hover {
background-color: ${props => props.theme.forms.selectionBackground};
}
`;
const ErrorMsg = styled.div`
font-size: 14px;
color: ${props => props.theme.forms.error};
`;
export const InputFlex = styled.div`
display: flex;
flex-direction: column;
width: 100%;
gap: 12px;
`;
export const Input = ({
placeholder = '',
name = '',
value = '',
handleInput,
error = false,
}) => {
return (
<CashtabInputWrapper>
<InputRow invalid={typeof error === 'string'}>
<CashtabInput
name={name}
value={value}
placeholder={placeholder}
invalid={typeof error === 'string'}
onChange={e => handleInput(e)}
/>
</InputRow>
<ErrorMsg>{typeof error === 'string' ? error : ''}</ErrorMsg>
</CashtabInputWrapper>
);
};
Input.propTypes = {
placeholder: PropTypes.string,
name: PropTypes.string,
value: PropTypes.string,
error: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
handleInput: PropTypes.func,
};
export const ModalInput = ({
placeholder = '',
name = '',
value = '',
handleInput,
error = false,
}) => {
return (
<CashtabInputWrapper>
<InputRow invalid={typeof error === 'string'}>
<ModalInputField
name={name}
value={value}
placeholder={placeholder}
invalid={typeof error === 'string'}
onChange={e => handleInput(e)}
/>
</InputRow>
<ErrorMsg>{typeof error === 'string' ? error : ''}</ErrorMsg>
</CashtabInputWrapper>
);
};
ModalInput.propTypes = {
placeholder: PropTypes.string,
name: PropTypes.string,
value: PropTypes.string,
error: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
handleInput: PropTypes.func,
};
+const Count = styled.span`
+ color: ${props =>
+ props.invalid ? props.theme.eCashPurple : props.theme.contrast};
+`;
+const CountHolder = styled.div`
+ color: ${props => props.theme.contrast};
+`;
+const CountAndErrorFlex = styled.div`
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+`;
+const TextAreaErrorMsg = styled.div`
+ order: 0;
+ font-size: 14px;
+ color: ${props => props.theme.forms.error};
+`;
+
export const TextArea = ({
placeholder = '',
name = '',
value = '',
handleInput,
error = false,
+ showCount = false,
+ customCount = false,
+ max = '',
}) => {
return (
<CashtabInputWrapper>
<CashtabTextArea
placeholder={placeholder}
name={name}
value={value}
onChange={e => handleInput(e)}
- invalid={typeof error === 'string'}
/>
- <ErrorMsg>{typeof error === 'string' ? error : ''}</ErrorMsg>
+ <CountAndErrorFlex>
+ <TextAreaErrorMsg>
+ {typeof error === 'string' ? error : ''}
+ </TextAreaErrorMsg>
+ {showCount && (
+ <CountHolder>
+ <Count invalid={typeof error === 'string'}>
+ {customCount !== false ? customCount : value.length}
+ </Count>
+ /{max}
+ </CountHolder>
+ )}
+ </CountAndErrorFlex>
</CashtabInputWrapper>
);
};
TextArea.propTypes = {
placeholder: PropTypes.string,
name: PropTypes.string,
value: PropTypes.string,
handleInput: PropTypes.func,
error: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
+ showCount: PropTypes.bool,
+ customCount: PropTypes.number,
+ max: PropTypes.string,
};
export const InputWithScanner = ({
placeholder = '',
name = '',
value = '',
disabled = false,
handleInput,
error = false,
loadWithScannerOpen,
}) => {
return (
<CashtabInputWrapper>
<InputRow invalid={typeof error === 'string'}>
<LeftInput
name={name}
value={value}
disabled={disabled}
placeholder={placeholder}
invalid={typeof error === 'string'}
onChange={e => handleInput(e)}
/>
<ScanQRCode
loadWithScannerOpen={loadWithScannerOpen}
onScan={result =>
handleInput({
target: {
name: 'address',
value: result,
},
})
}
/>
</InputRow>
<ErrorMsg>{typeof error === 'string' ? error : ''}</ErrorMsg>
</CashtabInputWrapper>
);
};
InputWithScanner.propTypes = {
placeholder: PropTypes.string,
name: PropTypes.string,
value: PropTypes.string,
disabled: PropTypes.bool,
error: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
handleInput: PropTypes.func,
loadWithScannerOpen: PropTypes.bool,
};
export const SendXecInput = ({
name = '',
value = 0,
inputDisabled = false,
selectValue = '',
selectDisabled = false,
fiatCode = 'USD',
error = false,
handleInput,
handleSelect,
handleOnMax,
}) => {
return (
<CashtabInputWrapper>
<InputRow invalid={typeof error === 'string'}>
<LeftInput
placeholder="Amount"
type="number"
step="0.01"
name={name}
value={value}
onChange={e => handleInput(e)}
disabled={inputDisabled}
/>
<CurrencyDropdown
data-testid="currency-select-dropdown"
value={selectValue}
onChange={e => handleSelect(e)}
disabled={selectDisabled}
>
<CurrencyOption data-testid="xec-option" value="XEC">
XEC
</CurrencyOption>
<CurrencyOption data-testid="fiat-option" value={fiatCode}>
{fiatCode}
</CurrencyOption>
</CurrencyDropdown>
<OnMaxBtn
onClick={handleOnMax}
// Disable the onMax button if the user has fiat selected
disabled={selectValue !== appConfig.ticker}
>
max
</OnMaxBtn>
</InputRow>
<ErrorMsg>{typeof error === 'string' ? error : ''}</ErrorMsg>
</CashtabInputWrapper>
);
};
SendXecInput.propTypes = {
name: PropTypes.string,
value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
inputDisabled: PropTypes.bool,
selectValue: PropTypes.string,
selectDisabled: PropTypes.bool,
fiatCode: PropTypes.string,
error: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
handleInput: PropTypes.func,
handleSelect: PropTypes.func,
handleOnMax: PropTypes.func,
};
export const SendTokenInput = ({
name = '',
placeholder = '',
value = 0,
inputDisabled = false,
decimals = 0,
error = false,
handleInput,
handleOnMax,
}) => {
return (
<CashtabInputWrapper>
<InputRow invalid={typeof error === 'string'}>
<LeftInput
placeholder={placeholder}
type="number"
step={1 / 10 ** decimals}
name={name}
value={value}
onChange={e => handleInput(e)}
disabled={inputDisabled}
/>
<OnMaxBtnToken onClick={handleOnMax}>max</OnMaxBtnToken>
</InputRow>
<ErrorMsg>{typeof error === 'string' ? error : ''}</ErrorMsg>
</CashtabInputWrapper>
);
};
SendTokenInput.propTypes = {
name: PropTypes.string,
placeholder: PropTypes.string,
value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
decimals: PropTypes.number,
inputDisabled: PropTypes.bool,
error: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
handleInput: PropTypes.func,
handleOnMax: PropTypes.func,
};
const CashtabSlider = styled.input`
width: 100%;
`;
export const Slider = ({ name, value, min, max, step, handleSlide }) => {
return (
<CashtabSlider
type="range"
name={name}
value={value}
min={min}
max={max}
step={step}
aria-labelledby={name}
onChange={e => {
handleSlide(e.target.value);
}}
/>
);
};
Slider.propTypes = {
name: PropTypes.string,
placeholder: PropTypes.string,
value: PropTypes.number,
min: PropTypes.number,
max: PropTypes.number,
step: PropTypes.number,
handleSlide: PropTypes.func,
};
const InputFile = styled.input`
display: none;
`;
const DragForm = styled.form`
height: 16rem;
width: 28rem;
max-width: 100%;
text-align: center;
position: relative;
`;
const DragLabel = styled.label`
height: 100%;
display: flex;
align-items: center;
justify-content: center;
border-radius: 9px;
border: 2px dashed
${props =>
props.dragActive ? props.theme.eCashBlue : props.theme.darkBlue};
background-color: ${props =>
props.dragActive ? props.theme.eCashBlue : '#f8fafc'};
`;
const UploadText = styled.div`
cursor: pointer;
padding: 0.25rem;
font-size: 1rem;
border: none;
background-color: transparent;
&:hover {
text-decoration-line: underline;
}
`;
const DragText = styled.p``;
const DragHolder = styled.div``;
const DragFileElement = styled.div`
position: absolute;
width: 100%;
height: 100%;
border-radius: 1rem;
top: 0px;
right: 0px;
bottom: 0px;
left: 0px;
`;
const TokenIconPreview = styled.img`
width: 242px;
height: 242px;
`;
export const CashtabDragger = ({ name, handleFile, imageUrl }) => {
// drag state
const [dragActive, setDragActive] = useState(false);
// handle drag events
const handleDrag = e => {
e.preventDefault();
e.stopPropagation();
if (e.type === 'dragenter' || e.type === 'dragover') {
// Update component state for drag enter
setDragActive(true);
} else if (e.type === 'dragleave') {
// Update component state for drag exit
setDragActive(false);
}
};
const handleDrop = function (e) {
e.preventDefault();
e.stopPropagation();
setDragActive(false);
if (e.dataTransfer.files && e.dataTransfer.files[0]) {
handleFile(e.dataTransfer.files[0]);
}
};
// User adds file by clicking the component
const handleChange = function (e) {
e.preventDefault();
if (e.target.files && e.target.files[0]) {
handleFile(e.target.files[0]);
}
};
return (
<DragForm
id="form-file-upload"
onDragEnter={handleDrag}
onSubmit={e => e.preventDefault()}
>
<InputFile
name={name}
type="file"
id="input-file-upload"
multiple={false}
onChange={handleChange}
/>
<DragLabel
id="label-file-upload"
htmlFor="input-file-upload"
dragActive={dragActive}
>
{imageUrl ? (
<TokenIconPreview src={imageUrl} alt="token icon" />
) : (
<DragHolder>
<DragText>
Drag and drop a png or jpg for your token icon
</DragText>
<UploadText>or click to upload</UploadText>
</DragHolder>
)}
</DragLabel>
{dragActive && (
<DragFileElement
id="drag-file-element"
onDragEnter={handleDrag}
onDragLeave={handleDrag}
onDragOver={handleDrag}
onDrop={handleDrop}
></DragFileElement>
)}
</DragForm>
);
};
CashtabDragger.propTypes = {
name: PropTypes.string,
handleFile: PropTypes.func,
imageUrl: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),
};
diff --git a/cashtab/src/components/Send/SendXec.js b/cashtab/src/components/Send/SendXec.js
index 8142d17b5..2e710c84e 100644
--- a/cashtab/src/components/Send/SendXec.js
+++ b/cashtab/src/components/Send/SendXec.js
@@ -1,1010 +1,1008 @@
// 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 {
- ThemedMailOutlined,
- CashReceivedNotificationIcon,
-} from 'components/Common/CustomIcons';
-import { CustomCollapseCtn } from 'components/Common/StyledCollapse';
-import { Alert } from 'antd';
+import { CashReceivedNotificationIcon } from 'components/Common/CustomIcons';
import Modal from 'components/Common/Modal';
import PrimaryButton from 'components/Common/PrimaryButton';
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,
} from 'validation';
import {
ConvertAmount,
AlertMsg,
FormLabel,
TxLink,
- MsgBytesizeError,
} from 'components/Common/Atoms';
import { getWalletState } from 'utils/cashMethods';
import {
sendXec,
getMultisendTargetOutputs,
ignoreUnspendableUtxos,
} from 'transactions';
import {
getCashtabMsgTargetOutput,
getAirdropTargetOutput,
getCashtabMsgByteCount,
getOpreturnParamTargetOutput,
} 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 CashtabSwitch from 'components/Common/Switch';
+import Switch from 'components/Common/Switch';
+const SendXecForm = styled.div`
+ 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-end;
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 SendInputCtn = styled.div`
- .ant-form-item-explain-error {
- @media (max-width: 300px) {
- font-size: 12px;
- }
- }
-`;
-
const LocaleFormattedValue = styled.div`
color: ${props => props.theme.contrast};
font-weight: bold;
font-size: 1.17em;
margin-bottom: 0;
`;
-const DestinationAddressSingleCtn = styled.div``;
-const DestinationAddressMultiCtn = styled.div``;
+const SendToOneHolder = styled.div``;
+const SendToManyHolder = styled.div``;
-const ExpandingAddressInputCtn = styled.div`
- min-height: 14rem;
- ${DestinationAddressSingleCtn} {
+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)};
}
- ${DestinationAddressMultiCtn} {
+ ${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 ? '13rem' : '0rem')};
+ max-height: ${props => (props.open ? '12rem' : '0rem')};
transform: ${props =>
props.open ? 'translateY(0%)' : 'translateY(100%)'};
opacity: ${props => (props.open ? 1 : 0)};
}
`;
-const PanelHeaderCtn = styled.div`
- display: flex;
- justify-content: center;
- align-items: center;
- gap: 1rem;
-`;
-
const AmountSetByBip21Alert = styled.span`
color: ${props => props.theme.eCashPurple};
`;
const OpReturnRawSetByBip21Alert = styled.div`
color: ${props => props.theme.eCashPurple};
padding: 12px;
overflow-wrap: break-word;
`;
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 [opReturnMsg, setOpReturnMsg] = useState(false);
+ const [sendWithCashtabMsg, setSendWithCashtabMsg] = useState(false);
// Load with QR code open if device is mobile
const openWithScanner =
settings && settings.autoCameraOn === true && isMobile(navigator);
- const [formData, setFormData] = useState({
+ const emptyFormData = {
amount: '',
address: '',
multiAddressInput: '',
airdropTokenId: '',
- });
+ cashtabMsg: '',
+ };
+
+ const [formData, setFormData] = useState(emptyFormData);
const [sendAddressError, setSendAddressError] = useState(false);
const [multiSendAddressError, setMultiSendAddressError] = useState(false);
const [sendAmountError, setSendAmountError] = useState(false);
- const [isMsgError, setIsMsgError] = 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({
- amount: '',
- address: '',
- multiAddressInput: '',
- airdropTokenId: '',
- });
- setOpReturnMsg(''); // OP_RETURN message has its own state field
+ 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) {
setFormData({
address: location.state.replyAddress,
amount: `${toXec(appConfig.dustSats)}`,
});
}
// if this was routed from the Contact List
if (location && location.state && location.state.contactSend) {
setFormData({
address: 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,
- opReturnMsg ? opReturnMsg : '',
+ formData.cashtabMsg,
),
);
- } else if (opReturnMsg !== false && opReturnMsg !== '') {
- // If not an airdrop msg, add opReturnMsg as a Cashtab Msg, if it exists
- targetOutputs.push(getCashtabMsgTargetOutput(opReturnMsg));
+ } 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 (
'op_return_raw' in parsedAddressInput &&
parsedAddressInput.op_return_raw.error === false
) {
targetOutputs.push(
getOpreturnParamTargetOutput(
parsedAddressInput.op_return_raw.value,
),
);
}
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 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 handleMsgChange = e => {
- const { value } = e.target;
- let msgError = false;
+ 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) {
- msgError = `Message can not exceed ${maxSize} bytes`;
+ cashtabMsgError = `Message can not exceed ${maxSize} bytes`;
}
- setIsMsgError(msgError);
- setOpReturnMsg(e.target.value);
+ 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 =
- opReturnMsg !== false && opReturnMsg !== ''
- ? getCashtabMsgTargetOutput(opReturnMsg)
+ 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,
- isMsgError,
+ sendWithCashtabMsg,
+ cashtabMsgError,
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 data-testid="app-created-tx">
Webapp Tx Request
</AppCreatedTxSummary>
)}
<SwitchContainer>
- <CashtabSwitch
+ <Switch
name="Send to many"
on="Send to many"
off="Send to one"
width={150}
right={115}
checked={isOneToManyXECSend}
disabled={
txInfoFromUrl || 'queryString' in parsedAddressInput
}
handleToggle={() =>
setIsOneToManyXECSend(!isOneToManyXECSend)
}
/>
</SwitchContainer>
- <ExpandingAddressInputCtn open={isOneToManyXECSend}>
- <SendInputCtn>
- <DestinationAddressSingleCtn>
- <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}
- data-testid="alias-address-preview"
- href={`${explorer.blockExplorerUrl}/address/${aliasInputAddress}`}
- target="_blank"
- rel="noreferrer"
- >
- {aliasInputAddress &&
- `${aliasInputAddress.slice(
- 0,
- 10,
- )}...${aliasInputAddress.slice(-5)}`}
- </TxLink>
- </AliasAddressPreviewLabel>
- <FormLabel>
- {'amount' in parsedAddressInput &&
- parsedAddressInput.amount.value !== null && (
- <AmountSetByBip21Alert data-testid="bip-alert">
- {' '}
- (set by BIP21 query string)
- </AmountSetByBip21Alert>
- )}
- </FormLabel>
- <SendXecInput
- name="amount"
- value={formData.amount}
- selectValue={selectedCurrency}
- selectDisabled={
- 'amount' in parsedAddressInput || txInfoFromUrl
+ <InputModesHolder open={isOneToManyXECSend}>
+ <SendToOneHolder>
+ <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}
+ data-testid="alias-address-preview"
+ href={`${explorer.blockExplorerUrl}/address/${aliasInputAddress}`}
+ target="_blank"
+ rel="noreferrer"
+ >
+ {aliasInputAddress &&
+ `${aliasInputAddress.slice(
+ 0,
+ 10,
+ )}...${aliasInputAddress.slice(-5)}`}
+ </TxLink>
+ </AliasAddressPreviewLabel>
+ <FormLabel>
+ {'amount' in parsedAddressInput &&
+ parsedAddressInput.amount.value !== null && (
+ <AmountSetByBip21Alert data-testid="bip-alert">
+ {' '}
+ (set by BIP21 query string)
+ </AmountSetByBip21Alert>
+ )}
+ </FormLabel>
+ <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}
+ />
+ </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="cashtab-msg-switch"
+ on="✉️"
+ off="✉️"
+ checked={sendWithCashtabMsg}
+ disabled={
+ txInfoFromUrl ||
+ 'queryString' in parsedAddressInput ||
+ 'op_return_raw' in parsedAddressInput
}
- inputDisabled={
- priceApiError ||
- (txInfoFromUrl !== false &&
- 'value' in txInfoFromUrl &&
- txInfoFromUrl.value !== 'null' &&
- txInfoFromUrl.value !== 'undefined') ||
- 'amount' in parsedAddressInput
+ handleToggle={() =>
+ setSendWithCashtabMsg(!sendWithCashtabMsg)
}
- fiatCode={settings.fiatCurrency.toUpperCase()}
- error={sendAmountError}
- handleInput={handleAmountChange}
- handleSelect={handleSelectedCurrencyChange}
- handleOnMax={onMax}
/>
- </DestinationAddressSingleCtn>
- {priceApiError && (
- <AlertMsg>
- Error fetching fiat price. Setting send by{' '}
- {supportedFiatCurrencies[
- settings.fiatCurrency
- ].slug.toUpperCase()}{' '}
- disabled
- </AlertMsg>
- )}
- </SendInputCtn>
-
- <>
- <DestinationAddressMultiCtn>
+ <SwitchLabel>Cashtab Msg</SwitchLabel>
+ </SwitchAndLabel>
+ </SendXecRow>
+ {sendWithCashtabMsg && (
+ <SendXecRow>
<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}
- />
- </DestinationAddressMultiCtn>
- </>
- <AmountPreviewCtn>
- {!priceApiError && (
- <>
- {isOneToManyXECSend ? (
- <LocaleFormattedValue>
- {formatBalance(multiSendTotal, userLocale) +
- ' ' +
- selectedCurrency}
- </LocaleFormattedValue>
- ) : (
- <LocaleFormattedValue>
- {!isNaN(formData.amount)
- ? formatBalance(
- formData.amount,
- userLocale,
- ) +
- ' ' +
- selectedCurrency
- : ''}
- </LocaleFormattedValue>
+ name="cashtabMsg"
+ 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,
)}
- <ConvertAmount>
- {fiatPriceString !== '' && '='}{' '}
- {fiatPriceString}
- </ConvertAmount>
- </>
- )}
- </AmountPreviewCtn>
- </ExpandingAddressInputCtn>
+ max={
+ location &&
+ location.state &&
+ location.state.airdropTokenId
+ ? opreturnConfig.cashtabMsgByteLimit -
+ localAirdropTxAddedBytes
+ : opreturnConfig.cashtabMsgByteLimit
+ }
+ handleInput={e => handleCashtabMsgChange(e)}
+ onKeyDown={e =>
+ e.keyCode == 13 ? e.preventDefault() : ''
+ }
+ />
+ </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>
{'op_return_raw' in parsedAddressInput && (
<OpReturnRawSetByBip21Alert data-testid="op-return-raw-set-alert">
Hex OP_RETURN &quot;
{parsedAddressInput.op_return_raw.value}
&quot; set by BIP21
</OpReturnRawSetByBip21Alert>
)}
<PrimaryButton
style={{ marginTop: '12px' }}
data-testid="send-it"
disabled={disableSendButton}
onClick={() => {
checkForConfirmationBeforeSendXec();
}}
>
Send
</PrimaryButton>
- {!('op_return_raw' in parsedAddressInput) && (
- <CustomCollapseCtn
- data-testid="cashtab-msg-collapse"
- panelHeader={
- <PanelHeaderCtn>
- <ThemedMailOutlined /> Message
- </PanelHeaderCtn>
- }
- optionalDefaultActiveKey={
- location &&
- location.state &&
- location.state.replyAddress
- ? ['1']
- : ['0']
- }
- optionalKey="1"
- >
- <Alert
- style={{
- marginBottom: '10px',
- }}
- description="Please note this message will be public."
- type="warning"
- showIcon
- />
- <TextArea
- name="opReturnMsg"
- placeholder={
- location &&
- location.state &&
- location.state.airdropTokenId
- ? `(max ${
- opreturnConfig.cashtabMsgByteLimit -
- localAirdropTxAddedBytes
- } bytes)`
- : `(max ${opreturnConfig.cashtabMsgByteLimit} bytes)`
- }
- value={opReturnMsg ? opReturnMsg : ''}
- handleInput={e => handleMsgChange(e)}
- onKeyDown={e =>
- e.keyCode == 13 ? e.preventDefault() : ''
- }
- />
- <MsgBytesizeError>
- {isMsgError ? isMsgError : ''}
- </MsgBytesizeError>
- </CustomCollapseCtn>
- )}
{apiError && <ApiError />}
</>
);
};
export default SendXec;
diff --git a/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js b/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js
index ffa19eb06..2355739ec 100644
--- a/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js
+++ b/cashtab/src/components/Send/__tests__/SendByUrlParams.test.js
@@ -1,808 +1,810 @@
// 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 { render, screen, waitFor } from '@testing-library/react';
import '@testing-library/jest-dom';
import { walletWithXecAndTokens } from 'components/fixtures/mocks';
import {
SEND_ADDRESS_VALIDATION_ERRORS,
SEND_AMOUNT_VALIDATION_ERRORS,
} from 'components/Send/fixtures/mocks';
import { when } from 'jest-when';
import 'fake-indexeddb/auto';
import localforage from 'localforage';
import appConfig from 'config/app';
import {
initializeCashtabStateForTests,
clearLocalForage,
} from 'components/fixtures/helpers';
import CashtabTestWrapper from 'components/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(),
});
describe('<SendXec /> rendered with params in URL', () => {
beforeEach(() => {
// 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);
// Unset the window location so it does not impact other tests in this file
Object.defineProperty(window, 'location', {
value: {
hash: undefined,
},
writable: true, // possibility to override
});
});
it('Legacy params. Address and value keys are set and valid.', async () => {
const destinationAddress =
'ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm';
const value = 500;
const hash = `#/send?address=${destinationAddress}&value=${value}`;
// ?address=ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm&value=500
Object.defineProperty(window, 'location', {
value: {
hash,
},
writable: true, // possibility to override
});
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
// Wait for balance to be loaded, as input fields are not populated until balance loads
expect(await screen.findByText('9,513.12 XEC')).toBeInTheDocument();
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// The 'Send To' input field has this address as a value
await waitFor(() =>
expect(addressInputEl).toHaveValue(destinationAddress),
);
// The address input is disabled
expect(addressInputEl).toHaveProperty('disabled', true);
// The amount input is set to the expected value
expect(amountInputEl).toHaveValue(value);
// The amount input is disabled
expect(amountInputEl).toHaveProperty('disabled', true);
// The "Webapp Tx Request" notice is rendered
expect(screen.getByText('Webapp Tx Request')).toBeInTheDocument();
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// Wait for balance to be loaded
expect(await screen.findByText('9,513.12 XEC')).toBeInTheDocument();
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
// The Send button is not disabled because we have a valid amount
expect(
await screen.findByRole('button', { name: /Send/ }),
).not.toHaveStyle('cursor: not-allowed');
});
it('Legacy params. Address and value keys are set and valid. Invalid bip21 string is ignored.', async () => {
const destinationAddress =
'ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm';
const legacyPassedAmount = 500;
const hash = `#/send?address=${destinationAddress}&value=${legacyPassedAmount}&bip21=isthisgoingtodosomething&someotherparam=false&anotherstill=true`;
// ?address=ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm&value=500&bip21=isthisgoingtodosomething&someotherparam=false&anotherstill=true
Object.defineProperty(window, 'location', {
value: {
hash,
},
writable: true, // possibility to override
});
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
// Wait for balance to be loaded
expect(await screen.findByText('9,513.12 XEC')).toBeInTheDocument();
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// The 'Send To' input field has this address as a value
await waitFor(() =>
expect(addressInputEl).toHaveValue(destinationAddress),
);
// The address input is disabled
expect(addressInputEl).toHaveProperty('disabled', true);
// The amount input is filled out per legacy passed amount
expect(amountInputEl).toHaveValue(legacyPassedAmount);
// The amount input is disabled
expect(amountInputEl).toHaveProperty('disabled', true);
// The "Webapp Tx Request" notice is rendered
expect(screen.getByText('Webapp Tx Request')).toBeInTheDocument();
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// The Send button is not disabled because we have a valid amount
expect(
await screen.findByRole('button', { name: /Send/ }),
).not.toHaveStyle('cursor: not-allowed');
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
});
it('Legacy params. Address field is populated + disabled while value field is empty + enabled if legacy url params have address defined and value present as undefined', async () => {
const destinationAddress =
'ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm';
const hash = `#/send?address=${destinationAddress}&value=undefined`;
// ?address=ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm&value=undefined
Object.defineProperty(window, 'location', {
value: {
hash,
},
writable: true,
});
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
// Wait for balance to be loaded, as input fields are not populated until balance loads
expect(await screen.findByText('9,513.12 XEC')).toBeInTheDocument();
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// The 'Send To' input field has this address as a value
await waitFor(() =>
expect(addressInputEl).toHaveValue(destinationAddress),
);
// The address input is disabled
expect(addressInputEl).toHaveProperty('disabled', true);
// The amount input is empty
expect(amountInputEl).toHaveValue(null);
// The amount input is not disabled
expect(amountInputEl).toHaveProperty('disabled', false);
// The "Webapp Tx Request" notice is rendered
expect(screen.getByText('Webapp Tx Request')).toBeInTheDocument();
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// The Send button is disabled because no amount is entered
expect(await screen.findByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
});
it('Legacy params. Address field is populated + disabled while value field is empty + enabled if legacy url params have address defined and no value key present', async () => {
const destinationAddress =
'ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm';
const hash = `#/send?address=${destinationAddress}`;
// ?address=ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm
Object.defineProperty(window, 'location', {
value: {
hash,
},
writable: true,
});
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
// Wait for balance to be loaded, as input fields are not populated until balance loads
expect(await screen.findByText('9,513.12 XEC')).toBeInTheDocument();
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// The 'Send To' input field has this address as a value
await waitFor(() =>
expect(addressInputEl).toHaveValue(destinationAddress),
);
// The address input is disabled
expect(addressInputEl).toHaveProperty('disabled', true);
// The amount input is empty
expect(amountInputEl).toHaveValue(null);
// The amount input is not disabled
expect(amountInputEl).toHaveProperty('disabled', false);
// The "Webapp Tx Request" notice is rendered
expect(screen.getByText('Webapp Tx Request')).toBeInTheDocument();
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// The Send button is disabled because no amount is entered
expect(await screen.findByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
});
it('Legacy params. Params are ignored if only value param is present', async () => {
const hash = `#/send?value=500`;
// ?value=500
Object.defineProperty(window, 'location', {
value: {
hash,
},
writable: true,
});
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The "Send to Many" switch is not disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
false,
);
// The 'Send To' input field is untouched
expect(addressInputEl).toHaveValue('');
// The address input is not disabled
expect(addressInputEl).toHaveProperty('disabled', false);
// The amount input is empty
expect(amountInputEl).toHaveValue(null);
// The amount input is not disabled
expect(amountInputEl).toHaveProperty('disabled', false);
// The "Webapp Tx Request" notice is NOT rendered
expect(screen.queryByText('Webapp Tx Request')).not.toBeInTheDocument();
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// The Send button is disabled because no amount is entered
expect(await screen.findByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
});
it('Legacy params. Params are ignored if param is duplicated', async () => {
const destinationAddress =
'ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm';
const hash = `#/send?address=${destinationAddress}&amount=500&amount=1000`;
// ?address=ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm&amount=500&amount=1000
Object.defineProperty(window, 'location', {
value: {
hash,
},
writable: true,
});
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The "Send to Many" switch is not disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
false,
);
// The 'Send To' input field is untouched
expect(addressInputEl).toHaveValue('');
// The address input is not disabled
expect(addressInputEl).toHaveProperty('disabled', false);
// The amount input is empty
expect(amountInputEl).toHaveValue(null);
// The amount input is not disabled
expect(amountInputEl).toHaveProperty('disabled', false);
// The "Webapp Tx Request" notice is NOT rendered
expect(screen.queryByText('Webapp Tx Request')).not.toBeInTheDocument();
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// The Send button is disabled because no amount is entered
expect(await screen.findByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
});
it('Legacy params are not parsed as bip21 even if the bip21 param appears in the string', async () => {
const destinationAddress =
'ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm';
const legacyPassedAmount = 500;
const hash = `#/send?address=${destinationAddress}&value=${legacyPassedAmount}&bip21=ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6?amount=17&op_return_raw=04007461622263617368746162206D6573736167652077697468206F705F72657475726E5F726177`;
// ?address=ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm&value=500&bip21=ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6?amount=17&op_return_raw=04007461622263617368746162206D6573736167652077697468206F705F72657475726E5F726177
Object.defineProperty(window, 'location', {
value: {
hash,
},
writable: true,
});
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
// Wait for balance to be loaded
expect(await screen.findByText('9,513.12 XEC')).toBeInTheDocument();
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// The 'Send To' input field has this address as a value
await waitFor(() =>
expect(addressInputEl).toHaveValue(destinationAddress),
);
// The address input is disabled
expect(addressInputEl).toHaveProperty('disabled', true);
// The amount input has the expected value
expect(amountInputEl).toHaveValue(legacyPassedAmount);
// The amount input is disabled
expect(amountInputEl).toHaveProperty('disabled', true);
// The "Webapp Tx Request" notice is rendered
expect(screen.getByText('Webapp Tx Request')).toBeInTheDocument();
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// The Send button is not disabled because we have a valid amount
expect(
await screen.findByRole('button', { name: /Send/ }),
).not.toHaveStyle('cursor: not-allowed');
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
});
it('bip21 param - valid bip21 param with amount and op_return_raw is parsed as expected', async () => {
const destinationAddress =
'ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm';
const amount = 17;
const op_return_raw =
'04007461622263617368746162206D6573736167652077697468206F705F72657475726E5F726177';
const bip21Str = `${destinationAddress}?amount=${amount}&op_return_raw=${op_return_raw}`;
const hash = `#/send?bip21=${bip21Str}`;
// ?bip21=ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm?amount=17&op_return_raw=04007461622263617368746162206D6573736167652077697468206F705F72657475726E5F726177
Object.defineProperty(window, 'location', {
value: {
hash,
},
writable: true,
});
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
// Wait for balance to be loaded
expect(await screen.findByText('9,513.12 XEC')).toBeInTheDocument();
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// The 'Send To' input field has this address as a value
await waitFor(() => expect(addressInputEl).toHaveValue(bip21Str));
// The address input is disabled for app txs with bip21 strings
// Note it is NOT disabled for txs where the user inputs the bip21 string
// This is covered in SendXec.test.js
expect(addressInputEl).toHaveProperty('disabled', true);
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// Amount input is the valid amount param value
expect(amountInputEl).toHaveValue(amount);
// The amount input is disabled because it is set by a bip21 query string
expect(amountInputEl).toHaveProperty('disabled', true);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
// The Send button is enabled as we have valid address and amount params
expect(
await screen.findByRole('button', { name: /Send/ }),
).not.toHaveStyle('cursor: not-allowed');
// The "Webapp Tx Request" notice is rendered
expect(screen.getByText('Webapp Tx Request')).toBeInTheDocument();
// The Bip21Alert span is not rendered
expect(
screen.getByText('(set by BIP21 query string)'),
).toBeInTheDocument();
- // The Cashtab Message collapse is not rendered
- expect(
- screen.queryByTestId('cashtab-message-collapse'),
- ).not.toBeInTheDocument();
+ // The Cashtab Msg switch is disabled because we have txInfoFromUrl
+ expect(screen.getByTestId('cashtab-msg-switch')).toHaveProperty(
+ 'disabled',
+ true,
+ );
// The Bip21Alert op_return_raw span is rendered
const opReturnRawAlert = screen.getByTestId('op-return-raw-set-alert');
expect(opReturnRawAlert).toBeInTheDocument();
// Alert renders the set hex string
expect(opReturnRawAlert).toHaveTextContent(
`Hex OP_RETURN "${op_return_raw}" set by BIP21`,
);
});
it('bip21 param - an invalid bip21 param shows validation errors but cannot be changed', async () => {
const destinationAddress =
'ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm';
const amount = 17;
const op_return_raw =
'04007461622263617368746162206D6573736167652077697468206F705F72657475726E5F726177';
// Repeat the op_return_raw param
const bip21Str = `${destinationAddress}?amount=${amount}&op_return_raw=${op_return_raw}&op_return_raw=${op_return_raw}`;
const hash = `#/send?bip21=${bip21Str}`;
// ?bip21=ecash:qp33mh3a7qq7p8yulhnvwty2uq5ynukqcvuxmvzfhm?amount=17&op_return_raw=04007461622263617368746162206D6573736167652077697468206F705F72657475726E5F726177&op_return_raw=04007461622263617368746162206D6573736167652077697468206F705F72657475726E5F726177
Object.defineProperty(window, 'location', {
value: {
hash,
},
writable: true,
});
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
// Wait for balance to be loaded, as input fields are not populated until balance loads
expect(await screen.findByText('9,513.12 XEC')).toBeInTheDocument();
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// The 'Send To' input field has this address as a value
await waitFor(() => expect(addressInputEl).toHaveValue(bip21Str));
// The address input is disabled for app txs with bip21 strings
// Note it is NOT disabled for txs where the user inputs the bip21 string
// This is covered in SendXec.test.js
expect(addressInputEl).toHaveProperty('disabled', true);
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// Amount input is not updated as the bip21 query is invalid
expect(amountInputEl).toHaveValue(null);
// The amount input is not disabled because it is not set by the invalid bip21 query string
expect(amountInputEl).toHaveProperty('disabled', false);
// We get the expected validation error
expect(
// Note that, due to antd quirks, we get 2 of these
screen.getAllByText(
'bip21 parameters may not appear more than once',
)[0],
).toBeInTheDocument();
// The Send button is disabled
expect(await screen.findByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// The "Webapp Tx Request" notice is rendered
expect(screen.getByText('Webapp Tx Request')).toBeInTheDocument();
// The Bip21Alert span is not rendered as no info about the tx is set for invalid bip21
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
- // The Cashtab Message collapse is not rendered
- expect(
- screen.queryByTestId('cashtab-message-collapse'),
- ).not.toBeInTheDocument();
+ // The Cashtab Msg switch is disabled because we have txInfoFromUrl
+ expect(screen.getByTestId('cashtab-msg-switch')).toHaveProperty(
+ 'disabled',
+ true,
+ );
// The Bip21Alert op_return_raw span is not rendered as the bip21 query string is invalid
const opReturnRawAlert = screen.queryByTestId(
'op-return-raw-set-alert',
);
expect(opReturnRawAlert).not.toBeInTheDocument();
});
it('No params. Send screen loads normally with no rendered input.', async () => {
const hash = `#/send`;
Object.defineProperty(window, 'location', {
value: {
hash,
},
writable: true, // possibility to override
});
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The "Send to Many" switch is not disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
false,
);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue('');
// The address input is not disabled
expect(addressInputEl).toHaveProperty('disabled', false);
// The amount input is empty
expect(amountInputEl).toHaveValue(null);
// The amount input is not disabled
expect(amountInputEl).toHaveProperty('disabled', false);
// The "Webapp Tx Request" notice is NOT rendered
expect(screen.queryByText('Webapp Tx Request')).not.toBeInTheDocument();
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// The Send button is disabled
expect(await screen.findByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
});
});
diff --git a/cashtab/src/components/Send/__tests__/SendXec.test.js b/cashtab/src/components/Send/__tests__/SendXec.test.js
index b79c6de1b..bbe85cf0d 100644
--- a/cashtab/src/components/Send/__tests__/SendXec.test.js
+++ b/cashtab/src/components/Send/__tests__/SendXec.test.js
@@ -1,1531 +1,1663 @@
// 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 { render, screen, waitFor } from '@testing-library/react';
import '@testing-library/jest-dom';
import userEvent, {
PointerEventsCheckLevel,
} from '@testing-library/user-event';
import { walletWithXecAndTokens } from 'components/fixtures/mocks';
import {
SEND_ADDRESS_VALIDATION_ERRORS,
SEND_AMOUNT_VALIDATION_ERRORS,
} from 'components/Send/fixtures/mocks';
import { when } from 'jest-when';
import aliasSettings from 'config/alias';
import { explorer } from 'config/explorer';
import 'fake-indexeddb/auto';
import localforage from 'localforage';
import appConfig from 'config/app';
import {
initializeCashtabStateForTests,
clearLocalForage,
} from 'components/fixtures/helpers';
import CashtabTestWrapper from 'components/fixtures/CashtabTestWrapper';
import { CashtabSettings } from 'config/cashtabSettings';
// 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(),
});
describe('<SendXec />', () => {
let user;
beforeEach(() => {
// Set up userEvent to skip pointerEvents check, which returns false positives with antd
user = userEvent.setup({
// https://github.com/testing-library/user-event/issues/922
pointerEventsCheck: PointerEventsCheckLevel.Never,
});
// 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('Renders the SendXec screen with send address input', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// Input fields are rendered
expect(addressInputEl).toBeInTheDocument();
expect(amountInputEl).toBeInTheDocument();
// Inputs are not disabled
expect(addressInputEl).toHaveProperty('disabled', false);
expect(amountInputEl).toHaveProperty('disabled', false);
// The "Send to Many" switch is not disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
false,
);
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// The Send button is disabled
expect(screen.getByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
});
it('Pass valid address to Send To field', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters a valid address
const addressInput = 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6';
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// The "Send to Many" switch is not disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
false,
);
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// Amount input is untouched
expect(amountInputEl).toHaveValue(null);
// The amount input is NOT disabled because there is no BIP21 query string
expect(amountInputEl).toHaveProperty('disabled', false);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
// The Send button is disabled because amount is null
expect(screen.getByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
});
it('Pass valid alias to Send To field', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
const alias = 'twelvechar12';
const expectedResolvedAddress =
'ecash:qpmytrdsakt0axrrlswvaj069nat3p9s7cjctmjasj';
// mock the fetch call to alias-server's '/alias' endpoint
const fetchUrl = `${aliasSettings.aliasServerBaseUrl}/alias/${alias}`;
global.fetch = jest.fn();
when(fetch)
.calledWith(fetchUrl)
.mockResolvedValue({
json: () =>
Promise.resolve({
alias: 'twelvechar12',
address: expectedResolvedAddress,
txid: '166b21d4631e2a6ec6110061f351c9c3bfb3a8d4e6919684df7e2824b42b0ffe',
blockheight: 792419,
}),
});
// The user enters a valid alias
const addressInput = 'twelvechar12.xec';
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// The "Send to Many" switch is not disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
false,
);
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// Amount input is untouched
expect(amountInputEl).toHaveValue(null);
// The amount input is NOT disabled because there is no BIP21 query string
expect(amountInputEl).toHaveProperty('disabled', false);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
// The Send button is disabled because amount is null
expect(screen.getByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// The alias address preview renders the expected address preview
expect(
screen.getByText(
`${expectedResolvedAddress.slice(
0,
10,
)}...${expectedResolvedAddress.slice(-5)}`,
),
).toBeInTheDocument();
});
it('Pass an invalid address to Send To field and get a validation error', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters an invalid address
const addressInput = 'ecash:notValid';
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// The "Send to Many" switch is not disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
false,
);
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// Amount input is untouched
expect(amountInputEl).toHaveValue(null);
// The amount input is NOT disabled because there is no BIP21 query string
expect(amountInputEl).toHaveProperty('disabled', false);
// We get expected addr validation error
// Due to antd quirks, we get multiple elements with this
expect(screen.getAllByText('Invalid address')[0]).toBeInTheDocument();
// The Send button is disabled
expect(screen.getByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
});
it('Pass a possibly valid alias without .xec suffix to Send To field and get expected error', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters an alias that could be valid except missing suffix '.xec'
const addressInput = 'aliasnosuffix';
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// The "Send to Many" switch is not disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
false,
);
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// Amount input is untouched
expect(amountInputEl).toHaveValue(null);
// The amount input is NOT disabled because there is no BIP21 query string
expect(amountInputEl).toHaveProperty('disabled', false);
// We get expected addr validation error
// Due to antd quirks, we get multiple elements with this
expect(
screen.getAllByText(`Aliases must end with '.xec'`)[0],
).toBeInTheDocument();
// The Send button is disabled
expect(screen.getByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
});
it('Pass a valid alias to Send To field that has not yet been registered and get expected error', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
const alias = 'notregistered';
// mock the fetch call to alias-server's '/alias' endpoint
const fetchUrl = `${aliasSettings.aliasServerBaseUrl}/alias/${alias}`;
global.fetch = jest.fn();
when(fetch)
.calledWith(fetchUrl)
.mockResolvedValue({
json: () =>
Promise.resolve({
alias: 'notregistered',
isRegistered: false,
pending: [],
registrationFeeSats: 551,
processedBlockheight: 827598,
}),
});
// The user enters a valid alias
const addressInput = `${alias}.xec`;
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// The "Send to Many" switch is not disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
false,
);
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// Amount input is untouched
expect(amountInputEl).toHaveValue(null);
// The amount input is NOT disabled because there is no BIP21 query string
expect(amountInputEl).toHaveProperty('disabled', false);
// We get expected addr validation error
// Due to antd quirks, we get multiple elements with this
expect(
screen.getAllByText(
`eCash Alias does not exist or yet to receive 1 confirmation`,
)[0],
).toBeInTheDocument();
// The Send button is disabled
expect(screen.getByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
});
it('Get expected error msg and send disabled if bad response from alias server', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
const alias = 'servererror';
// mock the fetch call to alias-server's '/alias' endpoint
const fetchUrl = `${aliasSettings.aliasServerBaseUrl}/alias/${alias}`;
global.fetch = jest.fn();
when(fetch)
.calledWith(fetchUrl)
.mockResolvedValue({
json: () => Promise.reject(new Error('some error')),
});
// The user enters a valid alias
const addressInput = `${alias}.xec`;
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// The "Send to Many" switch is not disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
false,
);
// The Bip21Alert span is not rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
// Amount input is untouched
expect(amountInputEl).toHaveValue(null);
// The amount input is NOT disabled because there is no BIP21 query string
expect(amountInputEl).toHaveProperty('disabled', false);
// We get expected addr validation error
// Due to antd quirks, we get multiple elements with this
expect(
screen.getAllByText(
`Error resolving alias at indexer, contact admin.`,
)[0],
).toBeInTheDocument();
// The Send button is disabled
expect(screen.getByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
});
it('Pass a valid address and bip21 query string with valid amount param to Send To field', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters a valid BIP21 query string with a valid amount param
const addressInput =
'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6?amount=500';
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// Amount input is the valid amount param value
expect(amountInputEl).toHaveValue(500);
// The amount input is disabled because it is set by a bip21 query string
expect(amountInputEl).toHaveProperty('disabled', true);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
// The Send button is enabled as we have valid address and amount params
expect(screen.getByRole('button', { name: /Send/ })).not.toHaveStyle(
'cursor: not-allowed',
);
// The Bip21Alert span is rendered
expect(
screen.getByText('(set by BIP21 query string)'),
).toBeInTheDocument();
});
it('Pass a valid alias and bip21 query string with valid amount param to Send To field', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// Prepare alias input with mock success api call
const alias = 'chicken';
const expectedResolvedAddress =
'ecash:qpmytrdsakt0axrrlswvaj069nat3p9s7cjctmjasj';
// mock the fetch call to alias-server's '/alias' endpoint
const fetchUrl = `${aliasSettings.aliasServerBaseUrl}/alias/${alias}`;
global.fetch = jest.fn();
when(fetch)
.calledWith(fetchUrl)
.mockResolvedValue({
json: () =>
Promise.resolve({
alias: 'chicken',
address: expectedResolvedAddress,
txid: '166b21d4631e2a6ec6110061f351c9c3bfb3a8d4e6919684df7e2824b42b0ffe',
blockheight: 792419,
}),
});
// The user enters a valid BIP21 query string with a valid amount param
const addressInput = `${alias}.xec?amount=500`;
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// Amount input is the valid amount param value
expect(amountInputEl).toHaveValue(500);
// The amount input is disabled because it is set by a bip21 query string
expect(amountInputEl).toHaveProperty('disabled', true);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
// The Send button is enabled as we have valid address and amount params
expect(screen.getByRole('button', { name: /Send/ })).not.toHaveStyle(
'cursor: not-allowed',
);
// The Bip21Alert span is rendered
expect(
screen.getByText('(set by BIP21 query string)'),
).toBeInTheDocument();
// The alias address preview renders the expected address preview
expect(
screen.getByText(
`${expectedResolvedAddress.slice(
0,
10,
)}...${expectedResolvedAddress.slice(-5)}`,
),
).toBeInTheDocument();
});
it('Pass a valid address and bip21 query string with invalid amount param (dust) to Send To field', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters a valid BIP21 query string with a valid amount param
const dustAmount = 5;
const addressInput = `ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6?amount=${dustAmount}`;
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// Amount input is the invalid amount param value
expect(amountInputEl).toHaveValue(dustAmount);
// The amount input is disabled because it is set by a bip21 query string
expect(amountInputEl).toHaveProperty('disabled', true);
// We get expected addr validation error
// Due to antd quirks, we get multiple elements with this
expect(
screen.getAllByText(`Send amount must be at least 5.5 XEC`)[0],
).toBeInTheDocument();
// The Send button is disabled
expect(screen.getByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// The Bip21Alert span is rendered
expect(
screen.getByText('(set by BIP21 query string)'),
).toBeInTheDocument();
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
});
it('Valid address with valid bip21 query string with valid amount param rejected if amount exceeds wallet balance', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters a valid BIP21 query string with a valid amount param
const exceedBalanceAmount = 1000000; // 1 million X E C
const addressInput = `ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6?amount=${exceedBalanceAmount}`;
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// Amount input is the invalid amount param value
expect(amountInputEl).toHaveValue(exceedBalanceAmount);
// The amount input is disabled because it is set by a bip21 query string
expect(amountInputEl).toHaveProperty('disabled', true);
// We get expected addr validation error
// Due to antd quirks, we get multiple elements with this
expect(
screen.getAllByText(
`Amount 1,000,000.00 XEC exceeds wallet balance of 9,513.12 XEC`,
)[0],
).toBeInTheDocument();
// The Send button is disabled
expect(screen.getByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// The Bip21Alert span is rendered
expect(
screen.getByText('(set by BIP21 query string)'),
).toBeInTheDocument();
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
});
it('Pass a valid alias and bip21 query string with invalid amount param (too many decimals) to Send To field', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// Prepare alias input with mock success api call
const alias = 'chicken';
const expectedResolvedAddress =
'ecash:qpmytrdsakt0axrrlswvaj069nat3p9s7cjctmjasj';
// mock the fetch call to alias-server's '/alias' endpoint
const fetchUrl = `${aliasSettings.aliasServerBaseUrl}/alias/${alias}`;
global.fetch = jest.fn();
when(fetch)
.calledWith(fetchUrl)
.mockResolvedValue({
json: () =>
Promise.resolve({
alias: 'chicken',
address: expectedResolvedAddress,
txid: '166b21d4631e2a6ec6110061f351c9c3bfb3a8d4e6919684df7e2824b42b0ffe',
blockheight: 792419,
}),
});
// The user enters a valid BIP21 query string with an invalid amount param
const amount = 500.123;
const addressInput = `${alias}.xec?amount=${amount}`;
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// Amount input is the invalid amount param value
expect(amountInputEl).toHaveValue(amount);
// The amount input is disabled because it is set by a bip21 query string
expect(amountInputEl).toHaveProperty('disabled', true);
// We get expected addr validation error
// Due to antd quirks, we get multiple elements with this
expect(
screen.getAllByText(
`XEC transactions do not support more than 2 decimal places`,
)[0],
).toBeInTheDocument();
// The Send button is disabled
expect(screen.getByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// The Bip21Alert span is rendered
expect(
screen.getByText('(set by BIP21 query string)'),
).toBeInTheDocument();
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// The alias address preview renders the expected address preview
expect(
screen.getByText(
`${expectedResolvedAddress.slice(
0,
10,
)}...${expectedResolvedAddress.slice(-5)}`,
),
).toBeInTheDocument();
});
it('Pass a valid address and an invalid bip21 query string', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters a badly formed query string
const addressInput =
'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6?notaparam=500';
await user.type(addressInputEl, addressInput);
// The Send To input value matches user input
expect(addressInputEl).toHaveValue(addressInput);
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// Amount input unchanged
expect(amountInputEl).toHaveValue(null);
// The amount input is not disabled because no amount param is specified
expect(amountInputEl).toHaveProperty('disabled', false);
// We get expected addr validation error
// Due to antd quirks, we get multiple elements with this
expect(
screen.getAllByText(`Unsupported param "notaparam"`)[0],
).toBeInTheDocument();
// The Send button is disabled
expect(screen.getByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// The Bip21Alert span is NOT rendered
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
- // The Cashtab Message collapse is rendered as there is no op_return_raw param
- expect(screen.getByText('Message')).toBeInTheDocument();
+ // The Cashtab Msg switch is disabled because we have a querystring address input
+ expect(screen.getByTestId('cashtab-msg-switch')).toHaveProperty(
+ 'disabled',
+ true,
+ );
});
it('Pass a valid address and bip21 query string with op_return_raw param to Send To field', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters a valid BIP21 query string with a valid amount param
const addressInput =
'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6?op_return_raw=0401020304';
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// Amount input is untouched
expect(amountInputEl).toHaveValue(null);
// The amount input is not disabled because it is set by a bip21 query string
expect(amountInputEl).toHaveProperty('disabled', false);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
// The Send button is disabled because amount is not entered
expect(screen.getByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// The amount set by Bip21Alert span is NOT rendered as the amount is not set by bip21
expect(
screen.queryByText('(set by BIP21 query string)'),
).not.toBeInTheDocument();
- // The Cashtab Message collapse is not rendered because op_return_raw is set
- expect(screen.queryByText('Message')).not.toBeInTheDocument();
+ // The Cashtab Msg switch is disabled because op_return_raw is set
+ expect(screen.getByTestId('cashtab-msg-switch')).toHaveProperty(
+ 'disabled',
+ true,
+ );
// The Bip21Alert op_return_raw span is rendered
expect(
screen.getByText(`Hex OP_RETURN "0401020304" set by BIP21`),
).toBeInTheDocument();
});
it('Pass a valid address and bip21 query string with valid amount and op_return_raw params to Send To field', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters a valid BIP21 query string with a valid amount param
const addressInput =
'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6?amount=500&op_return_raw=0401020304';
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// Amount input is the valid amount param value
expect(amountInputEl).toHaveValue(500);
// The amount input is disabled because it is set by a bip21 query string
expect(amountInputEl).toHaveProperty('disabled', true);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
// The Send button is enabled as we have valid address and amount params
expect(screen.getByRole('button', { name: /Send/ })).not.toHaveStyle(
'cursor: not-allowed',
);
// The Bip21Alert span is rendered
expect(
screen.getByText('(set by BIP21 query string)'),
).toBeInTheDocument();
- // The Cashtab Message collapse is NOT rendered because op_return_raw is set
- expect(screen.queryByText('Message')).not.toBeInTheDocument();
+ // The Cashtab Msg switch is disabled because op_return_raw is set
+ expect(screen.getByTestId('cashtab-msg-switch')).toHaveProperty(
+ 'disabled',
+ true,
+ );
// The Bip21Alert op_return_raw span is rendered
expect(
screen.getByText(`Hex OP_RETURN "0401020304" set by BIP21`),
).toBeInTheDocument();
});
it('Pass a valid address and bip21 query string with valid amount and invalid op_return_raw params to Send To field', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters a valid BIP21 query string with a valid amount param
const addressInput =
'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6?amount=500&op_return_raw=notahexstring';
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// Amount input is the valid amount param value
expect(amountInputEl).toHaveValue(500);
// The amount input is disabled because it is set by a bip21 query string
expect(amountInputEl).toHaveProperty('disabled', true);
// We get expected addr validation error
// Due to antd quirks, we get multiple elements with this
expect(
screen.getAllByText(
`Invalid op_return_raw param "notahexstring"`,
)[0],
).toBeInTheDocument();
// The Send button is disabled as we have valid address and amount params
expect(screen.getByRole('button', { name: /Send/ })).toHaveStyle(
'cursor: not-allowed',
);
// The Bip21Alert span is rendered
expect(
screen.getByText('(set by BIP21 query string)'),
).toBeInTheDocument();
- // The Cashtab Message collapse is NOT rendered because op_return_raw is set
- expect(screen.queryByText('Message')).not.toBeInTheDocument();
+ // The Cashtab Msg switch is disabled because op_return_raw is set
+ expect(screen.getByTestId('cashtab-msg-switch')).toHaveProperty(
+ 'disabled',
+ true,
+ );
// The Bip21Alert op_return_raw span is rendered
expect(
screen.getByText(`Hex OP_RETURN "notahexstring" set by BIP21`),
).toBeInTheDocument();
});
it('Clicking "Send" will send a valid tx with op_return_raw after entry of a valid address and bip21 query string with valid amount and op_return_raw params to Send To field', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
// Can check in electrum for opreturn and amount
const hex =
'0200000001fe667fba52a1aa603a892126e492717eed3dad43bfea7365a7fdd08e051e8a21020000006a47304402206d45893e238b7e30110d4e0d47e63204a7d6347169547bebad5200be510b8790022014eb3457545423b9eb04aec14e28551548c011ee3544cb40619063dfbb20a1c54121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff030000000000000000296a04007461622263617368746162206d6573736167652077697468206f705f72657475726e5f726177a4060000000000001976a9144e532257c01b310b3b5c1fd947c79a72addf852388ac417b0e00000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000';
const txid =
'79e6afc28d4149c51c4e2a32c05c57fb59c1c164fde1afc655590ce99ed70cb8';
mockedChronik.setMock('broadcastTx', {
input: hex,
output: { txid },
});
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters a valid BIP21 query string with a valid amount param
const addressInput =
'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6?amount=17&op_return_raw=04007461622263617368746162206D6573736167652077697468206F705F72657475726E5F726177';
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// The 'Send To' input field is not disabled
expect(addressInputEl).toHaveProperty('disabled', false);
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// Amount input is the valid amount param value
expect(amountInputEl).toHaveValue(17);
// The amount input is disabled because it is set by a bip21 query string
expect(amountInputEl).toHaveProperty('disabled', true);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
// The Send button is enabled as we have valid address and amount params
expect(screen.getByRole('button', { name: /Send/ })).not.toHaveStyle(
'cursor: not-allowed',
);
// The Bip21Alert span is rendered
expect(
screen.getByText('(set by BIP21 query string)'),
).toBeInTheDocument();
- // The Cashtab Message collapse is NOT rendered because op_return_raw is set
- expect(screen.queryByText('Message')).not.toBeInTheDocument();
+ // The Cashtab Msg switch is disabled because op_return_raw is set
+ expect(screen.getByTestId('cashtab-msg-switch')).toHaveProperty(
+ 'disabled',
+ true,
+ );
// The Bip21Alert op_return_raw span is rendered
expect(
screen.getByText(
`Hex OP_RETURN "04007461622263617368746162206D6573736167652077697468206F705F72657475726E5F726177" set by BIP21`,
),
).toBeInTheDocument();
// Click Send
await user.click(
screen.getByRole('button', { name: /Send/ }),
addressInput,
);
// Notification is rendered with expected txid?;
const txSuccessNotification = await screen.findByText('eCash sent');
await waitFor(() =>
expect(txSuccessNotification).toHaveAttribute(
'href',
`${explorer.blockExplorerUrl}/tx/${txid}`,
),
);
await waitFor(() =>
// The op_return_raw set alert is now removed
expect(
screen.queryByText(
`Hex OP_RETURN "04007461622263617368746162206D6573736167652077697468206F705F72657475726E5F726177" set by BIP21`,
),
).not.toBeInTheDocument(),
);
await waitFor(() =>
// The amount input is no longer disabled
expect(amountInputEl).toHaveProperty('disabled', false),
);
await waitFor(() =>
// Amount input is reset
expect(amountInputEl).toHaveValue(null),
);
// The "Send to Many" switch is not disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
false,
);
// The 'Send To' input field has been cleared
expect(addressInputEl).toHaveValue('');
- // The Cashtab Message collapse is now rendered because op_return_raw is no longer set
- expect(screen.getByText('Message')).toBeInTheDocument();
+ // The Cashtab Msg switch is not disabled because op_return_raw is not set
+ expect(screen.getByTestId('cashtab-msg-switch')).toHaveProperty(
+ 'disabled',
+ false,
+ );
});
it('We can calculate max send amount with and without a cashtab msg, and send a max sat tx with a cashtab msg', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
// Can check in electrum for opreturn and amount
const hex =
'0200000001fe667fba52a1aa603a892126e492717eed3dad43bfea7365a7fdd08e051e8a21020000006b483045022100c7afe57283adb7dae4ae4d72c40e9403f4673205ccb3bd25fb618919dc41984d02203433e27c83796c2bb4f89a20a51230e9db6a3c94aaf40f9ee51a284a8bdd40824121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff0200000000000000003c6a040074616235486f772061626f75742061206c6f6e672d6973682043617368746162206d7367207769746820656d6f6a697320f09f8eaff09f988e03820e00000000001976a9144e532257c01b310b3b5c1fd947c79a72addf852388ac00000000';
const txid =
'5c7b3dbc88ff6a9991108ec650448a9e530591001b99f40133eb23434778cfa7';
mockedChronik.setMock('broadcastTx', {
input: hex,
output: { txid },
});
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters a valid BIP21 query string with a valid amount param
const addressInput = 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6';
await user.type(addressInputEl, addressInput);
// We click "max" to populate the Amount field
await user.click(screen.getByText('max'));
// Amount input is the expected max send for Cashtab's fee and no other outputs
expect(amountInputEl).toHaveValue(9509.26);
- // Let's add a message
- await user.click(screen.getByText('Message'));
+ // Let's add a Cashtab message
+ await user.click(screen.getByTestId('cashtab-msg-switch'));
// Confirm that even a msg of blank spaces is added
await user.type(
- screen.getByPlaceholderText('(max 215 bytes)'),
+ screen.getByPlaceholderText(
+ 'Include a public Cashtab msg with this tx (max 215 bytes)',
+ ),
` `,
);
// We click "max" again to recalculate the max send amount
await user.click(screen.getByText('max'));
// Amount input is now the expected max send for Cashtab's fee and an empty-space Cashtab Msg output
expect(amountInputEl).toHaveValue(9508.83);
// Clear the msg input and start again
- await user.clear(screen.getByPlaceholderText('(max 215 bytes)'));
+ await user.clear(
+ screen.getByPlaceholderText(
+ 'Include a public Cashtab msg with this tx (max 215 bytes)',
+ ),
+ );
await user.type(
- screen.getByPlaceholderText('(max 215 bytes)'),
+ screen.getByPlaceholderText(
+ 'Include a public Cashtab msg with this tx (max 215 bytes)',
+ ),
`How about a long-ish Cashtab msg with emojis 🎯😎`,
);
// We click "max" again to recalculate the max send amount
await user.click(screen.getByText('max'));
// Amount input is now the expected max send for Cashtab's fee and a Cashtab Msg output
expect(amountInputEl).toHaveValue(9507.87);
// Click Send
await user.click(
screen.getByRole('button', { name: /Send/ }),
addressInput,
);
// Notification is rendered with expected txid?;
const txSuccessNotification = await screen.findByText('eCash sent');
await waitFor(() =>
expect(txSuccessNotification).toHaveAttribute(
'href',
`${explorer.blockExplorerUrl}/tx/${txid}`,
),
);
});
it('If the user has minFeeSends set to true but no longer has the right token amount, the feature is disabled', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
// Adjust initial settings so that minFeeSends is true
await localforage.setItem('settings', {
...new CashtabSettings(),
minFeeSends: true,
});
// Can check in electrum to confirm this is not sent at 1.0 sat/byte
// It's 2.02
const hex =
'0200000001fe667fba52a1aa603a892126e492717eed3dad43bfea7365a7fdd08e051e8a21020000006a47304402206d45893e238b7e30110d4e0d47e63204a7d6347169547bebad5200be510b8790022014eb3457545423b9eb04aec14e28551548c011ee3544cb40619063dfbb20a1c54121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff030000000000000000296a04007461622263617368746162206d6573736167652077697468206f705f72657475726e5f726177a4060000000000001976a9144e532257c01b310b3b5c1fd947c79a72addf852388ac417b0e00000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000';
const txid =
'79e6afc28d4149c51c4e2a32c05c57fb59c1c164fde1afc655590ce99ed70cb8';
mockedChronik.setMock('broadcastTx', {
input: hex,
output: { txid },
});
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
// Confirm we have minFeeSends true in settings
expect(await localforage.getItem('settings')).toEqual({
...new CashtabSettings(),
minFeeSends: true,
});
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters a valid BIP21 query string with a valid amount param
const addressInput =
'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6?amount=17&op_return_raw=04007461622263617368746162206D6573736167652077697468206F705F72657475726E5F726177';
await user.type(addressInputEl, addressInput);
// The 'Send To' input field has this address as a value
expect(addressInputEl).toHaveValue(addressInput);
// The 'Send To' input field is not disabled
expect(addressInputEl).toHaveProperty('disabled', false);
// The "Send to Many" switch is disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
true,
);
// Amount input is the valid amount param value
expect(amountInputEl).toHaveValue(17);
// The amount input is disabled because it is set by a bip21 query string
expect(amountInputEl).toHaveProperty('disabled', true);
// No addr validation errors on load
for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS) {
expect(screen.queryByText(addrErr)).not.toBeInTheDocument();
}
// No amount validation errors on load
for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS) {
expect(screen.queryByText(amountErr)).not.toBeInTheDocument();
}
// The Send button is enabled as we have valid address and amount params
expect(screen.getByRole('button', { name: /Send/ })).not.toHaveStyle(
'cursor: not-allowed',
);
// The Bip21Alert span is rendered
expect(
screen.getByText('(set by BIP21 query string)'),
).toBeInTheDocument();
- // The Cashtab Message collapse is NOT rendered because op_return_raw is set
- expect(screen.queryByText('Message')).not.toBeInTheDocument();
+ // The Cashtab Msg switch is disabled because op_return_raw is set
+ expect(screen.getByTestId('cashtab-msg-switch')).toHaveProperty(
+ 'disabled',
+ true,
+ );
// The Bip21Alert op_return_raw span is rendered
expect(
screen.getByText(
`Hex OP_RETURN "04007461622263617368746162206D6573736167652077697468206F705F72657475726E5F726177" set by BIP21`,
),
).toBeInTheDocument();
// Click Send
await user.click(
screen.getByRole('button', { name: /Send/ }),
addressInput,
);
// Notification is rendered with expected txid?;
const txSuccessNotification = await screen.findByText('eCash sent');
await waitFor(() =>
expect(txSuccessNotification).toHaveAttribute(
'href',
`${explorer.blockExplorerUrl}/tx/${txid}`,
),
);
await waitFor(() =>
// The op_return_raw set alert is now removed
expect(
screen.queryByText(
`Hex OP_RETURN "04007461622263617368746162206D6573736167652077697468206F705F72657475726E5F726177" set by BIP21`,
),
).not.toBeInTheDocument(),
);
await waitFor(() =>
// The amount input is no longer disabled
expect(amountInputEl).toHaveProperty('disabled', false),
);
await waitFor(() =>
// Amount input is reset
expect(amountInputEl).toHaveValue(null),
);
// The "Send to Many" switch is not disabled
expect(screen.getByTestId('Send to many')).toHaveProperty(
'disabled',
false,
);
// The 'Send To' input field has been cleared
expect(addressInputEl).toHaveValue('');
- // The Cashtab Message collapse is now rendered because op_return_raw is no longer set
- expect(screen.getByText('Message')).toBeInTheDocument();
+ // The Cashtab Msg switch is no longer disabled because op_return_raw is not set
+ expect(screen.getByTestId('cashtab-msg-switch')).toHaveProperty(
+ 'disabled',
+ false,
+ );
});
it('We can send a tx with amount denominated in fiat currency', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
// Can check in electrum for opreturn and amount
const hex =
'0200000001fe667fba52a1aa603a892126e492717eed3dad43bfea7365a7fdd08e051e8a21020000006a4730440220449bd79f6aaa826afaae1ae2021bd2b3459d1a77c40a64f7ba85a98c0fc7d531022007cf8e1246091b6b647487c75a63002d2fbc0e3bf6c0a99e326afbe5bd30e6c74121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff0260ae0a00000000001976a9144e532257c01b310b3b5c1fd947c79a72addf852388ace9d30300000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000';
const txid =
'aefbd7b1a93ec6914368d71deda3ce646aabdccdb99195b349675febeea976db';
mockedChronik.setMock('broadcastTx', {
input: hex,
output: { txid },
});
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
const addressInputEl = screen.getByPlaceholderText('Address');
const amountInputEl = screen.getByPlaceholderText('Amount');
// The user enters a valid address
const addressInput = 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6';
await user.type(addressInputEl, addressInput);
// Select USD from currency select
const currencyDropdownMenu = screen.getByTestId(
'currency-select-dropdown',
);
await user.selectOptions(
screen.getByTestId('currency-select-dropdown'),
screen.getByTestId('fiat-option'),
);
await waitFor(() => expect(currencyDropdownMenu).toHaveValue('USD'));
// Send $0.21
// 7000 satoshis at 0.00003 USD / XEC
await user.type(amountInputEl, '0.21');
// Click Send
await user.click(
screen.getByRole('button', { name: /Send/ }),
addressInput,
);
// Notification is rendered with expected txid?;
const txSuccessNotification = await screen.findByText('eCash sent');
await waitFor(() =>
expect(txSuccessNotification).toHaveAttribute(
'href',
`${explorer.blockExplorerUrl}/tx/${txid}`,
),
);
});
it('We can send an XEC tx to multiple users', async () => {
// Mock the app with context at the Send screen
const mockedChronik = await initializeCashtabStateForTests(
walletWithXecAndTokens,
localforage,
);
// Can check in electrum for opreturn and amount
const hex =
'0200000001fe667fba52a1aa603a892126e492717eed3dad43bfea7365a7fdd08e051e8a21020000006b4830450221009ce5b0f6332ed7d1dbfdcf6a0ab870a69d97690b47463c09e403c25255df8d2d02206c553baba4386eb73b7938cb041da23c69072bb1232101fd2f3c8d2b1b6367b34121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff03d0070000000000001976a91495e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d88ac98080000000000001976a9144e532257c01b310b3b5c1fd947c79a72addf852388ac9d710e00000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000';
const txid =
'cf665d10e1a0baa8f4c593113678f7859078b1a9a441ac4d6fa40d3636127b99';
mockedChronik.setMock('broadcastTx', {
input: hex,
output: { txid },
});
render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
// Wait for the app to load
await waitFor(() =>
expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
);
// Select multi-send mode
await user.click(screen.getByTestId('Send to many'));
const multiSendInputEl = screen.getByPlaceholderText(
/One address & amount per line/,
);
// The user enters a send to many input
const multiSendInput =
'ecash:qz2708636snqhsxu8wnlka78h6fdp77ar59jrf5035, 20\necash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6, 22';
await user.type(multiSendInputEl, multiSendInput);
// The send to many input field has this value
expect(multiSendInputEl).toHaveValue(multiSendInput);
// The Send button is enabled as we have valid multisend input
expect(screen.getByRole('button', { name: /Send/ })).not.toHaveStyle(
'cursor: not-allowed',
);
// Click Send
await user.click(screen.getByRole('button', { name: /Send/ }));
+ // Notification is rendered with expected txid?;
+ const txSuccessNotification = await screen.findByText('eCash sent');
+ await waitFor(() =>
+ expect(txSuccessNotification).toHaveAttribute(
+ 'href',
+ `${explorer.blockExplorerUrl}/tx/${txid}`,
+ ),
+ );
+ });
+ it('If we type a Cashtab msg, then disable the switch, we send a tx without our typed Cashtab message', async () => {
+ // Mock the app with context at the Send screen
+ const mockedChronik = await initializeCashtabStateForTests(
+ walletWithXecAndTokens,
+ localforage,
+ );
+
+ // Can check in electrum for opreturn and amount
+ const hex =
+ '0200000001fe667fba52a1aa603a892126e492717eed3dad43bfea7365a7fdd08e051e8a21020000006a4730440220055d58f64b9c4e899e06161829f10477ce1d102acfc1fa1a56d35483256a85070220026c9eb6858f62e2a61c58c4b9e55a28ba36bd6b5a7a37b5bb8108bdc4f78a4a4121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff018e820e00000000001976a9144e532257c01b310b3b5c1fd947c79a72addf852388ac00000000';
+ const txid =
+ 'c204b8644f35fdf102799c5b6575a7d9b32c6f6cda16182791e4ea8db40b3932';
+ mockedChronik.setMock('broadcastTx', {
+ input: hex,
+ output: { txid },
+ });
+
+ render(<CashtabTestWrapper chronik={mockedChronik} route="/send" />);
+
+ // Wait for the app to load
+ await waitFor(() =>
+ expect(screen.queryByTestId('loading-ctn')).not.toBeInTheDocument(),
+ );
+
+ const addressInputEl = screen.getByPlaceholderText('Address');
+ const amountInputEl = screen.getByPlaceholderText('Amount');
+ // The user enters a valid BIP21 query string with a valid amount param
+ const addressInput = 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6';
+ await user.type(addressInputEl, addressInput);
+
+ // We click "max" to populate the Amount field
+ await user.click(screen.getByText('max'));
+
+ // Amount input is the expected max send for Cashtab's fee and no other outputs
+ expect(amountInputEl).toHaveValue(9509.26);
+
+ // Let's add a Cashtab message
+ await user.click(screen.getByTestId('cashtab-msg-switch'));
+
+ // Confirm that even a msg of blank spaces is added
+ await user.type(
+ screen.getByPlaceholderText(
+ 'Include a public Cashtab msg with this tx (max 215 bytes)',
+ ),
+ ` `,
+ );
+
+ // We click "max" again to recalculate the max send amount
+ await user.click(screen.getByText('max'));
+
+ // Amount input is now the expected max send for Cashtab's fee and an empty-space Cashtab Msg output
+ expect(amountInputEl).toHaveValue(9508.83);
+
+ // Clear the msg input and start again
+ await user.clear(
+ screen.getByPlaceholderText(
+ 'Include a public Cashtab msg with this tx (max 215 bytes)',
+ ),
+ );
+
+ await user.type(
+ screen.getByPlaceholderText(
+ 'Include a public Cashtab msg with this tx (max 215 bytes)',
+ ),
+ `How about a long-ish Cashtab msg with emojis 🎯😎`,
+ );
+
+ // We click "max" again to recalculate the max send amount
+ await user.click(screen.getByText('max'));
+
+ // Amount input is now the expected max send for Cashtab's fee and a Cashtab Msg output
+ expect(amountInputEl).toHaveValue(9507.87);
+
+ // Now we turn the Cashtab Msg switch off without clearing the input field
+ await user.click(screen.getByTestId('cashtab-msg-switch'));
+
+ // Click max again to recalc max amount
+ // Note: for now, it is not expected behavior onMax to recalculate as the tx changes, onMax
+ // is always a user input
+ // We click "max" to populate the Amount field
+ await user.click(screen.getByText('max'));
+
+ // We are back to our max send amount for no other outputs
+ expect(amountInputEl).toHaveValue(9509.26);
+
+ // Click Send
+ await user.click(
+ screen.getByRole('button', { name: /Send/ }),
+ addressInput,
+ );
+
// Notification is rendered with expected txid?;
const txSuccessNotification = await screen.findByText('eCash sent');
await waitFor(() =>
expect(txSuccessNotification).toHaveAttribute(
'href',
`${explorer.blockExplorerUrl}/tx/${txid}`,
),
);
});
});
diff --git a/cashtab/src/validation/__tests__/index.test.js b/cashtab/src/validation/__tests__/index.test.js
index 6b8d693b9..1cd28731b 100644
--- a/cashtab/src/validation/__tests__/index.test.js
+++ b/cashtab/src/validation/__tests__/index.test.js
@@ -1,601 +1,603 @@
// 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 {
isValidTokenName,
isValidTokenTicker,
isValidTokenDecimals,
isValidTokenDocumentUrl,
isValidCashtabSettings,
isValidNewWalletNameLength,
isValidXecSendAmount,
isValidTokenId,
isValidXecAirdrop,
isValidAirdropExclusionArray,
isValidContactList,
migrateLegacyCashtabSettings,
isValidCashtabCache,
validateMnemonic,
meetsAliasSpec,
isValidAliasSendInput,
isProbablyNotAScam,
isValidRecipient,
isValidSideshiftObj,
isValidMultiSendUserInput,
isValidOpreturnParam,
shouldSendXecBeDisabled,
parseAddressInput,
isValidCashtabWallet,
isValidTokenSendOrBurnAmount,
isValidTokenMintAmount,
} from 'validation';
import {
validXecAirdropExclusionList,
invalidXecAirdropExclusionList,
invalidXecAirdropExclusionListPrefixless,
} from 'validation/fixtures/mocks';
import vectors from 'validation/fixtures/vectors';
import { when } from 'jest-when';
import appConfig from 'config/app';
import aliasSettings from 'config/alias';
describe('Cashtab validation functions', () => {
it(`isValidSideshiftObj() returns true for a valid sideshift library object`, () => {
const mockSideshift = {
show: () => {
return true;
},
hide: () => {
return true;
},
addEventListener: () => {
return true;
},
};
expect(isValidSideshiftObj(mockSideshift)).toBe(true);
});
it(`isValidSideshiftObj() returns false if the sideshift library object failed to instantiate`, () => {
expect(isValidSideshiftObj(null)).toBe(false);
});
it(`isValidSideshiftObj() returns false for an invalid sideshift library object`, () => {
const mockSideshift = {
show: () => {
return true;
},
hide: () => {
return true;
},
addEvenListener: 'not-a-function',
};
expect(isValidSideshiftObj(mockSideshift)).toBe(false);
});
it(`isValidRecipient() returns true for a valid and registered alias input`, async () => {
const mockRegisteredAliasResponse = {
alias: 'cbdc',
address: 'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
txid: 'f7d71433af9a4e0081ea60349becf2a60efed8890df7c3e8e079b3427f51d5ea',
blockheight: 802515,
};
const fetchUrl = `${aliasSettings.aliasServerBaseUrl}/alias/${mockRegisteredAliasResponse.alias}`;
// mock the fetch call to alias-server's '/alias' endpoint
global.fetch = jest.fn();
when(fetch)
.calledWith(fetchUrl)
.mockResolvedValue({
json: () => Promise.resolve(mockRegisteredAliasResponse),
});
expect(await isValidRecipient('cbdc.xec')).toBe(true);
});
it(`isValidRecipient() returns false for a valid but unregistered alias input`, async () => {
const mockUnregisteredAliasResponse = {
alias: 'koush',
isRegistered: false,
registrationFeeSats: 554,
processedBlockheight: 803421,
};
const fetchUrl = `${aliasSettings.aliasServerBaseUrl}/alias/${mockUnregisteredAliasResponse.alias}`;
// mock the fetch call to alias-server's '/alias' endpoint
global.fetch = jest.fn();
when(fetch)
.calledWith(fetchUrl)
.mockResolvedValue({
json: () => Promise.resolve(mockUnregisteredAliasResponse),
});
expect(await isValidRecipient('koush.xec')).toBe(false);
});
it(`isValidRecipient() returns false for an invalid eCash address / alias input`, async () => {
expect(await isValidRecipient('notvalid')).toBe(false);
});
it(`isValidRecipient() returns true for a valid eCash address`, async () => {
expect(
await isValidRecipient(
'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
),
).toBe(true);
});
it(`isValidRecipient() returns true for a valid prefix-less eCash address`, async () => {
expect(
await isValidRecipient(
'qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
),
).toBe(true);
});
it(`validateMnemonic() returns true for a valid mnemonic`, () => {
const mnemonic =
'labor tail bulb distance estate collect lecture into smile differ yard legal';
expect(validateMnemonic(mnemonic)).toBe(true);
});
it(`validateMnemonic() returns false for an invalid mnemonic`, () => {
const mnemonic =
'labor tail bulb not valid collect lecture into smile differ yard legal';
expect(validateMnemonic(mnemonic)).toBe(false);
});
it(`validateMnemonic() returns false for an empty string mnemonic`, () => {
const mnemonic = '';
expect(validateMnemonic(mnemonic)).toBe(false);
});
it(`Accepts a valid ${appConfig.tokenTicker} token name`, () => {
expect(isValidTokenName('Valid token name')).toBe(true);
});
it(`Accepts a valid ${appConfig.tokenTicker} token name that is a stringified number`, () => {
expect(isValidTokenName('123456789')).toBe(true);
});
it(`Rejects ${appConfig.tokenTicker} token name if longer than 68 characters`, () => {
expect(
isValidTokenName(
'This token name is not valid because it is longer than 68 characters which is really pretty long for a token name when you think about it and all',
),
).toBe(false);
});
it(`Rejects ${appConfig.tokenTicker} token name if empty string`, () => {
expect(isValidTokenName('')).toBe(false);
});
it(`Accepts a 4-char ${appConfig.tokenTicker} token ticker`, () => {
expect(isValidTokenTicker('DOGG')).toBe(true);
});
it(`Accepts a 12-char ${appConfig.tokenTicker} token ticker`, () => {
expect(isValidTokenTicker('123456789123')).toBe(true);
});
it(`Rejects ${appConfig.tokenTicker} token ticker if empty string`, () => {
expect(isValidTokenTicker('')).toBe(false);
});
it(`Rejects ${appConfig.tokenTicker} token ticker if > 12 chars`, () => {
expect(isValidTokenTicker('1234567891234')).toBe(false);
});
it(`Accepts tokenDecimals if zero`, () => {
expect(isValidTokenDecimals('0')).toBe(true);
});
it(`Accepts tokenDecimals if between 0 and 9 inclusive`, () => {
expect(isValidTokenDecimals('9')).toBe(true);
});
it(`Rejects tokenDecimals if empty string`, () => {
expect(isValidTokenDecimals('')).toBe(false);
});
it(`Rejects tokenDecimals if non-integer`, () => {
expect(isValidTokenDecimals('1.7')).toBe(false);
});
it(`Accepts a valid ${appConfig.tokenTicker} token document URL`, () => {
expect(isValidTokenDocumentUrl('cashtabapp.com')).toBe(true);
});
it(`Accepts a valid ${appConfig.tokenTicker} token document URL including special URL characters`, () => {
expect(isValidTokenDocumentUrl('https://cashtabapp.com/')).toBe(true);
});
it(`Accepts a blank string as a valid ${appConfig.tokenTicker} token document URL`, () => {
expect(isValidTokenDocumentUrl('')).toBe(true);
});
it(`Rejects ${appConfig.tokenTicker} token name if longer than 68 characters`, () => {
expect(
isValidTokenDocumentUrl(
'http://www.ThisTokenDocumentUrlIsActuallyMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchTooLong.com/',
),
).toBe(false);
});
it(`Accepts a domain input with https protocol as ${appConfig.tokenTicker} token document URL`, () => {
expect(isValidTokenDocumentUrl('https://google.com')).toBe(true);
});
it(`Accepts a domain input with http protocol as ${appConfig.tokenTicker} token document URL`, () => {
expect(isValidTokenDocumentUrl('http://test.com')).toBe(true);
});
it(`Accepts a domain input with a primary and secondary top level domain as ${appConfig.tokenTicker} token document URL`, () => {
expect(isValidTokenDocumentUrl('http://test.co.uk')).toBe(true);
});
it(`Accepts a domain input with just a subdomain as ${appConfig.tokenTicker} token document URL`, () => {
expect(isValidTokenDocumentUrl('www.test.co.uk')).toBe(true);
});
it(`Rejects a domain input with no top level domain, protocol or subdomain ${appConfig.tokenTicker} token document URL`, () => {
expect(isValidTokenDocumentUrl('mywebsite')).toBe(false);
});
it(`Rejects a domain input as numbers ${appConfig.tokenTicker} token document URL`, () => {
expect(isValidTokenDocumentUrl(12345)).toBe(false);
});
it(`isValidTokenId accepts valid token ID that is 64 chars in length`, () => {
const testValidTokenId =
'1c6c9c64d70b285befe733f175d0f384538576876bd280b10587df81279d3f5e';
expect(isValidTokenId(testValidTokenId)).toBe(true);
});
it(`isValidTokenId rejects a token ID that is less than 64 chars in length`, () => {
const testValidTokenId = '111111thisisaninvalidtokenid';
expect(isValidTokenId(testValidTokenId)).toBe(false);
});
it(`isValidTokenId rejects a token ID that is more than 64 chars in length`, () => {
const testValidTokenId =
'111111111c6c9c64d70b285befe733f175d0f384538576876bd280b10587df81279d3f5e';
expect(isValidTokenId(testValidTokenId)).toBe(false);
});
it(`isValidTokenId rejects a token ID number that is 64 digits in length`, () => {
// eslint-disable-next-line no-loss-of-precision
const testValidTokenId = 8912345678912345678912345678912345678912345678912345678912345679;
expect(isValidTokenId(testValidTokenId)).toBe(false);
});
it(`isValidTokenId rejects null`, () => {
const testValidTokenId = null;
expect(isValidTokenId(testValidTokenId)).toBe(false);
});
it(`isValidTokenId rejects undefined`, () => {
const testValidTokenId = undefined;
expect(isValidTokenId(testValidTokenId)).toBe(false);
});
it(`isValidTokenId rejects empty string`, () => {
const testValidTokenId = '';
expect(isValidTokenId(testValidTokenId)).toBe(false);
});
it(`isValidTokenId rejects special character input`, () => {
const testValidTokenId = '^&$%@&^$@&%$!';
expect(isValidTokenId(testValidTokenId)).toBe(false);
});
it(`isValidTokenId rejects non-alphanumeric input`, () => {
const testValidTokenId = 99999999999;
expect(isValidTokenId(testValidTokenId)).toBe(false);
});
it(`isValidXecAirdrop accepts valid Total Airdrop Amount`, () => {
const testAirdropTotal = '1000000';
expect(isValidXecAirdrop(testAirdropTotal)).toBe(true);
});
it(`isValidXecAirdrop rejects null`, () => {
const testAirdropTotal = null;
expect(isValidXecAirdrop(testAirdropTotal)).toBe(false);
});
it(`isValidXecAirdrop rejects undefined`, () => {
const testAirdropTotal = undefined;
expect(isValidXecAirdrop(testAirdropTotal)).toBe(false);
});
it(`isValidXecAirdrop rejects empty string`, () => {
const testAirdropTotal = '';
expect(isValidXecAirdrop(testAirdropTotal)).toBe(false);
});
it(`isValidTokenId rejects an alphanumeric input`, () => {
const testAirdropTotal = 'a73hsyujs3737';
expect(isValidXecAirdrop(testAirdropTotal)).toBe(false);
});
it(`isValidTokenId rejects a number !> 0 in string format`, () => {
const testAirdropTotal = '0';
expect(isValidXecAirdrop(testAirdropTotal)).toBe(false);
});
it(`isValidAirdropExclusionArray accepts a valid airdrop exclusion list`, () => {
expect(isValidAirdropExclusionArray(validXecAirdropExclusionList)).toBe(
true,
);
});
it(`isValidAirdropExclusionArray rejects an invalid airdrop exclusion list`, () => {
expect(
isValidAirdropExclusionArray(invalidXecAirdropExclusionList),
).toBe(false);
});
it(`isValidAirdropExclusionArray rejects a list of addresses if any are not prefixed`, () => {
expect(
isValidAirdropExclusionArray(
invalidXecAirdropExclusionListPrefixless,
),
).toBe(false);
});
it(`isValidAirdropExclusionArray rejects an empty airdrop exclusion list`, () => {
expect(isValidAirdropExclusionArray([])).toBe(false);
});
it(`isValidAirdropExclusionArray rejects a null airdrop exclusion list`, () => {
expect(isValidAirdropExclusionArray(null)).toBe(false);
});
it(`accepts a valid wallet name`, () => {
expect(isValidNewWalletNameLength('Apollo')).toBe(true);
});
it(`rejects wallet name that is too long`, () => {
expect(
isValidNewWalletNameLength(
'this string is far too long to be used as a wallet name...',
),
).toBe(false);
});
it(`rejects blank string as new wallet name`, () => {
expect(isValidNewWalletNameLength('')).toBe(false);
});
it(`rejects wallet name of the wrong type`, () => {
expect(isValidNewWalletNameLength(['newWalletName'])).toBe(false);
});
it(`isProbablyNotAScam recognizes "bitcoin" is probably a scam token name`, () => {
expect(isProbablyNotAScam('bitcoin')).toBe(false);
});
it(`isProbablyNotAScam recognizes "ebitcoin" is probably a scam token name`, () => {
expect(isProbablyNotAScam('ebitcoin')).toBe(false);
});
it(`isProbablyNotAScam recognizes "Lido Staked Ether", from coingeckoTop500Names, is probably a scam token name`, () => {
expect(isProbablyNotAScam('Lido Staked Ether')).toBe(false);
});
it(`isProbablyNotAScam recognizes 'matic-network', from coingeckoTop500Ids, is probably a scam token name`, () => {
expect(isProbablyNotAScam('matic-network')).toBe(false);
});
it(`isProbablyNotAScam recognizes 'Australian Dollar', from Cashtab supported fiat currencies, is probably a scam token name`, () => {
expect(isProbablyNotAScam('Australian Dollar')).toBe(false);
});
it(`isProbablyNotAScam recognizes 'ebtc', from bannedTickers, is probably a scam token name`, () => {
expect(isProbablyNotAScam('ebtc')).toBe(false);
});
it(`isProbablyNotAScam recognizes 'gbp', from bannedTickers, is probably a scam`, () => {
expect(isProbablyNotAScam('gbp')).toBe(false);
});
it(`isProbablyNotAScam recognizes 'Hong Kong Dollar', from fiatNames, is probably a scam`, () => {
expect(isProbablyNotAScam('gbp')).toBe(false);
});
it(`isProbablyNotAScam recognizes '₪', from fiat symbols, is probably a scam`, () => {
expect(isProbablyNotAScam('₪')).toBe(false);
});
it(`isProbablyNotAScam recognizes an ordinary token name as acceptable`, () => {
expect(isProbablyNotAScam('just a normal token name')).toBe(true);
});
it(`isProbablyNotAScam accepts a token name with fragments of banned potential scam names`, () => {
expect(
isProbablyNotAScam(
'This token is not Ethereum or bitcoin or USD $',
),
).toBe(true);
});
it(`isValidOpreturnParam rejects a string that starts with 6a`, () => {
expect(isValidOpreturnParam('6a')).toBe(false);
});
it(`isValidOpreturnParam rejects a string that starts with invalid pushdata`, () => {
expect(isValidOpreturnParam('4d')).toBe(false);
});
it(`isValidOpreturnParam rejects non-string input`, () => {
expect(isValidOpreturnParam(null)).toBe(false);
});
it(`isValidOpreturnParam rejects non-hex input`, () => {
expect(isValidOpreturnParam('nothexvaluesinthisstring')).toBe(false);
});
it(`isValidOpreturnParam supports a valid hex string under max length`, () => {
expect(
isValidOpreturnParam(
'042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
),
).toBe(true);
});
it(`isValidOpreturnParam supports a valid hex string under max length with mixed capitalization`, () => {
expect(
isValidOpreturnParam(
'042E786563000474657374150095e79F51D4260bc0dc3ba7fb77c7be92d0fbdd1d',
),
).toBe(true);
});
it(`isValidOpreturnParam supports a valid hex string of max length`, () => {
expect(
isValidOpreturnParam(
'04007461624cd73030303030303030303130303030303030303031303030303030303030313030303030303030303130303030303030303031303030303030303030313030303030303030303130303030303030303031303030303030303030313030303030303030303130303030303030303031303030303030303030313030303030303030303130303030303030303031303030303030303030313030303030303030303130303030303030303031303030303030303030313030303030303030303130303030303030303031303030303030303030313132333435',
),
).toBe(true);
});
it(`isValidOpreturnParam rejects a string with empty spaces`, () => {
expect(
isValidOpreturnParam(
'04 2e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
),
).toBe(false);
});
it(`isValidOpreturnParam rejects an empty string`, () => {
expect(isValidOpreturnParam('')).toBe(false);
});
it(`isValidOpreturnParam rejects a valid hex string exceeding max length`, () => {
expect(
isValidOpreturnParam(
'04007461624cd7303030303030303030313030303030303030303130303030303030303031303030303030303030313030303030303030303130303030303030303031303030303030303030313030303030303030303130303030303030303031303030303030303030313030303030303030303130303030303030303031303030303030303030313030303030303030303130303030303030303031303030303030303030313030303030303030303130303030303030303031303030303030303030313030303030303030303130303030303030303031313233343501',
),
).toBe(false);
});
it(`isValidOpreturnParam rejects a valid hex string that has uneven length (i.e., half a byte)`, () => {
expect(isValidOpreturnParam('042e7')).toBe(false);
});
describe('Determining whether Send button should be disabled on SendXec screen', () => {
const { expectedReturns } = vectors.shouldSendXecBeDisabled;
// Successfully created targetOutputs
expectedReturns.forEach(expectedReturn => {
const {
description,
formData,
balanceSats,
apiError,
sendAmountError,
sendAddressError,
multiSendAddressError,
- isMsgError,
+ sendWithCashtabMsg,
+ cashtabMsgError,
priceApiError,
isOneToManyXECSend,
sendDisabled,
} = expectedReturn;
it(`shouldSendXecBeDisabled: ${description}`, () => {
expect(
shouldSendXecBeDisabled(
formData,
balanceSats,
apiError,
sendAmountError,
sendAddressError,
multiSendAddressError,
- isMsgError,
+ sendWithCashtabMsg,
+ cashtabMsgError,
priceApiError,
isOneToManyXECSend,
),
).toBe(sendDisabled);
});
});
});
describe('Parses user input address strings with parseAddressInput', () => {
const { expectedReturns } = vectors.parseAddressInput;
// Successfully created targetOutputs
expectedReturns.forEach(expectedReturn => {
const {
description,
addressInput,
balanceSats,
userLocale,
parsedAddressInput,
} = expectedReturn;
it(`parseAddressInput: ${description}`, () => {
expect(
parseAddressInput(addressInput, balanceSats, userLocale),
).toStrictEqual(parsedAddressInput);
});
});
});
describe('Returns true if a given input meets alias spec or expected error msg if it does not', () => {
const { expectedReturns } = vectors.meetsAliasSpecInputCases;
// Successfully created targetOutputs
expectedReturns.forEach(expectedReturn => {
const { description, inputStr, response } = expectedReturn;
it(`meetsAliasSpec: ${description}`, () => {
expect(meetsAliasSpec(inputStr)).toBe(response);
});
});
});
describe('Validates user alias input on Send and SendToken screens', () => {
const { expectedReturns } = vectors.validAliasSendInputCases;
// Successfully created targetOutputs
expectedReturns.forEach(expectedReturn => {
const { description, sendToAliasInput, response } = expectedReturn;
it(`isValidAliasSendInput: ${description}`, () => {
expect(isValidAliasSendInput(sendToAliasInput)).toBe(response);
});
});
});
describe('Validating Cashtab Contact Lists', () => {
const { expectedReturns } = vectors.isValidContactList;
expectedReturns.forEach(expectedReturn => {
const { description, contactList, isValid } = expectedReturn;
it(`isValidContactList: ${description}`, () => {
expect(isValidContactList(contactList)).toBe(isValid);
});
});
});
describe('Appropriately migrates users with legacy settings', () => {
const { expectedReturns } = vectors.migrateLegacyCashtabSettings;
expectedReturns.forEach(expectedReturn => {
const { description, legacySettings, migratedSettings } =
expectedReturn;
it(`migrateLegacyCashtabSettings: ${description}`, () => {
expect(migrateLegacyCashtabSettings(legacySettings)).toEqual(
migratedSettings,
);
});
});
});
describe('Determines if the user has valid cashtab settings', () => {
const { expectedReturns } = vectors.isValidCashtabSettings;
expectedReturns.forEach(expectedReturn => {
const { description, settings, isValid } = expectedReturn;
it(`isValidCashtabSettings: ${description}`, () => {
expect(isValidCashtabSettings(settings)).toBe(isValid);
});
});
});
describe('Determines if cashtabCache is valid or invalid', () => {
const { expectedReturns } = vectors.isValidCashtabCache;
expectedReturns.forEach(expectedReturn => {
const { description, cashtabCache, isValid } = expectedReturn;
it(`isValidCashtabCache: ${description}`, () => {
expect(isValidCashtabCache(cashtabCache)).toBe(isValid);
});
});
});
describe('Determines if a cashtab wallet is valid or invalid', () => {
const { expectedReturns } = vectors.isValidCashtabWallet;
expectedReturns.forEach(expectedReturn => {
const { description, wallet, returned } = expectedReturn;
it(`isValidCashtabWallet: ${description}`, () => {
expect(isValidCashtabWallet(wallet)).toBe(returned);
});
});
});
describe('Determines if a user input send amount is valid', () => {
const { expectedReturns } = vectors.isValidXecSendAmount;
expectedReturns.forEach(expectedReturn => {
const {
description,
sendAmount,
balanceSats,
userLocale,
selectedCurrency,
fiatPrice,
returned,
} = expectedReturn;
it(`isValidXecSendAmount: ${description}`, () => {
expect(
isValidXecSendAmount(
sendAmount,
balanceSats,
userLocale,
selectedCurrency,
fiatPrice,
),
).toBe(returned);
});
});
});
describe('Determines if a user input multi-send CSV is valid', () => {
const { expectedReturns } = vectors.isValidMultiSendUserInput;
expectedReturns.forEach(expectedReturn => {
const {
description,
userMultisendInput,
balanceSats,
userLocale,
returned,
} = expectedReturn;
it(`isValidMultiSendUserInput: ${description}`, () => {
expect(
isValidMultiSendUserInput(
userMultisendInput,
balanceSats,
userLocale,
),
).toBe(returned);
});
});
});
describe('Determines if a user input send or burn token amount is valid', () => {
const { expectedReturns } = vectors.isValidTokenSendOrBurnAmount;
expectedReturns.forEach(expectedReturn => {
const { description, amount, tokenBalance, decimals, returned } =
expectedReturn;
it(`isValidTokenSendOrBurnAmount: ${description}`, () => {
expect(
isValidTokenSendOrBurnAmount(
amount,
tokenBalance,
decimals,
),
).toBe(returned);
});
});
});
describe('Determines if a user input token mint amount is valid', () => {
const { expectedReturns } = vectors.isValidTokenMintAmount;
expectedReturns.forEach(expectedReturn => {
const { description, amount, decimals, returned } = expectedReturn;
it(`isValidTokenMintAmount: ${description}`, () => {
expect(isValidTokenMintAmount(amount, decimals)).toBe(returned);
});
});
});
});
diff --git a/cashtab/src/validation/fixtures/vectors.js b/cashtab/src/validation/fixtures/vectors.js
index 50f44d8d3..c2ac8f9c4 100644
--- a/cashtab/src/validation/fixtures/vectors.js
+++ b/cashtab/src/validation/fixtures/vectors.js
@@ -1,1794 +1,1829 @@
// 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.
// Test vectors for validation functions
import appConfig from 'config/app';
import { CashtabSettings } from 'config/cashtabSettings';
import CashtabCache from 'config/CashtabCache';
import {
mockCashtabCache,
mockCashtabCacheNoBlocks,
mockCashtabCache_pre_2_9_0,
} from 'helpers/fixtures/mocks';
import {
validWalletJson,
validWalletJsonMultiPath,
} from 'validation/fixtures/mocks';
import { walletWithXecAndTokens_pre_2_9_0 } from 'components/fixtures/mocks';
import { toXec } from 'wallet';
import { cashtabWalletFromJSON } from 'helpers';
const cloneObjectWithDeletedKey = (object, key) => {
const clonedObject = { ...object };
delete clonedObject[key];
return clonedObject;
};
export default {
shouldSendXecBeDisabled: {
expectedReturns: [
{
description: 'Disabled on startup',
formData: {
address: '',
amount: '',
},
balanceSats: 10000,
apiError: false,
sendAmountError: false,
sendAddressError: false,
multiSendAddressError: false,
- isMsgError: false,
+ sendWithCashtabMsg: false,
+ cashtabMsgError: false,
priceApiError: false,
isOneToManyXECSend: false,
sendDisabled: true,
},
{
description:
'Disabled if address has been entered but no amount',
formData: {
address: 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6',
amount: '',
multiAddressInput: '',
},
balanceSats: 10000,
apiError: false,
sendAmountError: false,
sendAddressError: false,
multiSendAddressError: false,
- isMsgError: false,
+ sendWithCashtabMsg: false,
+ cashtabMsgError: false,
priceApiError: false,
isOneToManyXECSend: false,
sendDisabled: true,
},
{
description:
'Disabled if amount has been entered but no address',
formData: {
address: '',
amount: '50',
multiAddressInput: '',
},
balanceSats: 10000,
apiError: false,
sendAmountError: false,
sendAddressError: false,
multiSendAddressError: false,
- isMsgError: false,
+ sendWithCashtabMsg: false,
+ cashtabMsgError: false,
priceApiError: false,
isOneToManyXECSend: false,
sendDisabled: true,
},
{
description:
'Enabled for valid address and amount in send to one mode',
formData: {
address: 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6',
amount: '50',
multiAddressInput: '',
},
balanceSats: 10000,
apiError: false,
sendAmountError: false,
sendAddressError: false,
multiSendAddressError: false,
- isMsgError: false,
+ sendWithCashtabMsg: false,
+ cashtabMsgError: false,
priceApiError: false,
isOneToManyXECSend: false,
sendDisabled: false,
},
{
description:
'Disabled for valid address and amount entered in send to one mode, but app is in send to many mode and input is blank',
formData: {
address: 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6',
amount: '50',
multiAddressInput: '',
},
balanceSats: 10000,
apiError: false,
sendAmountError: false,
sendAddressError: false,
multiSendAddressError: false,
- isMsgError: false,
+ sendWithCashtabMsg: false,
+ cashtabMsgError: false,
priceApiError: false,
isOneToManyXECSend: true,
sendDisabled: true,
},
{
description: 'Disabled on zero balance for send to one',
formData: {
address: 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6',
amount: '50',
multiAddressInput: '',
},
balanceSats: 0,
apiError: false,
sendAmountError: false,
sendAddressError: false,
multiSendAddressError: false,
- isMsgError: false,
+ sendWithCashtabMsg: false,
+ cashtabMsgError: false,
priceApiError: false,
isOneToManyXECSend: false,
sendDisabled: true,
},
{
description: 'Disabled on zero balance for send to many',
formData: {
address: '',
amount: '',
multiAddressInput:
'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6, 22\necash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6, 22',
},
balanceSats: 0,
apiError: false,
sendAmountError: false,
sendAddressError: false,
multiSendAddressError: false,
- isMsgError: false,
+ sendWithCashtabMsg: false,
+ cashtabMsgError: false,
priceApiError: false,
isOneToManyXECSend: true,
sendDisabled: true,
},
{
description: 'Disabled for invalid address',
formData: {
address: 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg',
amount: '50',
multiAddressInput: '',
},
balanceSats: 10000,
apiError: false,
sendAmountError: false,
sendAddressError: 'a string indicating a validation error msg',
multiSendAddressError: false,
- isMsgError: false,
+ sendWithCashtabMsg: false,
+ cashtabMsgError: false,
priceApiError: false,
isOneToManyXECSend: false,
sendDisabled: true,
},
{
description: 'Disabled for invalid amount',
formData: {
address: 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6',
amount: '5',
multiAddressInput: '',
},
balanceSats: 10000,
apiError: false,
sendAmountError: 'a string indicating a validation error msg',
sendAddressError: false,
multiSendAddressError: false,
- isMsgError: false,
+ sendWithCashtabMsg: false,
+ cashtabMsgError: false,
priceApiError: false,
isOneToManyXECSend: false,
sendDisabled: true,
},
{
- description: 'Disabled for invalid opreturn msg send to one',
+ description:
+ 'Disabled for invalid cashtab msg send to one if user has cashtab msg enabled',
formData: {
address: 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6',
amount: '5',
multiAddressInput: '',
},
balanceSats: 10000,
apiError: false,
sendAmountError: false,
sendAddressError: false,
multiSendAddressError: false,
- isMsgError: 'a string indicating a validation error msg',
+ sendWithCashtabMsg: true,
+ cashtabMsgError: 'a string indicating a validation error msg',
priceApiError: false,
isOneToManyXECSend: false,
sendDisabled: true,
},
{
- description: 'Disabled for invalid opreturn msg send to many',
+ description:
+ 'Enabled for invalid cashtab msg send to one if user has cashtab msg disabled',
+ formData: {
+ address: 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6',
+ amount: '5',
+ multiAddressInput: '',
+ },
+ balanceSats: 10000,
+ apiError: false,
+ sendAmountError: false,
+ sendAddressError: false,
+ multiSendAddressError: false,
+ sendWithCashtabMsg: false,
+ cashtabMsgError: 'a string indicating a validation error msg',
+ priceApiError: false,
+ isOneToManyXECSend: false,
+ sendDisabled: false,
+ },
+ {
+ description:
+ 'Disabled for invalid opreturn msg send to many if cashtab msg is invalid and enabled',
formData: {
address: '',
amount: '',
multiAddressInput:
'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6, 22\necash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6, 22',
},
balanceSats: 10000,
apiError: false,
sendAmountError: false,
sendAddressError: false,
multiSendAddressError: false,
- isMsgError: 'a string indicating a validation error msg',
+ sendWithCashtabMsg: true,
+ cashtabMsgError: 'a string indicating a validation error msg',
priceApiError: false,
isOneToManyXECSend: false,
sendDisabled: true,
},
{
description: 'Disabled on priceApi error',
formData: {
address: 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6',
amount: '5',
multiAddressInput: '',
},
balanceSats: 10000,
apiError: false,
sendAmountError: false,
sendAddressError: false,
multiSendAddressError: false,
- isMsgError: false,
+ sendWithCashtabMsg: false,
+ cashtabMsgError: false,
priceApiError: true,
isOneToManyXECSend: false,
sendDisabled: true,
},
{
description:
'Enabled if isOneToManyXECSend and amount is not entered',
formData: {
address: '',
amount: '',
multiAddressInput:
'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6, 22\necash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6, 22',
},
balanceSats: 10000,
apiError: false,
sendAmountError: false,
sendAddressError: false,
multiSendAddressError: false,
- isMsgError: false,
+ sendWithCashtabMsg: false,
+ cashtabMsgError: false,
priceApiError: false,
isOneToManyXECSend: true,
sendDisabled: false,
},
{
description:
'Disabled if isOneToManyXECSend and we have a multiSendAddressError',
formData: {
address: '',
amount: '',
multiAddressInput:
// bad input
'eash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6, 22\necash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6, 22',
},
balanceSats: 10000,
apiError: false,
sendAmountError: false,
sendAddressError: false,
multiSendAddressError: true,
- isMsgError: false,
+ sendWithCashtabMsg: false,
+ cashtabMsgError: false,
priceApiError: false,
isOneToManyXECSend: true,
sendDisabled: true,
},
],
},
meetsAliasSpecInputCases: {
expectedReturns: [
{
description:
'returns true for a valid lowercase alphanumeric input',
inputStr: 'jasdf3873',
response: true,
},
{
description:
'returns expected error if input contains uppercase char',
inputStr: 'jasDf3873',
response:
'Alias may only contain lowercase characters a-z and 0-9',
},
{
description:
'returns expected error if input contains special char',
inputStr: 'Glück',
response:
'Alias may only contain lowercase characters a-z and 0-9',
},
{
description: 'returns expected error if input contains emoji',
inputStr: '😉',
response:
'Alias may only contain lowercase characters a-z and 0-9',
},
{
description:
'returns expected error if input contains other special characters',
inputStr: '( ͡° ͜ʖ ͡°)',
response:
'Alias may only contain lowercase characters a-z and 0-9',
},
{
description:
'returns expected error if input is an empty string',
inputStr: '​',
response:
'Alias may only contain lowercase characters a-z and 0-9',
},
{
description:
'returns expected error if input contains an empty space',
inputStr: '​jasdf3873',
response:
'Alias may only contain lowercase characters a-z and 0-9',
},
{
description: 'returns expected error if input contains symbols',
inputStr: '​jasdf3873@#',
response:
'Alias may only contain lowercase characters a-z and 0-9',
},
{
description: 'returns expected error if input is not a string',
inputStr: { testAlias: 'string at key' },
response: 'Alias input must be a string',
},
{
description:
'returns expected error if input contains underscores',
inputStr: 'test_WITH_badchars',
response:
'Alias may only contain lowercase characters a-z and 0-9',
},
{
description:
'returns expected error if exceeds byte restriction',
inputStr: '0123456789012345678901',
response: `Invalid bytecount 22. Alias be 1-21 bytes.`,
},
{
description: 'returns true for an alias of max bytecount',
inputStr: '012345678901234567890',
response: true,
},
],
},
validAliasSendInputCases: {
expectedReturns: [
{
description: 'Valid alias send input',
sendToAliasInput: 'chicken.xec',
response: true,
},
{
description: 'Valid alias missing prefix',
sendToAliasInput: 'chicken',
response: `Must include '.xec' suffix when sending to an eCash alias`,
},
{
description: 'Valid alias with double suffix',
sendToAliasInput: 'chicken.xec.xec',
response: `Must include '.xec' suffix when sending to an eCash alias`,
},
{
description: 'Valid alias with bad suffix',
sendToAliasInput: 'chicken.xe',
response: `Must include '.xec' suffix when sending to an eCash alias`,
},
{
description: 'Invalid alias (too long)',
sendToAliasInput: '0123456789012345678901.xec',
response: `Invalid bytecount 22. Alias be 1-21 bytes.`,
},
{
description: 'Invalid alias (nonalphanumeric)',
sendToAliasInput: 'Capitalized@.xec',
response:
'Alias may only contain lowercase characters a-z and 0-9',
},
],
},
parseAddressInput: {
expectedReturns: [
// address only
{
description: 'Blank string',
addressInput: '',
balanceSats: 10000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: '',
error: 'Invalid address',
isAlias: false,
},
},
},
{
description: 'Address only and no querystring',
addressInput:
'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
balanceSats: 10000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
error: false,
isAlias: false,
},
},
},
{
description: 'prefixless address input',
addressInput: 'qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
balanceSats: 10000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
error: false,
isAlias: false,
},
},
},
// alias only
{
description: 'alias only and no querystring',
addressInput: 'chicken.xec',
balanceSats: 10000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'chicken.xec',
error: false,
isAlias: true,
},
},
},
{
description: 'alias missing .xec suffix',
addressInput: 'chicken',
balanceSats: 10000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'chicken',
error: `Aliases must end with '.xec'`,
isAlias: true,
},
},
},
// amount param only
{
description:
'Valid address with valid amount param equal to user balance, no decimals',
addressInput:
'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx?amount=500000',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
error: false,
isAlias: false,
},
amount: { value: '500000', error: false },
queryString: { value: 'amount=500000', error: false },
},
},
{
description:
'Valid address with valid amount param exceeding user balance by one satoshi, no decimals',
addressInput:
'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx?amount=500001',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
error: false,
isAlias: false,
},
amount: {
value: '500001',
error: `Amount 500,001.00 XEC exceeds wallet balance of 500,000.00 XEC`,
},
queryString: { value: 'amount=500001', error: false },
},
},
{
description:
'Valid address with valid amount param, with decimals',
addressInput:
'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx?amount=123.45',
balanceSats: 5000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
error: false,
isAlias: false,
},
amount: { value: '123.45', error: false },
queryString: { value: 'amount=123.45', error: false },
},
},
{
description: 'Invalid address with valid amount param',
addressInput:
'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfg?amount=500000',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfg',
error: 'Invalid address',
isAlias: false,
},
amount: { value: '500000', error: false },
queryString: { value: 'amount=500000', error: false },
},
},
{
description: 'etoken address with valid amount param',
addressInput:
'etoken:qq9h6d0a5q65fgywv4ry64x04ep906mdkufhx2swv3?amount=500000',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'etoken:qq9h6d0a5q65fgywv4ry64x04ep906mdkufhx2swv3',
error: `eToken addresses are not supported for ${appConfig.ticker} sends`,
isAlias: false,
},
amount: { value: '500000', error: false },
queryString: { value: 'amount=500000', error: false },
},
},
{
description:
'Valid address with invalid amount param (too many decimal places)',
addressInput:
'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx?amount=123.456',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
error: false,
isAlias: false,
},
amount: {
value: '123.456',
error: `XEC transactions do not support more than 2 decimal places`,
},
queryString: { value: 'amount=123.456', error: false },
},
},
{
description: 'Valid alias with valid amount param',
addressInput: 'chicken.xec?amount=125',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'chicken.xec',
error: false,
isAlias: true,
},
amount: { value: '125', error: false },
queryString: { value: 'amount=125', error: false },
},
},
{
description: 'Invalid alias with valid amount param',
addressInput: 'chicken?amount=125',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'chicken',
error: `Aliases must end with '.xec'`,
isAlias: true,
},
amount: { value: '125', error: false },
queryString: { value: 'amount=125', error: false },
},
},
// opreturn param only
{
description: 'Valid address with valid op_return_raw param',
addressInput:
'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx?op_return_raw=042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
error: false,
isAlias: false,
},
op_return_raw: {
value: '042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
error: false,
},
queryString: {
value: 'op_return_raw=042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
error: false,
},
},
},
{
description: 'Valid alias with valid op_return_raw param',
addressInput:
'chicken.xec?op_return_raw=042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'chicken.xec',
error: false,
isAlias: true,
},
op_return_raw: {
value: '042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
error: false,
},
queryString: {
value: 'op_return_raw=042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
error: false,
},
},
},
{
description: 'Valid address with invalid op_return_raw param',
addressInput:
'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx?op_return_raw=notvalid042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
error: false,
isAlias: false,
},
op_return_raw: {
value: 'notvalid042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
error: `Invalid op_return_raw param "notvalid042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d"`,
},
queryString: {
value: 'op_return_raw=notvalid042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
error: false,
},
},
},
// Both op_return_raw and amount params
{
description: 'Valid amount and op_return_raw params',
addressInput:
'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx?amount=500&op_return_raw=042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
error: false,
isAlias: false,
},
amount: { value: '500', error: false },
op_return_raw: {
value: '042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
error: false,
},
queryString: {
value: 'amount=500&op_return_raw=042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
error: false,
},
},
},
{
description: 'invalid querystring (unsupported params)',
addressInput:
'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx?*&@^&%@amount=-500000',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
error: false,
isAlias: false,
},
queryString: {
value: '*&@^&%@amount=-500000',
error: `Unsupported param "%@amount"`,
},
},
},
// Querystring errors where no params can be returned
{
description: 'Invalid queryString, repeated param',
addressInput:
'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx?amount=123.45&amount=678.9',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
error: false,
isAlias: false,
},
queryString: {
value: 'amount=123.45&amount=678.9',
error: 'bip21 parameters may not appear more than once',
},
},
},
{
description: 'Repeated op_return_raw param',
addressInput:
'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx?op_return_raw=042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d&op_return_raw=042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
balanceSats: 50000000,
userLocale: appConfig.defaultLocale,
parsedAddressInput: {
address: {
value: 'ecash:qq9h6d0a5q65fgywv4ry64x04ep906mdku8f0gxfgx',
error: false,
isAlias: false,
},
queryString: {
value: 'op_return_raw=042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d&op_return_raw=042e786563000474657374150095e79f51d4260bc0dc3ba7fb77c7be92d0fbdd1d',
error: `bip21 parameters may not appear more than once`,
},
},
},
],
},
isValidContactList: {
expectedReturns: [
{
description: 'Legacy empty contact list',
contactList: [{}],
isValid: false,
},
{
description: 'Empty contact list',
contactList: [],
isValid: true,
},
{
description: 'Array of more than one empty object is invalid',
contactList: [{}, {}],
isValid: false,
},
{
description: 'List with one valid entry',
contactList: [
{
address:
'ecash:qphlhe78677sz227k83hrh542qeehh8el5lcjwk72y',
name: 'Alpha',
},
],
isValid: true,
},
{
description: 'Multiple valid entries',
contactList: [
{
address:
'ecash:qpdkc5p7f25hwkxsr69m3evlj4h7wqq9xcgmjc8sxr',
name: 'Alpha',
},
{
address:
'ecash:qpq235n3l3u6ampc8slapapnatwfy446auuv64ylt2',
name: 'Beta',
},
{
address:
'ecash:qz50e58nkeg2ej2f34z6mhwylp6ven8emy8pp52r82',
name: 'Gamma',
},
],
isValid: true,
},
{
description: 'Valid objects but also an empty object is false',
contactList: [
{},
{
address:
'ecash:qpdkc5p7f25hwkxsr69m3evlj4h7wqq9xcgmjc8sxr',
name: 'Alpha',
},
{
address:
'ecash:qpq235n3l3u6ampc8slapapnatwfy446auuv64ylt2',
name: 'Beta',
},
{
address:
'ecash:qz50e58nkeg2ej2f34z6mhwylp6ven8emy8pp52r82',
name: 'Gamma',
},
],
isValid: false,
},
{
description: 'Valid alias formats are accepted',
contactList: [
{
address: 'beta.xec',
name: 'Test',
},
],
isValid: true,
},
],
},
migrateLegacyCashtabSettings: {
expectedReturns: [
{
description: 'Migrates a 1.4.x user to 1.5.0 settings',
legacySettings: {
fiatCurrency: 'usd',
sendModal: false,
autoCameraOn: true,
hideMessagesFromUnknownSenders: false,
balanceVisible: true,
},
migratedSettings: {
fiatCurrency: 'usd',
sendModal: false,
autoCameraOn: true,
hideMessagesFromUnknownSenders: false,
balanceVisible: true,
minFeeSends: false,
},
},
{
description: 'User with only fiatCurrency in settings',
legacySettings: {
fiatCurrency: 'gbp',
},
migratedSettings: {
fiatCurrency: 'gbp',
sendModal: false,
autoCameraOn: true,
hideMessagesFromUnknownSenders: false,
balanceVisible: true,
minFeeSends: false,
},
},
{
description: 'Migrates an empty object to default settings',
legacySettings: {},
migratedSettings: new CashtabSettings(),
},
{
description:
'Returns object unchanged if it has all expected keys',
legacySettings: {
fiatCurrency: 'brl',
sendModal: true,
autoCameraOn: true,
hideMessagesFromUnknownSenders: false,
balanceVisible: true,
minFeeSends: false,
},
migratedSettings: {
fiatCurrency: 'brl',
sendModal: true,
autoCameraOn: true,
hideMessagesFromUnknownSenders: false,
balanceVisible: true,
minFeeSends: false,
},
},
],
},
isValidCashtabSettings: {
expectedReturns: [
{
description: 'A 1.4.x settings object is invalid',
settings: {
fiatCurrency: 'usd',
sendModal: false,
autoCameraOn: true,
hideMessagesFromUnknownSenders: false,
balanceVisible: true,
},
isValid: false,
},
{
description: 'A 1.5.0 settings object is valid',
settings: {
fiatCurrency: 'usd',
sendModal: false,
autoCameraOn: true,
hideMessagesFromUnknownSenders: false,
balanceVisible: true,
minFeeSends: false,
},
isValid: true,
},
{
description:
'Rejects an otherwise-valid settings object if the currency is not supported',
settings: {
fiatCurrency: 'xau',
sendModal: false,
autoCameraOn: true,
hideMessagesFromUnknownSenders: false,
balanceVisible: true,
minFeeSends: false,
},
isValid: false,
},
{
description:
'Rejects an otherwise-valid settings object if a ticker is misnamed',
settings: {
fiatCurrencyTicker: 'usd',
sendModal: false,
autoCameraOn: true,
hideMessagesFromUnknownSenders: false,
balanceVisible: true,
minFeeSends: false,
},
isValid: false,
},
{
description:
'Rejects an otherwise-valid settings object if it is from before the introduction of sendModal',
settings: {
fiatCurrencyTicker: 'usd',
autoCameraOn: true,
hideMessagesFromUnknownSenders: false,
balanceVisible: true,
},
isValid: false,
},
],
},
isValidCashtabCache: {
expectedReturns: [
{
description: 'Returns false for legacy cashtabCache',
cashtabCache: { tokenInfoById: {} },
isValid: false,
},
{
description:
'Returns false if there is not a map at tokens key',
cashtabCache: { tokens: {} },
isValid: false,
},
{
description: 'Returns false for cashtabCache before 2.9.0',
cashtabCache: mockCashtabCache_pre_2_9_0,
isValid: false,
},
{
description:
'Returns false for current version cashtabCache if it is missing the unknown token id',
cashtabCache: { tokens: new Map() },
isValid: false,
},
{
description: 'Returns true for current version cashtabCache',
cashtabCache: mockCashtabCache,
isValid: true,
},
{
description:
'Returns true for current version cashtabCache if blocks key is missing',
cashtabCache: mockCashtabCacheNoBlocks,
isValid: true,
},
{
description: 'Returns true for default cashtabCache',
cashtabCache: new CashtabCache(),
isValid: true,
},
],
},
isValidCashtabWallet: {
expectedReturns: [
{
description: 'Returns true for a valid Cashtab wallet',
wallet: cashtabWalletFromJSON(validWalletJson),
returned: true,
},
{
description:
'Returns false for a JSON-loaded pre-2.9.0 Cashtab wallet',
wallet: cashtabWalletFromJSON(walletWithXecAndTokens_pre_2_9_0),
returned: false,
},
{
description: 'Returns false for a pre-2.9.0 Cashtab wallet',
wallet: walletWithXecAndTokens_pre_2_9_0,
returned: false,
},
{
description: 'Returns false if not an object',
wallet: 'a string',
returned: false,
},
{
description:
'Returns false if false (used to indicate no wallet yet set)',
wallet: false,
returned: false,
},
{
description: 'Returns false if wallet is missing state',
wallet: cloneObjectWithDeletedKey(
cashtabWalletFromJSON(validWalletJson),
'state',
),
returned: false,
},
{
description: 'Returns false if wallet is missing mnemonic',
wallet: cloneObjectWithDeletedKey(
cashtabWalletFromJSON(validWalletJson),
'mnemonic',
),
returned: false,
},
{
description: 'Returns false if wallet is missing name',
wallet: cloneObjectWithDeletedKey(
cashtabWalletFromJSON(validWalletJson),
'name',
),
returned: false,
},
{
description: 'Returns false if wallet is missing paths',
wallet: cloneObjectWithDeletedKey(
cashtabWalletFromJSON(validWalletJson),
'paths',
),
returned: false,
},
{
description:
'Returns false if wallet is missing hash in path1899 path object',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
paths: new Map([
[
1899,
{
address: 'string',
wif: 'string',
},
],
]),
},
returned: false,
},
{
description:
'Returns false if wallet is missing address in path1899 path object',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
paths: new Map([
[
1899,
{
hash: 'string',
wif: 'string',
},
],
]),
},
returned: false,
},
{
description:
'Returns false if wallet is missing address in path1899 path object',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
paths: new Map([
[
1899,
{
address: 'string',
hash: 'string',
},
],
]),
},
returned: false,
},
{
description: 'Returns true for a multi-path wallet',
wallet: cashtabWalletFromJSON(validWalletJsonMultiPath),
returned: true,
},
{
description:
'Returns false if wallet is missing wif in a secondary path object',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
paths: new Map([
[
1899,
{
hash: 'string',
address: 'string',
wif: 'string',
},
],
[
145,
{
hash: 'string',
address: 'string',
},
],
]),
},
returned: false,
},
{
description: 'Returns false if wallet has no path info objects',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
paths: new Map(),
},
returned: false,
},
{
description: 'Returns false if wallet.state is not an object',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
state: 'string',
},
returned: false,
},
{
description: 'Returns false if no balanceSats in wallet.state',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
state: {
...cloneObjectWithDeletedKey(
cashtabWalletFromJSON(validWalletJson).state,
'balanceSats',
),
},
},
returned: false,
},
{
description: 'Returns false if balances in wallet.state',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
state: {
...cashtabWalletFromJSON(validWalletJson).state,
balances: {},
},
},
returned: false,
},
{
description: 'Returns false if balanceSats is not a number',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
state: {
...validWalletJson.state,
balanceSats: '100',
tokens: new Map(),
},
},
returned: false,
},
{
description: 'Returns false if no slpUtxos in wallet.state',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
state: cloneObjectWithDeletedKey(
cashtabWalletFromJSON(validWalletJson).state,
'slpUtxos',
),
},
returned: false,
},
{
description: 'Returns false if no nonSlpUtxos in wallet.state',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
state: cloneObjectWithDeletedKey(
cashtabWalletFromJSON(validWalletJson).state,
'nonSlpUtxos',
),
},
returned: false,
},
{
description: 'Returns false if no tokens in wallet.state',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
state: cloneObjectWithDeletedKey(
cashtabWalletFromJSON(validWalletJson).state,
'tokens',
),
},
returned: false,
},
{
description:
'Returns false if hydratedUtxoDetails is in wallet.state',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
state: {
...cashtabWalletFromJSON(validWalletJson).state,
hydratedUtxoDetails: [],
},
},
returned: false,
},
{
description:
'Returns false if slpBalancesAndUtxos is in wallet.state',
wallet: {
...cashtabWalletFromJSON(validWalletJson),
state: {
...cashtabWalletFromJSON(validWalletJson).state,
slpBalancesAndUtxos: [],
},
},
returned: false,
},
],
},
isValidXecSendAmount: {
expectedReturns: [
{
description: 'Dust minimum is valid',
sendAmount: toXec(appConfig.dustSats).toString(),
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 0.000003,
returned: true,
},
{
description: '1 satoshi below dust min is invalid',
sendAmount: toXec(appConfig.dustSats - 1).toString(),
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 0.000003,
returned: `Send amount must be at least ${toXec(
appConfig.dustSats,
).toString()} ${appConfig.ticker}`,
},
{
description: '0 is not a valid send amount',
sendAmount: '0',
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 0.000003,
returned: `Amount must be greater than 0`,
},
{
description:
'A value with one decimal place not exceeding user balance is accepted',
sendAmount: '100.1',
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 0.000003,
returned: true,
},
{
description:
'A value with two decimal places not exceeding user balance is accepted',
sendAmount: '100.12',
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 0.000003,
returned: true,
},
{
description:
'A value with more than two decimal places not exceeding user balance is rejected',
sendAmount: '100.123',
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 0.000003,
returned: `${appConfig.ticker} transactions do not support more than ${appConfig.cashDecimals} decimal places`,
},
{
description:
'A value using a decimal marker other than "." is rejected',
sendAmount: '100,12',
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 0.000003,
returned: `Invalid amount "100,12": Amount can only contain numbers and '.' to denote decimal places.`,
},
{
description: 'A non-number string is rejected',
sendAmount: 'not a number',
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 0.000003,
returned: `Unable to parse sendAmount "not a number" as a number`,
},
{
description: 'null is rejected',
sendAmount: null,
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 0.000003,
returned: `sendAmount type must be number or string`,
},
{
description: 'undefined is rejected',
sendAmount: undefined,
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 0.000003,
returned: `sendAmount type must be number or string`,
},
{
description:
'A value including non-numerical characters is rejected',
sendAmount: '12a17',
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 0.000003,
returned: `Invalid amount "12a17": Amount can only contain numbers and '.' to denote decimal places.`,
},
{
description:
'A value exactly matching wallet balance is accepted',
sendAmount: '1000',
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 0.000003,
returned: true,
},
{
description:
'A value exceeding wallet balance by 1 satoshi is rejected',
sendAmount: '1000.01',
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 0.000003,
returned: `Amount ${toXec(100001).toLocaleString(
appConfig.defaultLocale,
{
minimumFractionDigits: appConfig.cashDecimals,
},
)} ${appConfig.ticker} exceeds wallet balance of ${toXec(
100000,
).toLocaleString(appConfig.defaultLocale, {
minimumFractionDigits: 2,
})} ${appConfig.ticker}`,
},
{
description:
'A fiat value that converts to less than the user total balance is accepted',
sendAmount: '1000',
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: 'usd',
fiatPrice: 1, // fiatPrice * sendAmount = 1000 XEC
returned: true,
},
{
description:
'A fiat value that converts to one satoshi more than the user total balance is rejected',
sendAmount: '1000.01',
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: 'usd',
fiatPrice: 1, // fiatPrice * sendAmount = 1000 XEC
returned: `Amount 1,000.01 XEC exceeds wallet balance of 1,000.00 XEC`,
},
{
description:
'A fiat value that converts to more than the user total balance is rejected',
sendAmount: '1000.01',
balanceSats: 100000, // 1,000.00 XEC
userLocale: appConfig.defaultLocale,
selectedCurrency: appConfig.ticker,
fiatPrice: 1, // fiatPrice * sendAmount = 1000.01 XEC
returned: `Amount ${toXec(100001).toLocaleString(
appConfig.defaultLocale,
{
minimumFractionDigits: appConfig.cashDecimals,
},
)} ${appConfig.ticker} exceeds wallet balance of ${toXec(
100000,
).toLocaleString(appConfig.defaultLocale, {
minimumFractionDigits: 2,
})} ${appConfig.ticker}`,
},
{
description:
'A fiat value that converts to more than the user total balance is rejected with error formatted in non-default locale',
sendAmount: '1000.01',
balanceSats: 100000, // 1,000.00 XEC
userLocale: 'fr-FR',
selectedCurrency: appConfig.ticker,
fiatPrice: 1, // fiatPrice * sendAmount = 1000.01 XEC
returned: `Amount ${toXec(100001).toLocaleString('fr-FR', {
minimumFractionDigits: appConfig.cashDecimals,
})} ${appConfig.ticker} exceeds wallet balance of ${toXec(
100000,
).toLocaleString('fr-FR', {
minimumFractionDigits: 2,
})} ${appConfig.ticker}`,
},
],
},
isValidMultiSendUserInput: {
expectedReturns: [
{
description:
'Accepts correctly formed multisend output for amount exactly equal to wallet total balance',
userMultisendInput: `ecash:qplkmuz3rx480u6vc4xgc0qxnza42p0e7vll6p90wr, 22\necash:qqxrrls4u0znxx2q7e5m4en4z2yjrqgqeucckaerq3, 33\necash:qphlhe78677sz227k83hrh542qeehh8el5lcjwk72y, 55`,
balanceSats: 11000,
userLocale: appConfig.defaultLocale,
returned: true,
},
{
description:
'Rejects correctly formed multisend output for amount exceeding wallet total balance by 1 satoshi',
userMultisendInput: `ecash:qplkmuz3rx480u6vc4xgc0qxnza42p0e7vll6p90wr, 22\necash:qqxrrls4u0znxx2q7e5m4en4z2yjrqgqeucckaerq3, 33\necash:qphlhe78677sz227k83hrh542qeehh8el5lcjwk72y, 55`,
balanceSats: 10999,
userLocale: appConfig.defaultLocale,
returned:
'Total amount sent (110.00 XEC) exceeds wallet balance of 109.99 XEC',
},
{
description:
'Accepts correctly formed multisend output for amount exactly equal to wallet total balance if addresses are padded by extra spaces',
userMultisendInput: ` ecash:qplkmuz3rx480u6vc4xgc0qxnza42p0e7vll6p90wr , 22\necash:qqxrrls4u0znxx2q7e5m4en4z2yjrqgqeucckaerq3, 33\necash:qphlhe78677sz227k83hrh542qeehh8el5lcjwk72y, 55`,
balanceSats: 11000,
userLocale: appConfig.defaultLocale,
returned: true,
},
{
description:
'Returns expected error msg and line number if string includes an invalid address',
userMultisendInput: `ecash:notValid, 22\necash:qqxrrls4u0znxx2q7e5m4en4z2yjrqgqeucckaerq3, 33\necash:qphlhe78677sz227k83hrh542qeehh8el5lcjwk72y, 55`,
balanceSats: 11000,
userLocale: appConfig.defaultLocale,
returned: `Invalid address "ecash:notValid" at line 1`,
},
{
description:
'Returns expected error msg for invalid value (dust)',
userMultisendInput: `ecash:qplkmuz3rx480u6vc4xgc0qxnza42p0e7vll6p90wr, 1\necash:qqxrrls4u0znxx2q7e5m4en4z2yjrqgqeucckaerq3, 33\necash:qphlhe78677sz227k83hrh542qeehh8el5lcjwk72y, 55`,
balanceSats: 11000,
userLocale: appConfig.defaultLocale,
returned: `Send amount must be at least 5.5 XEC: check value "1" at line 1`,
},
{
description:
'Returns expected error msg and line numberfor invalid value (too many decimal places)',
userMultisendInput: `ecash:qplkmuz3rx480u6vc4xgc0qxnza42p0e7vll6p90wr, 10.12\necash:qqxrrls4u0znxx2q7e5m4en4z2yjrqgqeucckaerq3, 10.123\necash:qphlhe78677sz227k83hrh542qeehh8el5lcjwk72y, 55`,
balanceSats: 11000,
userLocale: appConfig.defaultLocale,
returned: `XEC transactions do not support more than 2 decimal places: check value "10.123" at line 2`,
},
{
description: 'Returns expected error msg for an empty input',
userMultisendInput: ` `,
balanceSats: 11000,
userLocale: appConfig.defaultLocale,
returned: `Input must not be blank`,
},
{
description:
'Returns expected error msg and line number for an empty row',
userMultisendInput: `\n, ecash:qqxrrls4u0znxx2q7e5m4en4z2yjrqgqeucckaerq3, 33\necash:qphlhe78677sz227k83hrh542qeehh8el5lcjwk72y, 55`,
balanceSats: 11000,
userLocale: appConfig.defaultLocale,
returned: `Remove empty row at line 1`,
},
{
description: 'Returns expected error msg for non-string input',
userMultisendInput: undefined,
balanceSats: 11000,
userLocale: appConfig.defaultLocale,
returned: `Input must be a string`,
},
{
description:
'Returns expected error msg and line number if csv line does not include address and value',
userMultisendInput: `ecash:qphlhe78677sz227k83hrh542qeehh8el5lcjwk72y`,
balanceSats: 11000,
userLocale: appConfig.defaultLocale,
returned: `Line 1 must have address and value, separated by a comma`,
},
{
description:
'Returns expected error msg and line number if a line has more than one comma',
userMultisendInput: `ecash:qphlhe78677sz227k83hrh542qeehh8el5lcjwk72y, 170,23`,
balanceSats: 11000,
userLocale: appConfig.defaultLocale,
returned: `Line 1: Comma can only separate address and value.`,
},
],
},
isValidTokenSendOrBurnAmount: {
expectedReturns: [
{
description:
'A decimalized string with no decimals equivalent to the user balance of this token is valid for a token with no decimals',
amount: '100',
tokenBalance: '100',
decimals: 0,
returned: true,
},
{
description: '0 is rejected',
amount: '0',
tokenBalance: '100',
decimals: 0,
returned: 'Amount must be greater than 0',
},
{
description: 'Blank input is rejected',
amount: '',
tokenBalance: '100',
decimals: 0,
returned: 'Amount is required',
},
{
description: 'Rejects non-string input',
amount: 50,
tokenBalance: '100',
decimals: 0,
returned: 'Amount must be a string',
},
{
description:
'Rejects input including a decimal marker other than "."',
amount: '95,1',
tokenBalance: '100',
decimals: 1,
returned:
'Amount must be a non-empty string containing only decimal numbers and optionally one decimal point "."',
},
{
description: 'Rejects input multiple decimal points',
amount: '95.1.23',
tokenBalance: '100',
decimals: 1,
returned:
'Amount must be a non-empty string containing only decimal numbers and optionally one decimal point "."',
},
{
description:
'Rejects input multiple consecutive decimal points',
amount: '95..23',
tokenBalance: '100',
decimals: 1,
returned:
'Amount must be a non-empty string containing only decimal numbers and optionally one decimal point "."',
},
{
description: 'Rejects input containing non-decimal characters',
amount: '100.a',
tokenBalance: '100',
decimals: 1,
returned:
'Amount must be a non-empty string containing only decimal numbers and optionally one decimal point "."',
},
{
description:
'We cannot send a token satoshi more than tokenBalance',
amount: '100.1',
tokenBalance: '100',
decimals: 1,
returned: 'Amount 100.1 exceeds balance of 100',
},
{
description:
'We get non-plural error msg if token supports only 1 decimal place',
amount: '99.12',
tokenBalance: '100',
decimals: 1,
returned: 'This token supports no more than 1 decimal place',
},
{
description:
'We cannot specify more decimal places than supported by the token',
amount: '99.123',
tokenBalance: '100',
decimals: 2,
returned: 'This token supports no more than 2 decimal places',
},
{
description:
'We cannot have decimals for a token supporting 0 decimals',
amount: '99.1',
tokenBalance: '100',
decimals: 0,
returned: 'This token does not support decimal places',
},
{
description:
'We can specify fewer decimal places than supported by the token',
amount: '99.123',
tokenBalance: '100',
decimals: 9,
returned: true,
},
{
description:
'We can specify the exact decimal places supported by the token',
amount: '99.123456789',
tokenBalance: '100',
decimals: 9,
returned: true,
},
{
description:
'We can include a decimal point at the end of the string and no decimal places',
amount: '99.',
tokenBalance: '100',
decimals: 9,
returned: true,
},
{
description:
'We can include a decimal point at the end of the string and no decimal places, even if the token supports 0 decimals',
amount: '99.',
tokenBalance: '100',
decimals: 0,
returned: true,
},
],
},
isValidTokenMintAmount: {
expectedReturns: [
{
description:
'A decimalized string with no decimals is valid for a token with no decimals',
amount: '100',
decimals: 0,
returned: true,
},
{
description: '0 is rejected',
amount: '0',
decimals: 0,
returned: 'Amount must be greater than 0',
},
{
description: 'Blank input is rejected',
amount: '',
decimals: 0,
returned: 'Amount is required',
},
{
description: 'Rejects non-string input',
amount: 50,
decimals: 0,
returned: 'Amount must be a string',
},
{
description:
'Rejects input including a decimal marker other than "."',
amount: '95,1',
decimals: 1,
returned:
'Amount must be a non-empty string containing only decimal numbers and optionally one decimal point "."',
},
{
description: 'Rejects input with multiple decimal points',
amount: '95.1.23',
decimals: 1,
returned:
'Amount must be a non-empty string containing only decimal numbers and optionally one decimal point "."',
},
{
description:
'Rejects input multiple consecutive decimal points',
amount: '95..23',
decimals: 1,
returned:
'Amount must be a non-empty string containing only decimal numbers and optionally one decimal point "."',
},
{
description: 'Rejects input containing non-decimal characters',
amount: '100.a',
decimals: 1,
returned:
'Amount must be a non-empty string containing only decimal numbers and optionally one decimal point "."',
},
{
description:
'We get non-plural error msg if token supports only 1 decimal place',
amount: '99.12',
decimals: 1,
returned: 'This token supports no more than 1 decimal place',
},
{
description:
'We cannot specify more decimal places than supported by the token',
amount: '99.123',
decimals: 2,
returned: 'This token supports no more than 2 decimal places',
},
{
description:
'We cannot have decimals for a token supporting 0 decimals',
amount: '99.1',
decimals: 0,
returned: 'This token does not support decimal places',
},
{
description:
'We can specify fewer decimal places than supported by the token',
amount: '99.123',
decimals: 9,
returned: true,
},
{
description:
'We can specify the exact decimal places supported by the token',
amount: '99.123456789',
decimals: 9,
returned: true,
},
{
description:
'We can include a decimal point at the end of the string and no decimal places',
amount: '99.',
decimals: 9,
returned: true,
},
{
description:
'We can include a decimal point at the end of the string and no decimal places, even if the token supports 0 decimals',
amount: '99.',
decimals: 0,
returned: true,
},
{
description: 'We accept the max mint amount',
amount: '18446744073709551615',
decimals: 0,
returned: true,
},
{
description:
'We reject one token satoshi more than the max mint amount',
amount: '18446744073709551616',
decimals: 0,
returned:
'Amount 18446744073709551616 exceeds max mint amount for this token (18446744073709551615)',
},
],
},
};
diff --git a/cashtab/src/validation/index.js b/cashtab/src/validation/index.js
index 3c3da5f88..8a9fd9a11 100644
--- a/cashtab/src/validation/index.js
+++ b/cashtab/src/validation/index.js
@@ -1,866 +1,868 @@
// 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 { BN } from 'slp-mdm';
import { toXec, toSatoshis } from 'wallet';
import cashaddr from 'ecashaddrjs';
import * as bip39 from 'bip39';
import {
CashtabSettings,
cashtabSettingsValidation,
} from 'config/cashtabSettings';
import tokenBlacklist from 'config/tokenBlacklist';
import { queryAliasServer } from 'alias';
import appConfig from 'config/app';
import { opReturn } from 'config/opreturn';
import { getStackArray } from 'ecash-script';
import aliasSettings from 'config/alias';
import { getAliasByteCount } from 'opreturn';
import { fiatToSatoshis } from 'wallet';
import { UNKNOWN_TOKEN_ID } from 'config/CashtabCache';
import { STRINGIFIED_DECIMALIZED_REGEX } from 'wallet';
import { getMaxMintAmount } from 'slpv1';
/**
* Checks whether the instantiated sideshift library object has loaded
* correctly with the expected API.
*
* @param {Object} sideshiftObj the instantiated sideshift library object
* @returns {boolean} whether or not this sideshift object is valid
*/
export const isValidSideshiftObj = sideshiftObj => {
return (
sideshiftObj !== null &&
typeof sideshiftObj === 'object' &&
typeof sideshiftObj.show === 'function' &&
typeof sideshiftObj.hide === 'function' &&
typeof sideshiftObj.addEventListener === 'function'
);
};
// Parses whether the value is a valid eCash address
// or a valid and registered alias
export const isValidRecipient = async value => {
if (cashaddr.isValidCashAddress(value, 'ecash')) {
return true;
}
// If not a valid XEC address, check if it's an alias
if (isValidAliasSendInput(value) !== true) {
return false;
}
// extract alias without the `.xec`
const aliasName = value.slice(0, -4);
try {
const aliasDetails = await queryAliasServer('alias', aliasName);
return aliasDetails && !aliasDetails.error && !!aliasDetails.address;
} catch (err) {
console.error(
`isValidRecipient(): Error retrieving alias details`,
err,
);
}
return false;
};
/**
* Does a given string meet the spec of a valid ecash alias
* See spec a doc/standards/ecash-alias.md
* Note that an alias is only "valid" if it has been registered
* So here, we are only testing spec compliance
* @param {string} inputStr
* @returns {true | string} true if isValid, string for reason why if not
*/
export const meetsAliasSpec = inputStr => {
if (typeof inputStr !== 'string') {
return 'Alias input must be a string';
}
if (!/^[a-z0-9]+$/.test(inputStr)) {
return 'Alias may only contain lowercase characters a-z and 0-9';
}
const aliasByteCount = getAliasByteCount(inputStr);
if (aliasByteCount > aliasSettings.aliasMaxLength) {
return `Invalid bytecount ${aliasByteCount}. Alias be 1-21 bytes.`;
}
return true;
};
/**
* Validate user input of an alias for cases that require the .xec suffix
* Note this only validates the format according to spec and requirements
* Must validate with indexer for associated ecash address before a tx is broadcast
* @param {string} sendToAliasInput
* @returns {true | string}
*/
export const isValidAliasSendInput = sendToAliasInput => {
// To send to an alias, a user must include the '.xec' extension
// This is to prevent confusion with alias platforms on other crypto networks
const aliasParts = sendToAliasInput.split('.');
const aliasName = aliasParts[0];
const aliasMeetsSpec = meetsAliasSpec(aliasName);
if (aliasMeetsSpec !== true) {
return aliasMeetsSpec;
}
if (aliasParts.length !== 2 || aliasParts[1] !== 'xec') {
return `Must include '.xec' suffix when sending to an eCash alias`;
}
return true;
};
export const validateMnemonic = (
mnemonic,
wordlist = bip39.wordlists.english,
) => {
try {
if (!mnemonic || !wordlist) return false;
// Preprocess the words
const words = mnemonic.split(' ');
// Detect blank phrase
if (words.length === 0) return false;
// Check the words are valid
return bip39.validateMnemonic(mnemonic, wordlist);
} catch (err) {
console.error(err);
return false;
}
};
/**
* Validate user input XEC send amount
* @param {number | string} sendAmountXec user input for XEC send amount. Number if from amount field. May be string if from multi-send or set by bip21.
* @param {number} balanceSats
* @param {string} userLocale navigator.language if available, or default if not
* @param {string} selectedCurrency
* @param {number} fiatPrice
* @returns {boolean | string} true if valid, string error msg of why invalid if not
*/
const VALID_XEC_USER_INPUT_REGEX = /^[0-9.]+$/;
export const isValidXecSendAmount = (
sendAmount,
balanceSats,
userLocale,
selectedCurrency = appConfig.ticker,
fiatPrice = 0,
) => {
if (typeof sendAmount !== 'number' && typeof sendAmount !== 'string') {
return 'sendAmount type must be number or string';
}
if (typeof sendAmount === 'string' && isNaN(parseFloat(sendAmount))) {
return `Unable to parse sendAmount "${sendAmount}" as a number`;
}
// xecSendAmount may only contain numbers and '.'
// TODO support other locale decimal markers
const xecSendAmountCharCheck = VALID_XEC_USER_INPUT_REGEX.test(sendAmount);
if (!xecSendAmountCharCheck) {
return `Invalid amount "${sendAmount}": Amount can only contain numbers and '.' to denote decimal places.`;
}
const isFiatSendAmount = selectedCurrency !== appConfig.ticker;
// If it is not a fiat send amount, reject values with more than 2 decimal places
if (!isFiatSendAmount && sendAmount.toString().includes('.')) {
if (
sendAmount.toString().split('.')[1].length > appConfig.cashDecimals
) {
return `${appConfig.ticker} transactions do not support more than ${appConfig.cashDecimals} decimal places`;
}
}
const sendAmountSatoshis = isFiatSendAmount
? fiatToSatoshis(sendAmount, fiatPrice)
: toSatoshis(sendAmount);
if (sendAmountSatoshis <= 0) {
return 'Amount must be greater than 0';
}
if (sendAmountSatoshis < appConfig.dustSats) {
return `Send amount must be at least ${toXec(appConfig.dustSats)} ${
appConfig.ticker
}`;
}
if (sendAmountSatoshis > balanceSats) {
return `Amount ${toXec(sendAmountSatoshis).toLocaleString(userLocale, {
minimumFractionDigits: appConfig.cashDecimals,
})} ${appConfig.ticker} exceeds wallet balance of ${toXec(
balanceSats,
).toLocaleString(userLocale, { minimumFractionDigits: 2 })} ${
appConfig.ticker
}`;
}
return true;
};
export const isProbablyNotAScam = tokenNameOrTicker => {
// convert to lower case, trim leading and trailing spaces
// split, filter then join on ' ' for cases where user inputs multiple spaces
const sanitized = tokenNameOrTicker
.toLowerCase()
.trim()
.split(' ')
.filter(string => string)
.join(' ');
return !tokenBlacklist.includes(sanitized);
};
export const isValidTokenName = tokenName => {
return (
typeof tokenName === 'string' &&
tokenName.length > 0 &&
tokenName.length < 68
);
};
export const isValidTokenTicker = tokenTicker => {
return (
typeof tokenTicker === 'string' &&
tokenTicker.length > 0 &&
tokenTicker.length < 13
);
};
export const isValidTokenDecimals = tokenDecimals => {
return ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].includes(
tokenDecimals,
);
};
export const isValidTokenDocumentUrl = tokenDocumentUrl => {
const urlPattern = new RegExp(
'^(https?:\\/\\/)?' + // protocol
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // domain name
'((\\d{1,3}\\.){3}\\d{1,3}))' + // OR ip (v4) address
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // port and path
'(\\?[;&a-z\\d%_.~+=-]*)?' + // query string
'(\\#[-a-z\\d_]*)?$',
'i',
); // fragment locator
const urlTestResult = urlPattern.test(tokenDocumentUrl);
return (
tokenDocumentUrl === '' ||
(typeof tokenDocumentUrl === 'string' &&
tokenDocumentUrl.length >= 0 &&
tokenDocumentUrl.length < 68 &&
urlTestResult)
);
};
export const isValidCashtabSettings = settings => {
const cashtabDefaultConfig = new CashtabSettings();
try {
let isValidSettingParams = true;
for (let param in cashtabDefaultConfig) {
if (
!Object.prototype.hasOwnProperty.call(settings, param) ||
!cashtabSettingsValidation[param].includes(settings[param])
) {
isValidSettingParams = false;
break;
}
}
const isValid = typeof settings === 'object' && isValidSettingParams;
return isValid;
} catch (err) {
return false;
}
};
/**
* When Cashtab adds a new setting, existing users will not have it set
* We do not want to force these users to start with fully-wiped default settings
* Instead, we add the missing key
* @param {object} settings cashtabSettings object from localforage
* @returns {object} migratedCashtabSettings
*/
export const migrateLegacyCashtabSettings = settings => {
const cashtabDefaultConfig = new CashtabSettings();
// determine if settings are invalid because it is missing a parameter
for (let param in cashtabDefaultConfig) {
if (!Object.prototype.hasOwnProperty.call(settings, param)) {
// adds the default setting for only that parameter
settings[param] = cashtabDefaultConfig[param];
}
}
return settings;
};
/**
* Check if an array is a valid Cashtab contact list
* A valid contact list is an array of objects
* An empty contact list looks like [{}]
* @param {array} contactList
* @returns {bool}
*/
export const isValidContactList = contactList => {
if (!Array.isArray(contactList)) {
return false;
}
for (const contact of contactList) {
// Must have keys 'address' and 'name'
if (
typeof contact === 'object' &&
'address' in contact &&
'name' in contact
) {
// Address must be a valid XEC address, name must be a string
const { address, name } = contact;
if (
(cashaddr.isValidCashAddress(address, 'ecash') ||
isValidAliasSendInput(address)) &&
typeof name === 'string'
) {
// This contact is valid
continue;
}
// Any single invalid contact makes the whole list invalid
return false;
}
return false;
}
// If you get here, it's good
return true;
};
/**
* Validate cashtabCache object found in localforage
* @param {object} cashtabCache
* @returns {boolean}
*/
export const isValidCashtabCache = cashtabCache => {
// Legacy cashtabCache is an object with key tokenInfoById
// At this key is an object with keys of tokenId
// We are replacing this with a map
const existingKeys = Object.keys(cashtabCache);
if (existingKeys.length !== 1 || existingKeys[0] !== 'tokens') {
return false;
}
// Validate that there is a map at the tokens key in case localforage saved the map without
// first converting it to a JSON at some point
if (!(cashtabCache.tokens instanceof Map)) {
return false;
}
if (typeof cashtabCache.tokens.get(UNKNOWN_TOKEN_ID) === 'undefined') {
// Cashtab Cache is invalid if it does not include UNKNOWN_TOKEN_ID
return false;
}
// Validate contents of map as shape may change
// Initialize flag because returning from a forEach does not do what you think it does
let isValidCachedInfo = true;
cashtabCache.tokens.forEach(cachedInfo => {
if (
!('tokenType' in cachedInfo) ||
!('genesisInfo' in cachedInfo) ||
!('timeFirstSeen' in cachedInfo) ||
!('genesisSupply' in cachedInfo) ||
!('genesisOutputScripts' in cachedInfo) ||
!('genesisMintBatons' in cachedInfo)
) {
isValidCachedInfo = false;
}
});
return isValidCachedInfo;
};
// XEC airdrop field validations
export const isValidTokenId = tokenId => {
// disable no-useless-escape for regex
//eslint-disable-next-line
const format = /[ `!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?~]/;
const specialCharCheck = format.test(tokenId);
return (
typeof tokenId === 'string' &&
tokenId.length === 64 &&
tokenId.trim() != '' &&
!specialCharCheck
);
};
export const isValidNewWalletNameLength = newWalletName => {
return (
typeof newWalletName === 'string' &&
newWalletName.length > 0 &&
newWalletName.length <= appConfig.localStorageMaxCharacters &&
newWalletName.length !== ''
);
};
export const isValidXecAirdrop = xecAirdrop => {
return (
typeof xecAirdrop === 'string' &&
xecAirdrop.length > 0 &&
xecAirdrop.trim() != '' &&
new BN(xecAirdrop).gt(0)
);
};
/**
* Parse user input of addresses to exclude in an airdrop tx
* @param {array} airdropExclusionArray
* @returns {boolean}
*/
export const isValidAirdropExclusionArray = airdropExclusionArray => {
if (!airdropExclusionArray || airdropExclusionArray.length === 0) {
return false;
}
let isValid = true;
// split by comma as the delimiter
const addressStringArray = airdropExclusionArray.split(',');
// parse and validate each address in array
for (const address of addressStringArray) {
if (
!address.startsWith('ecash') ||
!cashaddr.isValidCashAddress(address, 'ecash')
) {
return false;
}
}
return isValid;
};
/**
* Validate user input on Send.js for multi-input mode
* @param {string} userMultisendInput formData.address from Send.js screen, validated for multi-send
* @param {number} balanceSats user wallet balance in satoshis
* @param {string} userLocale navigator.language, if available, or default if not
* @returns {boolean | string} true if is valid, error msg about why if not
*/
export const isValidMultiSendUserInput = (
userMultisendInput,
balanceSats,
userLocale,
) => {
if (typeof userMultisendInput !== 'string') {
// In usage pairing to a form input, this should never happen
return 'Input must be a string';
}
if (userMultisendInput.trim() === '') {
return 'Input must not be blank';
}
let inputLines = userMultisendInput.split('\n');
let totalSendSatoshis = 0;
for (let i = 0; i < inputLines.length; i += 1) {
if (inputLines[i].trim() === '') {
return `Remove empty row at line ${i + 1}`;
}
const addressAndValueThisLine = inputLines[i].split(',');
const elementsThisLine = addressAndValueThisLine.length;
if (elementsThisLine < 2) {
return `Line ${
i + 1
} must have address and value, separated by a comma`;
} else if (elementsThisLine > 2) {
return `Line ${i + 1}: Comma can only separate address and value.`;
}
const address = addressAndValueThisLine[0].trim();
const isValidAddress = cashaddr.isValidCashAddress(address, 'ecash');
if (!isValidAddress) {
return `Invalid address "${address}" at line ${i + 1}`;
}
const xecSendAmount = addressAndValueThisLine[1].trim();
const isValidValue = isValidXecSendAmount(xecSendAmount, balanceSats);
if (isValidValue !== true) {
// isValidXecSendAmount returns a string explaining the error if it does not return true
return `${isValidValue}: check value "${xecSendAmount}" at line ${
i + 1
}`;
}
// If it is valid, then we know it has appropriate decimal places
totalSendSatoshis += toSatoshis(Number(xecSendAmount));
}
if (totalSendSatoshis > balanceSats) {
return `Total amount sent (${toXec(totalSendSatoshis).toLocaleString(
userLocale,
{ minimumFractionDigits: appConfig.cashDecimals },
)} ${appConfig.ticker}) exceeds wallet balance of ${toXec(
balanceSats,
).toLocaleString(userLocale, {
minimumFractionDigits: appConfig.cashDecimals,
})} ${appConfig.ticker}`;
}
// If you make it here, all good
return true;
};
/**
* Test a bip21 opreturn param for spec compliance
* @param {string} opreturn
* @returns {bool}
*/
export const isValidOpreturnParam = testedParam => {
// Spec
// The param must contain a valid hex string for a valid `OP_RETURN` output,
// not beginning with the`OP_RETURN` `6a`.
try {
if (testedParam === '') {
// No empty OP_RETURN for this param per ecash bip21 spec
return false;
}
// Use validation from ecash-script library
// Apply .toLowerCase() to support uppercase, lowercase, or mixed case input
getStackArray(
`${opReturn.opReturnPrefixHex}${testedParam.toLowerCase()}`,
);
return true;
} catch (err) {
return false;
}
};
/**
* Should the Send button be disabled on the SendXec screen
* @param {object} formData must have keys address: string and value: string
* @param {number} balanceSats
* @param {boolean} apiError
* @param {false | string} sendAmountError
* @param {false | string} sendAddressError
- * @param {false | string} isMsgError
+ * @param {boolean} sendWithCashtabMsg
+ * @param {false | string} cashtabMsgError
* @param {boolean} priceApiError
* @param {boolean} isOneToManyXECSend
* @returns boolean
*/
export const shouldSendXecBeDisabled = (
formData,
balanceSats,
apiError,
sendAmountError,
sendAddressError,
multiSendAddressError,
- isMsgError,
+ sendWithCashtabMsg,
+ cashtabMsgError,
priceApiError,
isOneToManyXECSend,
) => {
return (
// Disabled if no user inputs
(formData.multiAddressInput === '' &&
formData.amount === '' &&
formData.address === '') ||
// Disabled if we are on SendToOne mode and address or amount is blank
(!isOneToManyXECSend &&
(formData.amount === '' || formData.address === '')) ||
// Disabled if user has no balance
balanceSats === 0 ||
// Disabled if apiError (wallet unable to sync utxo set with chronik)
apiError ||
// Disabled if send amount fails validation
sendAmountError !== false ||
// Disabled if address fails validation
sendAddressError !== false ||
- // Disabled if msg fails validation
- isMsgError !== false ||
+ // Disabled if msg fails validation AND we are sending the msg
+ (sendWithCashtabMsg && cashtabMsgError !== false) ||
// Disabled if we do not have a fiat price AND the user is attempting to send fiat
priceApiError ||
// Disabled if send to many and we have a send to many validation error
(isOneToManyXECSend && multiSendAddressError !== false) ||
// Disabled if send to many and send to many input is blank
(isOneToManyXECSend && formData.multiAddressInput === '')
);
};
/**
* Parse an address string with bip21 params for use in Cashtab
* @param {string} addressString User input into the send field of Cashtab.
* Must be validated for bip21 and Cashtab supported features
* For now, Cashtab supports only
* amount - amount to be sent in XEC
* opreturn - raw hex for opreturn output
* @param {number} balanceSats user wallet balance in satoshis
* @param {string} userLocale navigator.language if available, or default value if not
* @returns {object} addressInfo. Object with parsed params designed for use in Send.js
*/
export function parseAddressInput(
addressInput,
balanceSats,
userLocale = appConfig.defaultLocale,
) {
// Build return obj
const parsedAddressInput = {
address: { value: null, error: false, isAlias: false },
};
// Reject non-string input
if (typeof addressInput !== 'string') {
parsedAddressInput.address.error = 'Address must be a string';
return parsedAddressInput;
}
// Parse address string for parameters
const paramCheck = addressInput.split('?');
let cleanAddress = paramCheck[0];
// Set cleanAddress to addressInfo.address.value even if validation fails
// If there is an error, this will be set later
parsedAddressInput.address.value = cleanAddress;
// Validate address
const isValidAddr = cashaddr.isValidCashAddress(cleanAddress, 'ecash');
// Is this valid address?
if (!isValidAddr) {
// Check if this is an alias address
if (isValidAliasSendInput(cleanAddress) !== true) {
if (meetsAliasSpec(cleanAddress) === true) {
// If it would be a valid alias except for the missing '.xec', this is a useful validation error
parsedAddressInput.address.error = `Aliases must end with '.xec'`;
parsedAddressInput.address.isAlias = true;
} else if (cashaddr.isValidCashAddress(cleanAddress, 'etoken')) {
// If it is, though, a valid eToken address
parsedAddressInput.address.error = `eToken addresses are not supported for ${appConfig.ticker} sends`;
} else {
// If your address is not a valid address and not a valid alias format
parsedAddressInput.address.error = `Invalid address`;
}
} else {
parsedAddressInput.address.isAlias = true;
}
}
// Check for parameters
if (paramCheck.length > 1) {
// add other keys
const queryString = paramCheck[1];
parsedAddressInput.queryString = { value: queryString, error: false };
// Note that URLSearchParams is not an array
// https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
const addrParams = new URLSearchParams(queryString);
// Check for duplicated params
const duplicatedParams =
new Set(addrParams.keys()).size !==
Array.from(addrParams.keys()).length;
if (duplicatedParams) {
// In this case, we can't pass any values back for supported params,
// without changing the shape of addressInfo
parsedAddressInput.queryString.error = `bip21 parameters may not appear more than once`;
return parsedAddressInput;
}
const supportedParams = ['amount', 'op_return_raw'];
// Iterate over params to check for valid and/or invalid params
for (const paramKeyValue of addrParams) {
const paramKey = paramKeyValue[0];
if (!supportedParams.includes(paramKey)) {
// queryString error
// Keep parsing for other params though
parsedAddressInput.queryString.error = `Unsupported param "${paramKey}"`;
}
if (paramKey === 'amount') {
// Handle Cashtab-supported bip21 param 'amount'
const amount = paramKeyValue[1];
parsedAddressInput.amount = { value: amount, error: false };
const validXecSendAmount = isValidXecSendAmount(
amount,
balanceSats,
userLocale,
);
if (validXecSendAmount !== true) {
// If the result of isValidXecSendAmount is not true, it is an error msg explaining wy
parsedAddressInput.amount.error = validXecSendAmount;
}
}
if (paramKey === 'op_return_raw') {
// Handle Cashtab-supported bip21 param 'op_return_raw'
const opreturnParam = paramKeyValue[1];
parsedAddressInput.op_return_raw = {
value: opreturnParam,
error: false,
};
if (!isValidOpreturnParam(opreturnParam)) {
// opreturn must be valid
parsedAddressInput.op_return_raw.error = `Invalid op_return_raw param "${opreturnParam}"`;
}
}
}
}
return parsedAddressInput;
}
/**
* Determine if a given object is a valid Cashtab wallet
* @param {object} wallet Cashtab wallet object
* @returns {boolean}
*/
export const isValidCashtabWallet = wallet => {
if (wallet === false) {
// Unset cashtab wallet
return false;
}
if (typeof wallet !== 'object') {
// Wallet must be an object
return false;
}
if (!('paths' in wallet)) {
return false;
}
if (Array.isArray(wallet.paths)) {
// wallet.paths should be a map
return false;
}
if (wallet.paths.size < 1) {
// Wallet must have at least one path info object
return false;
}
// Validate each path
// We use pathsValid as a flag as `return false` from a forEach does not do what you think it does
let pathsValid = true;
// Return false if we do not have Path1899
// This also handles the case of a JSON-activated pre-2.9.0 wallet
if (typeof wallet.paths.get(1899) === 'undefined') {
return false;
}
wallet.paths.forEach((value, key) => {
if (typeof key !== 'number') {
// Wallet is invalid if key is not a number
pathsValid = false;
}
if (!('hash' in value) || !('address' in value) || !('wif' in value)) {
// If any given path does not have all of these keys, the wallet is invalid
pathsValid = false;
}
});
if (!pathsValid) {
// Invalid path
return false;
}
return (
typeof wallet === 'object' &&
'state' in wallet &&
'mnemonic' in wallet &&
'name' in wallet &&
!('Path145' in wallet) &&
!('Path245' in wallet) &&
!('Path1899' in wallet) &&
typeof wallet.state === 'object' &&
'balanceSats' in wallet.state &&
typeof wallet.state.balanceSats === 'number' &&
!('balances' in wallet.state) &&
'slpUtxos' in wallet.state &&
'nonSlpUtxos' in wallet.state &&
'tokens' in wallet.state &&
!('hydratedUtxoDetails' in wallet.state) &&
!('slpBalancesAndUtxos' in wallet.state)
);
};
/**
* Validate a token send or burn qty
* @param {string} amount decimalized token string of send or burn amount, from user input, e.g. 100.123
* @param {string} tokenBalance decimalized token string, e.g. 100.123
* @param {number} decimals 0, 1, 2, 3, 4, 5, 6, 7, 8, or 9
*/
export const isValidTokenSendOrBurnAmount = (
amount,
tokenBalance,
decimals,
) => {
if (typeof amount !== 'string') {
return 'Amount must be a string';
}
if (amount === '') {
return 'Amount is required';
}
if (amount === '0') {
return `Amount must be greater than 0`;
}
if (!STRINGIFIED_DECIMALIZED_REGEX.test(amount) || amount.length === 0) {
return `Amount must be a non-empty string containing only decimal numbers and optionally one decimal point "."`;
}
// Note: we do not validate decimals, as this is coming from token cache, which is coming from chronik
// The user is not inputting decimals
// Amount must be <= balance
const amountBN = new BN(amount);
// Returns 1 if greater, -1 if less, 0 if the same, null if n/a
if (amountBN.gt(tokenBalance)) {
return `Amount ${amount} exceeds balance of ${tokenBalance}`;
}
if (amount.includes('.')) {
if (amount.toString().split('.')[1].length > decimals) {
if (decimals === 0) {
return `This token does not support decimal places`;
}
return `This token supports no more than ${decimals} decimal place${
decimals === 1 ? '' : 's'
}`;
}
}
return true;
};
/**
* Validate a token mint qty
* Same as isValidTokenSendOrBurnAmount except we do not care about baalnce
* @param {string} amount decimalized token string of mint amount, from user input, e.g. 100.123
* @param {number} decimals 0, 1, 2, 3, 4, 5, 6, 7, 8, or 9
*/
export const isValidTokenMintAmount = (amount, decimals) => {
if (typeof amount !== 'string') {
return 'Amount must be a string';
}
if (amount === '') {
return 'Amount is required';
}
if (amount === '0') {
return `Amount must be greater than 0`;
}
if (!STRINGIFIED_DECIMALIZED_REGEX.test(amount) || amount.length === 0) {
return `Amount must be a non-empty string containing only decimal numbers and optionally one decimal point "."`;
}
// Note: we do not validate decimals, as this is coming from token cache, which is coming from chronik
// The user is not inputting decimals
if (amount.includes('.')) {
if (amount.toString().split('.')[1].length > decimals) {
if (decimals === 0) {
return `This token does not support decimal places`;
}
return `This token supports no more than ${decimals} decimal place${
decimals === 1 ? '' : 's'
}`;
}
}
// Amount must be <= 0xffffffffffffffff in token satoshis for this token decimals
const amountBN = new BN(amount);
// Returns 1 if greater, -1 if less, 0 if the same, null if n/a
const maxMintAmount = getMaxMintAmount(decimals);
if (amountBN.gt(maxMintAmount)) {
return `Amount ${amount} exceeds max mint amount for this token (${maxMintAmount})`;
}
return true;
};

File Metadata

Mime Type
text/x-diff
Expires
Thu, May 22, 01:52 (7 h, 43 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5866293
Default Alt Text
(941 KB)

Event Timeline