diff --git a/cashtab/extension/public/manifest.json b/cashtab/extension/public/manifest.json index 241776e27c..b25a793425 100644 --- a/cashtab/extension/public/manifest.json +++ b/cashtab/extension/public/manifest.json @@ -1,35 +1,35 @@ { "manifest_version": 3, "name": "Cashtab", "description": "A browser-integrated eCash wallet from Bitcoin ABC", - "version": "3.34.0", + "version": "3.35.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": [""] } ] } diff --git a/cashtab/package-lock.json b/cashtab/package-lock.json index 66a52e7006..7076c9b4c4 100644 --- a/cashtab/package-lock.json +++ b/cashtab/package-lock.json @@ -1,18993 +1,18999 @@ { "name": "cashtab", - "version": "2.34.4", + "version": "2.35.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cashtab", - "version": "2.34.4", + "version": "2.35.0", "dependencies": { "@bitgo/utxo-lib": "^9.33.0", "@zxing/browser": "^0.1.4", "bip39": "^3.0.2", "bip66": "^1.1.5", "bitcoinjs-message": "^2.2.0", "chronik-client": "^0.26.1", "ecash-coinselect": "^2.2.0", "ecash-script": "^2.1.2", "ecashaddrjs": "^1.5.4", + "js-sha256": "^0.11.0", "localforage": "^1.9.0", "qrcode.react": "^3.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-easy-crop": "^5.0.6", "react-ga": "^3.3.0", "react-router-dom": "^6.22.0", "react-toastify": "^10.0.5", "slp-mdm": "^0.0.6" }, "devDependencies": { "@babel/core": "^7.16.0", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", "@svgr/webpack": "^6.3.1", "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^14.2.1", "@testing-library/user-event": "^14.5.2", "assert": "^2.0.0", "babel-jest": "^29.7.0", "babel-loader": "^8.2.3", "babel-plugin-named-asset-import": "^0.3.8", "babel-preset-react-app": "^10.0.1", "bfj": "^7.0.2", "browserslist": "^4.18.1", "buffer": "^6.0.3", "camelcase": "^6.2.1", "case-sensitive-paths-webpack-plugin": "^2.4.0", "crypto-browserify": "^3.12.0", "css-loader": "^6.5.1", "css-minimizer-webpack-plugin": "^3.2.0", "dotenv": "^10.0.0", "dotenv-expand": "^5.1.0", "eslint": "^8.3.0", "eslint-config-react-app": "^7.0.0", "eslint-plugin-etc": "2.0.2", "eslint-plugin-header": "^3.1.1", "eslint-plugin-testing-library": "^6.2.0", "eslint-webpack-plugin": "^3.1.1", "extensionizer": "^1.0.1", "fake-indexeddb": "^5.0.2", "file-loader": "^6.2.0", "fs-extra": "^10.0.0", "html-webpack-plugin": "^5.5.0", "identity-obj-proxy": "^3.0.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jest-junit": "^16.0.0", "jest-watch-typeahead": "^2.2.2", "jest-when": "^3.6.0", "mini-css-extract-plugin": "^2.4.5", "postcss": "^8.4.4", "postcss-flexbugs-fixes": "^5.0.2", "postcss-loader": "^6.2.1", "postcss-normalize": "^10.0.1", "postcss-preset-env": "^7.0.1", "prop-types": "^15.8.1", "react-app-polyfill": "^3.0.0", "react-dev-utils": "^12.0.0", "react-refresh": "^0.11.0", "resolve": "^1.20.0", "resolve-url-loader": "^5.0.0", "sass-loader": "^12.3.0", "semver": "^7.3.5", "source-map-loader": "^3.0.0", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", "styled-components": "^4.4.0", "tailwindcss": "^3.0.2", "terser-webpack-plugin": "^5.2.5", "web-vitals": "^2.1.4", "webpack": "^5.90.1", "webpack-dev-server": "^4.6.0", "webpack-manifest-plugin": "^4.0.2", "workbox-webpack-plugin": "^6.4.1" } }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@adobe/css-tools": { "version": "4.3.3", "dev": true, "license": "MIT" }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "dev": true, "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { "version": "7.23.5", "dev": true, "license": "MIT", "dependencies": { "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { "version": "7.23.5", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.23.9", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", "@babel/helpers": "^7.23.9", "@babel/parser": "^7.23.9", "@babel/template": "^7.23.9", "@babel/traverse": "^7.23.9", "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/eslint-parser": { "version": "7.23.10", "dev": true, "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", "semver": "^6.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || >=14.0.0" }, "peerDependencies": { "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0" } }, "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { "version": "2.1.0", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=10" } }, "node_modules/@babel/eslint-parser/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { "version": "7.23.6", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.22.15", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { "version": "7.23.6", "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-validator-option": "^7.23.5", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.23.10", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.22.15", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.5.0", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", "resolve": "^1.14.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.23.0", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.23.0", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { "version": "7.22.15", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { "version": "7.22.5", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.22.20", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-replace-supers": { "version": "7.22.20", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-member-expression-to-functions": "^7.22.15", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.6", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.23.4", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.20", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.23.5", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { "version": "7.22.20", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.15", "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { "version": "7.23.9", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.23.9", "@babel/traverse": "^7.23.9", "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { "version": "7.23.9", "dev": true, "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-transform-optional-chaining": "^7.23.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.13.0" } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { "version": "7.23.7", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-decorators": { "version": "7.23.9", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.23.9", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-decorators": "^7.23.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.21.0", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.11", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.21.0", "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-decorators": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-flow": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-attributes": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.23.9", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-class-properties": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "node_modules/@babel/plugin-transform-classes": { "version": "7.23.8", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/template": "^7.22.15" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-destructuring": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-flow-strip-types": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-flow": "^7.23.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-for-of": { "version": "7.23.6", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-function-name": "^7.23.0", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-json-strings": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-literals": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.23.9", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-transforms": "^7.23.3", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-numeric-separator": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.23.3", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-transform-parameters": "^7.23.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-optional-chaining": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-private-methods": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-private-property-in-object": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-constant-elements": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-display-name": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.23.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-jsx": "^7.23.3", "@babel/types": "^7.23.4" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-jsx-development": { "version": "7.22.5", "dev": true, "license": "MIT", "dependencies": { "@babel/plugin-transform-react-jsx": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-runtime": { "version": "7.23.9", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", "babel-plugin-polyfill-corejs2": "^0.4.8", "babel-plugin-polyfill-corejs3": "^0.9.0", "babel-plugin-polyfill-regenerator": "^0.5.5", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-spread": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-typescript": { "version": "7.23.6", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.23.6", "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-typescript": "^7.23.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-escapes": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/preset-env": { "version": "7.23.9", "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.23.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.23.3", "@babel/plugin-syntax-import-attributes": "^7.23.3", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", "@babel/plugin-transform-async-generator-functions": "^7.23.9", "@babel/plugin-transform-async-to-generator": "^7.23.3", "@babel/plugin-transform-block-scoped-functions": "^7.23.3", "@babel/plugin-transform-block-scoping": "^7.23.4", "@babel/plugin-transform-class-properties": "^7.23.3", "@babel/plugin-transform-class-static-block": "^7.23.4", "@babel/plugin-transform-classes": "^7.23.8", "@babel/plugin-transform-computed-properties": "^7.23.3", "@babel/plugin-transform-destructuring": "^7.23.3", "@babel/plugin-transform-dotall-regex": "^7.23.3", "@babel/plugin-transform-duplicate-keys": "^7.23.3", "@babel/plugin-transform-dynamic-import": "^7.23.4", "@babel/plugin-transform-exponentiation-operator": "^7.23.3", "@babel/plugin-transform-export-namespace-from": "^7.23.4", "@babel/plugin-transform-for-of": "^7.23.6", "@babel/plugin-transform-function-name": "^7.23.3", "@babel/plugin-transform-json-strings": "^7.23.4", "@babel/plugin-transform-literals": "^7.23.3", "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", "@babel/plugin-transform-member-expression-literals": "^7.23.3", "@babel/plugin-transform-modules-amd": "^7.23.3", "@babel/plugin-transform-modules-commonjs": "^7.23.3", "@babel/plugin-transform-modules-systemjs": "^7.23.9", "@babel/plugin-transform-modules-umd": "^7.23.3", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", "@babel/plugin-transform-new-target": "^7.23.3", "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", "@babel/plugin-transform-numeric-separator": "^7.23.4", "@babel/plugin-transform-object-rest-spread": "^7.23.4", "@babel/plugin-transform-object-super": "^7.23.3", "@babel/plugin-transform-optional-catch-binding": "^7.23.4", "@babel/plugin-transform-optional-chaining": "^7.23.4", "@babel/plugin-transform-parameters": "^7.23.3", "@babel/plugin-transform-private-methods": "^7.23.3", "@babel/plugin-transform-private-property-in-object": "^7.23.4", "@babel/plugin-transform-property-literals": "^7.23.3", "@babel/plugin-transform-regenerator": "^7.23.3", "@babel/plugin-transform-reserved-words": "^7.23.3", "@babel/plugin-transform-shorthand-properties": "^7.23.3", "@babel/plugin-transform-spread": "^7.23.3", "@babel/plugin-transform-sticky-regex": "^7.23.3", "@babel/plugin-transform-template-literals": "^7.23.3", "@babel/plugin-transform-typeof-symbol": "^7.23.3", "@babel/plugin-transform-unicode-escapes": "^7.23.3", "@babel/plugin-transform-unicode-property-regex": "^7.23.3", "@babel/plugin-transform-unicode-regex": "^7.23.3", "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.8", "babel-plugin-polyfill-corejs3": "^0.9.0", "babel-plugin-polyfill-regenerator": "^0.5.5", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-env/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/preset-react": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-transform-react-display-name": "^7.23.3", "@babel/plugin-transform-react-jsx": "^7.22.15", "@babel/plugin-transform-react-jsx-development": "^7.22.5", "@babel/plugin-transform-react-pure-annotations": "^7.23.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-typescript": { "version": "7.23.3", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-syntax-jsx": "^7.23.3", "@babel/plugin-transform-modules-commonjs": "^7.23.3", "@babel/plugin-transform-typescript": "^7.23.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/regjsgen": { "version": "0.8.0", "dev": true, "license": "MIT" }, "node_modules/@babel/runtime": { "version": "7.23.9", "dev": true, "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { "version": "7.23.9", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/parser": "^7.23.9", "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { "version": "7.23.9", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "@babel/parser": "^7.23.9", "@babel/types": "^7.23.9", "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { "version": "7.23.9", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "dev": true, "license": "MIT" }, "node_modules/@bitgo/blake2b": { "version": "3.2.4", "license": "ISC", "dependencies": { "@bitgo/blake2b-wasm": "^3.2.3", "nanoassert": "^2.0.0" } }, "node_modules/@bitgo/blake2b-wasm": { "version": "3.2.3", "license": "MIT", "dependencies": { "nanoassert": "^1.0.0" } }, "node_modules/@bitgo/blake2b-wasm/node_modules/nanoassert": { "version": "1.1.0", "license": "ISC" }, "node_modules/@bitgo/utxo-lib": { "version": "9.34.0", "license": "MIT", "dependencies": { "@bitgo/blake2b": "^3.2.4", "@brandonblack/musig": "^0.0.1-alpha.0", "@noble/secp256k1": "1.6.3", "bech32": "^2.0.0", "bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4", "bip32": "^3.0.1", "bitcoin-ops": "^1.3.0", "bitcoinjs-lib": "npm:@bitgo-forks/bitcoinjs-lib@7.1.0-master.7", "bn.js": "^5.2.1", "bs58check": "^2.1.2", "cashaddress": "^1.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "ecpair": "npm:@bitgo/ecpair@2.1.0-rc.0", "elliptic": "^6.5.2", "fastpriorityqueue": "^0.7.1", "typeforce": "^1.11.3", "varuint-bitcoin": "^1.1.2" }, "engines": { "node": ">=10.22.0 <21", "npm": ">=3.10.10" } }, "node_modules/@brandonblack/musig": { "version": "0.0.1-alpha.1", "license": "MIT" }, "node_modules/@csstools/normalize.css": { "version": "12.1.1", "dev": true, "license": "CC0-1.0" }, "node_modules/@csstools/postcss-cascade-layers": { "version": "1.1.1", "dev": true, "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.2", "postcss-selector-parser": "^6.0.10" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/@csstools/postcss-color-function": { "version": "1.1.1", "dev": true, "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/@csstools/postcss-font-format-keywords": { "version": "1.0.1", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/@csstools/postcss-hwb-function": { "version": "1.0.2", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/@csstools/postcss-ic-unit": { "version": "1.0.1", "dev": true, "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/@csstools/postcss-is-pseudo-class": { "version": "2.0.7", "dev": true, "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/@csstools/postcss-nested-calc": { "version": "1.0.0", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/@csstools/postcss-normalize-display-values": { "version": "1.0.1", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/@csstools/postcss-oklab-function": { "version": "1.1.1", "dev": true, "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/@csstools/postcss-progressive-custom-properties": { "version": "1.3.0", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { "postcss": "^8.3" } }, "node_modules/@csstools/postcss-stepped-value-functions": { "version": "1.0.1", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/@csstools/postcss-text-decoration-shorthand": { "version": "1.0.0", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/@csstools/postcss-trigonometric-functions": { "version": "1.0.2", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/@csstools/postcss-unset-value": { "version": "1.0.2", "dev": true, "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/@csstools/selector-specificity": { "version": "2.2.0", "dev": true, "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss-selector-parser": "^6.0.10" } }, "node_modules/@emotion/is-prop-valid": { "version": "0.8.8", "dev": true, "license": "MIT", "dependencies": { "@emotion/memoize": "0.7.4" } }, "node_modules/@emotion/memoize": { "version": "0.7.4", "dev": true, "license": "MIT" }, "node_modules/@emotion/unitless": { "version": "0.7.5", "dev": true, "license": "MIT" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { "version": "4.10.0", "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", "license": "Python-2.0" }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.24.0", "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { "version": "4.1.0", "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@eslint/js": { "version": "8.56.0", "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "license": "Apache-2.0", "engines": { "node": ">=12.22" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.2", "license": "BSD-3-Clause" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "dev": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { "version": "6.0.1", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { "version": "6.2.1", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "dev": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { "version": "7.1.0", "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { "version": "8.1.0", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "dev": true, "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { "version": "5.3.1", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", "dev": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jest/console": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/console/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/console/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/console/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/console/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/@jest/console/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jest/console/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/core": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.7.0", "jest-config": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-resolve-dependencies": "^29.7.0", "jest-runner": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/@jest/core/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/core/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/core/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/core/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/@jest/core/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jest/core/node_modules/pretty-format": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/core/node_modules/react-is": { "version": "18.2.0", "dev": true, "license": "MIT" }, "node_modules/@jest/core/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/environment": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/@jest/reporters/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/reporters/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/reporters/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/reporters/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/@jest/reporters/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { "version": "6.0.1", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" }, "engines": { "node": ">=10" } }, "node_modules/@jest/reporters/node_modules/jest-worker": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters/node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/@jest/reporters/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/schemas": { "version": "29.6.3", "dev": true, "license": "MIT", "dependencies": { "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { "version": "29.6.3", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/transform/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/transform/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/transform/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jest/transform/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jest/types": { "version": "29.6.3", "dev": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/types/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@jest/types/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@jest/types/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@jest/types/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/@jest/types/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jest/types/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.5", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.22", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "dev": true, "license": "MIT" }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "dev": true, "license": "MIT", "dependencies": { "eslint-scope": "5.1.1" } }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { "version": "5.1.1", "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/@noble/hashes": { "version": "1.3.3", "license": "MIT", "engines": { "node": ">= 16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/secp256k1": { "version": "1.6.3", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, "node_modules/@phenomnomnominal/tsquery": { "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { "esquery": "^1.0.1" }, "peerDependencies": { "typescript": "^3 || ^4" } }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "dev": true, "license": "MIT", "optional": true, "engines": { "node": ">=14" } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.5.11", "dev": true, "license": "MIT", "dependencies": { "ansi-html-community": "^0.0.8", "common-path-prefix": "^3.0.0", "core-js-pure": "^3.23.3", "error-stack-parser": "^2.0.6", "find-up": "^5.0.0", "html-entities": "^2.1.0", "loader-utils": "^2.0.4", "schema-utils": "^3.0.0", "source-map": "^0.7.3" }, "engines": { "node": ">= 10.13" }, "peerDependencies": { "@types/webpack": "4.x || 5.x", "react-refresh": ">=0.10.0 <1.0.0", "sockjs-client": "^1.4.0", "type-fest": ">=0.17.0 <5.0.0", "webpack": ">=4.43.0 <6.0.0", "webpack-dev-server": "3.x || 4.x", "webpack-hot-middleware": "2.x", "webpack-plugin-serve": "0.x || 1.x" }, "peerDependenciesMeta": { "@types/webpack": { "optional": true }, "sockjs-client": { "optional": true }, "type-fest": { "optional": true }, "webpack-dev-server": { "optional": true }, "webpack-hot-middleware": { "optional": true }, "webpack-plugin-serve": { "optional": true } } }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "node_modules/@protobufjs/float": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, "node_modules/@remix-run/router": { "version": "1.15.0", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" }, "engines": { "node": ">= 10.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0", "@types/babel__core": "^7.1.9", "rollup": "^1.20.0||^2.0.0" }, "peerDependenciesMeta": { "@types/babel__core": { "optional": true } } }, "node_modules/@rollup/plugin-node-resolve": { "version": "11.2.1", "dev": true, "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.1.0", "@types/resolve": "1.17.1", "builtin-modules": "^3.1.0", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.19.0" }, "engines": { "node": ">= 10.0.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "node_modules/@rollup/plugin-replace": { "version": "2.4.2", "dev": true, "license": "MIT", "dependencies": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" }, "peerDependencies": { "rollup": "^1.20.0 || ^2.0.0" } }, "node_modules/@rollup/pluginutils": { "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "engines": { "node": ">= 8.0.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "node_modules/@rollup/pluginutils/node_modules/@types/estree": { "version": "0.0.39", "dev": true, "license": "MIT" }, "node_modules/@rushstack/eslint-patch": { "version": "1.7.2", "dev": true, "license": "MIT" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "dev": true, "license": "MIT" }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "dev": true, "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "dev": true, "license": "Apache-2.0", "dependencies": { "ejs": "^3.1.6", "json5": "^2.2.0", "magic-string": "^0.25.0", "string.prototype.matchall": "^4.0.6" } }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "6.5.1", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { "version": "8.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "8.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "6.5.1", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@svgr/babel-plugin-svg-dynamic-title": { "version": "6.5.1", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@svgr/babel-plugin-svg-em-dimensions": { "version": "6.5.1", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@svgr/babel-plugin-transform-react-native-svg": { "version": "6.5.1", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@svgr/babel-plugin-transform-svg-component": { "version": "6.5.1", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@svgr/babel-preset": { "version": "6.5.1", "dev": true, "license": "MIT", "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", "@svgr/babel-plugin-remove-jsx-attribute": "*", "@svgr/babel-plugin-remove-jsx-empty-expression": "*", "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", "@svgr/babel-plugin-transform-svg-component": "^6.5.1" }, "engines": { "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@svgr/core": { "version": "6.5.1", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.19.6", "@svgr/babel-preset": "^6.5.1", "@svgr/plugin-jsx": "^6.5.1", "camelcase": "^6.2.0", "cosmiconfig": "^7.0.1" }, "engines": { "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@svgr/hast-util-to-babel-ast": { "version": "6.5.1", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.20.0", "entities": "^4.4.0" }, "engines": { "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@svgr/plugin-jsx": { "version": "6.5.1", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.19.6", "@svgr/babel-preset": "^6.5.1", "@svgr/hast-util-to-babel-ast": "^6.5.1", "svg-parser": "^2.0.4" }, "engines": { "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { "@svgr/core": "^6.0.0" } }, "node_modules/@svgr/plugin-svgo": { "version": "6.5.1", "dev": true, "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.1", "deepmerge": "^4.2.2", "svgo": "^2.8.0" }, "engines": { "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { "@svgr/core": "*" } }, "node_modules/@svgr/webpack": { "version": "6.5.1", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.19.6", "@babel/plugin-transform-react-constant-elements": "^7.18.12", "@babel/preset-env": "^7.19.4", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.18.6", "@svgr/core": "^6.5.1", "@svgr/plugin-jsx": "^6.5.1", "@svgr/plugin-svgo": "^6.5.1" }, "engines": { "node": ">=10" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" } }, "node_modules/@testing-library/dom": { "version": "9.3.4", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.1.3", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" }, "engines": { "node": ">=14" } }, "node_modules/@testing-library/dom/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@testing-library/dom/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@testing-library/dom/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@testing-library/dom/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/@testing-library/dom/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@testing-library/dom/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@testing-library/jest-dom": { "version": "6.4.2", "dev": true, "license": "MIT", "dependencies": { "@adobe/css-tools": "^4.3.2", "@babel/runtime": "^7.9.2", "aria-query": "^5.0.0", "chalk": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", "lodash": "^4.17.15", "redent": "^3.0.0" }, "engines": { "node": ">=14", "npm": ">=6", "yarn": ">=1" }, "peerDependencies": { "@jest/globals": ">= 28", "@types/bun": "latest", "@types/jest": ">= 28", "jest": ">= 28", "vitest": ">= 0.32" }, "peerDependenciesMeta": { "@jest/globals": { "optional": true }, "@types/bun": { "optional": true }, "@types/jest": { "optional": true }, "jest": { "optional": true }, "vitest": { "optional": true } } }, "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/@testing-library/jest-dom/node_modules/chalk": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=8" } }, "node_modules/@testing-library/jest-dom/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/@testing-library/jest-dom/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { "version": "0.6.3", "dev": true, "license": "MIT" }, "node_modules/@testing-library/jest-dom/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@testing-library/jest-dom/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@testing-library/react": { "version": "14.2.1", "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "@testing-library/dom": "^9.0.0", "@types/react-dom": "^18.0.0" }, "engines": { "node": ">=14" }, "peerDependencies": { "react": "^18.0.0", "react-dom": "^18.0.0" } }, "node_modules/@testing-library/user-event": { "version": "14.5.2", "dev": true, "license": "MIT", "engines": { "node": ">=12", "npm": ">=6" }, "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "node_modules/@tootallnate/once": { "version": "2.0.0", "dev": true, "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/@trysound/sax": { "version": "0.2.0", "dev": true, "license": "ISC", "engines": { "node": ">=10.13.0" } }, "node_modules/@types/aria-query": { "version": "5.0.4", "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "node_modules/@types/babel__generator": { "version": "7.6.8", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.4", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { "version": "7.20.5", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/body-parser": { "version": "1.19.5", "dev": true, "license": "MIT", "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "node_modules/@types/bonjour": { "version": "3.5.13", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect": { "version": "3.4.38", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { "version": "1.5.4", "dev": true, "license": "MIT", "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" } }, "node_modules/@types/eslint": { "version": "8.56.2", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { "version": "3.7.7", "dev": true, "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { "version": "1.0.5", "dev": true, "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "node_modules/@types/express-serve-static-core": { "version": "4.17.43", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "dev": true, "license": "MIT" }, "node_modules/@types/http-errors": { "version": "2.0.4", "dev": true, "license": "MIT" }, "node_modules/@types/http-proxy": { "version": "1.17.14", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "dev": true, "license": "MIT" }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.3", "dev": true, "license": "MIT", "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { "version": "3.0.4", "dev": true, "license": "MIT", "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jsdom": { "version": "20.0.1", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", "parse5": "^7.0.0" } }, "node_modules/@types/json-schema": { "version": "7.0.15", "dev": true, "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", "dev": true, "license": "MIT" }, "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "node_modules/@types/mime": { "version": "1.3.5", "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "20.11.17", "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/node-forge": { "version": "1.3.11", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/parse-json": { "version": "4.0.2", "dev": true, "license": "MIT" }, "node_modules/@types/prop-types": { "version": "15.7.11", "dev": true, "license": "MIT" }, "node_modules/@types/qs": { "version": "6.9.11", "dev": true, "license": "MIT" }, "node_modules/@types/range-parser": { "version": "1.2.7", "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "18.2.55", "dev": true, "license": "MIT", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { "version": "18.2.19", "dev": true, "license": "MIT", "dependencies": { "@types/react": "*" } }, "node_modules/@types/resolve": { "version": "1.17.1", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/retry": { "version": "0.12.0", "dev": true, "license": "MIT" }, "node_modules/@types/scheduler": { "version": "0.16.8", "dev": true, "license": "MIT" }, "node_modules/@types/semver": { "version": "7.5.6", "dev": true, "license": "MIT" }, "node_modules/@types/send": { "version": "0.17.4", "dev": true, "license": "MIT", "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "node_modules/@types/serve-index": { "version": "1.9.4", "dev": true, "license": "MIT", "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { "version": "1.15.5", "dev": true, "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } }, "node_modules/@types/sockjs": { "version": "0.3.36", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/stack-utils": { "version": "2.0.3", "dev": true, "license": "MIT" }, "node_modules/@types/tough-cookie": { "version": "4.0.5", "dev": true, "license": "MIT" }, "node_modules/@types/trusted-types": { "version": "2.0.7", "dev": true, "license": "MIT" }, "node_modules/@types/ws": { "version": "8.5.10", "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/yargs": { "version": "17.0.32", "dev": true, "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.3", "dev": true, "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/type-utils": "5.62.0", "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "@typescript-eslint/parser": "^5.0.0", "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/experimental-utils": { "version": "5.62.0", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/utils": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/parser": { "version": "5.62.0", "dev": true, "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.62.0", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/type-utils": { "version": "5.62.0", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "5.62.0", "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "*" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/types": { "version": "5.62.0", "dev": true, "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/typescript-estree": { "version": "5.62.0", "dev": true, "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/@typescript-eslint/utils": { "version": "5.62.0", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { "version": "5.1.1", "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/@typescript-eslint/utils/node_modules/estraverse": { "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "license": "ISC" }, "node_modules/@webassemblyjs/ast": { "version": "1.11.6", "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { "version": "1.11.6", "dev": true, "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { "version": "1.11.6", "dev": true, "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/helper-wasm-section": "1.11.6", "@webassemblyjs/wasm-gen": "1.11.6", "@webassemblyjs/wasm-opt": "1.11.6", "@webassemblyjs/wasm-parser": "1.11.6", "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { "version": "1.11.6", "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { "version": "1.11.6", "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", "@webassemblyjs/wasm-gen": "1.11.6", "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { "version": "1.11.6", "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { "version": "1.11.6", "dev": true, "license": "MIT", "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "dev": true, "license": "Apache-2.0" }, "node_modules/@zxing/browser": { "version": "0.1.4", "license": "MIT", "optionalDependencies": { "@zxing/text-encoding": "^0.9.0" }, "peerDependencies": { "@zxing/library": "^0.20.0" } }, "node_modules/@zxing/library": { "version": "0.20.0", "license": "MIT", "peer": true, "dependencies": { "ts-custom-error": "^3.2.1" }, "engines": { "node": ">= 10.4.0" }, "optionalDependencies": { "@zxing/text-encoding": "~0.9.0" } }, "node_modules/@zxing/text-encoding": { "version": "0.9.0", "license": "(Unlicense OR Apache-2.0)", "optional": true }, "node_modules/abab": { "version": "2.0.6", "dev": true, "license": "BSD-3-Clause" }, "node_modules/accepts": { "version": "1.3.8", "dev": true, "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" }, "engines": { "node": ">= 0.6" } }, "node_modules/acorn": { "version": "8.11.3", "license": "MIT", "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/acorn-globals": { "version": "7.0.1", "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.1.0", "acorn-walk": "^8.0.2" } }, "node_modules/acorn-import-assertions": { "version": "1.9.0", "dev": true, "license": "MIT", "peerDependencies": { "acorn": "^8" } }, "node_modules/acorn-jsx": { "version": "5.3.2", "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.3.2", "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/address": { "version": "1.2.2", "dev": true, "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "regex-parser": "^2.2.11" }, "engines": { "node": ">=8.9" } }, "node_modules/agent-base": { "version": "6.0.2", "dev": true, "license": "MIT", "dependencies": { "debug": "4" }, "engines": { "node": ">= 6.0.0" } }, "node_modules/ajv": { "version": "6.12.6", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ajv-formats": { "version": "2.1.1", "dev": true, "license": "MIT", "dependencies": { "ajv": "^8.0.0" }, "peerDependencies": { "ajv": "^8.0.0" }, "peerDependenciesMeta": { "ajv": { "optional": true } } }, "node_modules/ajv-formats/node_modules/ajv": { "version": "8.12.0", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", "dev": true, "license": "MIT" }, "node_modules/ajv-keywords": { "version": "3.5.2", "dev": true, "license": "MIT", "peerDependencies": { "ajv": "^6.9.1" } }, "node_modules/ansi-escapes": { "version": "4.3.2", "dev": true, "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-html-community": { "version": "0.0.8", "dev": true, "engines": [ "node >= 0.8.0" ], "license": "Apache-2.0", "bin": { "ansi-html": "bin/ansi-html" } }, "node_modules/ansi-regex": { "version": "5.0.1", "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "3.2.1", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/any-promise": { "version": "1.3.0", "dev": true, "license": "MIT" }, "node_modules/anymatch": { "version": "3.1.3", "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/arg": { "version": "5.0.2", "dev": true, "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", "dev": true, "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/aria-query": { "version": "5.1.3", "dev": true, "license": "Apache-2.0", "dependencies": { "deep-equal": "^2.0.5" } }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-flatten": { "version": "1.1.1", "dev": true, "license": "MIT" }, "node_modules/array-includes": { "version": "3.1.7", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-union": { "version": "2.1.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/array.prototype.filter": { "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.findlastindex": { "version": "1.2.4", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", "es-abstract": "^1.22.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flat": { "version": "1.3.2", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flatmap": { "version": "1.3.2", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.tosorted": { "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", "es-abstract": "^1.22.3", "es-errors": "^1.1.0", "es-shim-unscopables": "^1.0.2" } }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.5", "define-properties": "^1.2.1", "es-abstract": "^1.22.3", "es-errors": "^1.2.1", "get-intrinsic": "^1.2.3", "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/asap": { "version": "2.0.6", "dev": true, "license": "MIT" }, "node_modules/asn1.js": { "version": "5.4.1", "dev": true, "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "safer-buffer": "^2.1.0" } }, "node_modules/asn1.js/node_modules/bn.js": { "version": "4.12.0", "dev": true, "license": "MIT" }, "node_modules/assert": { "version": "2.1.0", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", "object-is": "^1.1.5", "object.assign": "^4.1.4", "util": "^0.12.5" } }, "node_modules/ast-types-flow": { "version": "0.0.8", "dev": true, "license": "MIT" }, "node_modules/async": { "version": "3.2.5", "dev": true, "license": "MIT" }, "node_modules/asynciterator.prototype": { "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" } }, "node_modules/asynckit": { "version": "0.4.0", "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", "dev": true, "license": "ISC", "engines": { "node": ">= 4.0.0" } }, "node_modules/autoprefixer": { "version": "10.4.17", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { "browserslist": "^4.22.2", "caniuse-lite": "^1.0.30001578", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" }, "bin": { "autoprefixer": "bin/autoprefixer" }, "engines": { "node": "^10 || ^12 || >=14" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/available-typed-arrays": { "version": "1.0.6", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/axe-core": { "version": "4.7.0", "dev": true, "license": "MPL-2.0", "engines": { "node": ">=4" } }, "node_modules/axios": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "node_modules/axobject-query": { "version": "3.2.1", "dev": true, "license": "Apache-2.0", "dependencies": { "dequal": "^2.0.3" } }, "node_modules/babel-jest": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "node_modules/babel-jest/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/babel-jest/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/babel-jest/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/babel-jest/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/babel-jest/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/babel-jest/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/babel-loader": { "version": "8.3.0", "dev": true, "license": "MIT", "dependencies": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "engines": { "node": ">= 8.9" }, "peerDependencies": { "@babel/core": "^7.0.0", "webpack": ">=2" } }, "node_modules/babel-loader/node_modules/schema-utils": { "version": "2.7.1", "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", "ajv-keywords": "^3.5.2" }, "engines": { "node": ">= 8.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/babel-plugin-macros": { "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", "resolve": "^1.19.0" }, "engines": { "node": ">=10", "npm": ">=6" } }, "node_modules/babel-plugin-named-asset-import": { "version": "0.3.8", "dev": true, "license": "MIT", "peerDependencies": { "@babel/core": "^7.1.0" } }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.8", "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.5.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.9.0", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.5.0", "core-js-compat": "^3.34.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.5.5", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.5.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-styled-components": { "version": "2.1.4", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", "@babel/plugin-syntax-jsx": "^7.22.5", "lodash": "^4.17.21", "picomatch": "^2.3.1" }, "peerDependencies": { "styled-components": ">= 2" } }, "node_modules/babel-plugin-transform-react-remove-prop-types": { "version": "0.4.24", "dev": true, "license": "MIT" }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/babel-preset-jest": { "version": "29.6.3", "dev": true, "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/babel-preset-react-app": { "version": "10.0.1", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.16.0", "@babel/plugin-proposal-class-properties": "^7.16.0", "@babel/plugin-proposal-decorators": "^7.16.4", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", "@babel/plugin-proposal-numeric-separator": "^7.16.0", "@babel/plugin-proposal-optional-chaining": "^7.16.0", "@babel/plugin-proposal-private-methods": "^7.16.0", "@babel/plugin-transform-flow-strip-types": "^7.16.0", "@babel/plugin-transform-react-display-name": "^7.16.0", "@babel/plugin-transform-runtime": "^7.16.4", "@babel/preset-env": "^7.16.4", "@babel/preset-react": "^7.16.0", "@babel/preset-typescript": "^7.16.0", "@babel/runtime": "^7.16.3", "babel-plugin-macros": "^3.1.0", "babel-plugin-transform-react-remove-prop-types": "^0.4.24" } }, "node_modules/balanced-match": { "version": "1.0.2", "license": "MIT" }, "node_modules/base-x": { "version": "3.0.9", "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } }, "node_modules/base64-js": { "version": "1.5.1", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "license": "MIT" }, "node_modules/batch": { "version": "0.6.1", "dev": true, "license": "MIT" }, "node_modules/bech32": { "version": "2.0.0", "license": "MIT" }, "node_modules/bfj": { "version": "7.1.0", "dev": true, "license": "MIT", "dependencies": { "bluebird": "^3.7.2", "check-types": "^11.2.3", "hoopy": "^0.1.4", "jsonpath": "^1.1.1", "tryer": "^1.0.1" }, "engines": { "node": ">= 8.0.0" } }, "node_modules/big-integer": { "version": "1.6.36", "license": "Unlicense", "engines": { "node": ">=0.6" } }, "node_modules/big.js": { "version": "5.2.2", "dev": true, "license": "MIT", "engines": { "node": "*" } }, "node_modules/bigi": { "version": "1.4.2" }, "node_modules/bignumber.js": { "version": "9.1.2", "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/bindings": { "version": "1.5.0", "license": "MIT", "dependencies": { "file-uri-to-path": "1.0.0" } }, "node_modules/bip174": { "name": "@bitgo-forks/bip174", "version": "3.1.0-master.4", "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/bip32": { "version": "3.1.0", "license": "MIT", "dependencies": { "bs58check": "^2.1.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "ripemd160": "^2.0.2", "typeforce": "^1.11.5", "wif": "^2.0.6" }, "engines": { "node": ">=6.0.0" } }, "node_modules/bip39": { "version": "3.1.0", "license": "ISC", "dependencies": { "@noble/hashes": "^1.2.0" } }, "node_modules/bip66": { "version": "1.1.5", "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } }, "node_modules/bitcoin-ops": { "version": "1.4.1", "license": "MIT" }, "node_modules/bitcoinjs-lib": { "name": "@bitgo-forks/bitcoinjs-lib", "version": "7.1.0-master.7", "license": "MIT", "dependencies": { "bech32": "^2.0.0", "bip174": "npm:@bitgo-forks/bip174@3.1.0-master.4", "bs58check": "^2.1.2", "create-hash": "^1.1.0", "fastpriorityqueue": "^0.7.1", "json5": "^2.2.3", "ripemd160": "^2.0.2", "typeforce": "^1.11.3", "varuint-bitcoin": "^1.1.2", "wif": "^2.0.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/bitcoinjs-message": { "version": "2.2.0", "license": "MIT", "dependencies": { "bech32": "^1.1.3", "bs58check": "^2.1.2", "buffer-equals": "^1.0.3", "create-hash": "^1.1.2", "secp256k1": "^3.0.1", "varuint-bitcoin": "^1.0.1" }, "engines": { "node": ">=0.10" } }, "node_modules/bitcoinjs-message/node_modules/bech32": { "version": "1.1.4", "license": "MIT" }, "node_modules/bluebird": { "version": "3.7.2", "dev": true, "license": "MIT" }, "node_modules/bn.js": { "version": "5.2.1", "license": "MIT" }, "node_modules/body-parser": { "version": "1.20.1", "dev": true, "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" }, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/bytes": { "version": "3.1.2", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" } }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "dev": true, "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } }, "node_modules/boolbase": { "version": "1.0.0", "dev": true, "license": "ISC" }, "node_modules/brace-expansion": { "version": "1.1.11", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { "version": "3.0.2", "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, "engines": { "node": ">=8" } }, "node_modules/brorand": { "version": "1.1.0", "license": "MIT" }, "node_modules/browserify-aes": { "version": "1.2.0", "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "node_modules/browserify-cipher": { "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", "evp_bytestokey": "^1.0.0" } }, "node_modules/browserify-des": { "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "node_modules/browserify-rsa": { "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { "bn.js": "^5.0.0", "randombytes": "^2.0.1" } }, "node_modules/browserify-sign": { "version": "4.2.2", "dev": true, "license": "ISC", "dependencies": { "bn.js": "^5.2.1", "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "elliptic": "^6.5.4", "inherits": "^2.0.4", "parse-asn1": "^5.1.6", "readable-stream": "^3.6.2", "safe-buffer": "^5.2.1" }, "engines": { "node": ">= 4" } }, "node_modules/browserslist": { "version": "4.22.3", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001580", "electron-to-chromium": "^1.4.648", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "node_modules/bs58": { "version": "4.0.1", "license": "MIT", "dependencies": { "base-x": "^3.0.2" } }, "node_modules/bs58check": { "version": "2.1.2", "license": "MIT", "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", "safe-buffer": "^5.1.2" } }, "node_modules/bser": { "version": "2.1.1", "dev": true, "license": "Apache-2.0", "dependencies": { "node-int64": "^0.4.0" } }, "node_modules/buffer": { "version": "6.0.3", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "node_modules/buffer-equals": { "version": "1.0.4", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/buffer-from": { "version": "1.1.2", "dev": true, "license": "MIT" }, "node_modules/buffer-xor": { "version": "1.0.3", "license": "MIT" }, "node_modules/builtin-modules": { "version": "3.3.0", "dev": true, "license": "MIT", "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bytes": { "version": "3.0.0", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/call-bind": { "version": "1.0.6", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.3", "set-function-length": "^1.2.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/callsites": { "version": "3.1.0", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camel-case": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "node_modules/camelcase": { "version": "6.3.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/camelcase-css": { "version": "2.0.1", "dev": true, "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/camelize": { "version": "1.0.1", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/caniuse-api": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.0.0", "caniuse-lite": "^1.0.0", "lodash.memoize": "^4.1.2", "lodash.uniq": "^4.5.0" } }, "node_modules/caniuse-lite": { "version": "1.0.30001585", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "CC-BY-4.0" }, "node_modules/case-sensitive-paths-webpack-plugin": { "version": "2.4.0", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/cashaddress": { "version": "1.1.0", "license": "MIT", "dependencies": { "bigi": "^1.4.2" } }, "node_modules/chalk": { "version": "2.4.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/char-regex": { "version": "1.0.2", "dev": true, "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/check-types": { "version": "11.2.3", "dev": true, "license": "MIT" }, "node_modules/chokidar": { "version": "3.6.0", "dev": true, "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "funding": { "url": "https://paulmillr.com/funding/" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/chrome-trace-event": { "version": "1.0.3", "dev": true, "license": "MIT", "engines": { "node": ">=6.0" } }, "node_modules/chronik-client": { "version": "0.26.1", "resolved": "https://registry.npmjs.org/chronik-client/-/chronik-client-0.26.1.tgz", "integrity": "sha512-zw+sf1itzPxPyJbDRmgvshveB5riSVgsHXUDP8DdMakPHeKzI8B547eTgero9TdotVk3t0Y6F9VTqk6bI9uD2A==", "dependencies": { "@types/ws": "^8.2.1", "axios": "^1.6.3", "ecashaddrjs": "^1.5.6", "isomorphic-ws": "^4.0.1", "protobufjs": "^6.8.8", "ws": "^8.3.0" } }, "node_modules/ci-info": { "version": "3.9.0", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/sibiraj-s" } ], "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/cipher-base": { "version": "1.0.4", "license": "MIT", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "node_modules/cjs-module-lexer": { "version": "1.2.3", "dev": true, "license": "MIT" }, "node_modules/clean-css": { "version": "5.3.3", "dev": true, "license": "MIT", "dependencies": { "source-map": "~0.6.0" }, "engines": { "node": ">= 10.0" } }, "node_modules/clean-css/node_modules/source-map": { "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/cliui": { "version": "8.0.1", "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/clsx": { "version": "2.1.0", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/co": { "version": "4.6.0", "dev": true, "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, "node_modules/collect-v8-coverage": { "version": "1.0.2", "dev": true, "license": "MIT" }, "node_modules/color-convert": { "version": "1.9.3", "dev": true, "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/color-name": { "version": "1.1.3", "dev": true, "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", "dev": true, "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", "dev": true, "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, "node_modules/commander": { "version": "8.3.0", "dev": true, "license": "MIT", "engines": { "node": ">= 12" } }, "node_modules/common-path-prefix": { "version": "3.0.0", "dev": true, "license": "ISC" }, "node_modules/common-tags": { "version": "1.8.2", "dev": true, "license": "MIT", "engines": { "node": ">=4.0.0" } }, "node_modules/commondir": { "version": "1.0.1", "dev": true, "license": "MIT" }, "node_modules/compressible": { "version": "2.0.18", "dev": true, "license": "MIT", "dependencies": { "mime-db": ">= 1.43.0 < 2" }, "engines": { "node": ">= 0.6" } }, "node_modules/compression": { "version": "1.7.4", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", "compressible": "~2.0.16", "debug": "2.6.9", "on-headers": "~1.0.2", "safe-buffer": "5.1.2", "vary": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/compression/node_modules/ms": { "version": "2.0.0", "dev": true, "license": "MIT" }, "node_modules/compression/node_modules/safe-buffer": { "version": "5.1.2", "dev": true, "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", "license": "MIT" }, "node_modules/confusing-browser-globals": { "version": "1.0.11", "dev": true, "license": "MIT" }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/content-disposition": { "version": "0.5.4", "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, "node_modules/content-type": { "version": "1.0.5", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "2.0.0", "dev": true, "license": "MIT" }, "node_modules/cookie": { "version": "0.5.0", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", "dev": true, "license": "MIT" }, "node_modules/core-js": { "version": "3.35.1", "dev": true, "hasInstallScript": true, "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-compat": { "version": "3.35.1", "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.22.2" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-js-pure": { "version": "3.35.1", "dev": true, "hasInstallScript": true, "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, "node_modules/core-util-is": { "version": "1.0.3", "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { "version": "7.1.0", "dev": true, "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" }, "engines": { "node": ">=10" } }, "node_modules/create-ecdh": { "version": "4.0.4", "dev": true, "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" } }, "node_modules/create-ecdh/node_modules/bn.js": { "version": "4.12.0", "dev": true, "license": "MIT" }, "node_modules/create-hash": { "version": "1.2.0", "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", "md5.js": "^1.3.4", "ripemd160": "^2.0.1", "sha.js": "^2.4.0" } }, "node_modules/create-hmac": { "version": "1.1.7", "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", "inherits": "^2.0.1", "ripemd160": "^2.0.0", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "node_modules/create-jest": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "prompts": "^2.0.1" }, "bin": { "create-jest": "bin/create-jest.js" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/create-jest/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/create-jest/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/create-jest/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/create-jest/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/create-jest/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/create-jest/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/cross-spawn": { "version": "7.0.3", "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/crypto-browserify": { "version": "3.12.0", "dev": true, "license": "MIT", "dependencies": { "browserify-cipher": "^1.0.0", "browserify-sign": "^4.0.0", "create-ecdh": "^4.0.0", "create-hash": "^1.1.0", "create-hmac": "^1.1.0", "diffie-hellman": "^5.0.0", "inherits": "^2.0.1", "pbkdf2": "^3.0.3", "public-encrypt": "^4.0.0", "randombytes": "^2.0.0", "randomfill": "^1.0.3" }, "engines": { "node": "*" } }, "node_modules/crypto-random-string": { "version": "2.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/css-blank-pseudo": { "version": "3.0.3", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, "bin": { "css-blank-pseudo": "dist/cli.cjs" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/css-color-keywords": { "version": "1.0.0", "dev": true, "license": "ISC", "engines": { "node": ">=4" } }, "node_modules/css-declaration-sorter": { "version": "6.4.1", "dev": true, "license": "ISC", "engines": { "node": "^10 || ^12 || >=14" }, "peerDependencies": { "postcss": "^8.0.9" } }, "node_modules/css-has-pseudo": { "version": "3.0.4", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, "bin": { "css-has-pseudo": "dist/cli.cjs" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/css-loader": { "version": "6.10.0", "dev": true, "license": "MIT", "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.33", "postcss-modules-extract-imports": "^3.0.0", "postcss-modules-local-by-default": "^4.0.4", "postcss-modules-scope": "^3.1.1", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", "semver": "^7.5.4" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" }, "peerDependenciesMeta": { "@rspack/core": { "optional": true }, "webpack": { "optional": true } } }, "node_modules/css-minimizer-webpack-plugin": { "version": "3.4.1", "dev": true, "license": "MIT", "dependencies": { "cssnano": "^5.0.6", "jest-worker": "^27.0.2", "postcss": "^8.3.5", "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^5.0.0" }, "peerDependenciesMeta": { "@parcel/css": { "optional": true }, "clean-css": { "optional": true }, "csso": { "optional": true }, "esbuild": { "optional": true } } }, "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { "version": "8.12.0", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { "version": "1.0.0", "dev": true, "license": "MIT" }, "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/css-prefers-color-scheme": { "version": "6.0.3", "dev": true, "license": "CC0-1.0", "bin": { "css-prefers-color-scheme": "dist/cli.cjs" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/css-select": { "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", "domhandler": "^4.3.1", "domutils": "^2.8.0", "nth-check": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, "node_modules/css-to-react-native": { "version": "2.3.2", "dev": true, "license": "MIT", "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", "postcss-value-parser": "^3.3.0" } }, "node_modules/css-to-react-native/node_modules/postcss-value-parser": { "version": "3.3.1", "dev": true, "license": "MIT" }, "node_modules/css-tree": { "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/css-tree/node_modules/source-map": { "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/css-what": { "version": "6.1.0", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, "funding": { "url": "https://github.com/sponsors/fb55" } }, "node_modules/css.escape": { "version": "1.5.1", "dev": true, "license": "MIT" }, "node_modules/cssdb": { "version": "7.10.0", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/csstools" }, { "type": "github", "url": "https://github.com/sponsors/csstools" } ], "license": "CC0-1.0" }, "node_modules/cssesc": { "version": "3.0.0", "dev": true, "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, "engines": { "node": ">=4" } }, "node_modules/cssnano": { "version": "5.1.15", "dev": true, "license": "MIT", "dependencies": { "cssnano-preset-default": "^5.2.14", "lilconfig": "^2.0.3", "yaml": "^1.10.2" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/cssnano" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/cssnano-preset-default": { "version": "5.2.14", "dev": true, "license": "MIT", "dependencies": { "css-declaration-sorter": "^6.3.1", "cssnano-utils": "^3.1.0", "postcss-calc": "^8.2.3", "postcss-colormin": "^5.3.1", "postcss-convert-values": "^5.1.3", "postcss-discard-comments": "^5.1.2", "postcss-discard-duplicates": "^5.1.0", "postcss-discard-empty": "^5.1.1", "postcss-discard-overridden": "^5.1.0", "postcss-merge-longhand": "^5.1.7", "postcss-merge-rules": "^5.1.4", "postcss-minify-font-values": "^5.1.0", "postcss-minify-gradients": "^5.1.1", "postcss-minify-params": "^5.1.4", "postcss-minify-selectors": "^5.2.1", "postcss-normalize-charset": "^5.1.0", "postcss-normalize-display-values": "^5.1.0", "postcss-normalize-positions": "^5.1.1", "postcss-normalize-repeat-style": "^5.1.1", "postcss-normalize-string": "^5.1.0", "postcss-normalize-timing-functions": "^5.1.0", "postcss-normalize-unicode": "^5.1.1", "postcss-normalize-url": "^5.1.0", "postcss-normalize-whitespace": "^5.1.1", "postcss-ordered-values": "^5.1.3", "postcss-reduce-initial": "^5.1.2", "postcss-reduce-transforms": "^5.1.0", "postcss-svgo": "^5.1.0", "postcss-unique-selectors": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/cssnano-utils": { "version": "3.1.0", "dev": true, "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/csso": { "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { "css-tree": "^1.1.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/cssom": { "version": "0.5.0", "dev": true, "license": "MIT" }, "node_modules/cssstyle": { "version": "2.3.0", "dev": true, "license": "MIT", "dependencies": { "cssom": "~0.3.6" }, "engines": { "node": ">=8" } }, "node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "dev": true, "license": "MIT" }, "node_modules/csstype": { "version": "3.1.3", "dev": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "dev": true, "license": "BSD-2-Clause" }, "node_modules/data-urls": { "version": "3.0.2", "dev": true, "license": "MIT", "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^11.0.0" }, "engines": { "node": ">=12" } }, "node_modules/debug": { "version": "4.3.4", "license": "MIT", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/decimal.js": { "version": "10.4.3", "dev": true, "license": "MIT" }, "node_modules/dedent": { "version": "1.5.1", "dev": true, "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "peerDependenciesMeta": { "babel-plugin-macros": { "optional": true } } }, "node_modules/deep-equal": { "version": "2.2.3", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.5", "es-get-iterator": "^1.1.3", "get-intrinsic": "^1.2.2", "is-arguments": "^1.1.1", "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "isarray": "^2.0.5", "object-is": "^1.1.5", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.1", "side-channel": "^1.0.4", "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/deep-is": { "version": "0.1.4", "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/default-gateway": { "version": "6.0.3", "dev": true, "license": "BSD-2-Clause", "dependencies": { "execa": "^5.0.0" }, "engines": { "node": ">= 10" } }, "node_modules/define-data-property": { "version": "1.1.2", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/define-lazy-prop": { "version": "2.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/define-properties": { "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/delayed-stream": { "version": "1.0.0", "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/depd": { "version": "2.0.0", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/dequal": { "version": "2.0.3", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/des.js": { "version": "1.1.0", "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "node_modules/destroy": { "version": "1.2.0", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/detect-newline": { "version": "3.1.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/detect-node": { "version": "2.1.0", "dev": true, "license": "MIT" }, "node_modules/detect-port-alt": { "version": "1.1.6", "dev": true, "license": "MIT", "dependencies": { "address": "^1.0.1", "debug": "^2.6.0" }, "bin": { "detect": "bin/detect-port", "detect-port": "bin/detect-port" }, "engines": { "node": ">= 4.2.1" } }, "node_modules/detect-port-alt/node_modules/debug": { "version": "2.6.9", "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/detect-port-alt/node_modules/ms": { "version": "2.0.0", "dev": true, "license": "MIT" }, "node_modules/didyoumean": { "version": "1.2.2", "dev": true, "license": "Apache-2.0" }, "node_modules/diff-sequences": { "version": "29.6.3", "dev": true, "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/diffie-hellman": { "version": "5.0.3", "dev": true, "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" } }, "node_modules/diffie-hellman/node_modules/bn.js": { "version": "4.12.0", "dev": true, "license": "MIT" }, "node_modules/dir-glob": { "version": "3.0.1", "dev": true, "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/dlv": { "version": "1.1.3", "dev": true, "license": "MIT" }, "node_modules/dns-packet": { "version": "5.6.1", "dev": true, "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, "engines": { "node": ">=6" } }, "node_modules/doctrine": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=6.0.0" } }, "node_modules/dom-accessibility-api": { "version": "0.5.16", "dev": true, "license": "MIT" }, "node_modules/dom-converter": { "version": "0.2.0", "dev": true, "license": "MIT", "dependencies": { "utila": "~0.4" } }, "node_modules/dom-serializer": { "version": "1.4.1", "dev": true, "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, "node_modules/dom-serializer/node_modules/entities": { "version": "2.2.0", "dev": true, "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/domelementtype": { "version": "2.3.0", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } ], "license": "BSD-2-Clause" }, "node_modules/domexception": { "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { "webidl-conversions": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/domhandler": { "version": "4.3.1", "dev": true, "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.2.0" }, "engines": { "node": ">= 4" }, "funding": { "url": "https://github.com/fb55/domhandler?sponsor=1" } }, "node_modules/domutils": { "version": "2.8.0", "dev": true, "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/dot-case": { "version": "3.0.4", "dev": true, "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/dotenv": { "version": "10.0.0", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=10" } }, "node_modules/dotenv-expand": { "version": "5.1.0", "dev": true, "license": "BSD-2-Clause" }, "node_modules/drbg.js": { "version": "1.0.1", "license": "MIT", "dependencies": { "browserify-aes": "^1.0.6", "create-hash": "^1.1.2", "create-hmac": "^1.1.4" }, "engines": { "node": ">=0.10" } }, "node_modules/duplexer": { "version": "0.1.2", "dev": true, "license": "MIT" }, "node_modules/eastasianwidth": { "version": "0.2.0", "dev": true, "license": "MIT" }, "node_modules/ecash-coinselect": { "version": "2.2.0", "license": "MIT", "dependencies": { "eslint-plugin-header": "^3.1.1", "mocha-suppress-logs": "^0.3.1" } }, "node_modules/ecash-script": { "version": "2.1.2", "license": "MIT" }, "node_modules/ecashaddrjs": { "version": "1.5.6", "license": "MIT", "dependencies": { "big-integer": "1.6.36", "bs58check": "^3.0.1" } }, "node_modules/ecashaddrjs/node_modules/base-x": { "version": "4.0.0", "license": "MIT" }, "node_modules/ecashaddrjs/node_modules/bs58": { "version": "5.0.0", "license": "MIT", "dependencies": { "base-x": "^4.0.0" } }, "node_modules/ecashaddrjs/node_modules/bs58check": { "version": "3.0.1", "license": "MIT", "dependencies": { "@noble/hashes": "^1.2.0", "bs58": "^5.0.0" } }, "node_modules/ecpair": { "name": "@bitgo/ecpair", "version": "2.1.0-rc.0", "license": "MIT", "dependencies": { "randombytes": "^2.1.0", "typeforce": "^1.18.0", "wif": "^2.0.6" }, "engines": { "node": ">=8.0.0" } }, "node_modules/ee-first": { "version": "1.1.1", "dev": true, "license": "MIT" }, "node_modules/ejs": { "version": "3.1.9", "dev": true, "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" }, "engines": { "node": ">=0.10.0" } }, "node_modules/electron-to-chromium": { "version": "1.4.664", "dev": true, "license": "ISC" }, "node_modules/elliptic": { "version": "6.5.4", "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", "license": "MIT" }, "node_modules/emittery": { "version": "0.13.1", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, "node_modules/emoji-regex": { "version": "9.2.2", "dev": true, "license": "MIT" }, "node_modules/emojis-list": { "version": "3.0.0", "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/encodeurl": { "version": "1.0.2", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/enhanced-resolve": { "version": "5.15.0", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" }, "engines": { "node": ">=10.13.0" } }, "node_modules/entities": { "version": "4.5.0", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/error-ex": { "version": "1.3.2", "dev": true, "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/error-stack-parser": { "version": "2.1.4", "dev": true, "license": "MIT", "dependencies": { "stackframe": "^1.3.4" } }, "node_modules/es-abstract": { "version": "1.22.3", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.1", "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", "typed-array-buffer": "^1.0.0", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-array-method-boxes-properly": { "version": "1.0.0", "dev": true, "license": "MIT" }, "node_modules/es-errors": { "version": "1.3.0", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-get-iterator": { "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "is-arguments": "^1.1.1", "is-map": "^2.0.2", "is-set": "^2.0.2", "is-string": "^1.0.7", "isarray": "^2.0.5", "stop-iteration-iterator": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-iterator-helpers": { "version": "1.0.15", "dev": true, "license": "MIT", "dependencies": { "asynciterator.prototype": "^1.0.0", "call-bind": "^1.0.2", "define-properties": "^1.2.1", "es-abstract": "^1.22.1", "es-set-tostringtag": "^2.0.1", "function-bind": "^1.1.1", "get-intrinsic": "^1.2.1", "globalthis": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "iterator.prototype": "^1.1.2", "safe-array-concat": "^1.0.1" } }, "node_modules/es-module-lexer": { "version": "1.4.1", "dev": true, "license": "MIT" }, "node_modules/es-set-tostringtag": { "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.2", "has-tostringtag": "^1.0.0", "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/escalade": { "version": "3.1.2", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", "dev": true, "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "1.0.5", "dev": true, "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/escodegen": { "version": "2.1.0", "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", "esgenerate": "bin/esgenerate.js" }, "engines": { "node": ">=6.0" }, "optionalDependencies": { "source-map": "~0.6.1" } }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/eslint": { "version": "8.56.0", "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-config-react-app": { "version": "7.0.1", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.16.0", "@babel/eslint-parser": "^7.16.3", "@rushstack/eslint-patch": "^1.1.0", "@typescript-eslint/eslint-plugin": "^5.5.0", "@typescript-eslint/parser": "^5.5.0", "babel-preset-react-app": "^10.0.1", "confusing-browser-globals": "^1.0.11", "eslint-plugin-flowtype": "^8.0.3", "eslint-plugin-import": "^2.25.3", "eslint-plugin-jest": "^25.3.0", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-react": "^7.27.1", "eslint-plugin-react-hooks": "^4.3.0", "eslint-plugin-testing-library": "^5.0.1" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "eslint": "^8.0.0" } }, "node_modules/eslint-config-react-app/node_modules/eslint-plugin-testing-library": { "version": "5.11.1", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^5.58.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0", "npm": ">=6" }, "peerDependencies": { "eslint": "^7.5.0 || ^8.0.0" } }, "node_modules/eslint-etc": { "version": "5.2.1", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "^5.0.0", "tsutils": "^3.17.1", "tsutils-etc": "^1.4.1" }, "peerDependencies": { "eslint": "^8.0.0", "typescript": ">=4.0.0" } }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { "version": "2.8.0", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7" }, "engines": { "node": ">=4" }, "peerDependenciesMeta": { "eslint": { "optional": true } } }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-etc": { "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { "@phenomnomnominal/tsquery": "^4.0.0", "@typescript-eslint/experimental-utils": "^5.0.0", "eslint-etc": "^5.1.0", "requireindex": "~1.2.0", "tslib": "^2.0.0", "tsutils": "^3.0.0" }, "peerDependencies": { "eslint": "^8.0.0", "typescript": "^4.0.0" } }, "node_modules/eslint-plugin-flowtype": { "version": "8.0.3", "dev": true, "license": "BSD-3-Clause", "dependencies": { "lodash": "^4.17.21", "string-natural-compare": "^3.0.1" }, "engines": { "node": ">=12.0.0" }, "peerDependencies": { "@babel/plugin-syntax-flow": "^7.14.5", "@babel/plugin-transform-react-jsx": "^7.14.9", "eslint": "^8.1.0" } }, "node_modules/eslint-plugin-header": { "version": "3.1.1", "license": "MIT", "peerDependencies": { "eslint": ">=7.7.0" } }, "node_modules/eslint-plugin-import": { "version": "2.29.1", "dev": true, "license": "MIT", "dependencies": { "array-includes": "^3.1.7", "array.prototype.findlastindex": "^1.2.3", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", "hasown": "^2.0.0", "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.7", "object.groupby": "^1.0.1", "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-jest": { "version": "25.7.0", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "^5.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { "optional": true }, "jest": { "optional": true } } }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.8.0", "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2", "aria-query": "^5.3.0", "array-includes": "^3.1.7", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "=4.7.0", "axobject-query": "^3.2.1", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "es-iterator-helpers": "^1.0.15", "hasown": "^2.0.0", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.entries": "^1.1.7", "object.fromentries": "^2.0.7" }, "engines": { "node": ">=4.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { "version": "5.3.0", "dev": true, "license": "Apache-2.0", "dependencies": { "dequal": "^2.0.3" } }, "node_modules/eslint-plugin-react": { "version": "7.33.2", "dev": true, "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.6", "object.fromentries": "^2.0.6", "object.hasown": "^1.1.2", "object.values": "^1.1.6", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.4", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.8" }, "engines": { "node": ">=4" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "node_modules/eslint-plugin-react-hooks": { "version": "4.6.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/eslint-plugin-react/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/eslint-plugin-testing-library": { "version": "6.2.0", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^5.58.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0", "npm": ">=6" }, "peerDependencies": { "eslint": "^7.5.0 || ^8.0.0" } }, "node_modules/eslint-scope": { "version": "7.2.2", "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-webpack-plugin": { "version": "3.2.0", "dev": true, "license": "MIT", "dependencies": { "@types/eslint": "^7.29.0 || ^8.4.1", "jest-worker": "^28.0.2", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "schema-utils": "^4.0.0" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0", "webpack": "^5.0.0" } }, "node_modules/eslint-webpack-plugin/node_modules/ajv": { "version": "8.12.0", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "node_modules/eslint-webpack-plugin/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { "version": "28.1.3", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { "version": "1.0.0", "dev": true, "license": "MIT" }, "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, "node_modules/eslint-webpack-plugin/node_modules/supports-color": { "version": "8.1.1", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/eslint/node_modules/argparse": { "version": "2.0.1", "license": "Python-2.0" }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/eslint/node_modules/color-convert": { "version": "2.0.1", "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", "license": "MIT" }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/globals": { "version": "13.24.0", "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/eslint/node_modules/js-yaml": { "version": "4.1.0", "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/espree": { "version": "9.6.1", "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { "version": "4.0.1", "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, "node_modules/esquery": { "version": "1.5.0", "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, "engines": { "node": ">=0.10" } }, "node_modules/esrecurse": { "version": "4.3.0", "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "5.3.0", "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { "version": "1.0.1", "dev": true, "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/etag": { "version": "1.8.1", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/eventemitter3": { "version": "4.0.7", "dev": true, "license": "MIT" }, "node_modules/events": { "version": "3.3.0", "dev": true, "license": "MIT", "engines": { "node": ">=0.8.x" } }, "node_modules/evp_bytestokey": { "version": "1.0.3", "license": "MIT", "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "node_modules/execa": { "version": "5.1.1", "dev": true, "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/exit": { "version": "0.1.2", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/expect": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/express": { "version": "4.18.2", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", "serve-static": "1.15.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.10.0" } }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "dev": true, "license": "MIT" }, "node_modules/extensionizer": { "version": "1.0.1", "dev": true, "license": "ISC" }, "node_modules/fake-indexeddb": { "version": "5.0.2", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "license": "MIT" }, "node_modules/fastpriorityqueue": { "version": "0.7.4", "license": "Apache-2.0" }, "node_modules/fastq": { "version": "1.17.1", "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/faye-websocket": { "version": "0.11.4", "dev": true, "license": "Apache-2.0", "dependencies": { "websocket-driver": ">=0.5.1" }, "engines": { "node": ">=0.8.0" } }, "node_modules/fb-watchman": { "version": "2.0.2", "dev": true, "license": "Apache-2.0", "dependencies": { "bser": "2.1.1" } }, "node_modules/file-entry-cache": { "version": "6.0.1", "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/file-loader": { "version": "6.2.0", "dev": true, "license": "MIT", "dependencies": { "loader-utils": "^2.0.0", "schema-utils": "^3.0.0" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/file-uri-to-path": { "version": "1.0.0", "license": "MIT" }, "node_modules/filelist": { "version": "1.0.4", "dev": true, "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } }, "node_modules/filelist/node_modules/brace-expansion": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" } }, "node_modules/filesize": { "version": "8.0.7", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 0.4.0" } }, "node_modules/fill-range": { "version": "7.0.1", "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/finalhandler": { "version": "1.2.0", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "dev": true, "license": "MIT" }, "node_modules/find-cache-dir": { "version": "3.3.2", "dev": true, "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, "node_modules/find-up": { "version": "5.0.0", "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { "version": "3.2.0", "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { "version": "3.2.9", "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.6", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], "license": "MIT", "engines": { "node": ">=4.0" }, "peerDependenciesMeta": { "debug": { "optional": true } } }, "node_modules/for-each": { "version": "0.3.3", "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { "version": "3.1.1", "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/foreground-child/node_modules/signal-exit": { "version": "4.1.0", "dev": true, "license": "ISC", "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.3", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", "chalk": "^4.1.0", "chokidar": "^3.4.2", "cosmiconfig": "^6.0.0", "deepmerge": "^4.2.2", "fs-extra": "^9.0.0", "glob": "^7.1.6", "memfs": "^3.1.2", "minimatch": "^3.0.4", "schema-utils": "2.7.0", "semver": "^7.3.2", "tapable": "^1.0.0" }, "engines": { "node": ">=10", "yarn": ">=1.0.0" }, "peerDependencies": { "eslint": ">= 6", "typescript": ">= 2.7", "vue-template-compiler": "*", "webpack": ">= 4" }, "peerDependenciesMeta": { "eslint": { "optional": true }, "vue-template-compiler": { "optional": true } } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { "version": "6.0.0", "dev": true, "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.1.0", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.7.2" }, "engines": { "node": ">=8" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { "version": "9.1.0", "dev": true, "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.4", "ajv": "^6.12.2", "ajv-keywords": "^3.4.1" }, "engines": { "node": ">= 8.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { "version": "1.1.3", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/form-data": { "version": "4.0.0", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" } }, "node_modules/forwarded": { "version": "0.2.0", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fraction.js": { "version": "4.3.7", "dev": true, "license": "MIT", "engines": { "node": "*" }, "funding": { "type": "patreon", "url": "https://github.com/sponsors/rawify" } }, "node_modules/fresh": { "version": "0.5.2", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fs-extra": { "version": "10.1.0", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { "node": ">=12" } }, "node_modules/fs-monkey": { "version": "1.0.5", "dev": true, "license": "Unlicense" }, "node_modules/fs.realpath": { "version": "1.0.0", "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.2", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { "version": "1.1.6", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functions-have-names": { "version": "1.2.3", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.2.4", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-own-enumerable-property-symbols": { "version": "3.0.2", "dev": true, "license": "ISC" }, "node_modules/get-package-type": { "version": "0.1.0", "dev": true, "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-stream": { "version": "6.0.1", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/glob": { "version": "7.2.3", "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { "version": "6.0.2", "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, "engines": { "node": ">=10.13.0" } }, "node_modules/glob-to-regexp": { "version": "0.4.1", "dev": true, "license": "BSD-2-Clause" }, "node_modules/global-modules": { "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/global-prefix": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", "which": "^1.3.1" }, "engines": { "node": ">=6" } }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "bin/which" } }, "node_modules/globals": { "version": "11.12.0", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/globalthis": { "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/globby": { "version": "11.1.0", "dev": true, "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/gopd": { "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { "version": "4.2.11", "dev": true, "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", "license": "MIT" }, "node_modules/gzip-size": { "version": "6.0.0", "dev": true, "license": "MIT", "dependencies": { "duplexer": "^0.1.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/handle-thing": { "version": "2.0.1", "dev": true, "license": "MIT" }, "node_modules/harmony-reflect": { "version": "1.6.2", "dev": true, "license": "(Apache-2.0 OR MPL-1.1)" }, "node_modules/has-bigints": { "version": "1.0.2", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "3.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/has-property-descriptors": { "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { "version": "1.0.1", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { "version": "1.0.3", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-tostringtag": { "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/hash-base": { "version": "3.1.0", "license": "MIT", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" }, "engines": { "node": ">=4" } }, "node_modules/hash.js": { "version": "1.1.7", "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "node_modules/hasown": { "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/he": { "version": "1.2.0", "dev": true, "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/hmac-drbg": { "version": "1.0.1", "license": "MIT", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "node_modules/hoopy": { "version": "0.1.4", "dev": true, "license": "MIT", "engines": { "node": ">= 6.0.0" } }, "node_modules/hpack.js": { "version": "2.1.6", "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", "readable-stream": "^2.0.1", "wbuf": "^1.1.0" } }, "node_modules/hpack.js/node_modules/isarray": { "version": "1.0.0", "dev": true, "license": "MIT" }, "node_modules/hpack.js/node_modules/readable-stream": { "version": "2.3.8", "dev": true, "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "node_modules/hpack.js/node_modules/safe-buffer": { "version": "5.1.2", "dev": true, "license": "MIT" }, "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "whatwg-encoding": "^2.0.0" }, "engines": { "node": ">=12" } }, "node_modules/html-entities": { "version": "2.4.0", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/mdevils" }, { "type": "patreon", "url": "https://patreon.com/mdevils" } ], "license": "MIT" }, "node_modules/html-escaper": { "version": "2.0.2", "dev": true, "license": "MIT" }, "node_modules/html-minifier-terser": { "version": "6.1.0", "dev": true, "license": "MIT", "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", "commander": "^8.3.0", "he": "^1.2.0", "param-case": "^3.0.4", "relateurl": "^0.2.7", "terser": "^5.10.0" }, "bin": { "html-minifier-terser": "cli.js" }, "engines": { "node": ">=12" } }, "node_modules/html-webpack-plugin": { "version": "5.6.0", "dev": true, "license": "MIT", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", "lodash": "^4.17.21", "pretty-error": "^4.0.0", "tapable": "^2.0.0" }, "engines": { "node": ">=10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" }, "peerDependenciesMeta": { "@rspack/core": { "optional": true }, "webpack": { "optional": true } } }, "node_modules/htmlparser2": { "version": "6.1.0", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { "type": "github", "url": "https://github.com/sponsors/fb55" } ], "license": "MIT", "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", "domutils": "^2.5.2", "entities": "^2.0.0" } }, "node_modules/htmlparser2/node_modules/entities": { "version": "2.2.0", "dev": true, "license": "BSD-2-Clause", "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/http-deceiver": { "version": "1.2.7", "dev": true, "license": "MIT" }, "node_modules/http-errors": { "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { "node": ">= 0.8" } }, "node_modules/http-parser-js": { "version": "0.5.8", "dev": true, "license": "MIT" }, "node_modules/http-proxy": { "version": "1.18.1", "dev": true, "license": "MIT", "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/http-proxy-agent": { "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" }, "engines": { "node": ">= 6" } }, "node_modules/http-proxy-middleware": { "version": "2.0.6", "dev": true, "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", "micromatch": "^4.0.2" }, "engines": { "node": ">=12.0.0" }, "peerDependencies": { "@types/express": "^4.17.13" }, "peerDependenciesMeta": { "@types/express": { "optional": true } } }, "node_modules/https-proxy-agent": { "version": "5.0.1", "dev": true, "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" }, "engines": { "node": ">= 6" } }, "node_modules/human-signals": { "version": "2.1.0", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/iconv-lite": { "version": "0.6.3", "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/icss-utils": { "version": "5.1.0", "dev": true, "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/idb": { "version": "7.1.1", "dev": true, "license": "ISC" }, "node_modules/identity-obj-proxy": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "harmony-reflect": "^1.4.6" }, "engines": { "node": ">=4" } }, "node_modules/ieee754": { "version": "1.2.1", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.1", "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immediate": { "version": "3.0.6", "license": "MIT" }, "node_modules/immer": { "version": "9.0.21", "dev": true, "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" } }, "node_modules/import-fresh": { "version": "3.3.0", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/import-local": { "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { "version": "0.1.4", "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/inflight": { "version": "1.0.6", "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { "version": "2.0.4", "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", "dev": true, "license": "ISC" }, "node_modules/internal-slot": { "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/ipaddr.js": { "version": "2.1.0", "dev": true, "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/is-arguments": { "version": "1.1.1", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-array-buffer": { "version": "3.0.4", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-arrayish": { "version": "0.2.1", "dev": true, "license": "MIT" }, "node_modules/is-async-function": { "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-bigint": { "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-binary-path": { "version": "2.1.0", "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/is-boolean-object": { "version": "1.1.2", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-callable": { "version": "1.2.7", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-core-module": { "version": "2.13.1", "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { "version": "1.0.5", "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-docker": { "version": "2.2.1", "dev": true, "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-extglob": { "version": "2.1.1", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-finalizationregistry": { "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-fn": { "version": "2.1.0", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-generator-function": { "version": "1.0.10", "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-glob": { "version": "4.0.3", "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-map": { "version": "2.0.2", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-module": { "version": "1.0.0", "dev": true, "license": "MIT" }, "node_modules/is-nan": { "version": "1.3.2", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-negative-zero": { "version": "2.0.2", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-number": { "version": "7.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-obj": { "version": "1.0.1", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-path-inside": { "version": "3.0.3", "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "3.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "dev": true, "license": "MIT" }, "node_modules/is-regex": { "version": "1.1.4", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-regexp": { "version": "1.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-root": { "version": "2.1.0", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-set": { "version": "2.0.2", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-stream": { "version": "2.0.1", "dev": true, "license": "MIT", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-symbol": { "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-typed-array": { "version": "1.1.13", "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakmap": { "version": "2.0.1", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakref": { "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-what": { "version": "3.14.1", "dev": true, "license": "MIT" }, "node_modules/is-wsl": { "version": "2.2.0", "dev": true, "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/isarray": { "version": "2.0.5", "dev": true, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", "license": "ISC" }, "node_modules/isomorphic-ws": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", "peerDependencies": { "ws": "*" } }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "5.2.1", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "dev": true, "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" } }, "node_modules/istanbul-lib-report/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { "semver": "^7.5.3" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "dev": true, "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "engines": { "node": ">=10" } }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-reports": { "version": "3.1.6", "dev": true, "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/iterator.prototype": { "version": "1.1.2", "dev": true, "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "reflect.getprototypeof": "^1.0.4", "set-function-name": "^2.0.1" } }, "node_modules/jackspeak": { "version": "2.3.6", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jake": { "version": "10.8.7", "dev": true, "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.4", "minimatch": "^3.1.2" }, "bin": { "jake": "bin/cli.js" }, "engines": { "node": ">=10" } }, "node_modules/jake/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jake/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jake/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jake/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jake/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jake/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/jest-changed-files": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.7.0", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0", "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-circus/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-circus/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-circus/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-circus/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-circus/node_modules/pretty-format": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-circus/node_modules/react-is": { "version": "18.2.0", "dev": true, "license": "MIT" }, "node_modules/jest-circus/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-cli": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", "create-jest": "^29.7.0", "exit": "^0.1.2", "import-local": "^3.0.2", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/jest-cli/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-cli/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-cli/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-cli/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-cli/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-cli/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-config": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-circus": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-runner": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@types/node": "*", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, "ts-node": { "optional": true } } }, "node_modules/jest-config/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-config/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-config/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-config/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-config/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-config/node_modules/pretty-format": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-config/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-config/node_modules/react-is": { "version": "18.2.0", "dev": true, "license": "MIT" }, "node_modules/jest-config/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-diff": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-diff/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-diff/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-diff/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-diff/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-diff/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-diff/node_modules/pretty-format": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-diff/node_modules/react-is": { "version": "18.2.0", "dev": true, "license": "MIT" }, "node_modules/jest-diff/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-docblock": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "jest-util": "^29.7.0", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-each/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-each/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-each/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-each/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-each/node_modules/pretty-format": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-each/node_modules/react-is": { "version": "18.2.0", "dev": true, "license": "MIT" }, "node_modules/jest-each/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-environment-jsdom": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0", "jsdom": "^20.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "canvas": "^2.5.0" }, "peerDependenciesMeta": { "canvas": { "optional": true } } }, "node_modules/jest-environment-node": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { "version": "29.6.3", "dev": true, "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-haste-map/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-haste-map/node_modules/jest-worker": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map/node_modules/supports-color": { "version": "8.1.1", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/jest-junit": { "version": "16.0.0", "dev": true, "license": "Apache-2.0", "dependencies": { "mkdirp": "^1.0.4", "strip-ansi": "^6.0.1", "uuid": "^8.3.2", "xml": "^1.0.1" }, "engines": { "node": ">=10.12.0" } }, "node_modules/jest-leak-detector": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-leak-detector/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-leak-detector/node_modules/pretty-format": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-leak-detector/node_modules/react-is": { "version": "18.2.0", "dev": true, "license": "MIT" }, "node_modules/jest-matcher-utils": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-matcher-utils/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-matcher-utils/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-matcher-utils/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-matcher-utils/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-matcher-utils/node_modules/react-is": { "version": "18.2.0", "dev": true, "license": "MIT" }, "node_modules/jest-matcher-utils/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-message-util": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-message-util/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-message-util/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-message-util/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-message-util/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-message-util/node_modules/pretty-format": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-message-util/node_modules/react-is": { "version": "18.2.0", "dev": true, "license": "MIT" }, "node_modules/jest-message-util/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-mock": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "dev": true, "license": "MIT", "engines": { "node": ">=6" }, "peerDependencies": { "jest-resolve": "*" }, "peerDependenciesMeta": { "jest-resolve": { "optional": true } } }, "node_modules/jest-regex-util": { "version": "29.6.3", "dev": true, "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-resolve/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-resolve/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-resolve/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-resolve/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-resolve/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-runner": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-leak-detector": "^29.7.0", "jest-message-util": "^29.7.0", "jest-resolve": "^29.7.0", "jest-runtime": "^29.7.0", "jest-util": "^29.7.0", "jest-watcher": "^29.7.0", "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-runner/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-runner/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-runner/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-runner/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-runner/node_modules/jest-worker": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/jest-runner/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-runtime": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runtime/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-runtime/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-runtime/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-runtime/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-runtime/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-runtime/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-snapshot": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", "@jest/expect-utils": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^29.7.0", "graceful-fs": "^4.2.9", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "natural-compare": "^1.4.0", "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-snapshot/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-snapshot/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-snapshot/node_modules/pretty-format": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-snapshot/node_modules/react-is": { "version": "18.2.0", "dev": true, "license": "MIT" }, "node_modules/jest-snapshot/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-util": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-util/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-util/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-util/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-util/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-util/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-util/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-validate": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-validate/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-validate/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-validate/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-validate/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-validate/node_modules/pretty-format": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-validate/node_modules/react-is": { "version": "18.2.0", "dev": true, "license": "MIT" }, "node_modules/jest-validate/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-watch-typeahead": { "version": "2.2.2", "dev": true, "license": "MIT", "dependencies": { "ansi-escapes": "^6.0.0", "chalk": "^5.2.0", "jest-regex-util": "^29.0.0", "jest-watcher": "^29.0.0", "slash": "^5.0.0", "string-length": "^5.0.1", "strip-ansi": "^7.0.1" }, "engines": { "node": "^14.17.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "jest": "^27.0.0 || ^28.0.0 || ^29.0.0" } }, "node_modules/jest-watch-typeahead/node_modules/ansi-escapes": { "version": "6.2.0", "dev": true, "license": "MIT", "dependencies": { "type-fest": "^3.0.0" }, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { "version": "6.0.1", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/jest-watch-typeahead/node_modules/chalk": { "version": "5.3.0", "dev": true, "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-watch-typeahead/node_modules/char-regex": { "version": "2.0.1", "dev": true, "license": "MIT", "engines": { "node": ">=12.20" } }, "node_modules/jest-watch-typeahead/node_modules/slash": { "version": "5.1.0", "dev": true, "license": "MIT", "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-watch-typeahead/node_modules/string-length": { "version": "5.0.1", "dev": true, "license": "MIT", "dependencies": { "char-regex": "^2.0.0", "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { "version": "7.1.0", "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/jest-watch-typeahead/node_modules/type-fest": { "version": "3.13.1", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-watcher": { "version": "29.7.0", "dev": true, "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-watcher/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/jest-watcher/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/jest-watcher/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/jest-watcher/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/jest-watcher/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-watcher/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/jest-when": { "version": "3.6.0", "dev": true, "license": "MIT", "peerDependencies": { "jest": ">= 25" } }, "node_modules/jest-worker": { "version": "27.5.1", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": ">= 10.13.0" } }, "node_modules/jest-worker/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/jiti": { "version": "1.21.0", "dev": true, "license": "MIT", "bin": { "jiti": "bin/jiti.js" } }, + "node_modules/js-sha256": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.11.0.tgz", + "integrity": "sha512-6xNlKayMZvds9h1Y1VWc0fQHQ82BxTXizWPEtEeGvmOUYpBRy4gbWroHLpzowe6xiQhHpelCQiE7HEdznyBL9Q==" + }, "node_modules/js-tokens": { "version": "4.0.0", "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", "dev": true, "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsdom": { "version": "20.0.3", "dev": true, "license": "MIT", "dependencies": { "abab": "^2.0.6", "acorn": "^8.8.1", "acorn-globals": "^7.0.0", "cssom": "^0.5.0", "cssstyle": "^2.3.0", "data-urls": "^3.0.2", "decimal.js": "^10.4.2", "domexception": "^4.0.0", "escodegen": "^2.0.0", "form-data": "^4.0.0", "html-encoding-sniffer": "^3.0.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.1", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.2", "parse5": "^7.1.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^4.1.2", "w3c-xmlserializer": "^4.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^2.0.0", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^11.0.0", "ws": "^8.11.0", "xml-name-validator": "^4.0.0" }, "engines": { "node": ">=14" }, "peerDependencies": { "canvas": "^2.5.0" }, "peerDependenciesMeta": { "canvas": { "optional": true } } }, "node_modules/jsesc": { "version": "2.5.2", "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { "node": ">=4" } }, "node_modules/json-buffer": { "version": "3.0.1", "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, "license": "MIT" }, "node_modules/json-schema": { "version": "0.4.0", "dev": true, "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", "license": "MIT", "bin": { "json5": "lib/cli.js" }, "engines": { "node": ">=6" } }, "node_modules/jsonfile": { "version": "6.1.0", "dev": true, "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/jsonpath": { "version": "1.1.1", "dev": true, "license": "MIT", "dependencies": { "esprima": "1.2.2", "static-eval": "2.0.2", "underscore": "1.12.1" } }, "node_modules/jsonpath/node_modules/esprima": { "version": "1.2.2", "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=0.4.0" } }, "node_modules/jsonpointer": { "version": "5.0.1", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "dev": true, "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" }, "engines": { "node": ">=4.0" } }, "node_modules/keyv": { "version": "4.5.4", "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kind-of": { "version": "6.0.3", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/kleur": { "version": "3.0.3", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/klona": { "version": "2.0.6", "dev": true, "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/language-subtag-registry": { "version": "0.3.22", "dev": true, "license": "CC0-1.0" }, "node_modules/language-tags": { "version": "1.0.9", "dev": true, "license": "MIT", "dependencies": { "language-subtag-registry": "^0.3.20" }, "engines": { "node": ">=0.10" } }, "node_modules/launch-editor": { "version": "2.6.1", "dev": true, "license": "MIT", "dependencies": { "picocolors": "^1.0.0", "shell-quote": "^1.8.1" } }, "node_modules/leven": { "version": "3.1.0", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.4.1", "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/lie": { "version": "3.1.1", "license": "MIT", "dependencies": { "immediate": "~3.0.5" } }, "node_modules/lilconfig": { "version": "2.1.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/lines-and-columns": { "version": "1.2.4", "dev": true, "license": "MIT" }, "node_modules/loader-runner": { "version": "4.3.0", "dev": true, "license": "MIT", "engines": { "node": ">=6.11.5" } }, "node_modules/loader-utils": { "version": "2.0.4", "dev": true, "license": "MIT", "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^2.1.2" }, "engines": { "node": ">=8.9.0" } }, "node_modules/localforage": { "version": "1.10.0", "license": "Apache-2.0", "dependencies": { "lie": "3.1.1" } }, "node_modules/locate-path": { "version": "6.0.0", "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { "version": "4.17.21", "dev": true, "license": "MIT" }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, "node_modules/lodash.memoize": { "version": "4.1.2", "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "license": "MIT" }, "node_modules/lodash.sortby": { "version": "4.7.0", "dev": true, "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", "dev": true, "license": "MIT" }, "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "node_modules/loose-envify": { "version": "1.4.0", "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "node_modules/lower-case": { "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { "tslib": "^2.0.3" } }, "node_modules/lru-cache": { "version": "5.1.1", "dev": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/lz-string": { "version": "1.5.0", "dev": true, "license": "MIT", "bin": { "lz-string": "bin/bin.js" } }, "node_modules/magic-string": { "version": "0.25.9", "dev": true, "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.8" } }, "node_modules/make-dir": { "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { "semver": "^6.0.0" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-dir/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/makeerror": { "version": "1.0.12", "dev": true, "license": "BSD-3-Clause", "dependencies": { "tmpl": "1.0.5" } }, "node_modules/md5.js": { "version": "1.3.5", "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "node_modules/mdn-data": { "version": "2.0.14", "dev": true, "license": "CC0-1.0" }, "node_modules/media-typer": { "version": "0.3.0", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/memfs": { "version": "3.5.3", "dev": true, "license": "Unlicense", "dependencies": { "fs-monkey": "^1.0.4" }, "engines": { "node": ">= 4.0.0" } }, "node_modules/memoize-one": { "version": "5.2.1", "dev": true, "license": "MIT" }, "node_modules/merge-anything": { "version": "2.4.4", "dev": true, "license": "MIT", "dependencies": { "is-what": "^3.3.1" } }, "node_modules/merge-descriptors": { "version": "1.0.1", "dev": true, "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", "dev": true, "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", "dev": true, "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/methods": { "version": "1.1.2", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { "version": "4.0.5", "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, "node_modules/miller-rabin": { "version": "4.0.1", "dev": true, "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" }, "bin": { "miller-rabin": "bin/miller-rabin" } }, "node_modules/miller-rabin/node_modules/bn.js": { "version": "4.12.0", "dev": true, "license": "MIT" }, "node_modules/mime": { "version": "1.6.0", "dev": true, "license": "MIT", "bin": { "mime": "cli.js" }, "engines": { "node": ">=4" } }, "node_modules/mime-db": { "version": "1.52.0", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/mimic-fn": { "version": "2.1.0", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/min-indent": { "version": "1.0.1", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/mini-css-extract-plugin": { "version": "2.8.0", "dev": true, "license": "MIT", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^5.0.0" } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { "version": "8.12.0", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { "version": "1.0.0", "dev": true, "license": "MIT" }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, "node_modules/minimalistic-assert": { "version": "1.0.1", "license": "ISC" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "license": "MIT" }, "node_modules/minimatch": { "version": "3.1.2", "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/minimist": { "version": "1.2.8", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { "version": "7.0.4", "dev": true, "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/mkdirp": { "version": "1.0.4", "dev": true, "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, "engines": { "node": ">=10" } }, "node_modules/mocha-suppress-logs": { "version": "0.3.1", "license": "MIT" }, "node_modules/ms": { "version": "2.1.2", "license": "MIT" }, "node_modules/multicast-dns": { "version": "7.2.5", "dev": true, "license": "MIT", "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" }, "bin": { "multicast-dns": "cli.js" } }, "node_modules/mz": { "version": "2.7.0", "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "node_modules/nan": { "version": "2.18.0", "license": "MIT" }, "node_modules/nanoassert": { "version": "2.0.0", "license": "ISC" }, "node_modules/nanoid": { "version": "3.3.7", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, "engines": { "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/natural-compare": { "version": "1.4.0", "license": "MIT" }, "node_modules/natural-compare-lite": { "version": "1.4.0", "dev": true, "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", "dev": true, "license": "MIT" }, "node_modules/no-case": { "version": "3.0.4", "dev": true, "license": "MIT", "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "node_modules/node-forge": { "version": "1.3.1", "dev": true, "license": "(BSD-3-Clause OR GPL-2.0)", "engines": { "node": ">= 6.13.0" } }, "node_modules/node-int64": { "version": "0.4.0", "dev": true, "license": "MIT" }, "node_modules/node-releases": { "version": "2.0.14", "dev": true, "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-range": { "version": "0.1.2", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { "version": "6.1.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/normalize-wheel": { "version": "1.0.1", "license": "BSD-3-Clause" }, "node_modules/npm-run-path": { "version": "4.0.1", "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/nth-check": { "version": "2.1.1", "dev": true, "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, "funding": { "url": "https://github.com/fb55/nth-check?sponsor=1" } }, "node_modules/nwsapi": { "version": "2.2.7", "dev": true, "license": "MIT" }, "node_modules/object-assign": { "version": "4.1.1", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-hash": { "version": "3.0.0", "dev": true, "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { "version": "1.13.1", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-is": { "version": "1.1.5", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.5", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.entries": { "version": "1.1.7", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { "version": "2.0.7", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.groupby": { "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { "array.prototype.filter": "^1.0.3", "call-bind": "^1.0.5", "define-properties": "^1.2.1", "es-abstract": "^1.22.3", "es-errors": "^1.0.0" } }, "node_modules/object.hasown": { "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { "define-properties": "^1.2.0", "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.values": { "version": "1.1.7", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/obuf": { "version": "1.1.2", "dev": true, "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", "dev": true, "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, "engines": { "node": ">= 0.8" } }, "node_modules/on-headers": { "version": "1.0.2", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/once": { "version": "1.4.0", "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", "dev": true, "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/open": { "version": "8.4.2", "dev": true, "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { "version": "0.9.3", "license": "MIT", "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/p-limit": { "version": "3.1.0", "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "5.0.0", "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-retry": { "version": "4.6.2", "dev": true, "license": "MIT", "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" }, "engines": { "node": ">=8" } }, "node_modules/p-try": { "version": "2.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/param-case": { "version": "3.0.4", "dev": true, "license": "MIT", "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/parent-module": { "version": "1.0.1", "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/parse-asn1": { "version": "5.1.6", "dev": true, "license": "ISC", "dependencies": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" } }, "node_modules/parse-json": { "version": "5.2.0", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse5": { "version": "7.1.2", "dev": true, "license": "MIT", "dependencies": { "entities": "^4.4.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parseurl": { "version": "1.3.3", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/pascal-case": { "version": "3.1.2", "dev": true, "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "node_modules/path-exists": { "version": "4.0.0", "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", "dev": true, "license": "MIT" }, "node_modules/path-scurry": { "version": "1.10.1", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^9.1.1 || ^10.0.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.2.0", "dev": true, "license": "ISC", "engines": { "node": "14 || >=16.14" } }, "node_modules/path-to-regexp": { "version": "0.1.7", "dev": true, "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pbkdf2": { "version": "3.1.2", "dev": true, "license": "MIT", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", "ripemd160": "^2.0.1", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" }, "engines": { "node": ">=0.12" } }, "node_modules/performance-now": { "version": "2.1.0", "dev": true, "license": "MIT" }, "node_modules/picocolors": { "version": "1.0.0", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "dev": true, "license": "MIT", "engines": { "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pify": { "version": "2.3.0", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/pirates": { "version": "4.0.6", "dev": true, "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", "dev": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-up": { "version": "3.1.0", "dev": true, "license": "MIT", "dependencies": { "find-up": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-up/node_modules/find-up": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "locate-path": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/pkg-up/node_modules/locate-path": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/pkg-up/node_modules/p-limit": { "version": "2.3.0", "dev": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "p-limit": "^2.0.0" }, "engines": { "node": ">=6" } }, "node_modules/pkg-up/node_modules/path-exists": { "version": "3.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/postcss": { "version": "8.4.35", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-attribute-case-insensitive": { "version": "5.0.2", "dev": true, "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-browser-comments": { "version": "4.0.0", "dev": true, "license": "CC0-1.0", "engines": { "node": ">=8" }, "peerDependencies": { "browserslist": ">=4", "postcss": ">=8" } }, "node_modules/postcss-calc": { "version": "8.2.4", "dev": true, "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.9", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.2.2" } }, "node_modules/postcss-clamp": { "version": "4.1.0", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": ">=7.6.0" }, "peerDependencies": { "postcss": "^8.4.6" } }, "node_modules/postcss-color-functional-notation": { "version": "4.2.4", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-color-hex-alpha": { "version": "8.0.4", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-color-rebeccapurple": { "version": "7.1.1", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-colormin": { "version": "5.3.1", "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "colord": "^2.9.1", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-convert-values": { "version": "5.1.3", "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-custom-media": { "version": "8.0.2", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.3" } }, "node_modules/postcss-custom-properties": { "version": "12.1.11", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-custom-selectors": { "version": "6.0.3", "dev": true, "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.4" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.3" } }, "node_modules/postcss-dir-pseudo-class": { "version": "6.0.5", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-discard-comments": { "version": "5.1.2", "dev": true, "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-duplicates": { "version": "5.1.0", "dev": true, "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-empty": { "version": "5.1.1", "dev": true, "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-overridden": { "version": "5.1.0", "dev": true, "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-double-position-gradients": { "version": "3.1.2", "dev": true, "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-env-function": { "version": "4.0.6", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-flexbugs-fixes": { "version": "5.0.2", "dev": true, "license": "MIT", "peerDependencies": { "postcss": "^8.1.4" } }, "node_modules/postcss-focus-visible": { "version": "6.0.4", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-focus-within": { "version": "5.0.4", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-font-variant": { "version": "5.0.0", "dev": true, "license": "MIT", "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/postcss-gap-properties": { "version": "3.0.5", "dev": true, "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-image-set-function": { "version": "4.0.7", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-import": { "version": "15.1.0", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "postcss": "^8.0.0" } }, "node_modules/postcss-initial": { "version": "4.0.1", "dev": true, "license": "MIT", "peerDependencies": { "postcss": "^8.0.0" } }, "node_modules/postcss-js": { "version": "4.0.1", "dev": true, "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" }, "engines": { "node": "^12 || ^14 || >= 16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, "peerDependencies": { "postcss": "^8.4.21" } }, "node_modules/postcss-lab-function": { "version": "4.2.1", "dev": true, "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-load-config": { "version": "4.0.2", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "engines": { "node": ">= 14" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { "postcss": { "optional": true }, "ts-node": { "optional": true } } }, "node_modules/postcss-load-config/node_modules/lilconfig": { "version": "3.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/postcss-load-config/node_modules/yaml": { "version": "2.3.4", "dev": true, "license": "ISC", "engines": { "node": ">= 14" } }, "node_modules/postcss-loader": { "version": "6.2.1", "dev": true, "license": "MIT", "dependencies": { "cosmiconfig": "^7.0.0", "klona": "^2.0.5", "semver": "^7.3.5" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "postcss": "^7.0.0 || ^8.0.1", "webpack": "^5.0.0" } }, "node_modules/postcss-logical": { "version": "5.0.4", "dev": true, "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-media-minmax": { "version": "5.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/postcss-merge-longhand": { "version": "5.1.7", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "stylehacks": "^5.1.1" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-merge-rules": { "version": "5.1.4", "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", "cssnano-utils": "^3.1.0", "postcss-selector-parser": "^6.0.5" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-font-values": { "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-gradients": { "version": "5.1.1", "dev": true, "license": "MIT", "dependencies": { "colord": "^2.9.1", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-params": { "version": "5.1.4", "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-selectors": { "version": "5.2.1", "dev": true, "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.5" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-modules-extract-imports": { "version": "3.0.0", "dev": true, "license": "ISC", "engines": { "node": "^10 || ^12 || >= 14" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/postcss-modules-local-by-default": { "version": "4.0.4", "dev": true, "license": "MIT", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" }, "engines": { "node": "^10 || ^12 || >= 14" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/postcss-modules-scope": { "version": "3.1.1", "dev": true, "license": "ISC", "dependencies": { "postcss-selector-parser": "^6.0.4" }, "engines": { "node": "^10 || ^12 || >= 14" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/postcss-modules-values": { "version": "4.0.0", "dev": true, "license": "ISC", "dependencies": { "icss-utils": "^5.0.0" }, "engines": { "node": "^10 || ^12 || >= 14" }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/postcss-nested": { "version": "6.0.1", "dev": true, "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.11" }, "engines": { "node": ">=12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, "peerDependencies": { "postcss": "^8.2.14" } }, "node_modules/postcss-nesting": { "version": "10.2.0", "dev": true, "license": "CC0-1.0", "dependencies": { "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-normalize": { "version": "10.0.1", "dev": true, "license": "CC0-1.0", "dependencies": { "@csstools/normalize.css": "*", "postcss-browser-comments": "^4", "sanitize.css": "*" }, "engines": { "node": ">= 12" }, "peerDependencies": { "browserslist": ">= 4", "postcss": ">= 8" } }, "node_modules/postcss-normalize-charset": { "version": "5.1.0", "dev": true, "license": "MIT", "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-display-values": { "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-positions": { "version": "5.1.1", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-repeat-style": { "version": "5.1.1", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-string": { "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-timing-functions": { "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-unicode": { "version": "5.1.1", "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-url": { "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-whitespace": { "version": "5.1.1", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-opacity-percentage": { "version": "1.1.3", "dev": true, "funding": [ { "type": "kofi", "url": "https://ko-fi.com/mrcgrtz" }, { "type": "liberapay", "url": "https://liberapay.com/mrcgrtz" } ], "license": "MIT", "engines": { "node": "^12 || ^14 || >=16" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-ordered-values": { "version": "5.1.3", "dev": true, "license": "MIT", "dependencies": { "cssnano-utils": "^3.1.0", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-overflow-shorthand": { "version": "3.0.4", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-page-break": { "version": "3.0.4", "dev": true, "license": "MIT", "peerDependencies": { "postcss": "^8" } }, "node_modules/postcss-place": { "version": "7.0.5", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-preset-env": { "version": "7.8.3", "dev": true, "license": "CC0-1.0", "dependencies": { "@csstools/postcss-cascade-layers": "^1.1.1", "@csstools/postcss-color-function": "^1.1.1", "@csstools/postcss-font-format-keywords": "^1.0.1", "@csstools/postcss-hwb-function": "^1.0.2", "@csstools/postcss-ic-unit": "^1.0.1", "@csstools/postcss-is-pseudo-class": "^2.0.7", "@csstools/postcss-nested-calc": "^1.0.0", "@csstools/postcss-normalize-display-values": "^1.0.1", "@csstools/postcss-oklab-function": "^1.1.1", "@csstools/postcss-progressive-custom-properties": "^1.3.0", "@csstools/postcss-stepped-value-functions": "^1.0.1", "@csstools/postcss-text-decoration-shorthand": "^1.0.0", "@csstools/postcss-trigonometric-functions": "^1.0.2", "@csstools/postcss-unset-value": "^1.0.2", "autoprefixer": "^10.4.13", "browserslist": "^4.21.4", "css-blank-pseudo": "^3.0.3", "css-has-pseudo": "^3.0.4", "css-prefers-color-scheme": "^6.0.3", "cssdb": "^7.1.0", "postcss-attribute-case-insensitive": "^5.0.2", "postcss-clamp": "^4.1.0", "postcss-color-functional-notation": "^4.2.4", "postcss-color-hex-alpha": "^8.0.4", "postcss-color-rebeccapurple": "^7.1.1", "postcss-custom-media": "^8.0.2", "postcss-custom-properties": "^12.1.10", "postcss-custom-selectors": "^6.0.3", "postcss-dir-pseudo-class": "^6.0.5", "postcss-double-position-gradients": "^3.1.2", "postcss-env-function": "^4.0.6", "postcss-focus-visible": "^6.0.4", "postcss-focus-within": "^5.0.4", "postcss-font-variant": "^5.0.0", "postcss-gap-properties": "^3.0.5", "postcss-image-set-function": "^4.0.7", "postcss-initial": "^4.0.1", "postcss-lab-function": "^4.2.1", "postcss-logical": "^5.0.4", "postcss-media-minmax": "^5.0.0", "postcss-nesting": "^10.2.0", "postcss-opacity-percentage": "^1.1.2", "postcss-overflow-shorthand": "^3.0.4", "postcss-page-break": "^3.0.4", "postcss-place": "^7.0.5", "postcss-pseudo-class-any-link": "^7.1.6", "postcss-replace-overflow-wrap": "^4.0.0", "postcss-selector-not": "^6.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-pseudo-class-any-link": { "version": "7.1.6", "dev": true, "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-reduce-initial": { "version": "5.1.2", "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-reduce-transforms": { "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-replace-overflow-wrap": { "version": "4.0.0", "dev": true, "license": "MIT", "peerDependencies": { "postcss": "^8.0.3" } }, "node_modules/postcss-selector-not": { "version": "6.0.1", "dev": true, "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.10" }, "engines": { "node": "^12 || ^14 || >=16" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/csstools" }, "peerDependencies": { "postcss": "^8.2" } }, "node_modules/postcss-selector-parser": { "version": "6.0.15", "dev": true, "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" }, "engines": { "node": ">=4" } }, "node_modules/postcss-svgo": { "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0", "svgo": "^2.7.0" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-unique-selectors": { "version": "5.1.1", "dev": true, "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.5" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-value-parser": { "version": "4.2.0", "dev": true, "license": "MIT" }, "node_modules/prelude-ls": { "version": "1.2.1", "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/pretty-bytes": { "version": "5.6.0", "dev": true, "license": "MIT", "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pretty-error": { "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" } }, "node_modules/pretty-format": { "version": "27.5.1", "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/process-nextick-args": { "version": "2.0.1", "dev": true, "license": "MIT" }, "node_modules/promise": { "version": "8.3.0", "dev": true, "license": "MIT", "dependencies": { "asap": "~2.0.6" } }, "node_modules/prompts": { "version": "2.4.2", "dev": true, "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" }, "engines": { "node": ">= 6" } }, "node_modules/prop-types": { "version": "15.8.1", "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", "license": "MIT" }, "node_modules/protobufjs": { "version": "6.11.4", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/long": "^4.0.1", "@types/node": ">=13.7.0", "long": "^4.0.0" }, "bin": { "pbjs": "bin/pbjs", "pbts": "bin/pbts" } }, "node_modules/proxy-addr": { "version": "2.0.7", "dev": true, "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" }, "engines": { "node": ">= 0.10" } }, "node_modules/proxy-addr/node_modules/ipaddr.js": { "version": "1.9.1", "dev": true, "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "node_modules/psl": { "version": "1.9.0", "dev": true, "license": "MIT" }, "node_modules/public-encrypt": { "version": "4.0.3", "dev": true, "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" } }, "node_modules/public-encrypt/node_modules/bn.js": { "version": "4.12.0", "dev": true, "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pure-rand": { "version": "6.0.4", "dev": true, "funding": [ { "type": "individual", "url": "https://github.com/sponsors/dubzzz" }, { "type": "opencollective", "url": "https://opencollective.com/fast-check" } ], "license": "MIT" }, "node_modules/qrcode.react": { "version": "3.1.0", "license": "ISC", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/qs": { "version": "6.11.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, "engines": { "node": ">=0.6" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/querystringify": { "version": "2.2.0", "dev": true, "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "license": "MIT" }, "node_modules/raf": { "version": "3.4.1", "dev": true, "license": "MIT", "dependencies": { "performance-now": "^2.1.0" } }, "node_modules/randombytes": { "version": "2.1.0", "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/randomfill": { "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.1", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { "version": "2.5.1", "dev": true, "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, "engines": { "node": ">= 0.8" } }, "node_modules/raw-body/node_modules/bytes": { "version": "3.1.2", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" } }, "node_modules/react": { "version": "18.2.0", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-app-polyfill": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "core-js": "^3.19.2", "object-assign": "^4.1.1", "promise": "^8.1.0", "raf": "^3.4.1", "regenerator-runtime": "^0.13.9", "whatwg-fetch": "^3.6.2" }, "engines": { "node": ">=14" } }, "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { "version": "0.13.11", "dev": true, "license": "MIT" }, "node_modules/react-dev-utils": { "version": "12.0.1", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.16.0", "address": "^1.1.2", "browserslist": "^4.18.1", "chalk": "^4.1.2", "cross-spawn": "^7.0.3", "detect-port-alt": "^1.1.6", "escape-string-regexp": "^4.0.0", "filesize": "^8.0.6", "find-up": "^5.0.0", "fork-ts-checker-webpack-plugin": "^6.5.0", "global-modules": "^2.0.0", "globby": "^11.0.4", "gzip-size": "^6.0.0", "immer": "^9.0.7", "is-root": "^2.1.0", "loader-utils": "^3.2.0", "open": "^8.4.0", "pkg-up": "^3.1.0", "prompts": "^2.4.2", "react-error-overlay": "^6.0.11", "recursive-readdir": "^2.2.2", "shell-quote": "^1.7.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "engines": { "node": ">=14" } }, "node_modules/react-dev-utils/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/react-dev-utils/node_modules/chalk": { "version": "4.1.2", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/react-dev-utils/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/react-dev-utils/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/react-dev-utils/node_modules/escape-string-regexp": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/react-dev-utils/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/react-dev-utils/node_modules/loader-utils": { "version": "3.2.1", "dev": true, "license": "MIT", "engines": { "node": ">= 12.13.0" } }, "node_modules/react-dev-utils/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/react-dom": { "version": "18.2.0", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "node_modules/react-easy-crop": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-5.0.6.tgz", "integrity": "sha512-LV8te8NGC72k3l8uAqPAw73D2i9AbRlZqyo1Xz8VetwiMfkSKYgyqE3IFEwf5h+1g7AS1nMxBKk6ZPdhvLw6MQ==", "dependencies": { "normalize-wheel": "^1.0.1", "tslib": "2.0.1" }, "peerDependencies": { "react": ">=16.4.0", "react-dom": ">=16.4.0" } }, "node_modules/react-easy-crop/node_modules/tslib": { "version": "2.0.1", "license": "0BSD" }, "node_modules/react-error-overlay": { "version": "6.0.11", "dev": true, "license": "MIT" }, "node_modules/react-ga": { "version": "3.3.1", "license": "Apache-2.0", "peerDependencies": { "prop-types": "^15.6.0", "react": "^15.6.2 || ^16.0 || ^17 || ^18" } }, "node_modules/react-is": { "version": "17.0.2", "dev": true, "license": "MIT" }, "node_modules/react-refresh": { "version": "0.11.0", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-router": { "version": "6.22.0", "license": "MIT", "dependencies": { "@remix-run/router": "1.15.0" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8" } }, "node_modules/react-router-dom": { "version": "6.22.0", "license": "MIT", "dependencies": { "@remix-run/router": "1.15.0", "react-router": "6.22.0" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "node_modules/react-toastify": { "version": "10.0.5", "license": "MIT", "dependencies": { "clsx": "^2.1.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "node_modules/read-cache": { "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { "pify": "^2.3.0" } }, "node_modules/readable-stream": { "version": "3.6.2", "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/readdirp": { "version": "3.6.0", "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, "engines": { "node": ">=8.10.0" } }, "node_modules/recursive-readdir": { "version": "2.2.3", "dev": true, "license": "MIT", "dependencies": { "minimatch": "^3.0.5" }, "engines": { "node": ">=6.0.0" } }, "node_modules/redent": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/reflect.getprototypeof": { "version": "1.0.5", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", "es-abstract": "^1.22.3", "es-errors": "^1.0.0", "get-intrinsic": "^1.2.3", "globalthis": "^1.0.3", "which-builtin-type": "^1.1.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regenerate": { "version": "1.4.2", "dev": true, "license": "MIT" }, "node_modules/regenerate-unicode-properties": { "version": "10.1.1", "dev": true, "license": "MIT", "dependencies": { "regenerate": "^1.4.2" }, "engines": { "node": ">=4" } }, "node_modules/regenerator-runtime": { "version": "0.14.1", "dev": true, "license": "MIT" }, "node_modules/regenerator-transform": { "version": "0.15.2", "dev": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regex-parser": { "version": "2.3.0", "dev": true, "license": "MIT" }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regexpu-core": { "version": "5.3.2", "dev": true, "license": "MIT", "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" } }, "node_modules/regjsparser": { "version": "0.9.1", "dev": true, "license": "BSD-2-Clause", "dependencies": { "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "dev": true, "bin": { "jsesc": "bin/jsesc" } }, "node_modules/relateurl": { "version": "0.2.7", "dev": true, "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/renderkid": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", "strip-ansi": "^6.0.1" } }, "node_modules/require-directory": { "version": "2.1.1", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/requireindex": { "version": "1.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.5" } }, "node_modules/requires-port": { "version": "1.0.0", "dev": true, "license": "MIT" }, "node_modules/resolve": { "version": "1.22.8", "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-cwd": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/resolve-from": { "version": "5.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve-url-loader": { "version": "5.0.0", "dev": true, "license": "MIT", "dependencies": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", "loader-utils": "^2.0.0", "postcss": "^8.2.14", "source-map": "0.6.1" }, "engines": { "node": ">=12" } }, "node_modules/resolve-url-loader/node_modules/convert-source-map": { "version": "1.9.0", "dev": true, "license": "MIT" }, "node_modules/resolve-url-loader/node_modules/source-map": { "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/resolve.exports": { "version": "2.0.2", "dev": true, "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/retry": { "version": "0.13.1", "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rimraf": { "version": "3.0.2", "license": "ISC", "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/ripemd160": { "version": "2.0.2", "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, "node_modules/rollup": { "version": "2.79.1", "dev": true, "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, "engines": { "node": ">=10.0.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-terser": { "version": "7.0.2", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.10.4", "jest-worker": "^26.2.1", "serialize-javascript": "^4.0.0", "terser": "^5.0.0" }, "peerDependencies": { "rollup": "^2.0.0" } }, "node_modules/rollup-plugin-terser/node_modules/has-flag": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/rollup-plugin-terser/node_modules/jest-worker": { "version": "26.6.2", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^7.0.0" }, "engines": { "node": ">= 10.13.0" } }, "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { "version": "4.0.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/rollup-plugin-terser/node_modules/supports-color": { "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/run-parallel": { "version": "1.2.0", "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/safe-array-concat": { "version": "1.1.0", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.5", "get-intrinsic": "^1.2.2", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, "engines": { "node": ">=0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safe-buffer": { "version": "5.2.1", "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.0.3", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safer-buffer": { "version": "2.1.2", "dev": true, "license": "MIT" }, "node_modules/sanitize.css": { "version": "13.0.0", "dev": true, "license": "CC0-1.0" }, "node_modules/sass-loader": { "version": "12.6.0", "dev": true, "license": "MIT", "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "fibers": ">= 3.1.0", "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { "fibers": { "optional": true }, "node-sass": { "optional": true }, "sass": { "optional": true }, "sass-embedded": { "optional": true } } }, "node_modules/saxes": { "version": "6.0.0", "dev": true, "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, "engines": { "node": ">=v12.22.7" } }, "node_modules/scheduler": { "version": "0.23.0", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/schema-utils": { "version": "3.3.0", "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, "node_modules/secp256k1": { "version": "3.8.0", "hasInstallScript": true, "license": "MIT", "dependencies": { "bindings": "^1.5.0", "bip66": "^1.1.5", "bn.js": "^4.11.8", "create-hash": "^1.2.0", "drbg.js": "^1.0.1", "elliptic": "^6.5.2", "nan": "^2.14.0", "safe-buffer": "^5.1.2" }, "engines": { "node": ">=4.0.0" } }, "node_modules/secp256k1/node_modules/bn.js": { "version": "4.12.0", "license": "MIT" }, "node_modules/select-hose": { "version": "2.0.0", "dev": true, "license": "MIT" }, "node_modules/selfsigned": { "version": "2.4.1", "dev": true, "license": "MIT", "dependencies": { "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { "node": ">=10" } }, "node_modules/semver": { "version": "7.6.0", "dev": true, "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", "dev": true, "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, "node_modules/semver/node_modules/yallist": { "version": "4.0.0", "dev": true, "license": "ISC" }, "node_modules/send": { "version": "0.18.0", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/send/node_modules/debug": { "version": "2.6.9", "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "dev": true, "license": "MIT" }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "dev": true, "license": "MIT" }, "node_modules/serialize-javascript": { "version": "6.0.2", "dev": true, "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-index": { "version": "1.9.1", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", "escape-html": "~1.0.3", "http-errors": "~1.6.2", "mime-types": "~2.1.17", "parseurl": "~1.3.2" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/serve-index/node_modules/debug": { "version": "2.6.9", "dev": true, "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/serve-index/node_modules/depd": { "version": "1.1.2", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "dev": true, "license": "MIT", "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", "setprototypeof": "1.1.0", "statuses": ">= 1.4.0 < 2" }, "engines": { "node": ">= 0.6" } }, "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", "dev": true, "license": "ISC" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "dev": true, "license": "MIT" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "dev": true, "license": "ISC" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/serve-static": { "version": "1.15.0", "dev": true, "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/set-function-length": { "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.2", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/setprototypeof": { "version": "1.2.0", "dev": true, "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.11", "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" }, "bin": { "sha.js": "bin.js" } }, "node_modules/shebang-command": { "version": "2.0.0", "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/shebang-regex": { "version": "3.0.0", "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { "version": "1.8.1", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel": { "version": "1.0.5", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", "object-inspect": "^1.13.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { "version": "3.0.7", "dev": true, "license": "ISC" }, "node_modules/sisteransi": { "version": "1.0.5", "dev": true, "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/slp-mdm": { "version": "0.0.6", "license": "MIT", "dependencies": { "bignumber.js": "^9.0.0" } }, "node_modules/sockjs": { "version": "0.3.24", "dev": true, "license": "MIT", "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", "websocket-driver": "^0.7.4" } }, "node_modules/source-list-map": { "version": "2.0.1", "dev": true, "license": "MIT" }, "node_modules/source-map": { "version": "0.7.4", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/source-map-js": { "version": "1.0.2", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-loader": { "version": "3.0.2", "dev": true, "license": "MIT", "dependencies": { "abab": "^2.0.5", "iconv-lite": "^0.6.3", "source-map-js": "^1.0.1" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^5.0.0" } }, "node_modules/source-map-support": { "version": "0.5.13", "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/source-map-support/node_modules/source-map": { "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/sourcemap-codec": { "version": "1.4.8", "dev": true, "license": "MIT" }, "node_modules/spdy": { "version": "4.0.2", "dev": true, "license": "MIT", "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", "http-deceiver": "^1.2.7", "select-hose": "^2.0.0", "spdy-transport": "^3.0.0" }, "engines": { "node": ">=6.0.0" } }, "node_modules/spdy-transport": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", "hpack.js": "^2.1.6", "obuf": "^1.1.2", "readable-stream": "^3.0.6", "wbuf": "^1.7.3" } }, "node_modules/sprintf-js": { "version": "1.0.3", "dev": true, "license": "BSD-3-Clause" }, "node_modules/stable": { "version": "0.1.8", "dev": true, "license": "MIT" }, "node_modules/stack-utils": { "version": "2.0.6", "dev": true, "license": "MIT", "dependencies": { "escape-string-regexp": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/stackframe": { "version": "1.3.4", "dev": true, "license": "MIT" }, "node_modules/static-eval": { "version": "2.0.2", "dev": true, "license": "MIT", "dependencies": { "escodegen": "^1.8.1" } }, "node_modules/static-eval/node_modules/escodegen": { "version": "1.14.3", "dev": true, "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", "estraverse": "^4.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1" }, "bin": { "escodegen": "bin/escodegen.js", "esgenerate": "bin/esgenerate.js" }, "engines": { "node": ">=4.0" }, "optionalDependencies": { "source-map": "~0.6.1" } }, "node_modules/static-eval/node_modules/estraverse": { "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/static-eval/node_modules/levn": { "version": "0.3.0", "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/static-eval/node_modules/optionator": { "version": "0.8.3", "dev": true, "license": "MIT", "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "word-wrap": "~1.2.3" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/static-eval/node_modules/prelude-ls": { "version": "1.1.2", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/static-eval/node_modules/source-map": { "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", "optional": true, "engines": { "node": ">=0.10.0" } }, "node_modules/static-eval/node_modules/type-check": { "version": "0.3.2", "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/statuses": { "version": "2.0.1", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { "internal-slot": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, "node_modules/stream-browserify": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" } }, "node_modules/string_decoder": { "version": "1.3.0", "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-length": { "version": "4.0.2", "dev": true, "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" } }, "node_modules/string-natural-compare": { "version": "3.0.1", "dev": true, "license": "MIT" }, "node_modules/string-width": { "version": "4.2.3", "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/string-width-cjs": { "name": "string-width", "version": "4.2.3", "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "dev": true, "license": "MIT" }, "node_modules/string-width/node_modules/emoji-regex": { "version": "8.0.0", "dev": true, "license": "MIT" }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "internal-slot": "^1.0.5", "regexp.prototype.flags": "^1.5.0", "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trim": { "version": "1.2.8", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/stringify-object": { "version": "3.3.0", "dev": true, "license": "BSD-2-Clause", "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" }, "engines": { "node": ">=4" } }, "node_modules/strip-ansi": { "version": "6.0.1", "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-ansi-cjs": { "name": "strip-ansi", "version": "6.0.1", "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-bom": { "version": "4.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-comments": { "version": "2.0.1", "dev": true, "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/strip-final-newline": { "version": "2.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/strip-indent": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "min-indent": "^1.0.0" }, "engines": { "node": ">=8" } }, "node_modules/strip-json-comments": { "version": "3.1.1", "license": "MIT", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/style-loader": { "version": "3.3.4", "dev": true, "license": "MIT", "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^5.0.0" } }, "node_modules/styled-components": { "version": "4.4.1", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.0.0", "@babel/traverse": "^7.0.0", "@emotion/is-prop-valid": "^0.8.1", "@emotion/unitless": "^0.7.0", "babel-plugin-styled-components": ">= 1", "css-to-react-native": "^2.2.2", "memoize-one": "^5.0.0", "merge-anything": "^2.2.4", "prop-types": "^15.5.4", "react-is": "^16.6.0", "stylis": "^3.5.0", "stylis-rule-sheet": "^0.0.10", "supports-color": "^5.5.0" }, "peerDependencies": { "react": ">= 16.3.0", "react-dom": ">= 16.3.0" } }, "node_modules/styled-components/node_modules/react-is": { "version": "16.13.1", "dev": true, "license": "MIT" }, "node_modules/styled-components/node_modules/stylis": { "version": "3.5.4", "dev": true, "license": "MIT" }, "node_modules/styled-components/node_modules/stylis-rule-sheet": { "version": "0.0.10", "dev": true, "license": "MIT", "peerDependencies": { "stylis": "^3.5.0" } }, "node_modules/stylehacks": { "version": "5.1.1", "dev": true, "license": "MIT", "dependencies": { "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" }, "engines": { "node": "^10 || ^12 || >=14.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/sucrase": { "version": "3.35.0", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" }, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/sucrase/node_modules/brace-expansion": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/sucrase/node_modules/commander": { "version": "4.1.1", "dev": true, "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/sucrase/node_modules/glob": { "version": "10.3.10", "dev": true, "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/sucrase/node_modules/minimatch": { "version": "9.0.3", "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/supports-color": { "version": "5.5.0", "dev": true, "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/svg-parser": { "version": "2.0.4", "dev": true, "license": "MIT" }, "node_modules/svgo": { "version": "2.8.0", "dev": true, "license": "MIT", "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^4.1.3", "css-tree": "^1.1.3", "csso": "^4.2.0", "picocolors": "^1.0.0", "stable": "^0.1.8" }, "bin": { "svgo": "bin/svgo" }, "engines": { "node": ">=10.13.0" } }, "node_modules/svgo/node_modules/commander": { "version": "7.2.0", "dev": true, "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/symbol-tree": { "version": "3.2.4", "dev": true, "license": "MIT" }, "node_modules/tailwindcss": { "version": "3.4.1", "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.19.1", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", "postcss": "^8.4.23", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.1", "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", "resolve": "^1.22.2", "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" }, "engines": { "node": ">=14.0.0" } }, "node_modules/tapable": { "version": "2.2.1", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/temp-dir": { "version": "2.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/tempy": { "version": "0.6.0", "dev": true, "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "temp-dir": "^2.0.0", "type-fest": "^0.16.0", "unique-string": "^2.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tempy/node_modules/type-fest": { "version": "0.16.0", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/terser": { "version": "5.27.0", "dev": true, "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { "node": ">=10" } }, "node_modules/terser-webpack-plugin": { "version": "5.3.10", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^5.1.0" }, "peerDependenciesMeta": { "@swc/core": { "optional": true }, "esbuild": { "optional": true }, "uglify-js": { "optional": true } } }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "dev": true, "license": "MIT" }, "node_modules/terser/node_modules/source-map": { "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/terser/node_modules/source-map-support": { "version": "0.5.21", "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/test-exclude": { "version": "6.0.0", "dev": true, "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" }, "engines": { "node": ">=8" } }, "node_modules/text-table": { "version": "0.2.0", "license": "MIT" }, "node_modules/thenify": { "version": "3.3.1", "dev": true, "license": "MIT", "dependencies": { "any-promise": "^1.0.0" } }, "node_modules/thenify-all": { "version": "1.6.0", "dev": true, "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" }, "engines": { "node": ">=0.8" } }, "node_modules/thunky": { "version": "1.1.0", "dev": true, "license": "MIT" }, "node_modules/tmpl": { "version": "1.0.5", "dev": true, "license": "BSD-3-Clause" }, "node_modules/to-fast-properties": { "version": "2.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, "engines": { "node": ">=8.0" } }, "node_modules/toidentifier": { "version": "1.0.1", "dev": true, "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/tough-cookie": { "version": "4.1.3", "dev": true, "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" }, "engines": { "node": ">=6" } }, "node_modules/tough-cookie/node_modules/universalify": { "version": "0.2.0", "dev": true, "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/tr46": { "version": "3.0.0", "dev": true, "license": "MIT", "dependencies": { "punycode": "^2.1.1" }, "engines": { "node": ">=12" } }, "node_modules/tryer": { "version": "1.0.1", "dev": true, "license": "MIT" }, "node_modules/ts-custom-error": { "version": "3.3.1", "license": "MIT", "peer": true, "engines": { "node": ">=14.0.0" } }, "node_modules/ts-interface-checker": { "version": "0.1.13", "dev": true, "license": "Apache-2.0" }, "node_modules/tsconfig-paths": { "version": "3.15.0", "dev": true, "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tslib": { "version": "2.6.2", "dev": true, "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", "dev": true, "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, "engines": { "node": ">= 6" }, "peerDependencies": { "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, "node_modules/tsutils-etc": { "version": "1.4.2", "dev": true, "license": "MIT", "dependencies": { "@types/yargs": "^17.0.0", "yargs": "^17.0.0" }, "bin": { "ts-flags": "bin/ts-flags", "ts-kind": "bin/ts-kind" }, "peerDependencies": { "tsutils": "^3.0.0", "typescript": ">=4.0.0" } }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", "dev": true, "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/type-detect": { "version": "4.0.8", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "0.21.3", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/type-is": { "version": "1.6.18", "dev": true, "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" }, "engines": { "node": ">= 0.6" } }, "node_modules/typed-array-buffer": { "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.6", "es-errors": "^1.3.0", "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", "has-proto": "^1.0.1", "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-byte-offset": { "version": "1.0.0", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "has-proto": "^1.0.1", "is-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-length": { "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", "is-typed-array": "^1.1.9" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typeforce": { "version": "1.18.0", "license": "MIT" }, "node_modules/typescript": { "version": "4.9.5", "dev": true, "license": "Apache-2.0", "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=4.2.0" } }, "node_modules/unbox-primitive": { "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", "has-symbols": "^1.0.3", "which-boxed-primitive": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/underscore": { "version": "1.12.1", "dev": true, "license": "MIT" }, "node_modules/undici-types": { "version": "5.26.5", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" }, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.1.0", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/unique-string": { "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { "crypto-random-string": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/universalify": { "version": "2.0.1", "dev": true, "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/upath": { "version": "1.2.0", "dev": true, "license": "MIT", "engines": { "node": ">=4", "yarn": "*" } }, "node_modules/update-browserslist-db": { "version": "1.0.13", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "bin": { "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } }, "node_modules/uri-js": { "version": "4.4.1", "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/url-parse": { "version": "1.5.10", "dev": true, "license": "MIT", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "node_modules/util": { "version": "0.12.5", "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "node_modules/util-deprecate": { "version": "1.0.2", "license": "MIT" }, "node_modules/utila": { "version": "0.4.0", "dev": true, "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "8.3.2", "dev": true, "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-to-istanbul": { "version": "9.2.0", "dev": true, "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" } }, "node_modules/varuint-bitcoin": { "version": "1.1.2", "license": "MIT", "dependencies": { "safe-buffer": "^5.1.1" } }, "node_modules/vary": { "version": "1.1.2", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { "xml-name-validator": "^4.0.0" }, "engines": { "node": ">=14" } }, "node_modules/walker": { "version": "1.0.8", "dev": true, "license": "Apache-2.0", "dependencies": { "makeerror": "1.0.12" } }, "node_modules/watchpack": { "version": "2.4.0", "dev": true, "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" }, "engines": { "node": ">=10.13.0" } }, "node_modules/wbuf": { "version": "1.7.3", "dev": true, "license": "MIT", "dependencies": { "minimalistic-assert": "^1.0.0" } }, "node_modules/web-vitals": { "version": "2.1.4", "dev": true, "license": "Apache-2.0" }, "node_modules/webidl-conversions": { "version": "7.0.0", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=12" } }, "node_modules/webpack": { "version": "5.90.1", "dev": true, "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.11.5", "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.9.0", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" }, "engines": { "node": ">=10.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependenciesMeta": { "webpack-cli": { "optional": true } } }, "node_modules/webpack-dev-middleware": { "version": "5.3.4", "dev": true, "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^4.0.0 || ^5.0.0" } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { "version": "8.12.0", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { "version": "1.0.0", "dev": true, "license": "MIT" }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, "node_modules/webpack-dev-server": { "version": "4.15.1", "dev": true, "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", "@types/express": "^4.17.13", "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", "default-gateway": "^6.0.3", "express": "^4.17.3", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", "rimraf": "^3.0.2", "schema-utils": "^4.0.0", "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", "ws": "^8.13.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { "webpack": "^4.37.0 || ^5.0.0" }, "peerDependenciesMeta": { "webpack": { "optional": true }, "webpack-cli": { "optional": true } } }, "node_modules/webpack-dev-server/node_modules/ajv": { "version": "8.12.0", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/webpack-dev-server/node_modules/ajv-keywords": { "version": "5.1.0", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { "version": "1.0.0", "dev": true, "license": "MIT" }, "node_modules/webpack-dev-server/node_modules/schema-utils": { "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, "node_modules/webpack-manifest-plugin": { "version": "4.1.1", "dev": true, "license": "MIT", "dependencies": { "tapable": "^2.0.0", "webpack-sources": "^2.2.0" }, "engines": { "node": ">=12.22.0" }, "peerDependencies": { "webpack": "^4.44.2 || ^5.47.0" } }, "node_modules/webpack-manifest-plugin/node_modules/source-map": { "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { "version": "2.3.1", "dev": true, "license": "MIT", "dependencies": { "source-list-map": "^2.0.1", "source-map": "^0.6.1" }, "engines": { "node": ">=10.13.0" } }, "node_modules/webpack-sources": { "version": "3.2.3", "dev": true, "license": "MIT", "engines": { "node": ">=10.13.0" } }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" }, "engines": { "node": ">=8.0.0" } }, "node_modules/webpack/node_modules/estraverse": { "version": "4.3.0", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/websocket-driver": { "version": "0.7.4", "dev": true, "license": "Apache-2.0", "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" }, "engines": { "node": ">=0.8.0" } }, "node_modules/websocket-extensions": { "version": "0.1.4", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=0.8.0" } }, "node_modules/whatwg-encoding": { "version": "2.0.0", "dev": true, "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" }, "engines": { "node": ">=12" } }, "node_modules/whatwg-fetch": { "version": "3.6.20", "dev": true, "license": "MIT" }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "dev": true, "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/whatwg-url": { "version": "11.0.0", "dev": true, "license": "MIT", "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/which": { "version": "2.0.2", "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, "node_modules/which-boxed-primitive": { "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", "is-number-object": "^1.0.4", "is-string": "^1.0.5", "is-symbol": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { "version": "1.1.3", "dev": true, "license": "MIT", "dependencies": { "function.prototype.name": "^1.1.5", "has-tostringtag": "^1.0.0", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", "is-finalizationregistry": "^1.0.2", "is-generator-function": "^1.0.10", "is-regex": "^1.1.4", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-collection": { "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { "is-map": "^2.0.1", "is-set": "^2.0.1", "is-weakmap": "^2.0.1", "is-weakset": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { "version": "1.1.14", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.6", "call-bind": "^1.0.5", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/wif": { "version": "2.0.6", "license": "MIT", "dependencies": { "bs58check": "<3.0.0" } }, "node_modules/word-wrap": { "version": "1.2.5", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/workbox-background-sync": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "idb": "^7.0.1", "workbox-core": "6.6.0" } }, "node_modules/workbox-broadcast-update": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } }, "node_modules/workbox-build": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.11.1", "@babel/preset-env": "^7.11.0", "@babel/runtime": "^7.11.2", "@rollup/plugin-babel": "^5.2.0", "@rollup/plugin-node-resolve": "^11.2.1", "@rollup/plugin-replace": "^2.4.1", "@surma/rollup-plugin-off-main-thread": "^2.2.3", "ajv": "^8.6.0", "common-tags": "^1.8.0", "fast-json-stable-stringify": "^2.1.0", "fs-extra": "^9.0.1", "glob": "^7.1.6", "lodash": "^4.17.20", "pretty-bytes": "^5.3.0", "rollup": "^2.43.1", "rollup-plugin-terser": "^7.0.0", "source-map": "^0.8.0-beta.0", "stringify-object": "^3.3.0", "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", "workbox-background-sync": "6.6.0", "workbox-broadcast-update": "6.6.0", "workbox-cacheable-response": "6.6.0", "workbox-core": "6.6.0", "workbox-expiration": "6.6.0", "workbox-google-analytics": "6.6.0", "workbox-navigation-preload": "6.6.0", "workbox-precaching": "6.6.0", "workbox-range-requests": "6.6.0", "workbox-recipes": "6.6.0", "workbox-routing": "6.6.0", "workbox-strategies": "6.6.0", "workbox-streams": "6.6.0", "workbox-sw": "6.6.0", "workbox-window": "6.6.0" }, "engines": { "node": ">=10.0.0" } }, "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { "version": "0.3.6", "dev": true, "license": "MIT", "dependencies": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", "leven": "^3.1.0" }, "engines": { "node": ">=10" }, "peerDependencies": { "ajv": ">=8" } }, "node_modules/workbox-build/node_modules/ajv": { "version": "8.12.0", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/workbox-build/node_modules/fs-extra": { "version": "9.1.0", "dev": true, "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/workbox-build/node_modules/json-schema-traverse": { "version": "1.0.0", "dev": true, "license": "MIT" }, "node_modules/workbox-build/node_modules/source-map": { "version": "0.8.0-beta.0", "dev": true, "license": "BSD-3-Clause", "dependencies": { "whatwg-url": "^7.0.0" }, "engines": { "node": ">= 8" } }, "node_modules/workbox-build/node_modules/tr46": { "version": "1.0.1", "dev": true, "license": "MIT", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/workbox-build/node_modules/webidl-conversions": { "version": "4.0.2", "dev": true, "license": "BSD-2-Clause" }, "node_modules/workbox-build/node_modules/whatwg-url": { "version": "7.1.0", "dev": true, "license": "MIT", "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "node_modules/workbox-cacheable-response": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } }, "node_modules/workbox-core": { "version": "6.6.0", "dev": true, "license": "MIT" }, "node_modules/workbox-expiration": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "idb": "^7.0.1", "workbox-core": "6.6.0" } }, "node_modules/workbox-google-analytics": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "workbox-background-sync": "6.6.0", "workbox-core": "6.6.0", "workbox-routing": "6.6.0", "workbox-strategies": "6.6.0" } }, "node_modules/workbox-navigation-preload": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } }, "node_modules/workbox-precaching": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "workbox-core": "6.6.0", "workbox-routing": "6.6.0", "workbox-strategies": "6.6.0" } }, "node_modules/workbox-range-requests": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } }, "node_modules/workbox-recipes": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "workbox-cacheable-response": "6.6.0", "workbox-core": "6.6.0", "workbox-expiration": "6.6.0", "workbox-precaching": "6.6.0", "workbox-routing": "6.6.0", "workbox-strategies": "6.6.0" } }, "node_modules/workbox-routing": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } }, "node_modules/workbox-strategies": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "workbox-core": "6.6.0" } }, "node_modules/workbox-streams": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "workbox-core": "6.6.0", "workbox-routing": "6.6.0" } }, "node_modules/workbox-sw": { "version": "6.6.0", "dev": true, "license": "MIT" }, "node_modules/workbox-webpack-plugin": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "fast-json-stable-stringify": "^2.1.0", "pretty-bytes": "^5.4.1", "upath": "^1.2.0", "webpack-sources": "^1.4.3", "workbox-build": "6.6.0" }, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "webpack": "^4.4.0 || ^5.9.0" } }, "node_modules/workbox-webpack-plugin/node_modules/source-map": { "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { "version": "1.4.3", "dev": true, "license": "MIT", "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" } }, "node_modules/workbox-window": { "version": "6.6.0", "dev": true, "license": "MIT", "dependencies": { "@types/trusted-types": "^2.0.2", "workbox-core": "6.6.0" } }, "node_modules/wrap-ansi": { "version": "7.0.0", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrap-ansi-cjs/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/wrap-ansi-cjs/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "dev": true, "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", "license": "ISC" }, "node_modules/write-file-atomic": { "version": "4.0.2", "dev": true, "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/ws": { "version": "8.16.0", "license": "MIT", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { "optional": true }, "utf-8-validate": { "optional": true } } }, "node_modules/xml": { "version": "1.0.1", "dev": true, "license": "MIT" }, "node_modules/xml-name-validator": { "version": "4.0.0", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=12" } }, "node_modules/xmlchars": { "version": "2.2.0", "dev": true, "license": "MIT" }, "node_modules/y18n": { "version": "5.0.8", "dev": true, "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", "dev": true, "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", "dev": true, "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/yargs": { "version": "17.7.2", "dev": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/yargs-parser": { "version": "21.1.1", "dev": true, "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yocto-queue": { "version": "0.1.0", "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } } } } diff --git a/cashtab/package.json b/cashtab/package.json index 1ae219e061..cb2d1cb2fa 100644 --- a/cashtab/package.json +++ b/cashtab/package.json @@ -1,113 +1,114 @@ { "name": "cashtab", - "version": "2.34.4", + "version": "2.35.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": { "@bitgo/utxo-lib": "^9.33.0", "@zxing/browser": "^0.1.4", "bip39": "^3.0.2", "bip66": "^1.1.5", "bitcoinjs-message": "^2.2.0", "chronik-client": "^0.26.1", "ecash-coinselect": "^2.2.0", "ecash-script": "^2.1.2", "ecashaddrjs": "^1.5.4", + "js-sha256": "^0.11.0", "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/App/App.js b/cashtab/src/components/App/App.js index 53fc773d5c..b5f7331195 100644 --- a/cashtab/src/components/App/App.js +++ b/cashtab/src/components/App/App.js @@ -1,552 +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, useEffect } from 'react'; import { HomeIcon, SendIcon, ReceiveIcon, SettingsIcon, AirdropIcon, BankIcon, WalletIcon, ContactsIcon, ThemedSignAndVerifyMsg, ThemedUserProfileIcon, SwapIcon, TokensIcon, RewardIcon, } from 'components/Common/CustomIcons'; import Spinner from 'components/Common/Spinner'; import { ThemeProvider } from 'styled-components'; import { theme } from 'assets/styles/theme'; import Home from 'components/Home/Home'; import Receive from 'components/Receive/Receive'; import CreateToken from 'components/Etokens/CreateToken'; import SendXec from 'components/Send/SendXec'; import Token from 'components/Etokens/Token'; import Airdrop from 'components/Airdrop/Airdrop'; import BackupWallet from 'components/BackupWallet/BackupWallet'; import Contacts from 'components/Contacts'; import Wallets from 'components/Wallets'; import Alias from 'components/Alias/Alias'; import Etokens from 'components/Etokens/Etokens'; import Configure from 'components/Configure/Configure'; import SignVerifyMsg from 'components/SignVerifyMsg/SignVerifyMsg'; import Swap from 'components/Swap/Swap'; import Rewards from 'components/Rewards'; import NotFound from 'components/App/NotFound'; import OnBoarding from 'components/OnBoarding/OnBoarding'; import { LoadingCtn } from 'components/Common/Atoms'; import Cashtab from 'assets/cashtab_xec.png'; import './App.css'; import { WalletContext } from 'wallet/context'; import { getWalletState } from 'utils/cashMethods'; import { Route, Routes, useLocation, useNavigate } from 'react-router-dom'; // Easter egg imports not used in extension/src/components/App.js import TabCash from 'assets/tabcash.png'; import { hasEnoughToken } from 'wallet'; import ServiceWorkerWrapper from 'components/Common/ServiceWorkerWrapper'; import aliasSettings from 'config/alias'; import WebApp from 'components/AppModes/WebApp'; import Extension from 'components/AppModes/Extension'; import ExtensionHeader from 'components/Common/ExtensionHeader'; import WalletLabel from 'components/Common/WalletLabel.js'; import BalanceHeader from 'components/Common/BalanceHeader'; import { isValidCashtabWallet } from 'validation'; import { Bounce } from 'react-toastify'; import { ExtensionFrame, GlobalStyle, CashtabNotification, CustomApp, Footer, Header, NavWrapper, NavItem, NavIcon, NavMenu, NavButton, WalletBody, ScreenWrapper, WalletCtn, HeaderCtn, CashtabLogo, EasterEgg, NavHeader, WalletInfoCtn, } from 'components/App/styles'; import WalletHeaderActions from 'components/Common/WalletHeaderActions'; import 'react-toastify/dist/ReactToastify.min.css'; import debounce from 'lodash.debounce'; const App = () => { const ContextValue = React.useContext(WalletContext); const { cashtabState, updateCashtabState, fiatPrice, loading, cashtabLoaded, } = ContextValue; const { settings, wallets } = cashtabState; const wallet = wallets.length > 0 ? wallets[0] : false; const walletState = getWalletState(wallet); const { balanceSats } = walletState; const [navMenuClicked, setNavMenuClicked] = useState(false); const [scrollY, setScrollY] = useState(0); const [minifiedMenu, setMinifiedMenu] = useState(false); const handleNavMenuClick = () => setNavMenuClicked(!navMenuClicked); // If wallet is unmigrated, do not show page until it has migrated // An invalid wallet will be validated/populated after the next API call, ETA 10s const validWallet = isValidCashtabWallet(wallet); const location = useLocation(); const navigate = useNavigate(); const PIN_MINIFIED_WALLET_MENU_SCROLLY = 63; const UNPIN_MINIFIED_WALLET_MENU_SCROLLY = 15; const handleScroll = () => { setScrollY(window.scrollY); }; useEffect(() => { if (scrollY > PIN_MINIFIED_WALLET_MENU_SCROLLY && !minifiedMenu) { // If the user has scrolled DOWN past PIN_MINIFIED_WALLET_MENU_SCROLLY and the menu IS NOT minified // Minify the menu setMinifiedMenu(true); } else if ( scrollY < UNPIN_MINIFIED_WALLET_MENU_SCROLLY && minifiedMenu ) { // If the user has scrolled UP past UNPIN_MINIFIED_WALLET_MENU_SCROLLY and the menu IS minified // Unminify the menu setMinifiedMenu(false); } }, [scrollY, minifiedMenu]); // Only execute handleScroll if it has not been called for 25ms const debouncedHandleScroll = debounce(handleScroll, 25); useEffect(() => { window.addEventListener('scroll', debouncedHandleScroll); return () => { window.removeEventListener('scroll', debouncedHandleScroll); }; }, []); // Easter egg boolean not used in extension/src/components/App.js const hasTab = validWallet ? hasEnoughToken( wallet.state.tokens, '50d8292c6255cda7afc6c8566fed3cf42a2794e9619740fe8f4c95431271410e', 1, ) : false; return ( {process.env.REACT_APP_BUILD_ENV === 'extension' ? ( <> ) : ( <> )} {loading || (wallet !== false && !validWallet && )} {!cashtabLoaded ? ( ) : ( <> {wallet === false ? ( ) : ( <>
{process.env .REACT_APP_BUILD_ENV === 'extension' ? ( ) : ( )} {location.pathname === '/airdrop' && ( Airdrop )} {location.pathname === '/backup' && ( Wallet Backup )} {location.pathname === '/contacts' && ( Contacts )} {location.pathname === '/wallets' && ( Wallets )} {location.pathname === '/configure' && ( Settings )} {location.pathname === '/signverifymsg' && ( {' '} Sign & Verify Msg )} {location.pathname === '/rewards' && ( {' '} Rewards )} {process.env .REACT_APP_BUILD_ENV !== 'extension' && ( <> {location.pathname === '/swap' && ( {' '} Swap )} )} {process.env .REACT_APP_BUILD_ENV !== 'extension' && ( <> {hasTab && ( )} )} {minifiedMenu && ( )}
} /> } /> } /> + } + /> + } /> } /> } /> } /> } /> } /> } /> } /> } /> {aliasSettings.aliasEnabled && ( } /> )} } /> {process.env .REACT_APP_BUILD_ENV !== 'extension' && ( } /> )} } /> } /> } /> )} )}
{wallet !== false && (
navigate('/')} > navigate('/send')} style={{ paddingBottom: '10px' }} > navigate('/etokens')} > navigate('receive')} > navigate('/backup')} > {' '}

Wallet Backup

navigate('/wallets')} > {' '}

Wallets

navigate('/contacts')} > {' '}

Contacts

navigate('/airdrop')} > {' '}

Airdrop

navigate('/rewards')} > {' '}

Rewards

{process.env.REACT_APP_BUILD_ENV !== 'extension' && ( navigate('/swap')} > {' '}

Swap

)} navigate('/signverifymsg') } >

Sign & Verify

{aliasSettings.aliasEnabled && ( navigate('/alias')} > {' '}

Alias

)} navigate('/configure')} >

Settings

)}
); }; export default App; diff --git a/cashtab/src/components/Common/Inputs.js b/cashtab/src/components/Common/Inputs.js index 094ebcde1c..43d686935b 100644 --- a/cashtab/src/components/Common/Inputs.js +++ b/cashtab/src/components/Common/Inputs.js @@ -1,668 +1,671 @@ // 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'; import { supportedFiatCurrencies } from 'config/cashtabSettings'; 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` ${props => props.disabled && `cursor: not-allowed`}; 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: ${props => props.height}px; resize: none; ${props => props.disabled && `cursor: not-allowed`}; &::-webkit-scrollbar { width: 12px; } &::-webkit-scrollbar-track { -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); background-color: ${props => props.theme.eCashBlue}; border-radius: 10px; height: 80%; } &::-webkit-scrollbar-thumb { border-radius: 10px; color: ${props => props.theme.eCashBlue}; -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.5); } `; 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 AliasSuffixHolder = styled(OnMaxBtn)` cursor: auto; `; const CurrencyDropdown = styled.select` cursor: ${props => (props.disabled ? 'not-allowed' : '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 SendXecDropdown = styled(CurrencyDropdown)` width: 100px; `; 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}; word-break: break-all; `; export const InputFlex = styled.div` display: flex; flex-direction: column; width: 100%; gap: 12px; `; export const Input = ({ placeholder = '', name = '', value = '', + disabled = false, handleInput, error = false, }) => { return ( handleInput(e)} /> {typeof error === 'string' ? error : ''} ); }; Input.propTypes = { placeholder: PropTypes.string, name: PropTypes.string, value: PropTypes.string, + disabled: PropTypes.bool, error: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), handleInput: PropTypes.func, }; export const ModalInput = ({ placeholder = '', name = '', value = '', handleInput, error = false, }) => { return ( handleInput(e)} /> {typeof error === 'string' ? error : ''} ); }; 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: center; justify-content: space-between; `; const TextAreaErrorMsg = styled.div` order: 0; font-size: 14px; color: ${props => props.theme.forms.error}; word-break: break-all; `; export const TextArea = ({ placeholder = '', name = '', value = '', handleInput, disabled = false, height = 142, error = false, showCount = false, customCount = false, max = '', }) => { return ( handleInput(e)} /> {typeof error === 'string' ? error : ''} {showCount && ( {customCount !== false ? customCount : value.length} /{max} )} ); }; TextArea.propTypes = { placeholder: PropTypes.string, name: PropTypes.string, value: PropTypes.string, handleInput: PropTypes.func, disabled: PropTypes.bool, height: PropTypes.number, error: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), showCount: PropTypes.bool, customCount: PropTypes.number, max: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), }; export const InputWithScanner = ({ placeholder = '', name = '', value = '', disabled = false, handleInput, error = false, loadWithScannerOpen, }) => { return ( handleInput(e)} /> handleInput({ target: { name: 'address', value: result, }, }) } /> {typeof error === 'string' ? error : ''} ); }; 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 ( handleInput(e)} disabled={inputDisabled} /> handleSelect(e)} disabled={selectDisabled} > XEC {fiatCode} max {typeof error === 'string' ? error : ''} ); }; 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 ( handleInput(e)} disabled={inputDisabled} /> max {typeof error === 'string' ? error : ''} ); }; SendTokenInput.propTypes = { name: PropTypes.string, placeholder: PropTypes.string, value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), decimals: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), inputDisabled: PropTypes.bool, error: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]), handleInput: PropTypes.func, handleOnMax: PropTypes.func, }; export const AliasInput = ({ name = '', placeholder = '', value = '', inputDisabled = false, error = false, handleInput, }) => { return ( handleInput(e)} disabled={inputDisabled} /> .xec {typeof error === 'string' ? error : ''} ); }; AliasInput.propTypes = { name: PropTypes.string, placeholder: PropTypes.string, value: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), decimals: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), 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 ( { 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 ( e.preventDefault()} > {imageUrl ? ( ) : ( Drag and drop a png or jpg for your token icon or click to upload )} {dragActive && ( )} ); }; CashtabDragger.propTypes = { name: PropTypes.string, handleFile: PropTypes.func, imageUrl: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]), }; export const CurrencySelect = ({ name = 'select', value, handleSelect }) => { // Build select dropdown from supportedFiatCurrencies const currencyMenuOptions = []; const currencyKeys = Object.keys(supportedFiatCurrencies); for (let i = 0; i < currencyKeys.length; i += 1) { const currencyMenuOption = {}; currencyMenuOption.value = supportedFiatCurrencies[currencyKeys[i]].slug; currencyMenuOption.label = `${ supportedFiatCurrencies[currencyKeys[i]].name } (${supportedFiatCurrencies[currencyKeys[i]].symbol})`; currencyMenuOptions.push(currencyMenuOption); } const currencyOptions = currencyMenuOptions.map(currencyMenuOption => { return ( {currencyMenuOption.label} ); }); return ( {currencyOptions} ); }; CurrencySelect.propTypes = { name: PropTypes.string.isRequired, value: PropTypes.string.isRequired, handleSelect: PropTypes.func.isRequired, }; diff --git a/cashtab/src/components/Etokens/CreateTokenForm/index.js b/cashtab/src/components/Etokens/CreateTokenForm/index.js index 588f4c15b1..d902776a79 100644 --- a/cashtab/src/components/Etokens/CreateTokenForm/index.js +++ b/cashtab/src/components/Etokens/CreateTokenForm/index.js @@ -1,691 +1,779 @@ // Copyright (c) 2024 The Bitcoin developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. import React, { useState, useCallback, useEffect } from 'react'; import Modal from 'components/Common/Modal'; import { WalletContext } from 'wallet/context'; import { isValidTokenName, isValidTokenTicker, isValidTokenDecimals, isValidTokenMintAmount, getTokenDocumentUrlError, isProbablyNotAScam, } from 'validation'; import PrimaryButton from 'components/Common/Buttons'; import { Input, SendTokenInput, Slider, CashtabDragger, } from 'components/Common/Inputs'; import CashtabSwitch from 'components/Common/Switch'; import { TokenParamLabel } from 'components/Common/Atoms'; import Cropper from 'react-easy-crop'; import getCroppedImg from 'components/Etokens/icons/cropImage'; import getRoundImg from 'components/Etokens/icons/roundImage'; import getResizedImage from 'components/Etokens/icons/resizeImage'; import { token as tokenConfig } from 'config/token'; import appConfig from 'config/app'; -import { getSlpGenesisTargetOutput, getMaxMintAmount } from 'slpv1'; +import { + getSlpGenesisTargetOutput, + getMaxMintAmount, + getNftParentGenesisTargetOutputs, +} from 'slpv1'; import { sendXec } from 'transactions'; import { TokenNotificationIcon } from 'components/Common/CustomIcons'; import { explorer } from 'config/explorer'; import { getWalletState } from 'utils/cashMethods'; import { hasEnoughToken } from 'wallet'; import { toast } from 'react-toastify'; import Switch from 'components/Common/Switch'; -import { useNavigate } from 'react-router-dom'; +import { useNavigate, useLocation } from 'react-router-dom'; import { Form, SwitchRow, SwitchLabel, EditIcon, TokenCreatedLink, IconModalForm, IconModalRow, SliderLabel, SliderBox, CropperContainer, CreateTokenTitle, TokenCreationSummaryTable, SummaryRow, TokenParam, } from 'components/Etokens/CreateTokenForm/styles'; +import { sha256 } from 'js-sha256'; const CreateTokenForm = () => { const navigate = useNavigate(); + const location = useLocation(); const { chronik, chaintipBlockheight, cashtabState } = React.useContext(WalletContext); const { settings, wallets } = cashtabState; const wallet = wallets.length > 0 ? wallets[0] : false; const walletState = getWalletState(wallet); const { tokens } = walletState; // eToken icon adds const [tokenIcon, setTokenIcon] = useState(''); const [createdTokenId, setCreatedTokenId] = useState(null); const [loading, setLoading] = useState(false); const [fileName, setFileName] = useState(''); const [tokenIconFileName, setTokenIconFileName] = useState(undefined); const [rawImageUrl, setRawImageUrl] = useState(''); const [imageUrl, setImageUrl] = useState(false); const [showCropModal, setShowCropModal] = useState(false); const [roundSelection, setRoundSelection] = useState(true); const [crop, setCrop] = useState({ x: 0, y: 0 }); const [rotation, setRotation] = useState(0); const [zoom, setZoom] = useState(1); const [croppedAreaPixels, setCroppedAreaPixels] = useState(null); + // NFT handling + const [createNftCollection, setCreateNftCollection] = useState(false); + // Modal settings const [showConfirmCreateToken, setShowConfirmCreateToken] = useState(false); // Token form items const emptyFormData = { name: '', ticker: '', decimals: '', genesisQty: '', url: '', + hash: '', createWithMintBatonAtIndexTwo: false, }; const initialFormDataErrors = { name: false, ticker: false, decimals: false, genesisQty: false, url: false, + // No error for hash as this is only generated }; const [formData, setFormData] = useState(emptyFormData); const [formDataErrors, setFormDataErrors] = useState(initialFormDataErrors); // This switch is form data, but since it is a bool and not a string, keep it with its own state field const [createWithMintBatonAtIndexTwo, setCreateWithMintBatonAtIndexTwo] = useState(false); // Note: We do not include a UI input for token document hash // Questionable value to casual users and requires significant complication + useEffect(() => { + // If we routed here from the Create NFT Collection link, toggle NFT switch to true + if (location?.pathname?.includes('create-nft-collection')) { + setCreateNftCollection(true); + } + }, []); + useEffect(() => { // After the user has created a token, we wait until the wallet has updated its balance // and the page is available, then we navigate to the page if (createdTokenId === null) { return; } if (typeof tokens.get(createdTokenId) !== 'undefined') { navigate(`/token/${createdTokenId}`); } }, [createdTokenId, tokens]); + useEffect(() => { + if (createNftCollection === true) { + // Cashtab only creates NFT1 Parent tokens (aka NFT Collections) with 0 decimals + setFormData(previous => ({ + ...previous, + decimals: '0', + })); + } + }, [createNftCollection]); + const onCropComplete = useCallback((croppedArea, croppedAreaPixels) => { setCroppedAreaPixels(croppedAreaPixels); }, []); const showCroppedImage = useCallback(async () => { setLoading(true); try { let imageToResize; const croppedResult = await getCroppedImg( rawImageUrl, croppedAreaPixels, rotation, fileName, ); if (roundSelection) { imageToResize = await getRoundImg(croppedResult.url, fileName); } else { imageToResize = croppedResult; } await getResizedImage( imageToResize.url, resizedResult => { setTokenIcon(resizedResult.file); setImageUrl(resizedResult.url); }, fileName, ); } catch (e) { console.error(e); } finally { setLoading(false); } }, [croppedAreaPixels, fileName, rawImageUrl, rotation, roundSelection]); const onClose = useCallback(() => { setShowCropModal(false); }, []); const handleTokenIconImage = (imgFile, callback) => new Promise((resolve, reject) => { setLoading(true); try { + // Get the sha256 hash of the user's original uploaded file + // For an NFT, this will be set as the document hash + // Note that this will not match the hash of the image on the token server due to resizing + // and renaming + // The hash should be of the creator's original file + const hashreader = new FileReader(); + hashreader.readAsArrayBuffer(imgFile); + hashreader.addEventListener('load', () => { + // Handle Input expects an event with key target + // target to have keys name and hash + handleInput({ + target: { + name: 'hash', + value: sha256(hashreader.result), + }, + }); + }); + const reader = new FileReader(); const width = 512; const height = 512; reader.readAsDataURL(imgFile); reader.addEventListener('load', () => setRawImageUrl(reader.result), ); reader.onload = event => { const img = new Image(); img.src = event.target.result; img.onload = () => { const elem = document.createElement('canvas'); elem.width = width; elem.height = height; const ctx = elem.getContext('2d'); // img.width and img.height will contain the original dimensions ctx.drawImage(img, 0, 0, width, height); if (!HTMLCanvasElement.prototype.toBlob) { Object.defineProperty( HTMLCanvasElement.prototype, 'toBlob', { value: function (callback, type, quality) { var dataURL = this.toDataURL( type, quality, ).split(',')[1]; setTimeout(function () { var binStr = atob(dataURL), len = binStr.length, arr = new Uint8Array(len); for (var i = 0; i < len; i++) { arr[i] = binStr.charCodeAt(i); } callback( new Blob([arr], { type: type || 'image/png', }), ); }); }, }, ); } ctx.canvas.toBlob( blob => { let fileNameParts = imgFile.name.split('.'); fileNameParts.pop(); let fileNamePng = fileNameParts.join('.') + '.png'; const file = new File([blob], fileNamePng, { type: 'image/png', }); setFileName(fileNamePng); const resultReader = new FileReader(); resultReader.readAsDataURL(file); setTokenIcon(file); resultReader.addEventListener('load', () => callback(resultReader.result), ); setLoading(false); setShowCropModal(true); resolve(); }, 'image/png', 1, ); }; }; } catch (err) { console.error(`Error in handleTokenIconImage()`, err); reject(err); } }); const validateTokenIconUpload = file => { const approvedFileTypes = ['image/png', 'image/jpg', 'image/jpeg']; try { if (!approvedFileTypes.includes(file.type)) { throw new Error('Only jpg or png image files are accepted'); } setLoading(true); handleTokenIconImage(file, imageUrl => setImageUrl(imageUrl)); } catch (e) { toast.error( `Cashtab can only process jpg or png files for token icon uploads.`, ); setTokenIconFileName(undefined); setTokenIcon(undefined); setImageUrl(''); return false; } }; const handleInput = e => { const { name, value } = e.target; switch (name) { case 'name': { // Handle validation and state updates for new token name // validation const validTokenName = isValidTokenName(value); const probablyNotScam = isProbablyNotAScam(value); setFormDataErrors(previous => ({ ...previous, [name]: !validTokenName ? `Token name must be a valid string between 1 and 68 characters long.` : !probablyNotScam ? 'Token name must not conflict with existing crypto or fiat' : false, })); break; } case 'ticker': { // validation const validTokenTicker = isValidTokenTicker(value); const probablyNotScamTicker = isProbablyNotAScam(value); setFormDataErrors(previous => ({ ...previous, [name]: !validTokenTicker ? `Token ticker must be a valid string between 1 and 12 characters long` : !probablyNotScamTicker ? 'Token ticker must not conflict with existing crypto or fiat' : false, })); break; } case 'decimals': { setFormDataErrors(previous => ({ ...previous, [name]: isValidTokenDecimals(value) ? false : 'Token decimals must be an integer between 0 and 9', })); // Also validate the supply here if the form has been touched // Supply validation may change when decimals changes if (formData.genesisQty !== '') { const isValidOrStringErrorMsg = isValidTokenMintAmount( formData.genesisQty, // Note that, in this code block, value is formData.decimals parseInt(value), ); setFormDataErrors(previous => ({ ...previous, genesisQty: typeof isValidOrStringErrorMsg === 'string' ? isValidOrStringErrorMsg : false, })); } break; } case 'genesisQty': { const isValidOrStringErrorMsg = isValidTokenMintAmount( value, // If user has not yet input decimals, assume 0 decimals formData.decimals === '' ? 0 : parseInt(formData.decimals), ); setFormDataErrors(previous => ({ ...previous, [name]: typeof isValidOrStringErrorMsg === 'string' ? isValidOrStringErrorMsg : false, })); break; } case 'url': { setFormDataErrors(previous => ({ ...previous, [name]: getTokenDocumentUrlError(value), })); break; } + case 'hash': { + // Do nothing, we disable user input for this field + // Input can only come from a user uploaded image + break; + } default: break; } setFormData(previous => ({ ...previous, [name]: value, })); }; const onMaxGenesis = () => { // Use 0 for decimals if user has not input decimals yet const usedDecimals = formData.decimals === '' ? 0 : parseInt(formData.decimals); const maxGenesisAmount = getMaxMintAmount(usedDecimals); handleInput({ target: { name: 'genesisQty', value: maxGenesisAmount, }, }); }; // Only enable CreateToken button if all form entries are valid let tokenGenesisDataIsValid = formDataErrors.name === false && formDataErrors.ticker === false && formDataErrors.decimals === false && formDataErrors.genesisQty === false && formDataErrors.url === false; const submitTokenIcon = async tokenId => { let submittedFormData = new FormData(); const data = { name: formData.name, ticker: formData.ticker, decimals: formData.decimals, url: formData.url, genesisQty: formData.genesisQty, tokenIcon, }; for (let key in data) { submittedFormData.append(key, data[key]); } // This function is called after the genesis tx is broadcast, using tokenId as a calling param submittedFormData.append('tokenId', tokenId); try { const tokenIconApprovalResponse = await fetch( tokenConfig.tokenIconSubmitApi, { method: 'POST', //Note: fetch automatically assigns correct header for multipart form based on formData obj headers: { Accept: 'application/json', }, body: submittedFormData, }, ); const tokenIconApprovalResponseJson = await tokenIconApprovalResponse.json(); if ( typeof tokenIconApprovalResponseJson.status === 'undefined' || tokenIconApprovalResponseJson.status !== 'ok' ) { // Let the user know there was an issue with submitting the token icon if (tokenIconApprovalResponseJson.msg) { throw new Error(tokenIconApprovalResponseJson.msg); } else { throw new Error( 'Error uploading token icon. Please email icons@e.cash for support.', ); } } toast.success(`Successfully uploaded token icon`); } catch (err) { console.error(err.message); toast.error( `Error submitting token icon for approval, please contact icons@e.cash for support`, ); } }; const createPreviewedToken = async () => { // If data is for some reason not valid here, bail out if (!tokenGenesisDataIsValid) { return; } // data must be valid and user reviewed to get here const configObj = { name: formData.name, ticker: formData.ticker, decimals: formData.decimals, documentUrl: formData.url === '' ? tokenConfig.newTokenDefaultUrl : formData.url, genesisQty: formData.genesisQty, - documentHash: '', + // Support documentHash for NFT Collection, but only for uploaded image file + documentHash: createNftCollection ? formData.hash : '', mintBatonVout: createWithMintBatonAtIndexTwo ? 2 : null, }; - // create token with data in state fields + // Create type 1 slp token per specified user data try { // Get target outputs for an SLP v1 genesis tx - const targetOutputs = getSlpGenesisTargetOutput(configObj); + const targetOutputs = createNftCollection + ? getNftParentGenesisTargetOutputs(configObj) + : getSlpGenesisTargetOutput(configObj); const { response } = await sendXec( chronik, wallet, targetOutputs, settings.minFeeSends && hasEnoughToken( tokens, appConfig.vipSettingsTokenId, appConfig.vipSettingsTokenQty, ) ? appConfig.minFee : appConfig.defaultFee, chaintipBlockheight, ); const { txid } = response; setCreatedTokenId(txid); toast( - Token created! + {createNftCollection ? 'NFT Collection' : 'Token'} created! , { icon: TokenNotificationIcon, }, ); // If this eToken has an icon, upload to server if (tokenIcon !== '') { submitTokenIcon(txid); } } catch (e) { toast.error(`${e}`); } // Hide the modal setShowConfirmCreateToken(false); }; return ( <> {showConfirmCreateToken && ( setShowConfirmCreateToken(false)} showCancelButton height={260} > Name: {formData.name} Ticker:{' '} {formData.ticker} Decimals: {formData.decimals} Supply: {formData.genesisQty} URL: {formData.url === '' ? tokenConfig.newTokenDefaultUrl : formData.url} + {createNftCollection && ( + + Hash: + {formData.hash} + + )} )} - Create a Token + + Create {createNftCollection ? 'NFT Collection' : 'Token'} +
+ {createNftCollection && ( + + )} { setCreateWithMintBatonAtIndexTwo( !createWithMintBatonAtIndexTwo, ); }} /> - Token supply + + {createNftCollection + ? 'NFT Collection Size' + : 'Token supply'} + {typeof tokenIconFileName === 'string' && (

{tokenIconFileName.name}

)} {!loading && tokenIcon && ( setShowCropModal(true)}> {tokenIcon.name} [edit] )} {showCropModal && ( showCroppedImage() && onClose()} height={400} > setRoundSelection(!roundSelection) } /> Zoom: Rotation: )} setShowConfirmCreateToken(true)} disabled={!tokenGenesisDataIsValid} style={{ marginTop: '30px' }} > - Create eToken + Create {createNftCollection ? 'NFT Collection' : 'eToken'} ); }; export default CreateTokenForm; diff --git a/cashtab/src/components/Etokens/Etokens.js b/cashtab/src/components/Etokens/Etokens.js index d2e15d4d94..6101b4ecf6 100644 --- a/cashtab/src/components/Etokens/Etokens.js +++ b/cashtab/src/components/Etokens/Etokens.js @@ -1,148 +1,152 @@ // Copyright (c) 2024 The Bitcoin developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. import React, { useState, useEffect } from 'react'; import styled from 'styled-components'; import { WalletContext } from 'wallet/context'; import { LoadingCtn } from 'components/Common/Atoms'; import TokenList from './TokenList'; import { getWalletState } from 'utils/cashMethods'; import appConfig from 'config/app'; import { getUserLocale } from 'helpers'; -import { PrimaryLink } from 'components/Common/Buttons'; +import { PrimaryLink, SecondaryLink } from 'components/Common/Buttons'; import { Input } from 'components/Common/Inputs'; const EtokensCtn = styled.div` color: ${props => props.theme.contrast}; width: 100%; h2 { margin: 0 0 20px; margin-top: 10px; } padding-top: 24px; `; const ButtonHolder = styled.div` display: flex; flex-direction: column; gap: 12px; align-items: center; justify-content: center; `; const Etokens = () => { const ContextValue = React.useContext(WalletContext); const { loading, cashtabState } = ContextValue; const { wallets, cashtabCache } = cashtabState; const wallet = wallets.length > 0 ? wallets[0] : false; const walletState = getWalletState(wallet); const { tokens } = walletState; const userLocale = getUserLocale(navigator); const [tokenSearch, setTokenSearch] = useState(''); // tokensInWallet is a key value array of the cashtab cache tokens Map, // except that it contains only the tokens in wallet.state.tokens, // and, in addition to cached info, it has the user's token balance const [tokensInWallet, setTokensInWallet] = useState(null); // renderedTokens is a subset of tokensInWallet, filtered by the user's search query const [renderedTokens, setRenderedTokens] = useState(null); useEffect(() => { // On page load, create a key value array of all the cached info for tokens you have in the wallet // Clone cashtab cache tokens const tokenMapWithBalance = new Map(cashtabCache.tokens); // Add balance to all cached tokens where balance info is available tokens.forEach((tokenBalance, tokenId) => { tokenMapWithBalance.set(tokenId, { ...tokenMapWithBalance.get(tokenId), balance: tokenBalance, }); }); // Convert to a keyValueArray so you can filter() const cacheKeyValueArray = [...tokenMapWithBalance]; // Filter so you only have tokens with balance (or 0 balance and mint baton) const walletTokensKeyValueArray = cacheKeyValueArray.filter(kv => tokens.has(kv[0]), ); // Sort alphabetical by token ticker, since the ticker is what you render walletTokensKeyValueArray.sort((a, b) => { return a[1].genesisInfo.tokenTicker.localeCompare( b[1].genesisInfo.tokenTicker, ); }); setTokensInWallet(walletTokensKeyValueArray); // Initialize rendered tokens as all tokens setRenderedTokens(walletTokensKeyValueArray); }, [wallet.state.tokens]); const handleTokenSearchInput = e => { const { value } = e.target; setTokenSearch(value); // make the search case insensitive const searchString = value.toLowerCase(); // Get the tokensInWallet that include this search string in ticker or name const filteredTokensInWallet = tokensInWallet.filter( kv => kv[1].genesisInfo.tokenName .toLowerCase() .includes(searchString) || kv[1].genesisInfo.tokenTicker .toLowerCase() .includes(searchString), ); // Only render tokens that appear in filteredTokensInWallet setRenderedTokens(filteredTokensInWallet); }; return ( <> {loading || renderedTokens === null ? ( ) : ( - + Create eToken + + + Create NFT Collection + + {Array.isArray(tokensInWallet) && tokensInWallet.length > 0 ? ( <> {renderedTokens.length > 0 ? ( ) : (

No tokens matching {tokenSearch}

)} ) : (

Tokens sent to your {appConfig.tokenTicker} address will appear here

)}
)} ); }; export default Etokens; diff --git a/cashtab/src/components/Etokens/Token/index.js b/cashtab/src/components/Etokens/Token/index.js index ef0b2291e7..969fc4f4a7 100644 --- a/cashtab/src/components/Etokens/Token/index.js +++ b/cashtab/src/components/Etokens/Token/index.js @@ -1,1046 +1,1052 @@ // Copyright (c) 2024 The Bitcoin developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. import React, { useState, useEffect } from 'react'; import { Link, useParams } from 'react-router-dom'; import { WalletContext } from 'wallet/context'; import PrimaryButton, { SecondaryButton, IconButton, CopyIconButton, } from 'components/Common/Buttons'; -import { TxLink, SwitchLabel } from 'components/Common/Atoms'; +import { TxLink, SwitchLabel, Info } from 'components/Common/Atoms'; import BalanceHeaderToken from 'components/Common/BalanceHeaderToken'; import { useNavigate } from 'react-router-dom'; import { Event } from 'components/Common/GoogleAnalytics'; import { getWalletState } from 'utils/cashMethods'; import ApiError from 'components/Common/ApiError'; import { isValidTokenSendOrBurnAmount, parseAddressInput, isValidTokenMintAmount, } from 'validation'; import { formatDate } from 'utils/formatting'; import TokenIcon from 'components/Etokens/TokenIcon'; import { explorer } from 'config/explorer'; import { queryAliasServer } from 'alias'; import aliasSettings from 'config/alias'; import cashaddr from 'ecashaddrjs'; import appConfig from 'config/app'; import { isMobile, getUserLocale } from 'helpers'; import { getSendTokenInputs, getSlpSendTargetOutputs, getSlpBurnTargetOutputs, getMintBatons, getMintTargetOutputs, getMaxMintAmount, } from 'slpv1'; import { sendXec } from 'transactions'; import { hasEnoughToken, decimalizeTokenAmount } from 'wallet'; import Modal from 'components/Common/Modal'; import { toast } from 'react-toastify'; import { InputWithScanner, SendTokenInput, ModalInput, InputFlex, } from 'components/Common/Inputs'; import { QuestionIcon } from 'components/Common/CustomIcons'; import { decimalizedTokenQtyToLocaleFormat } from 'utils/formatting'; import Switch from 'components/Common/Switch'; import { DataAndQuestionButton, TokenIconExpandButton, SendTokenForm, SendTokenFormRow, InputRow, TokenStatsTable, TokenStatsRow, TokenStatsCol, TokenStatsTableRow, TokenStatsLabel, SwitchHolder, TokenSentLink, AliasAddressPreviewLabel, } from 'components/Etokens/Token/styled'; const Token = () => { let navigate = useNavigate(); const { apiError, cashtabState, chronik, chaintipBlockheight, loading } = React.useContext(WalletContext); const { settings, wallets, cashtabCache } = cashtabState; const wallet = wallets.length > 0 ? wallets[0] : false; const walletState = getWalletState(wallet); const { tokens, balanceSats } = walletState; const params = useParams(); const tokenId = params.tokenId; const tokenBalance = tokens.get(tokenId); const cachedInfo = typeof cashtabCache.tokens.get(tokenId) !== 'undefined' ? cashtabCache.tokens.get(tokenId) : { tokenType: { number: 1, protocol: 'SLP', type: 'SLP_TOKEN_TYPE_FUNGIBLE', }, genesisInfo: { tokenName: 'UNCACHED', tokenTicker: 'UNCACHED', decimals: 0, }, genesisSupply: '0', genesisMintBatons: 0, }; const { tokenType, genesisInfo, genesisSupply } = cachedInfo; const { tokenName, tokenTicker, url, decimals } = genesisInfo; let isSupportedToken = false; // Assign default values which will be presented for any token without explicit support let renderedTokenType = `${tokenType.protocol} ${tokenType.number} ${tokenType.type}`; let renderedTokenDescription = 'This token is not yet supported by Cashtab.'; switch (tokenType.protocol) { case 'SLP': { switch (tokenType.type) { case 'SLP_TOKEN_TYPE_FUNGIBLE': { renderedTokenType = 'SLP'; renderedTokenDescription = 'SLP 1 fungible token. Token may be of fixed supply if no mint batons exist. If you have a mint baton, you can mint more of this token at any time. May have up to 9 decimal places.'; isSupportedToken = true; break; } case 'SLP_TOKEN_TYPE_NFT1_GROUP': { renderedTokenType = 'SLP NFT Collection'; renderedTokenDescription = 'The parent tokens for an NFT collection. Can be used to mint NFTs. No decimal places. The supply of this token is the potential quantity of NFTs which could be minted. If no mint batons exist, the supply is fixed.'; // TODO set isSupportedToken = true when we add token action support for NFT parent break; } default: { // leave renderedTokenType and renderedTokenDescription as defaults break; } } break; } case 'ALP': { renderedTokenType = 'ALP'; // Leave renderedTokenDescription as default break; } default: { // leave renderedTokenType and renderedTokenDescription as defaults break; } } const [showTokenTypeInfo, setShowTokenTypeInfo] = useState(false); const [sendTokenAddressError, setSendTokenAddressError] = useState(false); const [sendTokenAmountError, setSendTokenAmountError] = useState(false); const [showConfirmBurnEtoken, setShowConfirmBurnEtoken] = useState(false); const [burnTokenAmountError, setBurnTokenAmountError] = useState(false); const [mintAmountError, setMintAmountError] = useState(false); const [burnConfirmationError, setBurnConfirmationError] = useState(false); const [confirmationOfEtokenToBeBurnt, setConfirmationOfEtokenToBeBurnt] = useState(''); const [aliasInputAddress, setAliasInputAddress] = useState(false); // By default, we load the app with all switches disabled // For SLP v1 tokens, we want showSend to be enabled by default // But we may not want this to be default for other token types in the future const switchesOff = { showSend: false, showAirdrop: false, showBurn: false, showMint: false, }; const [switches, setSwitches] = useState(switchesOff); const [showLargeIconModal, setShowLargeIconModal] = useState(false); const defaultUncachedTokenInfo = { circulatingSupply: null, mintBatons: null, }; const [uncachedTokenInfo, setUncachedTokenInfo] = useState( defaultUncachedTokenInfo, ); const [uncachedTokenInfoError, setUncachedTokenInfoError] = useState(false); // Check if the user has mint batons for this token // If they don't, disable the mint switch and label why const mintBatons = getMintBatons(wallet.state.slpUtxos, tokenId); // Load with QR code open if device is mobile const openWithScanner = settings && settings.autoCameraOn === true && isMobile(navigator); const [isModalVisible, setIsModalVisible] = useState(false); const emptyFormData = { amount: '', address: '', burnAmount: '', mintAmount: '', }; const [formData, setFormData] = useState(emptyFormData); const userLocale = getUserLocale(navigator); const getUncachedTokenInfo = async () => { let tokenUtxos; try { tokenUtxos = await chronik.tokenId(tokenId).utxos(); let undecimalizedBigIntCirculatingSupply = 0n; let mintBatons = 0; for (const utxo of tokenUtxos.utxos) { const { token } = utxo; const { amount, isMintBaton } = token; undecimalizedBigIntCirculatingSupply += BigInt(amount); if (isMintBaton) { mintBatons += 1; } } const circulatingSupply = decimalizeTokenAmount( undecimalizedBigIntCirculatingSupply.toString(), decimals, ); setUncachedTokenInfo({ circulatingSupply, mintBatons }); } catch (err) { console.error(`Error in chronik.tokenId(${tokenId}).utxos()`, err); setUncachedTokenInfoError(true); } }; useEffect(() => { if (typeof cashtabCache.tokens.get(tokenId) === 'undefined') { // Wait for token info to be available from cache // For now, this is only relevant to unit tests // But, in the future, we will want to support a user visiting a token page // of a token he does not have return; } // Get token info that is not practical to cache as it is subject to change getUncachedTokenInfo(); // Set the Send switch to on by default // TODO handle other token types and other default settings setSwitches(prev => ({ ...prev, showSend: true })); }, [cashtabCache.tokens.get(tokenId)]); useEffect(() => { if ( loading === false && (typeof tokenBalance === 'undefined' || typeof cashtabCache.tokens.get(tokenId) === 'undefined') ) { // token can be undefined when the app is loading // in practice, this only happens in integration tests or when the user navigates directly // to send/tokenId screen, as cashtab locks UI while it loads // token becomes undefined when a user sends or burns all of their balance for this token // In this case -- loading === true and token === undefined -- navigate to the home page navigate('/'); } }, [loading, tokenBalance, cashtabCache]); // Clears address and amount fields following a send token notification const clearInputForms = () => { setFormData(emptyFormData); setAliasInputAddress(false); // clear alias address preview }; async function sendToken() { setFormData({ ...formData, }); if ( !formData.address || !formData.amount || Number(formData.amount <= 0) || sendTokenAmountError ) { return; } // Track number of SLPA send transactions and // SLPA token IDs Event('SendToken.js', 'Send', tokenId); const { address, amount } = formData; let cleanAddress; // check state on whether this is an alias or ecash address if (aliasInputAddress) { cleanAddress = aliasInputAddress; } else { // Get the non-alias param-free address cleanAddress = address.split('?')[0]; } try { // Get input utxos for slpv1 send tx const tokenInputInfo = getSendTokenInputs( wallet.state.slpUtxos, tokenId, amount, decimals, ); // Get targetOutputs for an slpv1 send tx const tokenSendTargetOutputs = getSlpSendTargetOutputs( tokenInputInfo, cleanAddress, ); // Build and broadcast the tx const { response } = await sendXec( chronik, wallet, tokenSendTargetOutputs, settings.minFeeSends && hasEnoughToken( tokens, appConfig.vipSettingsTokenId, appConfig.vipSettingsTokenQty, ) ? appConfig.minFee : appConfig.defaultFee, chaintipBlockheight, tokenInputInfo.tokenInputs, ); toast( eToken sent , { icon: , }, ); clearInputForms(); } catch (e) { console.error(`Error sending token`, e); toast.error(`${e}`); } } const handleSlpAmountChange = e => { const { value, name } = e.target; const isValidAmountOrErrorMsg = isValidTokenSendOrBurnAmount( value, tokenBalance, decimals, ); setSendTokenAmountError( isValidAmountOrErrorMsg === true ? false : isValidAmountOrErrorMsg, ); setFormData(p => ({ ...p, [name]: value, })); }; const handleTokenAddressChange = async e => { setAliasInputAddress(false); // clear alias address preview const { value, name } = e.target; // validate for token address // validate for parameters // show warning that query strings are not supported const parsedAddressInput = parseAddressInput( value, balanceSats, userLocale, ); const address = parsedAddressInput.address.value; let renderedError = parsedAddressInput.address.error; if ('queryString' in parsedAddressInput) { // Token sends do not support a queryString // If you have one, this is the address validation error renderedError = 'eToken sends do not support bip21 query strings'; } else if ( parsedAddressInput.address.error && cashaddr.isValidCashAddress(address, 'etoken') ) { // If address is a valid eToken address, no error // We support sending to etoken: addresses on SendToken screen renderedError = false; } else if ( parsedAddressInput.address.isAlias && parsedAddressInput.address.error === false ) { // if input is a valid alias (except for server validation check) // extract alias without the `.xec` const aliasName = address.slice(0, address.length - 4); // retrieve the alias details for `aliasName` from alias-server let aliasDetails; try { aliasDetails = await queryAliasServer('alias', aliasName); if (!aliasDetails.address) { renderedError = 'eCash Alias does not exist or yet to receive 1 confirmation'; } else { // Valid address response returned setAliasInputAddress(aliasDetails.address); } } catch (err) { console.error( `handleTokenAddressChange(): error retrieving alias`, err, ); renderedError = 'Error resolving alias at indexer, contact admin.'; } } setSendTokenAddressError(renderedError); setFormData(p => ({ ...p, [name]: value, })); }; const onMax = async () => { // Clear this error before updating field setSendTokenAmountError(false); try { let amount = tokenBalance; setFormData({ ...formData, amount, }); } catch (err) { console.error(`Error in onMax:`); console.error(err); } }; const onMaxMint = () => { const maxMintAmount = getMaxMintAmount(decimals); handleMintAmountChange({ target: { name: 'mintAmount', value: maxMintAmount, }, }); }; const checkForConfirmationBeforeSendEtoken = () => { if (settings.sendModal) { setIsModalVisible(settings.sendModal); } else { // if the user does not have the send confirmation enabled in settings then send directly sendToken(); } }; const handleOk = () => { setIsModalVisible(false); sendToken(); }; const handleCancel = () => { setIsModalVisible(false); }; const handleEtokenBurnAmountChange = e => { const { name, value } = e.target; const isValidBurnAmountOrErrorMsg = isValidTokenSendOrBurnAmount( value, tokenBalance, decimals, ); setBurnTokenAmountError( isValidBurnAmountOrErrorMsg === true ? false : isValidBurnAmountOrErrorMsg, ); setFormData(p => ({ ...p, [name]: value, })); }; const handleMintAmountChange = e => { const { name, value } = e.target; const isValidMintAmountOrErrorMsg = isValidTokenMintAmount( value, decimals, ); setMintAmountError( isValidMintAmountOrErrorMsg === true ? false : isValidMintAmountOrErrorMsg, ); setFormData(p => ({ ...p, [name]: value, })); }; const onMaxBurn = () => { // trigger validation on the inserted max value handleEtokenBurnAmountChange({ target: { name: 'burnAmount', value: tokenBalance, }, }); }; async function burn() { if (burnConfirmationError || formData.burnAmount === '') { return; } Event('SendToken.js', 'Burn eToken', tokenId); try { // Get input utxos for slpv1 burn tx // This is done the same way as for an slpv1 send tx const tokenInputInfo = getSendTokenInputs( wallet.state.slpUtxos, tokenId, formData.burnAmount, decimals, ); // Get targetOutputs for an slpv1 burn tx // this is NOT like an slpv1 send tx const tokenBurnTargetOutputs = getSlpBurnTargetOutputs(tokenInputInfo); // Build and broadcast the tx const { response } = await sendXec( chronik, wallet, tokenBurnTargetOutputs, settings.minFeeSends && hasEnoughToken( tokens, appConfig.vipSettingsTokenId, appConfig.vipSettingsTokenQty, ) ? appConfig.minFee : appConfig.defaultFee, chaintipBlockheight, tokenInputInfo.tokenInputs, true, // skip SLP burn checks ); toast( 🔥 Burn successful , { icon: , }, ); clearInputForms(); setShowConfirmBurnEtoken(false); setConfirmationOfEtokenToBeBurnt(''); } catch (e) { setShowConfirmBurnEtoken(false); setConfirmationOfEtokenToBeBurnt(''); toast.error(`${e}`); } } async function handleMint() { Event('SendToken.js', 'Mint eToken', tokenId); try { // Get targetOutputs for an slpv1 burn tx // this is NOT like an slpv1 send tx const mintTargetOutputs = getMintTargetOutputs( tokenId, decimals, formData.mintAmount, ); // We should not be able to get here without at least one mint baton, // as the mint switch would be disabled // Still, handle if (mintBatons.length < 1) { throw new Error(`Unable to find mint baton for ${tokenName}`); } // Build and broadcast the tx const { response } = await sendXec( chronik, wallet, mintTargetOutputs, settings.minFeeSends && hasEnoughToken( tokens, appConfig.vipSettingsTokenId, appConfig.vipSettingsTokenQty, ) ? appConfig.minFee : appConfig.defaultFee, chaintipBlockheight, [mintBatons[0]], // Only use one mint baton ); toast( ⚗️ Minted {formData.mintAmount} {tokenTicker} , { icon: , }, ); clearInputForms(); } catch (e) { toast.error(`${e}`); } } const handleBurnConfirmationInput = e => { const { value } = e.target; if (value && value === `burn ${tokenTicker}`) { setBurnConfirmationError(false); } else { setBurnConfirmationError( `Input must exactly match "burn ${tokenTicker}"`, ); } setConfirmationOfEtokenToBeBurnt(value); }; const handleBurnAmountInput = () => { if (!burnTokenAmountError) { setShowConfirmBurnEtoken(true); } }; return ( <> {tokenBalance && typeof cashtabCache.tokens.get(tokenId) !== 'undefined' && ( <> {showTokenTypeInfo && ( setShowTokenTypeInfo(false)} handleCancel={() => setShowTokenTypeInfo(false)} /> )} {showLargeIconModal && ( setShowLargeIconModal(false) } > )} {isModalVisible && (

Are you sure you want to send{' '} {formData.amount} {tokenTicker} to{' '} {formData.address}?

)} {showConfirmBurnEtoken && ( setShowConfirmBurnEtoken(false) } showCancelButton height={250} > )} setShowLargeIconModal(true)} > Type: {renderedTokenType}{' '} } onClick={() => setShowTokenTypeInfo(true) } /> Token Id: {tokenId.slice(0, 3)}... {tokenId.slice(-3)} decimals: {decimals} {url && url.startsWith('https://') && ( url: {`${url.slice(8, 19)}...`} )} created: {typeof cachedInfo.block !== 'undefined' ? formatDate( cachedInfo.block.timestamp, navigator.language, ) : formatDate( cachedInfo.timeFirstSeen, navigator.language, )} Genesis Qty: {decimalizedTokenQtyToLocaleFormat( genesisSupply, userLocale, )} Supply: {typeof uncachedTokenInfo.circulatingSupply === 'string' ? `${decimalizedTokenQtyToLocaleFormat( uncachedTokenInfo.circulatingSupply, userLocale, )}${ uncachedTokenInfo.mintBatons === 0 ? ' (fixed)' : ' (var.)' }` : uncachedTokenInfoError ? 'Error fetching supply' : 'Loading...'} {apiError && } + {renderedTokenType === 'SLP NFT Collection' && ( + + ℹ️ Cashtab support for minting NFTs is coming + soon + + )} {isSupportedToken && ( { // We turn everything else off, whether we are turning this one on or off setSwitches({ ...switchesOff, showSend: !switches.showSend, }); }} /> Send {tokenName} ({tokenTicker}) {switches.showSend && ( <> {aliasInputAddress && `${aliasInputAddress.slice( 0, 10, )}...${aliasInputAddress.slice( -5, )}`} checkForConfirmationBeforeSendEtoken() } > Send {tokenTicker} )} // We turn everything else off, whether we are turning this one on or off setSwitches({ ...switchesOff, showAirdrop: !switches.showAirdrop, }) } /> Airdrop XEC to {tokenTicker} holders {switches.showAirdrop && ( Airdrop Calculator )} // We turn everything else off, whether we are turning this one on or off setSwitches({ ...switchesOff, showBurn: !switches.showBurn, }) } /> Burn {tokenTicker} {switches.showBurn && ( Burn {tokenTicker} )} {mintBatons.length > 0 && ( // We turn everything else off, whether we are turning this one on or off setSwitches({ ...switchesOff, showMint: !switches.showMint, }) } /> Mint )} {switches.showMint && ( Mint {tokenTicker} )} )} )} ); }; export default Token; diff --git a/cashtab/src/components/Etokens/__tests__/CreateToken.test.js b/cashtab/src/components/Etokens/__tests__/CreateToken.test.js index 6c7a54cd17..3c86eb9bcd 100644 --- a/cashtab/src/components/Etokens/__tests__/CreateToken.test.js +++ b/cashtab/src/components/Etokens/__tests__/CreateToken.test.js @@ -1,141 +1,141 @@ // Copyright (c) 2024 The Bitcoin developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. import React from 'react'; import { walletWithXecAndTokens } from 'components/App/fixtures/mocks'; import { render, screen, waitFor } from '@testing-library/react'; import '@testing-library/jest-dom'; import { initializeCashtabStateForTests, clearLocalForage, } from 'components/App/fixtures/helpers'; import 'fake-indexeddb/auto'; import localforage from 'localforage'; import { when } from 'jest-when'; import appConfig from 'config/app'; import CashtabTestWrapper from 'components/App/fixtures/CashtabTestWrapper'; // https://stackoverflow.com/questions/39830580/jest-test-fails-typeerror-window-matchmedia-is-not-a-function Object.defineProperty(window, 'matchMedia', { writable: true, value: jest.fn().mockImplementation(query => ({ matches: false, media: query, onchange: null, addListener: jest.fn(), // Deprecated removeListener: jest.fn(), // Deprecated addEventListener: jest.fn(), removeEventListener: jest.fn(), dispatchEvent: jest.fn(), })), }); // https://stackoverflow.com/questions/64813447/cannot-read-property-addlistener-of-undefined-react-testing-library window.matchMedia = query => ({ matches: false, media: query, onchange: null, addListener: jest.fn(), // deprecated removeListener: jest.fn(), // deprecated addEventListener: jest.fn(), removeEventListener: jest.fn(), dispatchEvent: jest.fn(), }); describe('', () => { 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); }); it('If wallet has sufficient XEC, renders CreateTokenForm', async () => { const mockedChronik = await initializeCashtabStateForTests( walletWithXecAndTokens, localforage, ); render( , ); // Wait for the app to load await waitFor(() => expect( screen.queryByTitle('Cashtab Loading'), ).not.toBeInTheDocument(), ); // Renders CreateTokenForm, as this wallet has sufficient balance to create a token - expect(await screen.findByText('Create a Token')).toBeInTheDocument(); + expect(await screen.findByText('Create Token')).toBeInTheDocument(); // Does not render insufficient balance alert expect( screen.queryByText( 'You need at least 5.46 spendable XEC ($0.0002 USD) to create a token', ), ).not.toBeInTheDocument(); }); it('If wallet has insufficient XEC, renders component but does not render CreateTokenForm', async () => { const mockedChronik = await initializeCashtabStateForTests( { ...walletWithXecAndTokens, state: { ...walletWithXecAndTokens.state, balanceSats: 0, nonSlpUtxos: [], }, }, localforage, ); render( , ); // Wait for the app to load await waitFor(() => expect( screen.queryByTitle('Cashtab Loading'), ).not.toBeInTheDocument(), ); // Wait for the wallet balance to load expect(await screen.findByText('0.00 XEC')).toBeInTheDocument(); // We do not see the Create a Token form - expect(screen.queryByText('Create a Token')).not.toBeInTheDocument(); + expect(screen.queryByText('Create Token')).not.toBeInTheDocument(); // Renders expected alert // Note: the component is expected to load before fiatPrice loads // In this case, we do not display the fiat price expect( await screen.findByText( 'You need at least 5.46 spendable XEC ($0.0002 USD) to create a token', ), ).toBeInTheDocument(); }); }); diff --git a/cashtab/src/components/Etokens/__tests__/CreateTokenForm.test.js b/cashtab/src/components/Etokens/__tests__/CreateTokenForm.test.js index ee2eebbe13..587c863c2c 100644 --- a/cashtab/src/components/Etokens/__tests__/CreateTokenForm.test.js +++ b/cashtab/src/components/Etokens/__tests__/CreateTokenForm.test.js @@ -1,241 +1,327 @@ // Copyright (c) 2024 The Bitcoin developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. import React from 'react'; import { walletWithXecAndTokens, MOCK_CHRONIK_TOKEN_CALL, MOCK_CHRONIK_GENESIS_TX_CALL, } from 'components/App/fixtures/mocks'; -import { render, screen } from '@testing-library/react'; +import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import '@testing-library/jest-dom'; import { explorer } from 'config/explorer'; import { initializeCashtabStateForTests, clearLocalForage, } from 'components/App/fixtures/helpers'; import 'fake-indexeddb/auto'; import localforage from 'localforage'; import { when } from 'jest-when'; import appConfig from 'config/app'; import CashtabTestWrapper from 'components/App/fixtures/CashtabTestWrapper'; // https://stackoverflow.com/questions/39830580/jest-test-fails-typeerror-window-matchmedia-is-not-a-function Object.defineProperty(window, 'matchMedia', { writable: true, value: jest.fn().mockImplementation(query => ({ matches: false, media: query, onchange: null, addListener: jest.fn(), // Deprecated removeListener: jest.fn(), // Deprecated addEventListener: jest.fn(), removeEventListener: jest.fn(), dispatchEvent: jest.fn(), })), }); // https://stackoverflow.com/questions/64813447/cannot-read-property-addlistener-of-undefined-react-testing-library window.matchMedia = query => ({ matches: false, media: query, onchange: null, addListener: jest.fn(), // deprecated removeListener: jest.fn(), // deprecated addEventListener: jest.fn(), removeEventListener: jest.fn(), dispatchEvent: jest.fn(), }); describe('', () => { let user; beforeEach(() => { // Configure userEvent user = userEvent.setup(); // Mock the fetch call for Cashtab's price API global.fetch = jest.fn(); const fiatCode = 'usd'; // Use usd until you mock getting settings from localforage const cryptoId = appConfig.coingeckoId; // Keep this in the code, because different URLs will have different outputs requiring different parsing const priceApiUrl = `https://api.coingecko.com/api/v3/simple/price?ids=${cryptoId}&vs_currencies=${fiatCode}&include_last_updated_at=true`; const xecPrice = 0.00003; const priceResponse = { ecash: { usd: xecPrice, last_updated_at: 1706644626, }, }; when(fetch) .calledWith(priceApiUrl) .mockResolvedValue({ json: () => Promise.resolve(priceResponse), }); }); afterEach(async () => { jest.clearAllMocks(); await clearLocalForage(localforage); }); it('User can input valid token parameters, generate a token, and view a success notification', async () => { const mockedChronik = await initializeCashtabStateForTests( walletWithXecAndTokens, localforage, ); // Add tx mock to mockedChronik const hex = '0200000001fe667fba52a1aa603a892126e492717eed3dad43bfea7365a7fdd08e051e8a21020000006b483045022100c90a0e610859887b6d490b35ec4c8d013c4824a490536fb7f41bc0b7f6af481b02200f81b5125abed2e9ad7323cbf95d3983a75a9ab725eac454c164f836b26ee68c4121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff030000000000000000466a04534c500001010747454e4553495303544b450a7465737420746f6b656e1768747470733a2f2f7777772e636173687461622e636f6d4c0001024c0008000000000393870022020000000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac887f0e00000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000'; const txid = 'b8f0152d64266b0c31729be8b997e9c3f780694cffb664cd9acc98e0871a0135'; mockedChronik.setMock('broadcastTx', { input: hex, output: { txid }, }); render( , ); + // Wait for Cashtab to load + await waitFor(() => + expect( + screen.queryByTitle('Cashtab Loading'), + ).not.toBeInTheDocument(), + ); + // The user enters valid token metadata await user.type( await screen.findByPlaceholderText('Enter a name for your token'), 'test token', ); await user.type( await screen.findByPlaceholderText('Enter a ticker for your token'), 'TKE', ); await user.type( await screen.findByPlaceholderText( 'Enter number of decimal places', ), '2', ); await user.type( - await screen.findByPlaceholderText( - 'Enter the supply of your token', - ), + await screen.findByPlaceholderText('Enter initial token supply'), '600000', ); await user.type( await screen.findByPlaceholderText( 'Enter a website for your token', ), 'https://www.cashtab.com', ); // Click the Create eToken button await user.click(screen.getByRole('button', { name: /Create eToken/ })); // Click OK on confirmation modal await user.click(screen.getByText('OK')); // Verify notification triggered expect(await screen.findByText('Token created!')).toHaveAttribute( 'href', `${explorer.blockExplorerUrl}/tx/${txid}`, ); }); it('User can create a token with a mint baton', async () => { const createdTokenId = 'a34382e000eed02f749ab6a9e8de37e25e7565f016707dc81460ce63167ee1c2'; // Mock a utxo of the not-yet-created token so we can test the redirect const MOCK_UTXO_FOR_BALANCE = { token: { tokenId: createdTokenId, isMintBaton: false, amount: '10', }, }; const mockedChronik = await initializeCashtabStateForTests( { ...walletWithXecAndTokens, state: { ...walletWithXecAndTokens.state, slpUtxos: [ ...walletWithXecAndTokens.state.slpUtxos, MOCK_UTXO_FOR_BALANCE, ], }, }, localforage, ); // Mock the not-yet-created token's tokeninfo and utxo calls to test the redirect mockedChronik.setMock('token', { input: createdTokenId, output: MOCK_CHRONIK_TOKEN_CALL, }); mockedChronik.setMock('tx', { input: createdTokenId, output: MOCK_CHRONIK_GENESIS_TX_CALL, }); mockedChronik.setTokenId(createdTokenId); mockedChronik.setUtxosByTokenId(createdTokenId, { utxos: [MOCK_UTXO_FOR_BALANCE], }); // Add tx mock to mockedChronik const hex = '0200000001fe667fba52a1aa603a892126e492717eed3dad43bfea7365a7fdd08e051e8a21020000006a47304402205e54e8ef3c0912b2bbeda364c1b15298e235d91eca3f8e02395fe5f07a406ee70220482d820793356ba8c3012ac2bd6630c8daa88c443111d8f9ee93785937d48f7c4121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff040000000000000000466a04534c500001010747454e4553495303544b450a7465737420746f6b656e1768747470733a2f2f7777772e636173687461622e636f6d4c000102010208000000000393870022020000000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac22020000000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac227d0e00000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000'; const txid = 'a34382e000eed02f749ab6a9e8de37e25e7565f016707dc81460ce63167ee1c2'; mockedChronik.setMock('broadcastTx', { input: hex, output: { txid }, }); render( , ); + // Wait for Cashtab to load + await waitFor(() => + expect( + screen.queryByTitle('Cashtab Loading'), + ).not.toBeInTheDocument(), + ); + // The user enters valid token metadata await user.type( await screen.findByPlaceholderText('Enter a name for your token'), 'test token', ); await user.type( await screen.findByPlaceholderText('Enter a ticker for your token'), 'TKE', ); await user.type( await screen.findByPlaceholderText( 'Enter number of decimal places', ), '2', ); await user.type( - await screen.findByPlaceholderText( - 'Enter the supply of your token', - ), + await screen.findByPlaceholderText('Enter initial token supply'), '600000', ); await user.type( await screen.findByPlaceholderText( 'Enter a website for your token', ), 'https://www.cashtab.com', ); // Hit the switch for a variable supply token await user.click(screen.getByTitle('Toggle Mint Baton')); // Click the Create eToken button await user.click(screen.getByRole('button', { name: /Create eToken/ })); // Click OK on confirmation modal await user.click(screen.getByText('OK')); // Verify notification triggered expect(await screen.findByText('Token created!')).toHaveAttribute( 'href', `${explorer.blockExplorerUrl}/tx/${txid}`, ); // We are sent to its token-action page expect(await screen.findByTitle('Token Stats')).toBeInTheDocument(); }); + it('User can create an NFT collection', async () => { + const mockedChronik = await initializeCashtabStateForTests( + walletWithXecAndTokens, + localforage, + ); + // Add tx mock to mockedChronik + const hex = + '0200000001fe667fba52a1aa603a892126e492717eed3dad43bfea7365a7fdd08e051e8a21020000006a473044022064d8618b1b6131f6d1b611d67107d0962f7c1d951a5cadcccf3f502952a1723002202f9fd50a185b683475fb9c0a394fef4b6aaaf188cdb3747a1c38d4366571a3614121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff0300000000000000006e6a04534c500001810747454e45534953033448432454686520466f75722048616c662d436f696e73206f66204a696e2d71756120283448432925656e2e77696b6970656469612e6f72672f77696b692f5461692d50616e5f286e6f76656c294c0001004c0008000000000000000422020000000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac387f0e00000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000'; + const txid = + 'ed6e5838af475cf2d35e537abb06cb497bb9e69ba071ba06a678d35764a39c9a'; + mockedChronik.setMock('broadcastTx', { + input: hex, + output: { txid }, + }); + + // Load component with create-nft-collection route + render( + , + ); + + // Wait for Cashtab to load + await waitFor(() => + expect( + screen.queryByTitle('Cashtab Loading'), + ).not.toBeInTheDocument(), + ); + + // The user enters valid token metadata + await user.type( + await screen.findByPlaceholderText( + 'Enter a name for your NFT collection', + ), + 'The Four Half-Coins of Jin-qua (4HC)', + ); + await user.type( + await screen.findByPlaceholderText( + 'Enter a ticker for your NFT collection', + ), + '4HC', + ); + + // The decimals input is disabled + const decimalsInput = screen.getByPlaceholderText( + 'Enter number of decimal places', + ); + expect(decimalsInput).toHaveProperty('disabled', true); + + // Decimals is set to 0 + expect(decimalsInput).toHaveValue('0'); + await user.type( + await screen.findByPlaceholderText('Enter NFT collection size'), + '4', + ); + await user.type( + await screen.findByPlaceholderText( + 'Enter a website for your NFT collection', + ), + 'en.wikipedia.org/wiki/Tai-Pan_(novel)', + ); + + // Click the Create eToken button + await user.click( + screen.getByRole('button', { name: /Create NFT Collection/ }), + ); + + // Click OK on confirmation modal + await user.click(screen.getByText('OK')); + + // Verify notification triggered + expect( + await screen.findByText('NFT Collection created!'), + ).toHaveAttribute('href', `${explorer.blockExplorerUrl}/tx/${txid}`); + }); }); diff --git a/cashtab/src/components/Etokens/__tests__/Token.test.js b/cashtab/src/components/Etokens/__tests__/Token.test.js index dcd97fb4e5..8160dd5d12 100644 --- a/cashtab/src/components/Etokens/__tests__/Token.test.js +++ b/cashtab/src/components/Etokens/__tests__/Token.test.js @@ -1,756 +1,756 @@ // 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 from '@testing-library/user-event'; import { when } from 'jest-when'; import aliasSettings from 'config/alias'; import { explorer } from 'config/explorer'; import { initializeCashtabStateForTests, clearLocalForage, } from 'components/App/fixtures/helpers'; import CashtabTestWrapper from 'components/App/fixtures/CashtabTestWrapper'; import appConfig from 'config/app'; import 'fake-indexeddb/auto'; import localforage from 'localforage'; import { walletWithXecAndTokens } from 'components/App/fixtures/mocks'; import { slp1FixedBear, slp1FixedCachet, } from 'components/Etokens/fixtures/mocks'; // 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(), }); const SEND_TOKEN_TOKENID = '3fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d109'; const SEND_TOKEN_DECIMALS = 0; const SEND_TOKEN_TICKER = 'BEAR'; const SEND_TOKEN_BALANCE = walletWithXecAndTokens.state.tokens.get(SEND_TOKEN_TOKENID); // See src/validation, ref parseAddressInput // See SendToken for some modified errors (SendToken does not support bip21) // These could change, which would break tests, which is expected behavior if we haven't // updated tests properly on changing the app const SEND_ADDRESS_VALIDATION_ERRORS_TOKEN = [ `Aliases must end with '.xec'`, 'eCash Alias does not exist or yet to receive 1 confirmation', 'Invalid address', 'eToken sends do not support bip21 query strings', ]; const SEND_AMOUNT_VALIDATION_ERRORS_TOKEN = [ `Amount must be a number`, 'Amount must be greater than 0', `Amount cannot exceed your ${SEND_TOKEN_TICKER} balance of ${SEND_TOKEN_BALANCE}`, `This token only supports ${SEND_TOKEN_DECIMALS} decimal places`, ]; describe('', () => { let user, mockedChronik; beforeEach(async () => { // Mock the app with context at the Send screen mockedChronik = await initializeCashtabStateForTests( walletWithXecAndTokens, localforage, ); // Set chronik mocks required for cache preparation and supply calc mockedChronik.setMock('token', { input: slp1FixedBear.tokenId, output: slp1FixedBear.token, }); mockedChronik.setMock('tx', { input: slp1FixedBear.tokenId, output: slp1FixedBear.tx, }); mockedChronik.setTokenId(slp1FixedBear.tokenId); mockedChronik.setUtxosByTokenId(slp1FixedBear.tokenId, { tokenId: slp1FixedBear.tokenId, utxos: slp1FixedBear.utxos, }); // Set up userEvent user = userEvent.setup(); // Mock the fetch call to 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 SendToken screen with send address input', async () => { + it('Renders the Token screen with send address input', async () => { render( , ); // Wait for element to get token info and load expect((await screen.findAllByText(/BEAR/))[0]).toBeInTheDocument(); // Wait for Cashtab to recognize this is an SLP1 fungible token and enable Send expect(await screen.findByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); 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); // No addr validation errors on load for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS_TOKEN) { expect(screen.queryByText(addrErr)).not.toBeInTheDocument(); } // No amount validation errors on load for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS_TOKEN) { expect(screen.queryByText(amountErr)).not.toBeInTheDocument(); } }); it('Accepts a valid ecash: prefixed address', async () => { render( , ); // Wait for element to get token info and load expect((await screen.findAllByText(/BEAR/))[0]).toBeInTheDocument(); // Wait for Cashtab to recognize this is an SLP1 fungible token and enable Send expect(await screen.findByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); const addressInputEl = screen.getByPlaceholderText(/Address/); // 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); // No addr validation errors on load for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS_TOKEN) { expect(screen.queryByText(addrErr)).not.toBeInTheDocument(); } // No amount validation errors on load for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS_TOKEN) { expect(screen.queryByText(amountErr)).not.toBeInTheDocument(); } }); it('Accepts a valid etoken: prefixed address', async () => { render( , ); // Wait for element to get token info and load expect((await screen.findAllByText(/BEAR/))[0]).toBeInTheDocument(); // Wait for Cashtab to recognize this is an SLP1 fungible token and enable Send expect(await screen.findByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); const addressInputEl = screen.getByPlaceholderText(/Address/); // The user enters a valid address const addressInput = 'etoken:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvgvv3p0vd'; await user.type(addressInputEl, addressInput); // The 'Send To' input field has this address as a value expect(addressInputEl).toHaveValue(addressInput); // No addr validation errors on load for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS_TOKEN) { expect(screen.queryByText(addrErr)).not.toBeInTheDocument(); } // No amount validation errors on load for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS_TOKEN) { expect(screen.queryByText(amountErr)).not.toBeInTheDocument(); } }); it('Accepts a valid alias', async () => { render( , ); // Wait for element to get token info and load expect((await screen.findAllByText(/BEAR/))[0]).toBeInTheDocument(); // Wait for Cashtab to recognize this is an SLP1 fungible token and enable Send expect(await screen.findByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); const addressInputEl = screen.getByPlaceholderText(/Address/); 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); // No addr validation errors on load for (const addrErr of SEND_ADDRESS_VALIDATION_ERRORS_TOKEN) { expect(screen.queryByText(addrErr)).not.toBeInTheDocument(); } // No amount validation errors on load for (const amountErr of SEND_AMOUNT_VALIDATION_ERRORS_TOKEN) { expect(screen.queryByText(amountErr)).not.toBeInTheDocument(); } // The alias address preview renders the expected address preview expect( screen.getByText( `${expectedResolvedAddress.slice( 0, 10, )}...${expectedResolvedAddress.slice(-5)}`, ), ).toBeInTheDocument(); }); it('Displays a validation error for an invalid address', async () => { render( , ); // Wait for element to get token info and load expect((await screen.findAllByText(/BEAR/))[0]).toBeInTheDocument(); // Wait for Cashtab to recognize this is an SLP1 fungible token and enable Send expect(await screen.findByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); const addressInputEl = screen.getByPlaceholderText(/Address/); // The user enters an invalid address const addressInput = 'not a valid address'; await user.type(addressInputEl, addressInput); // The 'Send To' input field has this address as a value expect(addressInputEl).toHaveValue(addressInput); // We get the expected error expect(screen.getByText('Invalid address')).toBeInTheDocument(); }); it('Displays a validation error for an alias without .xec suffix', async () => { render( , ); // Wait for element to get token info and load expect((await screen.findAllByText(/BEAR/))[0]).toBeInTheDocument(); // Wait for Cashtab to recognize this is an SLP1 fungible token and enable Send expect(await screen.findByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); const addressInputEl = screen.getByPlaceholderText(/Address/); // The user enters a potentially valid alias without .xec suffix const addressInput = 'chicken'; await user.type(addressInputEl, addressInput); // The 'Send To' input field has this address as a value expect(addressInputEl).toHaveValue(addressInput); // We get the expected error expect( screen.getByText(`Aliases must end with '.xec'`), ).toBeInTheDocument(); }); it('Displays a validation error for valid alias that has not yet been registered', async () => { render( , ); // Wait for element to get token info and load expect((await screen.findAllByText(/BEAR/))[0]).toBeInTheDocument(); // Wait for Cashtab to recognize this is an SLP1 fungible token and enable Send expect(await screen.findByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); const addressInputEl = screen.getByPlaceholderText(/Address/); 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); // We get the expected error expect( screen.getByText( `eCash Alias does not exist or yet to receive 1 confirmation`, ), ).toBeInTheDocument(); }); it('Displays expected error if alias server gives a bad response', async () => { render( , ); // Wait for element to get token info and load expect((await screen.findAllByText(/BEAR/))[0]).toBeInTheDocument(); // Wait for Cashtab to recognize this is an SLP1 fungible token and enable Send expect(await screen.findByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); const addressInputEl = screen.getByPlaceholderText(/Address/); 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); // We get the expected error expect( screen.getByText( `Error resolving alias at indexer, contact admin.`, ), ).toBeInTheDocument(); }); it('Displays a validation error if the user includes any query string', async () => { render( , ); // Wait for element to get token info and load expect((await screen.findAllByText(/BEAR/))[0]).toBeInTheDocument(); // Wait for Cashtab to recognize this is an SLP1 fungible token and enable Send expect(await screen.findByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); const addressInputEl = screen.getByPlaceholderText(/Address/); // The user enters an ivalid address const addressInput = 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6?amount=5000'; await user.type(addressInputEl, addressInput); // The 'Send To' input field has this address as a value expect(addressInputEl).toHaveValue(addressInput); // We get the expected error expect( screen.getByText('eToken sends do not support bip21 query strings'), ).toBeInTheDocument(); }); it('Renders the send token notification upon successful broadcast', async () => { const hex = '02000000023023c2a02d7932e2f716016ab866249dd292387967dbd050ff200b8b8560073b010000006a47304402205b2a6c3258f95fed347fff3485f16e3507aa032c516c46f4631f769ac53af5aa02204b1940d9cdc79542dde8590743792cf07ced0d862f30a635af1c942754ae2e714121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dfffffffffe667fba52a1aa603a892126e492717eed3dad43bfea7365a7fdd08e051e8a21020000006b483045022100ee46a0e31295eb96553d93beaddffac69b81392d400e5a23b172e150b7663dac02204cf681b845e66462689b8a9f5385a64517783085d342dc8ec40c16f08e0c1eee4121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff030000000000000000376a04534c500001010453454e44203fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d10908000000000000000122020000000000001976a9144e532257c01b310b3b5c1fd947c79a72addf852388ac9f800e00000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000'; const txid = '6b3eb7d27be1cfd28efa206572b502aac60ef6be13fb10c521f003188b1afcce'; mockedChronik.setMock('broadcastTx', { input: hex, output: { txid }, }); render( , ); // Wait for element to get token info and load expect((await screen.findAllByText(/BEAR/))[0]).toBeInTheDocument(); // Wait for Cashtab to recognize this is an SLP1 fungible token and enable Send expect(await screen.findByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); // The user enters a valid address and send amount const addressInputEl = screen.getByPlaceholderText(/Address/); const addressInput = 'ecash:qp89xgjhcqdnzzemts0aj378nfe2mhu9yvxj9nhgg6'; const amountInputEl = screen.getByPlaceholderText('Amount'); const amountInput = '1'; await user.type(addressInputEl, addressInput); await user.type(amountInputEl, amountInput); // Click the Send token button await user.click(screen.getByRole('button', { name: /Send BEAR/ })); const sendTokenSuccessNotification = await screen.findByText( 'eToken sent', ); await waitFor(() => expect(sendTokenSuccessNotification).toHaveAttribute( 'href', `${explorer.blockExplorerUrl}/tx/${txid}`, ), ); }); it('Renders the burn token success notification upon successful burn tx broadcast', async () => { const hex = '02000000023023c2a02d7932e2f716016ab866249dd292387967dbd050ff200b8b8560073b010000006a4730440220510213513a45f1d02c38e524745db141a0c699e0abbd00552114beafebabe0ce02202d16daf42a61681e678744039067c23bca93e50a547fcb2a631547b34de225734121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dfffffffffe667fba52a1aa603a892126e492717eed3dad43bfea7365a7fdd08e051e8a21020000006b483045022100a86446a3e27b0c80b7ca81070769d818758505933787b01076f99297faf7dd5e0220622cf7d02111e23d54f5ccd19606af1ab08c384c46e8ddeae74b55bc3b238ba04121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff030000000000000000376a04534c500001010453454e44203fee3384150b030490b7bee095a63900f66a45f2d8e3002ae2cf17ce3ef4d10908000000000000000022020000000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac9f800e00000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000'; const txid = '9fe2a278894fb4afc259ca455947b0f8864b74aa142294225f2fa818b68b1711'; mockedChronik.setMock('broadcastTx', { input: hex, output: { txid }, }); render( , ); // Wait for element to get token info and load expect((await screen.findAllByText(/BEAR/))[0]).toBeInTheDocument(); // Wait for Cashtab to recognize this is an SLP1 fungible token and enable Send expect(await screen.findByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); // The send switch is turned on by default expect(screen.getByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); // Click the burn switch to show the burn interface await user.click(screen.getByTitle('Toggle Burn')); // The burn switch is turned on expect(screen.getByTitle('Toggle Burn')).toHaveProperty( 'checked', true, ); // Confirm that turning Burn on turns all other switches off expect(screen.getByTitle('Toggle Send')).toHaveProperty( 'checked', false, ); expect(screen.getByTitle('Toggle Airdrop')).toHaveProperty( 'checked', false, ); await user.type(screen.getByPlaceholderText('Burn Amount'), '1'); // Click the Burn button // Note we button title is the token ticker await user.click( await screen.findByRole('button', { name: /Burn BEAR/ }), ); // We see a modal and enter the correct confirmation msg await user.type( screen.getByPlaceholderText(`Type "burn BEAR" to confirm`), 'burn BEAR', ); // Click the Confirm button await user.click(screen.getByRole('button', { name: /OK/ })); const burnTokenSuccessNotification = await screen.findByText( '🔥 Burn successful', ); await waitFor(() => expect(burnTokenSuccessNotification).toHaveAttribute( 'href', `${explorer.blockExplorerUrl}/tx/${txid}`, ), ); }); it('Mint switch is disabled if no mint batons for this token in the wallet', async () => { render( , ); // Wait for element to get token info and load expect((await screen.findAllByText(/BEAR/))[0]).toBeInTheDocument(); // Wait for Cashtab to recognize this is an SLP1 fungible token and enable Send expect(await screen.findByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); // The mint switch is not rendered expect(screen.queryByTitle('Toggle Mint')).not.toBeInTheDocument(); }); it('We can mint an slpv1 token if we have a mint baton', async () => { // Mock context with a mint baton utxo const mockTokenId = 'aed861a31b96934b88c0252ede135cb9700d7649f69191235087a3030e553cb1'; const mintBatonUtxo = { outpoint: { txid: '4b5b2a0f8bcacf6bccc7ef49e7f82a894c9c599589450eaeaf423e0f5926c38e', outIdx: 2, }, blockHeight: -1, isCoinbase: false, value: 546, isFinal: false, token: { tokenId: 'aed861a31b96934b88c0252ede135cb9700d7649f69191235087a3030e553cb1', tokenType: { protocol: 'SLP', type: 'SLP_TOKEN_TYPE_FUNGIBLE', number: 1, }, amount: '0', isMintBaton: true, }, path: 1899, }; const balanceUtxo = { outpoint: { txid: '4b5b2a0f8bcacf6bccc7ef49e7f82a894c9c599589450eaeaf423e0f5926c38e', outIdx: 2, }, blockHeight: -1, isCoinbase: false, value: 546, isFinal: false, token: { tokenId: 'aed861a31b96934b88c0252ede135cb9700d7649f69191235087a3030e553cb1', tokenType: { protocol: 'SLP', type: 'SLP_TOKEN_TYPE_FUNGIBLE', number: 1, }, amount: '20000', isMintBaton: false, }, path: 1899, }; const mintMockedChronik = await initializeCashtabStateForTests( { ...walletWithXecAndTokens, state: { ...walletWithXecAndTokens.state, slpUtxos: [ ...walletWithXecAndTokens.state.slpUtxos, mintBatonUtxo, balanceUtxo, ], }, }, localforage, ); // Set mock tokeninfo call mintMockedChronik.setMock('token', { input: slp1FixedCachet.tokenId, output: slp1FixedCachet.token, }); mintMockedChronik.setMock('tx', { input: slp1FixedCachet.tokenId, output: slp1FixedCachet.tx, }); mockedChronik.setTokenId(slp1FixedCachet.tokenId); mockedChronik.setUtxosByTokenId(slp1FixedCachet.tokenId, { tokenId: slp1FixedCachet.tokenId, utxos: slp1FixedCachet.utxos, }); const hex = '02000000028ec326590f3e42afae0e458995599c4c892af8e749efc7cc6bcfca8b0f2a5b4b020000006b48304502210095c8181e677c6c6c88c3f0836129531944f88722f156bdeda4928342c5554ee702200addb9f7cc4678cd0d9f8111ab774936e92c893fce05fa783a58135f5a69ba614121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dfffffffffe667fba52a1aa603a892126e492717eed3dad43bfea7365a7fdd08e051e8a21020000006a4730440220168f3738b988e690b2a45d818e69369376cde0e96524c5fe3ab5fdbefa89bffa0220777243d6b5d2c6d8929f95817633094c3f9b792e45ab8e095c763963fef099a74121031d4603bdc23aca9432f903e3cf5975a3f655cc3fa5057c61d00dfc1ca5dfd02dffffffff040000000000000000396a04534c50000101044d494e5420aed861a31b96934b88c0252ede135cb9700d7649f69191235087a3030e553cb1010208000000000000273122020000000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac22020000000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac357e0e00000000001976a9143a5fb236934ec078b4507c303d3afd82067f8fc188ac00000000'; const txid = 'dc12e6d3c5ea7504fdc51c8a713b952214b80ff27227faf2f970af74b9c8685e'; mintMockedChronik.setMock('broadcastTx', { input: hex, output: { txid }, }); render( , ); // Wait for element to get token info and load expect((await screen.findAllByText(/CACHET/))[0]).toBeInTheDocument(); // Wait for Cashtab to recognize this is an SLP1 fungible token and enable Send expect(await screen.findByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); // The mint switch is rendered const mintSwitch = screen.getByTitle('Toggle Mint'); expect(mintSwitch).toBeInTheDocument(); // Click the mint switch await user.click(mintSwitch); // Fill out the form await user.type(screen.getByPlaceholderText('Mint Amount'), '100.33'); // Mint it await user.click(screen.getByRole('button', { name: /Mint CACHET/ })); const burnTokenSuccessNotification = await screen.findByText( '⚗️ Minted 100.33 CACHET', ); await waitFor(() => expect(burnTokenSuccessNotification).toHaveAttribute( 'href', `${explorer.blockExplorerUrl}/tx/${txid}`, ), ); }); }); diff --git a/cashtab/src/components/Etokens/__tests__/TokenActions.test.js b/cashtab/src/components/Etokens/__tests__/TokenActions.test.js index a487d052e2..2f4ec97a55 100644 --- a/cashtab/src/components/Etokens/__tests__/TokenActions.test.js +++ b/cashtab/src/components/Etokens/__tests__/TokenActions.test.js @@ -1,294 +1,300 @@ // 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 from '@testing-library/user-event'; import { when } from 'jest-when'; import { initializeCashtabStateForTests, clearLocalForage, } from 'components/App/fixtures/helpers'; import CashtabTestWrapper from 'components/App/fixtures/CashtabTestWrapper'; import appConfig from 'config/app'; import 'fake-indexeddb/auto'; import localforage from 'localforage'; import { tokenTestWallet, supportedTokens, slp1FixedMocks, slp1VarMocks, alpMocks, slp1NftParentMocks, } from 'components/Etokens/fixtures/mocks'; // 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(' available actions rendered', () => { let mockedChronik; beforeEach(async () => { // Mock the app with context at the Send screen mockedChronik = await initializeCashtabStateForTests( tokenTestWallet, localforage, ); // Build chronik mocks that Cashtab would use to add token info to cache for (const tokenMock of supportedTokens) { mockedChronik.setMock('token', { input: tokenMock.tokenId, output: tokenMock.token, }); mockedChronik.setMock('tx', { input: tokenMock.tokenId, output: tokenMock.tx, }); mockedChronik.setTokenId(tokenMock.tokenId); mockedChronik.setUtxosByTokenId(tokenMock.tokenId, { tokenId: tokenMock.tokenId, utxos: tokenMock.utxos, }); } // Mock the fetch call to 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('SLP1 fixed supply token', async () => { render( , ); const { tokenName } = slp1FixedMocks.token.genesisInfo; // Wait for element to get token info and load expect( (await screen.findAllByText(new RegExp(tokenName)))[0], ).toBeInTheDocument(); // We can click an info icon to learn more about this token type await userEvent.click( await screen.findByRole('button', { name: 'Click for more info about this token type', }), ); expect( screen.getByText( `SLP 1 fungible token. Token may be of fixed supply if no mint batons exist. If you have a mint baton, you can mint more of this token at any time. May have up to 9 decimal places.`, ), ).toBeInTheDocument(); // Close out of the info modal await userEvent.click(screen.getByText('OK')); // The supply is correctly rendered as fixed expect( screen.getByText('2,999,998,798.000000000 (fixed)'), ).toBeInTheDocument(); // Token actions are available expect(screen.getByTitle('Token Actions')).toBeInTheDocument(); // The send switch is turned on by default expect(screen.getByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); // The Airdrop switch is present expect(screen.getByTitle('Toggle Airdrop')).toBeInTheDocument(); // The Burn switch is present expect(screen.getByTitle('Toggle Burn')).toBeInTheDocument(); // The Mint switch is not rendered expect(screen.queryByTitle('Toggle Mint')).not.toBeInTheDocument(); }); it('SLP1 variable supply token with mint baton', async () => { render( , ); const { tokenName } = slp1VarMocks.token.genesisInfo; // Wait for element to get token info and load expect( (await screen.findAllByText(new RegExp(tokenName)))[0], ).toBeInTheDocument(); // We can click an info icon to learn more about this token type await userEvent.click( await screen.findByRole('button', { name: 'Click for more info about this token type', }), ); expect( screen.getByText( `SLP 1 fungible token. Token may be of fixed supply if no mint batons exist. If you have a mint baton, you can mint more of this token at any time. May have up to 9 decimal places.`, ), ).toBeInTheDocument(); // Close out of the info modal await userEvent.click(screen.getByText('OK')); // The supply is correctly rendered as fixed expect( screen.getByText('18,446,744,073.709551615 (var.)'), ).toBeInTheDocument(); // Token actions are available expect(screen.getByTitle('Token Actions')).toBeInTheDocument(); // The send switch is turned on by default expect(screen.getByTitle('Toggle Send')).toHaveProperty( 'checked', true, ); // The Airdrop switch is present expect(screen.getByTitle('Toggle Airdrop')).toBeInTheDocument(); // The Burn switch is present expect(screen.getByTitle('Toggle Burn')).toBeInTheDocument(); // The Mint switch is present and not disabled expect(screen.getByTitle('Toggle Mint')).toHaveProperty( 'disabled', false, ); }); it('SLP1 NFT Parent token', async () => { render( , ); const { tokenName } = slp1NftParentMocks.token.genesisInfo; // Wait for the component to finish loading await waitFor(() => expect( screen.queryByTitle('Cashtab Loading'), ).not.toBeInTheDocument(), ); - screen.debug(null, Infinity); // Wait for element to get token info and load expect( (await screen.findAllByText(new RegExp(tokenName)))[0], ).toBeInTheDocument(); // We can click an info icon to learn more about this token type await userEvent.click( await screen.findByRole('button', { name: 'Click for more info about this token type', }), ); expect( screen.getByText( `The parent tokens for an NFT collection. Can be used to mint NFTs. No decimal places. The supply of this token is the potential quantity of NFTs which could be minted. If no mint batons exist, the supply is fixed.`, ), ).toBeInTheDocument(); // Close out of the info modal await userEvent.click(screen.getByText('OK')); // The supply is correctly rendered expect(screen.getByText('100 (var.)')).toBeInTheDocument(); + // We see a "Coming soon" notice + expect( + screen.getByText( + 'ℹ️ Cashtab support for minting NFTs is coming soon', + ), + ).toBeInTheDocument(); + // No token actions are available expect(screen.queryByTitle('Token Actions')).not.toBeInTheDocument(); }); it('ALP token', async () => { render( , ); const { tokenName } = alpMocks.token.genesisInfo; // Wait for element to get token info and load expect( (await screen.findAllByText(new RegExp(tokenName)))[0], ).toBeInTheDocument(); // We can click an info icon to learn more about this token type await userEvent.click( await screen.findByRole('button', { name: 'Click for more info about this token type', }), ); expect( screen.getByText(`This token is not yet supported by Cashtab.`), ).toBeInTheDocument(); // Close out of the info modal await userEvent.click(screen.getByText('OK')); // The supply is correctly rendered expect(screen.getByText('111,367.0000 (var.)')).toBeInTheDocument(); // No token actions are available expect(screen.queryByTitle('Token Actions')).not.toBeInTheDocument(); }); }); diff --git a/cashtab/src/validation/__tests__/index.test.js b/cashtab/src/validation/__tests__/index.test.js index 264d343303..9c19bc48dc 100644 --- a/cashtab/src/validation/__tests__/index.test.js +++ b/cashtab/src/validation/__tests__/index.test.js @@ -1,535 +1,542 @@ // 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, getTokenDocumentUrlError, isValidCashtabSettings, isValidXecSendAmount, isValidTokenId, isValidXecAirdrop, isValidAirdropExclusionArray, isValidContactList, migrateLegacyCashtabSettings, isValidCashtabCache, validateMnemonic, meetsAliasSpec, isValidAliasSendInput, isProbablyNotAScam, isValidSideshiftObj, isValidMultiSendUserInput, shouldSendXecBeDisabled, parseAddressInput, isValidCashtabWallet, isValidTokenSendOrBurnAmount, isValidTokenMintAmount, getOpReturnRawError, nodeWillAcceptOpReturnRaw, getContactNameError, getContactAddressError, getWalletNameError, TOKEN_DOCUMENT_URL_MAX_CHARACTERS, } from 'validation'; import { validXecAirdropExclusionList, invalidXecAirdropExclusionList, invalidXecAirdropExclusionListPrefixless, } from 'validation/fixtures/mocks'; import vectors from 'validation/fixtures/vectors'; import appConfig from 'config/app'; 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(`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(`No error for a valid ${appConfig.tokenTicker} token document URL`, () => { expect(getTokenDocumentUrlError('cashtabapp.com')).toBe(false); }); it(`No error for a valid ${appConfig.tokenTicker} token document URL including special URL characters`, () => { expect(getTokenDocumentUrlError('https://cashtabapp.com/')).toBe(false); }); it(`No error for a blank string as a valid ${appConfig.tokenTicker} token document URL`, () => { expect(getTokenDocumentUrlError('')).toBe(false); }); it(`Expected error for valid url longer than 68 characters`, () => { expect( getTokenDocumentUrlError( 'http://www.ThisTokenDocumentUrlIsActuallyMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchMuchTooLong.com/', ), ).toBe( `URL must be less than ${TOKEN_DOCUMENT_URL_MAX_CHARACTERS} characters.`, ); }); it(`No error for a domain input with https protocol as ${appConfig.tokenTicker} token document URL`, () => { expect(getTokenDocumentUrlError('https://google.com')).toBe(false); }); it(`No error for a domain input with http protocol as ${appConfig.tokenTicker} token document URL`, () => { expect(getTokenDocumentUrlError('http://test.com')).toBe(false); }); it(`No error for a domain input with a primary and secondary top level domain as ${appConfig.tokenTicker} token document URL`, () => { expect(getTokenDocumentUrlError('http://test.co.uk')).toBe(false); }); it(`No error for a domain input with just a subdomain as ${appConfig.tokenTicker} token document URL`, () => { expect(getTokenDocumentUrlError('www.test.co.uk')).toBe(false); }); it(`Expected error for a domain input with no top level domain, protocol or subdomain ${appConfig.tokenTicker} token document URL`, () => { expect(getTokenDocumentUrlError('mywebsite')).toBe('Invalid URL'); }); + it(`Accepts a common wikipedia URL convention (underscore and parenthesis)`, () => { + expect( + getTokenDocumentUrlError( + 'https://en.wikipedia.org/wiki/Tai-Pan_(novel)', + ), + ).toBe(false); + }); it(`Expected error for a domain input as numbers ${appConfig.tokenTicker} token document URL`, () => { expect(getTokenDocumentUrlError(12345)).toBe('Invalid URL'); }); 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(`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); }); 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, sendWithCashtabMsg, cashtabMsgError, sendWithOpReturnRaw, opReturnRawError, priceApiError, isOneToManyXECSend, sendDisabled, } = expectedReturn; it(`shouldSendXecBeDisabled: ${description}`, () => { expect( shouldSendXecBeDisabled( formData, balanceSats, apiError, sendAmountError, sendAddressError, multiSendAddressError, sendWithCashtabMsg, cashtabMsgError, sendWithOpReturnRaw, opReturnRawError, 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); }); }); }); describe('Can tell if a string is valid bip21 op_return_raw input, or why it is not', () => { const { expectedReturns } = vectors.getOpReturnRawError; expectedReturns.forEach(expectedReturn => { const { description, opReturnRaw, returned } = expectedReturn; it(`getOpReturnRawError: ${description}`, () => { expect(getOpReturnRawError(opReturnRaw)).toBe(returned); }); }); }); describe('Validates OP_RETURN raw for eCash node broadcast', () => { const { expectedReturns } = vectors.nodeWillAcceptOpReturnRaw; expectedReturns.forEach(expectedReturn => { const { description, opReturnRaw, returned } = expectedReturn; it(`nodeWillAcceptOpReturnRaw: ${description}`, () => { expect(nodeWillAcceptOpReturnRaw(opReturnRaw)).toBe(returned); }); }); }); describe('Gets error or false for contact name input', () => { const { expectedReturns } = vectors.getContactNameError; expectedReturns.forEach(expectedReturn => { const { description, name, contacts, returned } = expectedReturn; it(`getContactNameError: ${description}`, () => { expect(getContactNameError(name, contacts)).toBe(returned); }); }); }); describe('Gets error or false for contact address input', () => { const { expectedReturns } = vectors.getContactAddressError; expectedReturns.forEach(expectedReturn => { const { description, address, contacts, returned } = expectedReturn; it(`getContactAddressError: ${description}`, () => { expect(getContactAddressError(address, contacts)).toBe( returned, ); }); }); }); describe('Gets error or false for wallet name input', () => { const { expectedReturns } = vectors.getWalletNameError; expectedReturns.forEach(expectedReturn => { const { description, name, wallets, returned } = expectedReturn; it(`getWalletNameError: ${description}`, () => { expect(getWalletNameError(name, wallets)).toBe(returned); }); }); }); }); diff --git a/cashtab/src/validation/index.js b/cashtab/src/validation/index.js index 24690ef979..fd5df19a22 100644 --- a/cashtab/src/validation/index.js +++ b/cashtab/src/validation/index.js @@ -1,950 +1,950 @@ // 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 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' ); }; export const getContactAddressError = (address, contacts) => { const isValidCashAddress = cashaddr.isValidCashAddress(address, 'ecash'); // We do not accept prefixless input if (!address.startsWith('ecash:')) { return `Addresses in Contacts must start with "ecash:" prefix`; } if (!isValidCashAddress) { return `Invalid address`; } for (const contact of contacts) { if (contact.address === address) { return `${address.slice(6, 9)}...${address.slice( -3, )} already in Contacts`; } } 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, ); }; const TOKEN_DOCUMENT_URL_REGEX = new RegExp( '^(https?:\\/\\/)?' + // protocol (optional) '((([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 + '(\\:\\d+)?(\\/[-a-z\\d%_().~+]*)*' + // port and path '(\\?[;&a-z\\d%_.~+=-]*)?' + // query string '(\\#[-a-z\\d_]*)?$', 'i', ); // fragment locator // Spec has no space limitation. Limitation is actually on available bytes in the genesis tx // This value is chosen arbitrarily to ensure sum of all fields does not break the limit // Since the URL must pass regex, we cannot have emojis or special characters // So a max length of 68 corresponds to 34 bytes export const TOKEN_DOCUMENT_URL_MAX_CHARACTERS = 68; /** * Validate user input for token document URL of genesis tx for SLP1 token * @param {string} url * @returns {string | false} error msg as string or false as bool if no error */ export const getTokenDocumentUrlError = url => { // This is an optional input field, so a blank string is valid (no error) if (url === '') { return false; } const isValidUrl = TOKEN_DOCUMENT_URL_REGEX.test(url); if (!isValidUrl) { return `Invalid URL`; } if (url.length > TOKEN_DOCUMENT_URL_MAX_CHARACTERS) { return `URL must be less than ${TOKEN_DOCUMENT_URL_MAX_CHARACTERS} characters.`; } // No error return false; }; 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 ); }; /** * Get false if no error, or a string error for why a wallet name is invalid * @param {string} name * @param {{name: string;}[]} wallets * @returns {false | string} */ export const getWalletNameError = (name, wallets) => { if (name === '') { return 'Wallet name cannot be a blank string'; } if (name.trim() === '') { return 'Wallet name cannot be only blank spaces'; } if (name.length > appConfig.localStorageMaxCharacters) { return `Wallet name cannot exceed ${appConfig.localStorageMaxCharacters} characters`; } for (const wallet of wallets) { if (wallet.name === name) { return `Wallet name "${name}" already exists`; } } return false; }; 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; }; const VALID_LOWERCASE_HEX_REGEX = /^[a-f0-9]+$/; /** * Validate bip21 op_return_raw input * @param {string} opReturnRaw user input (or webapp tx input) for bip21 op_return_raw * @returns {boolean | string} true if valid, string error msg if not */ export const getOpReturnRawError = opReturnRaw => { if (opReturnRaw === '') { return 'Cashtab will not send an empty op_return_raw'; } if (opReturnRaw.startsWith(opReturn.opReturnPrefixHex)) { return `op_return_raw will have OP_RETURN (6a) prepended automatically`; } if (!VALID_LOWERCASE_HEX_REGEX.test(opReturnRaw)) { return `Input must be lowercase hex a-f 0-9.`; } const BYTE_LENGTH_HEX = 2; if ( opReturnRaw.length / BYTE_LENGTH_HEX > opReturn.opreturnParamByteLimit ) { return `op_return_raw exceeds ${opReturn.opreturnParamByteLimit} bytes`; } if (opReturnRaw.length % BYTE_LENGTH_HEX !== 0) { return `op_return_raw input must be in hex bytes. Length of input must be divisible by two.`; } if (!nodeWillAcceptOpReturnRaw(opReturnRaw)) { return 'Invalid OP_RETURN'; } // No error return false; }; /** * Test a bip21 op_return_raw param to see if an eCash node will accept it * @param {string} opReturnRaw * @returns {bool} */ export const nodeWillAcceptOpReturnRaw = opReturnRaw => { try { if (opReturnRaw === '') { // 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}${opReturnRaw.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 {boolean} sendWithCashtabMsg * @param {false | string} cashtabMsgError * @param {boolean} sendWithOpReturnRaw * @param {false | string} opReturnRawError * @param {boolean} priceApiError * @param {boolean} isOneToManyXECSend * @returns boolean */ export const shouldSendXecBeDisabled = ( formData, balanceSats, apiError, sendAmountError, sendAddressError, multiSendAddressError, sendWithCashtabMsg, cashtabMsgError, sendWithOpReturnRaw, opReturnRawError, 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 AND we are sending the msg (sendWithCashtabMsg && cashtabMsgError !== false) || // Disabled if op_return_raw fails validation AND we are sending with op_return_raw (sendWithOpReturnRaw && opReturnRawError !== 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, }; const opReturnRawError = getOpReturnRawError(opreturnParam); if (opReturnRawError !== false) { // If we have an invalid op_return_raw param, set error parsedAddressInput.op_return_raw.error = `Invalid op_return_raw param: ${opReturnRawError}`; } } } } 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; }; /** * Determine if a new contact name is valid (same rule as renaming a contact) * The contact name must be <= 24 characters * The contact name must not already exist in contacts * @param {string} name * @param {{name: string;}[]} contacts array of cashtab contact objects, with key 'name' */ export const getContactNameError = (name, contacts) => { if (name === '') { return 'Please enter a contact name'; } if (name.length > appConfig.localStorageMaxCharacters) { return `Contact names cannot be longer than ${appConfig.localStorageMaxCharacters} characters`; } for (const contact of contacts) { if (contact.name === name) { return `"${name}" already exists in contacts`; } } return false; };