diff --git a/.gitignore b/.gitignore index 8315f40e..e8a52ebd 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,7 @@ src/main.prod.js.map src/node_modules **/walletSettings.json + +test/.env +test/walletsData/*.tezwallet +test/walletsData/testConfig.json diff --git a/configs/webpack.config.base.js b/configs/webpack.config.base.js index 0a094614..402a0833 100755 --- a/configs/webpack.config.base.js +++ b/configs/webpack.config.base.js @@ -35,7 +35,8 @@ module.exports = { plugins: [ new webpack.EnvironmentPlugin({ - NODE_ENV: 'production' + NODE_ENV: 'production', + TEST_ENV: 'false' }), new webpack.NamedModulesPlugin() diff --git a/package-lock.json b/package-lock.json index 973e5191..921316a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2450,6 +2450,15 @@ "integrity": "sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==", "dev": true }, + "@types/webdriverio": { + "version": "4.13.3", + "resolved": "https://registry.npmjs.org/@types/webdriverio/-/webdriverio-4.13.3.tgz", + "integrity": "sha512-AfSQM1xTO9Ax+u9uSQPDuw69DQ0qA2RMoKHn86jCgWNcwKVUjGMSP4sfSl3JOfcZN8X/gWvn7znVPp2/g9zcJA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/webpack-env": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.15.2.tgz", @@ -2471,6 +2480,12 @@ "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", "dev": true }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, "@webassemblyjs/ast": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", @@ -2960,6 +2975,47 @@ } } }, + "archiver": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", + "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=", + "dev": true, + "requires": { + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "zip-stream": "^1.2.0" + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", @@ -3328,6 +3384,30 @@ "babel-preset-current-node-syntax": "^0.1.2" } }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -3793,8 +3873,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, - "optional": true + "dev": true }, "bindings": { "version": "1.5.0", @@ -3829,7 +3908,6 @@ "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", "dev": true, - "optional": true, "requires": { "readable-stream": "^2.3.5", "safe-buffer": "^5.1.1" @@ -4088,6 +4166,12 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -4989,6 +5073,29 @@ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", "dev": true }, + "compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "dev": true, + "requires": { + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -5448,6 +5555,25 @@ } } }, + "crc": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", + "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "dev": true, + "requires": { + "buffer": "^5.1.0" + } + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "dev": true, + "requires": { + "crc": "^3.4.4", + "readable-stream": "^2.0.0" + } + }, "create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -5536,6 +5662,26 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "css-color-keywords": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", @@ -5640,6 +5786,15 @@ } } }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=", + "dev": true, + "requires": { + "css": "^2.0.0" + } + }, "css-select-base-adapter": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", @@ -5687,6 +5842,12 @@ "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", "dev": true }, + "css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha1-Xv1sLupeof1rasV+wEJ7GEUkJOo=", + "dev": true + }, "css-vendor": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", @@ -6428,6 +6589,12 @@ } } }, + "dev-null": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz", + "integrity": "sha1-WiBc48Ky73e2I41roXnrdMag6Bg=", + "dev": true + }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -7038,6 +7205,16 @@ } } }, + "electron-chromedriver": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/electron-chromedriver/-/electron-chromedriver-8.0.0.tgz", + "integrity": "sha512-d0210ExhkGOwYLXFZHQR6LISZ8UbMqXWLwjTe8Cdh44XlO4z4+6DWQfM0p7aB2Qak/An6tN732Yl98wN1ylZww==", + "dev": true, + "requires": { + "electron-download": "^4.1.1", + "extract-zip": "^1.6.7" + } + }, "electron-debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-3.1.0.tgz", @@ -7076,6 +7253,83 @@ } } }, + "electron-download": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", + "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==", + "dev": true, + "requires": { + "debug": "^3.0.0", + "env-paths": "^1.0.0", + "fs-extra": "^4.0.1", + "minimist": "^1.2.0", + "nugget": "^2.0.1", + "path-exists": "^3.0.0", + "rc": "^1.2.1", + "semver": "^5.4.1", + "sumchecker": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "env-paths": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", + "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", + "dev": true + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "sumchecker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", + "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", + "dev": true, + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + } + } + }, "electron-is-accelerator": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz", @@ -8443,6 +8697,12 @@ "resolve-dir": "^1.0.1" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -8529,8 +8789,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "optional": true + "dev": true }, "fs-extra": { "version": "8.1.0", @@ -8690,6 +8949,12 @@ "npm-conf": "^1.1.0" } }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -9028,6 +9293,18 @@ "dev": true, "optional": true }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, "growly": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", @@ -9222,6 +9499,12 @@ "minimalistic-assert": "^1.0.1" } }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, "hex-color-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", @@ -10196,7 +10479,6 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "optional": true, "requires": { "binary-extensions": "^2.0.0" } @@ -13542,6 +13824,15 @@ "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==", "dev": true }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "^2.0.5" + } + }, "lcov-parse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", @@ -14571,82 +14862,425 @@ } } }, - "moment": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", - "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "move-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.0.0.tgz", - "integrity": "sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==", - "dev": true, - "requires": { - "path-exists": "^4.0.0" - }, - "dependencies": { - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "mocha": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.3.2.tgz", + "integrity": "sha512-UdmISwr/5w+uXLPKspgoV7/RXZwKRTiTjJ2/AC5ZiEztIoOYdfKb19+9jNmEInzx5pBsCyJQzarAxqIGBNYJhg==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true - } - } - }, - "mozjpeg": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-6.0.1.tgz", - "integrity": "sha512-9Z59pJMi8ni+IUvSH5xQwK5tNLw7p3dwDNCZ3o1xE+of3G5Hc/yOz6Ue/YuLiBXU3ZB5oaHPURyPdqfBX/QYJA==", - "dev": true, - "optional": true, - "requires": { - "bin-build": "^3.0.0", - "bin-wrapper": "^4.0.0", - "logalot": "^2.1.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "multicast-dns": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", - "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", - "dev": true, - "requires": { - "dns-packet": "^1.3.1", - "thunky": "^1.0.2" - } - }, - "multicast-dns-service-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", - "dev": true - }, - "multiline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/multiline/-/multiline-2.0.0.tgz", - "integrity": "sha512-+HpXaUcV8PIGNNmuhtlaVmw4NH0W30/A5WP+rq6pxZYBjDslX/sXkFgL3Mgk1cSGGIICjWu4gNStkJXL6ZM2DQ==", - "dev": true, - "requires": { - "strip-indent": "^2.0.0" + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, + "moment": { + "version": "2.27.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", + "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==", + "dev": true, + "requires": { + "path-exists": "^4.0.0" + }, + "dependencies": { + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } + } + }, + "mozjpeg": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-6.0.1.tgz", + "integrity": "sha512-9Z59pJMi8ni+IUvSH5xQwK5tNLw7p3dwDNCZ3o1xE+of3G5Hc/yOz6Ue/YuLiBXU3ZB5oaHPURyPdqfBX/QYJA==", + "dev": true, + "optional": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0", + "logalot": "^2.1.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "multiline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/multiline/-/multiline-2.0.0.tgz", + "integrity": "sha512-+HpXaUcV8PIGNNmuhtlaVmw4NH0W30/A5WP+rq6pxZYBjDslX/sXkFgL3Mgk1cSGGIICjWu4gNStkJXL6ZM2DQ==", + "dev": true, + "requires": { + "strip-indent": "^2.0.0" }, "dependencies": { "strip-indent": { @@ -14669,6 +15303,12 @@ "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", "dev": true }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -15159,6 +15799,12 @@ } } }, + "npm-install-package": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/npm-install-package/-/npm-install-package-2.1.0.tgz", + "integrity": "sha1-1+/jz816sAYUuJbqUxGdyaslkSU=", + "dev": true + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -15197,6 +15843,38 @@ "boolbase": "~1.0.0" } }, + "nugget": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", + "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", + "dev": true, + "requires": { + "debug": "^2.1.3", + "minimist": "^1.1.0", + "pretty-bytes": "^1.0.2", + "progress-stream": "^1.1.0", + "request": "^2.45.0", + "single-line-log": "^1.1.2", + "throttleit": "0.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -15430,7 +16108,25 @@ "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "dev": true, "requires": { - "is-wsl": "^1.1.0" + "is-wsl": "^1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } } }, "optimize-css-assets-webpack-plugin": { @@ -16527,6 +17223,16 @@ "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg==", "dev": true }, + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "meow": "^3.1.0" + } + }, "pretty-format": { "version": "25.5.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", @@ -16590,6 +17296,67 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "progress-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", + "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", + "dev": true, + "requires": { + "speedometer": "~0.1.2", + "through2": "~0.2.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "object-keys": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", + "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", + "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", + "dev": true, + "requires": { + "readable-stream": "~1.1.9", + "xtend": "~2.1.1" + } + }, + "xtend": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", + "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "dev": true, + "requires": { + "object-keys": "~0.4.0" + } + } + } + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -17478,6 +18245,12 @@ "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", "dev": true }, + "rgb2hex": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.1.10.tgz", + "integrity": "sha512-vKz+kzolWbL3rke/xeTE2+6vHmZnNxGyDnaVW4OckntAIcc7DcZzWkQSfxMDwqHS8vhgySnIFyBUH7lIk6PxvQ==", + "dev": true + }, "rgba-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", @@ -17544,6 +18317,21 @@ "aproba": "^1.1.1" } }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, "rxjs": { "version": "6.5.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", @@ -18168,6 +18956,52 @@ } } }, + "single-line-log": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", + "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", + "dev": true, + "requires": { + "string-width": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -18544,6 +19378,35 @@ } } }, + "spectron": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/spectron/-/spectron-10.0.1.tgz", + "integrity": "sha512-eMAOr7ovYf+e6+DhkoxVWAMRfZvLJMjtZKwWYkL56fv3Ij6rxhYLjOxybKj0phgMYZ7o2cX5zu2NoyiUM756CA==", + "dev": true, + "requires": { + "@types/webdriverio": "^4.8.0", + "dev-null": "^0.1.1", + "electron-chromedriver": "^8.0.0", + "request": "^2.87.0", + "split": "^1.0.0", + "webdriverio": "^4.13.0" + } + }, + "speedometer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", + "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2" + } + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -19292,7 +20155,6 @@ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", "dev": true, - "optional": true, "requires": { "bl": "^1.0.0", "buffer-alloc": "^1.2.0", @@ -19473,6 +20335,12 @@ "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.1.0.tgz", "integrity": "sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg==" }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -19552,8 +20420,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true, - "optional": true + "dev": true }, "to-fast-properties": { "version": "2.0.0", @@ -20741,6 +21608,144 @@ "defaults": "^1.0.3" } }, + "wdio-dot-reporter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/wdio-dot-reporter/-/wdio-dot-reporter-0.0.10.tgz", + "integrity": "sha512-A0TCk2JdZEn3M1DSG9YYbNRcGdx/YRw19lTiRpgwzH4qqWkO/oRDZRmi3Snn4L2j54KKTfPalBhlOtc8fojVgg==", + "dev": true + }, + "webdriverio": { + "version": "4.14.4", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-4.14.4.tgz", + "integrity": "sha512-Knp2vzuzP5c5ybgLu+zTwy/l1Gh0bRP4zAr8NWcrStbuomm9Krn9oRF0rZucT6AyORpXinETzmeowFwIoo7mNA==", + "dev": true, + "requires": { + "archiver": "~2.1.0", + "babel-runtime": "^6.26.0", + "css-parse": "^2.0.0", + "css-value": "~0.0.1", + "deepmerge": "~2.0.1", + "ejs": "~2.5.6", + "gaze": "~1.1.2", + "glob": "~7.1.1", + "grapheme-splitter": "^1.0.2", + "inquirer": "~3.3.0", + "json-stringify-safe": "~5.0.1", + "mkdirp": "~0.5.1", + "npm-install-package": "~2.1.0", + "optimist": "~0.6.1", + "q": "~1.5.0", + "request": "^2.83.0", + "rgb2hex": "^0.1.9", + "safe-buffer": "~5.1.1", + "supports-color": "~5.0.0", + "url": "~0.11.0", + "wdio-dot-reporter": "~0.0.8", + "wgxpath": "~1.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "deepmerge": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.0.1.tgz", + "integrity": "sha512-VIPwiMJqJ13ZQfaCsIFnp5Me9tnjURiaIFxfz7EH0Ci0dTSQpZtSLrqOicXqEd/z2r+z+Klk9GzmnRsgpgbOsQ==", + "dev": true + }, + "ejs": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.9.tgz", + "integrity": "sha512-GJCAeDBKfREgkBtgrYSf9hQy9kTb3helv0zGdzqhM7iAkW8FA/ZF97VQDbwFiwIT8MQLLOe5VlPZOEvZAqtUAQ==", + "dev": true + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.0.1.tgz", + "integrity": "sha512-7FQGOlSQ+AQxBNXJpVDj8efTA/FtyB5wcNE1omXXJ0cq6jm1jjDwuROlYDbnzHqdNPqliWFhcioCWSyav+xBnA==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } + } + }, "webidl-conversions": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", @@ -21460,6 +22465,12 @@ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, + "wgxpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wgxpath/-/wgxpath-1.0.0.tgz", + "integrity": "sha1-7vikudVYzEla06mit1FZfs2a9pA=", + "dev": true + }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -21605,6 +22616,12 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -21634,6 +22651,12 @@ } } }, + "workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", + "dev": true + }, "wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -21691,6 +22714,42 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, + "xvfb-maybe": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xvfb-maybe/-/xvfb-maybe-0.2.1.tgz", + "integrity": "sha1-7YyxMpV7eEi0OZhMZvAQ6n8kNhs=", + "dev": true, + "requires": { + "debug": "^2.2.0", + "which": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "y18n": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", @@ -21740,6 +22799,38 @@ "decamelize": "^1.2.0" } }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + } + } + }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -21750,6 +22841,24 @@ "fd-slicer": "~1.1.0" } }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "dev": true, + "requires": { + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" + } + }, "zxcvbn": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/zxcvbn/-/zxcvbn-4.4.2.tgz", diff --git a/package.json b/package.json index ddba358f..500c5ae9 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "build-debug": "cross-env DEBUG_PROD=true npm run build", "build-dll": "cross-env NODE_ENV=development webpack --config ./configs/webpack.config.renderer.dev.dll.js --colors", "build-e2e": "cross-env E2E_BUILD=true npm run build", - "build-main": "cross-env NODE_ENV=production webpack --config ./configs/webpack.config.main.prod.js --colors", - "build-renderer": "cross-env NODE_ENV=production webpack --config ./configs/webpack.config.renderer.prod.js --colors", + "build-main": "cross-env NODE_ENV=production TEST_ENV=$TEST webpack --config ./configs/webpack.config.main.prod.js --colors", + "build-renderer": "cross-env NODE_ENV=production TEST_ENV=$TEST webpack --config ./configs/webpack.config.renderer.prod.js --colors", "dev": "cross-env START_HOT=1 node ./scripts/CheckPortInUse.js && cross-env START_HOT=1 npm run start-renderer-dev", "electron-rebuild": "electron-rebuild --parallel --force --types prod,dev,optional --module-dir src", "lint": "tslint '{src,test,mocks}/**/*.{ts,tsx}' --project ./tsconfig.json", @@ -31,7 +31,8 @@ "start-main-dev": "cross-env START_HOT=1 NODE_ENV=development electron ./src/main.dev.js", "start-renderer-dev": "cross-env NODE_ENV=development webpack-dev-server --config ./configs/webpack.config.renderer.dev.js", "coverage": "cross-env NODE_ENV=test BABEL_DISABLE_CACHE=1 jest --coverage=true && ./node_modules/coveralls/bin/coveralls.js < ./coverage/lcov.info", - "test": "cross-env NODE_ENV=test BABEL_DISABLE_CACHE=1 jest", + "test": "cross-env NODE_ENV=test mocha", + "test-build": " cross-env TEST=true concurrently \"npm run build-main\" \"npm run build-renderer\"", "test-all": "npm run lint && npm run build && npm run test && npm run build-e2e && npm run test-e2e", "test-e2e": "node ./scripts/CheckBuildsExist.js && cross-env NODE_ENV=test testcafe electron:./src ./test/e2e/HomePage.e2e.ts", "test-e2e-live": "node ./scripts/CheckBuildsExist.js && cross-env NODE_ENV=test testcafe --live electron:./src ./test/e2e/HomePage.e2e.ts", @@ -53,14 +54,9 @@ ] }, "jest": { - "preset": "ts-jest", - "collectCoverageFrom": [ - "src/**/*.ts", - "src/**/*.tsx", - "!src/**/style.ts", - "!src/**/types.ts", - "!src/constants/*" - ], + "transform": { + ".+\\.tsx?$": "ts-jest" + }, "testRegex": "(/test/.+\\.spec)\\.tsx?$", "moduleFileExtensions": [ "ts", @@ -185,6 +181,7 @@ "jest": "26.0.1", "lint-staged": "9.5.0", "mini-css-extract-plugin": "0.9.0", + "mocha": "^8.1.3", "node-sass": "4.14.1", "opencollective-postinstall": "2.0.2", "optimize-css-assets-webpack-plugin": "5.0.3", @@ -194,6 +191,7 @@ "redux-logger": "3.0.6", "sass-loader": "8.0.2", "source-map-loader": "0.2.4", + "spectron": "10.0.1", "style-loader": "1.2.1", "terser-webpack-plugin": "3.0.1", "ts-jest": "26.0.0", @@ -208,7 +206,8 @@ "webpack-bundle-analyzer": "3.8.0", "webpack-cli": "3.3.12", "webpack-dev-server": "3.11.0", - "webpack-merge": "4.2.2" + "webpack-merge": "4.2.2", + "xvfb-maybe": "^0.2.1" }, "dependencies": { "@airgap/beacon-sdk": "2.2.5", diff --git a/src/components/Address/index.tsx b/src/components/Address/index.tsx index 030619ab..228c9671 100644 --- a/src/components/Address/index.tsx +++ b/src/components/Address/index.tsx @@ -113,18 +113,19 @@ interface Props { balance?: number; index?: number; accountId?: string; + dataSpectron?: string; onClick?: () => void; } -const Address: React.SFC = props => { +const Address: React.SFC = (props) => { const { t } = useTranslation(); - const { isManager, isContract, isActive, balance, index, accountId, onClick } = props; + const { isManager, isContract, isActive, balance, index, accountId, dataSpectron, onClick } = props; const firstLine = getFirstLine(isManager, isContract, isActive, index, accountId, t); return ( - + {firstLine} - + diff --git a/src/components/AddressBlock/index.tsx b/src/components/AddressBlock/index.tsx index 50860606..be553f07 100644 --- a/src/components/AddressBlock/index.tsx +++ b/src/components/AddressBlock/index.tsx @@ -273,9 +273,10 @@ function AddressBlock(props: Props) { const isDelegateModalOpen = isModalOpen && activeModal === 'delegate_contract'; return ( - + {ready ? (
goToAccount(publicKeyHash, 0, AddressType.Manager)} /> )} - + {t('components.addDelegateModal.add_delegate_title')} @@ -300,6 +301,7 @@ function AddressBlock(props: Props) { return delegatedAddressReady ? (
- goToAccount(publicKeyHash, 0, AddressType.TokensPage)}> + goToAccount(publicKeyHash, 0, AddressType.TokensPage)} + > {t('general.nouns.tokens')} @@ -373,6 +379,7 @@ function AddressBlock(props: Props) { return ( + {t('components.interactModal.interact_contract')} {isManagerReady ? ( onCheckInteractModal()} /> @@ -400,6 +407,7 @@ function AddressBlock(props: Props) { return smartAddressReady ? (
void; + label: string; + onClick?: () => void; + dataSpectron?: string; } function BackButton(props: Props) { - const history = useHistory(); - const { label, onClick } = props; - function goBack() { - if (!onClick) { - history.goBack(); - } else { - onClick(); + const history = useHistory(); + const { label, onClick } = props; + function goBack() { + if (!onClick) { + history.goBack(); + } else { + onClick(); + } } - } - return ( - }> - {label} - - ); + return ( + }> + {label} + + ); } export default BackButton; diff --git a/src/components/BalanceBanner/index.tsx b/src/components/BalanceBanner/index.tsx index 86203f03..2984fe59 100644 --- a/src/components/BalanceBanner/index.tsx +++ b/src/components/BalanceBanner/index.tsx @@ -104,7 +104,7 @@ function BalanceBanner(props: Props) { } return ( - + {breadcrumbs} @@ -118,31 +118,40 @@ function BalanceBanner(props: Props) { {!displayName ? addressLabel : displayName} {isManager && !isLedger && ( - setIsShowKey(true)}> + setIsShowKey(true)}> )} {isManager && ( {t('components.balanceBanner.tooltip_content')}}> - openNotifierUrl()}> + openNotifierUrl()}> )} )} - + {domainName && domainName.length > 0 && <>{domainName}} {isReady || storeType === Mnemonic ? (
- +
) : null}
{delegatedAddress && ( - + <>{t('components.balanceBanner.delegated_to')} {bakerName && {bakerName}} {!bakerName && ( diff --git a/src/components/Button/index.tsx b/src/components/Button/index.tsx index 9633e0c9..5040660c 100644 --- a/src/components/Button/index.tsx +++ b/src/components/Button/index.tsx @@ -5,15 +5,15 @@ import { lighten } from 'polished'; import { ms } from '../../styles/helpers'; const primaryTheme = css` - background: ${({ theme: { colors } }) => colors.accent}; - color: ${({ theme: { colors } }) => colors.white}; - transition: all ${({ theme: { animations } }) => animations.defaultTime}; - border: 2px solid ${({ theme: { colors } }) => colors.accent}; + background: ${({ theme: { colors } }) => colors.accent}; + color: ${({ theme: { colors } }) => colors.white}; + transition: all ${({ theme: { animations } }) => animations.defaultTime}; + border: 2px solid ${({ theme: { colors } }) => colors.accent}; - &:hover { - background: ${({ theme: { colors } }) => lighten(0.08, colors.accent)}; - border: 2px solid ${({ theme: { colors } }) => lighten(0.08, colors.accent)}; - } + &:hover { + background: ${({ theme: { colors } }) => lighten(0.08, colors.accent)}; + border: 2px solid ${({ theme: { colors } }) => lighten(0.08, colors.accent)}; + } `; const secondaryTheme = css` @@ -28,29 +28,29 @@ const secondaryTheme = css` `; const plainTheme = css` - background: transparent; - transition: background ${({ theme: { animations } }) => animations.defaultTime}; - padding: 0; - outline: none; + background: transparent; + transition: background ${({ theme: { animations } }) => animations.defaultTime}; + padding: 0; + outline: none; `; const chooseTheme = (buttonTheme: 'primary' | 'secondary' | 'plain') => { - switch (buttonTheme) { - case 'primary': - return primaryTheme; - case 'secondary': - return secondaryTheme; - case 'plain': - return plainTheme; - default: - return primaryTheme; - } + switch (buttonTheme) { + case 'primary': + return primaryTheme; + case 'secondary': + return secondaryTheme; + case 'plain': + return plainTheme; + default: + return primaryTheme; + } }; interface ButtonProps { - small?: boolean; - buttonTheme: any; - type?: any; + small?: boolean; + buttonTheme: any; + type?: any; } const StyledButton = styled.button>` @@ -65,59 +65,52 @@ const StyledButton = styled.button - small && - css` - padding: ${ms(-5)} ${ms(6)}; - font-size: ${ms(-1)}; - `} + small && + css` + padding: ${ms(-5)} ${ms(6)}; + font-size: ${ms(-1)}; + `} ${({ disabled }) => - disabled && - css` - opacity: 0.5; - pointer-events: none; - &:hover { - opacity: 0.5; - } - `} + disabled && + css` + opacity: 0.5; + pointer-events: none; + &:hover { + opacity: 0.5; + } + `} ${({ buttonTheme }) => chooseTheme(buttonTheme)}; `; interface Props { - className?: string; - children?: any; - disabled?: boolean; - buttonTheme: 'primary' | 'secondary' | 'plain'; - small?: boolean; - type?: string; - onClick?: (event: MouseEvent) => void; + className?: string; + children?: any; + disabled?: boolean; + buttonTheme: 'primary' | 'secondary' | 'plain'; + small?: boolean; + id?: string; + type?: string; + onClick?: (event: MouseEvent) => void; } function Button(props: Props) { - const { - className, - children, - disabled, - buttonTheme, - type, - small, - onClick, - ...restOfProps - } = props; - return ( - - {children} - - ); + const { className, children, disabled, buttonTheme, type, id, small, onClick, ...restOfProps } = props; + return ( + + {children} + + ); } export default Button; diff --git a/src/components/Checkbox/index.tsx b/src/components/Checkbox/index.tsx index 76b058fd..297abd83 100644 --- a/src/components/Checkbox/index.tsx +++ b/src/components/Checkbox/index.tsx @@ -5,32 +5,32 @@ import Circle from '@material-ui/icons/PanoramaFishEye'; import theme from '../../styles/theme'; interface Props { - isChecked: boolean; - onCheck: () => void; + isChecked: boolean; + onCheck: () => void; } const styles = { - width: 'auto' + width: 'auto', }; const iconStyles = { - fill: theme.colors.accent, - width: 30, - height: 30 + fill: theme.colors.accent, + width: 30, + height: 30, }; function Checkbox(props: Props) { - const { isChecked, onCheck } = props; - return ( - } - icon={} - /> - ); + const { isChecked, onCheck } = props; + return ( + } + icon={} + /> + ); } export default Checkbox; diff --git a/src/components/ConfirmModals/AddDelegateModal.tsx b/src/components/ConfirmModals/AddDelegateModal.tsx index b116d309..fcd53d74 100644 --- a/src/components/ConfirmModals/AddDelegateModal.tsx +++ b/src/components/ConfirmModals/AddDelegateModal.tsx @@ -322,9 +322,10 @@ function AddDelegateModal(props: Props) { const { isIssue, warningMessage, balanceColor } = getBalanceState(); return ( - + - + @@ -376,7 +378,7 @@ function AddDelegateModal(props: Props) { {t('general.nouns.total')} - + {t('general.nouns.remaining_balance')} {isIssue && ( @@ -392,13 +394,14 @@ function AddDelegateModal(props: Props) { {!isLedger && ( setPassPhrase(val)} containerStyle={{ width: '60%', marginTop: '10px' }} /> )} - createAccount()}> + createAccount()}> {t('general.verbs.delegate')} diff --git a/src/components/ConfirmModals/DelegateConfirmationModal.tsx b/src/components/ConfirmModals/DelegateConfirmationModal.tsx index f9305d81..457a8299 100644 --- a/src/components/ConfirmModals/DelegateConfirmationModal.tsx +++ b/src/components/ConfirmModals/DelegateConfirmationModal.tsx @@ -153,7 +153,7 @@ const DelegateConfirmationModal = (props: Props) => { isDelegateIssue, onDelegateIssue, isLedger, - isDisplayedFeeTooltip + isDisplayedFeeTooltip, } = props; const { t } = useTranslation(); const isDisabled = isLoading || !newAddress || (!password && !isLedger) || isDelegateIssue; diff --git a/src/components/ConfirmModals/SendConfirmationModal.tsx b/src/components/ConfirmModals/SendConfirmationModal.tsx index e286492d..41b2de77 100644 --- a/src/components/ConfirmModals/SendConfirmationModal.tsx +++ b/src/components/ConfirmModals/SendConfirmationModal.tsx @@ -35,6 +35,7 @@ const SendConfirmationModal = (props: Props) => { return ( { {t('general.nouns.amount')} - + {amount} @@ -56,7 +57,7 @@ const SendConfirmationModal = (props: Props) => { {t('general.nouns.fee')} - + {calcFee} @@ -85,6 +86,7 @@ const SendConfirmationModal = (props: Props) => { {t('components.copyIcon.copied')}} leaveDelay={500} @@ -68,10 +69,10 @@ function CopyButton(props: Props) { modifiers: { offset: { enabled: true, - offset: '50px, 0px' - } - } - } + offset: '50px, 0px', + }, + }, + }, }} > {title ? ( diff --git a/src/components/CreateAccountSlide/BackUpSeedPhrase.tsx b/src/components/CreateAccountSlide/BackUpSeedPhrase.tsx index 16aad8b5..1be665b2 100644 --- a/src/components/CreateAccountSlide/BackUpSeedPhrase.tsx +++ b/src/components/CreateAccountSlide/BackUpSeedPhrase.tsx @@ -5,17 +5,19 @@ import SeedInput from './SeedInput'; import { DescriptionContainer, ValidFormContainer } from './style'; interface Seed { + dataSpectron?: number; index: number; value: string; } interface Props { + dataSpectron?: string; seed: string; onValid: (isVal: boolean) => void; } function BackUpSeedPhrase(props: Props) { - const { seed, onValid } = props; + const { dataSpectron, seed, onValid } = props; const { t } = useTranslation(); const [randomSeeds, setRandomSeeds] = useState([]); const [validationStatus, setValidationStatus] = useState([]); @@ -48,9 +50,15 @@ function BackUpSeedPhrase(props: Props) { return ( {t('components.createAccountSlide.descriptions.description3')} - + {randomSeeds.map((item, index) => ( - checkValidation(index, val)} /> + checkValidation(index, val)} + data-spectron="random-seeds" + /> ))} diff --git a/src/components/CreateAccountSlide/SeedInput.tsx b/src/components/CreateAccountSlide/SeedInput.tsx index f26491da..0a033dff 100644 --- a/src/components/CreateAccountSlide/SeedInput.tsx +++ b/src/components/CreateAccountSlide/SeedInput.tsx @@ -32,13 +32,14 @@ const WarningIcon = styled(Warning)` `; interface Props { + dataSpectron?: string; value: string; index: number; onValidate: (isValid: boolean) => void; } function SeedInput(props: Props) { - const { index, value, onValidate } = props; + const { dataSpectron, index, value, onValidate } = props; const { t } = useTranslation(); const [isFirst, setIsFirst] = useState(false); const [status, setStatus] = useState(0); @@ -124,7 +125,7 @@ function SeedInput(props: Props) { return ( - changFunc(newVal)} errorText={t(error)} /> + changFunc(newVal)} errorText={t(error)} data-spectron="random-seed-text-field" /> {icon} ); diff --git a/src/components/CreateAccountSlide/ShowSeedPhrase.tsx b/src/components/CreateAccountSlide/ShowSeedPhrase.tsx index 07da1e83..a01d4620 100644 --- a/src/components/CreateAccountSlide/ShowSeedPhrase.tsx +++ b/src/components/CreateAccountSlide/ShowSeedPhrase.tsx @@ -2,88 +2,69 @@ import React, { Fragment } from 'react'; import { useTranslation } from 'react-i18next'; import CopyButton from '../CopyButton'; -import { - DescriptionContainer, - IconContainer, - RefreshButton, - RefreshIconWrapper, - SeedsContainer, - SeedColume, - SeedItem, - SeedIndex -} from './style'; +import { DescriptionContainer, IconContainer, RefreshButton, RefreshIconWrapper, SeedsContainer, SeedColume, SeedItem, SeedIndex } from './style'; interface Props { - seed: string; - onUpdate: () => void; + dataSpectron?: string; + seed: string; + onUpdate: () => void; } function ShowSeedPhrase(props: Props) { - const { seed, onUpdate } = props; - const { t } = useTranslation(); + const { dataSpectron, seed, onUpdate } = props; + const { t } = useTranslation(); - function setupSeedColumns() { - const seedWords = seed.split(' '); - const seedsTable: any[] = []; - let seedColums: string[] = []; + function setupSeedColumns() { + const seedWords = seed.split(' '); + const seedsTable: any[] = []; + let seedColums: string[] = []; - seedWords.forEach((item, index) => { - seedColums.push(item); - if ((index + 1) % 6 === 0) { - seedsTable.push(seedColums); - seedColums = []; - } - }); + seedWords.forEach((item, index) => { + seedColums.push(item); + if ((index + 1) % 6 === 0) { + seedsTable.push(seedColums); + seedColums = []; + } + }); - return seedsTable; - } - const seeds = setupSeedColumns(); - const processedSeed = seed - .split(' ') - .map((item, index) => { - return `${index + 1}. ${item}`; - }) - .join(' '); - return ( - - - {t('components.createAccountSlide.descriptions.description1')} - - - {seeds.map((items, index) => { - return ( - - {items.map((item, index1) => ( - - {index * 6 + index1 + 1} - {item} - - ))} - - ); - })} - - -
- -
-
- onUpdate()} - startIcon={} - > - {t('components.createAccountSlide.generate_other_seed')} - -
-
-
- ); + return seedsTable; + } + const seeds = setupSeedColumns(); + const processedSeed = seed + .split(' ') + .map((item, index) => { + return `${index + 1}. ${item}`; + }) + .join(' '); + return ( + + {t('components.createAccountSlide.descriptions.description1')} + + {seeds.map((items, index) => { + return ( + + {items.map((item, index1) => ( + + {index * 6 + index1 + 1} + {item} + + ))} + + ); + })} + + +
+ +
+
+ onUpdate()} startIcon={}> + {t('components.createAccountSlide.generate_other_seed')} + +
+
+
+ ); } export default ShowSeedPhrase; diff --git a/src/components/CreateAccountSlide/index.tsx b/src/components/CreateAccountSlide/index.tsx index 9919fd2b..9be26f88 100644 --- a/src/components/CreateAccountSlide/index.tsx +++ b/src/components/CreateAccountSlide/index.tsx @@ -10,93 +10,77 @@ import { generateNewMnemonic } from '../../utils/general'; import useEventListener from '../../customHooks/useEventListener'; import { importAddressThunk } from '../../reduxContent/wallet/thunks'; -import { - CreateAccountSlideContainer, - BackButtonContainer, - ActionButton, - DescriptionContainer, - TitleContainer -} from './style'; +import { CreateAccountSlideContainer, BackButtonContainer, ActionButton, DescriptionContainer, TitleContainer } from './style'; function CreateAccountSlide() { - const { t } = useTranslation(); - const dispatch = useDispatch(); - const [isDisabled, setIsDisabled] = useState(false); - const [seed, setSeed] = useState(generateNewMnemonic()); - const [currentSlide, setCurrentSlide] = useState(0); + const { t } = useTranslation(); + const dispatch = useDispatch(); + const [isDisabled, setIsDisabled] = useState(false); + const [seed, setSeed] = useState(generateNewMnemonic()); + const [currentSlide, setCurrentSlide] = useState(0); - function updateMnemonic() { - setSeed(generateNewMnemonic()); - } - - function onImport() { - dispatch(importAddressThunk(GENERATE_MNEMONIC, seed)); - } + function updateMnemonic() { + setSeed(generateNewMnemonic()); + } - function onAction() { - if (currentSlide === 0) { - setIsDisabled(true); - setCurrentSlide(currentSlide + 1); - } else if (currentSlide === 2) { - onImport(); - } else { - setCurrentSlide(currentSlide + 1); + function onImport() { + dispatch(importAddressThunk(GENERATE_MNEMONIC, seed)); } - } - const onKeyPressed = event => { - if (event.key === 'Enter' && (currentSlide !== 1 || !isDisabled)) { - onAction(); + function onAction() { + if (currentSlide === 0) { + setIsDisabled(true); + setCurrentSlide(currentSlide + 1); + } else if (currentSlide === 2) { + onImport(); + } else { + setCurrentSlide(currentSlide + 1); + } } - }; - const createAccount = () => { - return ( - - {t('components.createAccountSlide.seed_backup')} - - {t('components.createAccountSlide.descriptions.description2')} - - - ); - }; + const onKeyPressed = (event) => { + if (event.key === 'Enter' && (currentSlide !== 1 || !isDisabled)) { + onAction(); + } + }; - function mainRender() { - switch (currentSlide) { - case 0: - return updateMnemonic()} />; - case 1: - return setIsDisabled(isVal)} />; - default: - return createAccount(); + const createAccount = () => { + return ( + + {t('components.createAccountSlide.seed_backup')} + {t('components.createAccountSlide.descriptions.description2')} + + ); + }; + + function mainRender() { + switch (currentSlide) { + case 0: + return updateMnemonic()} />; + case 1: + return setIsDisabled(isVal)} />; + default: + return createAccount(); + } } - } - useEventListener('keydown', onKeyPressed); + useEventListener('keydown', onKeyPressed); - const buttonTitle = - currentSlide === 2 ? t('components.createAccountSlide.create_account') : t('general.next'); + const buttonTitle = currentSlide === 2 ? t('components.createAccountSlide.create_account') : t('general.next'); - return ( - - {!!currentSlide && ( - - setCurrentSlide(0)} - /> - - )} - {mainRender()} - onAction()} - > - {buttonTitle} - - - ); + return ( + + {!!currentSlide && ( + + setCurrentSlide(0)} /> + + )} + {mainRender()} + onAction()}> + {buttonTitle} + + + ); } export default CreateAccountSlide; diff --git a/src/components/CustomModal/index.tsx b/src/components/CustomModal/index.tsx index 19985dfd..d015e57e 100644 --- a/src/components/CustomModal/index.tsx +++ b/src/components/CustomModal/index.tsx @@ -4,61 +4,62 @@ import Modal from '@material-ui/core/Modal'; import CloseIcon from '@material-ui/icons/Close'; const ModalWrapper = styled(Modal)` - &&& { - display: flex; - align-items: center; - justify-content: center; - } + &&& { + display: flex; + align-items: center; + justify-content: center; + } `; const ModalContainer = styled.div` - background-color: ${({ theme: { colors } }) => colors.white}; - outline: none; - position: relative; - padding-top: 53px; - min-width: 671px; - max-width: 750px; + background-color: ${({ theme: { colors } }) => colors.white}; + outline: none; + position: relative; + padding-top: 53px; + min-width: 671px; + max-width: 750px; `; const CloseIconWrapper = styled(CloseIcon)` - &&& { - fill: #7190c6; - cursor: pointer; - height: 20px; - width: 20px; - position: absolute; - top: 23px; - right: 23px; - } + &&& { + fill: #7190c6; + cursor: pointer; + height: 20px; + width: 20px; + position: absolute; + top: 23px; + right: 23px; + } `; const ModalTitle = styled.div` - padding: 0 76px; - font-size: 24px; - letter-spacing: 1px; - line-height: 34px; - font-weight: 300; - color: ${({ theme: { colors } }) => colors.primary}; + padding: 0 76px; + font-size: 24px; + letter-spacing: 1px; + line-height: 34px; + font-weight: 300; + color: ${({ theme: { colors } }) => colors.primary}; `; interface Props { - title: string; - open: boolean; - children?: React.ReactNode; - onClose: () => void; + title: string; + open: boolean; + children?: React.ReactNode; + dataSpectron?: string; + onClose: () => void; } const CustomModal = (props: Props) => { - const { title, open, children, onClose, ...other } = props; - return ( - - - - {title} - {children} - - - ); + const { title, open, children, dataSpectron, onClose, ...other } = props; + return ( + + + + {title} + {children} + + + ); }; export default CustomModal; diff --git a/src/components/CustomSelect/index.tsx b/src/components/CustomSelect/index.tsx index 93fcad94..9b73eac1 100644 --- a/src/components/CustomSelect/index.tsx +++ b/src/components/CustomSelect/index.tsx @@ -5,7 +5,7 @@ import FormControl from '@material-ui/core/FormControl'; import InputLabel from '@material-ui/core/InputLabel'; const SelectContainer = styled(FormControl)` - width: 100%; + width: 100%; `; const LabelWrapper = styled(InputLabel)` @@ -19,50 +19,51 @@ const LabelWrapper = styled(InputLabel)` }`; const SelectWrapper = styled(SelectField)` - &&& { - .MuiSelect-select { - display: flex; - align-items: center; - padding-top: 4px; - padding-bottom: 4px; - &:focus { - background: ${({ theme: { colors } }) => colors.transparent}; - } - } + &&& { + .MuiSelect-select { + display: flex; + align-items: center; + padding-top: 4px; + padding-bottom: 4px; + &:focus { + background: ${({ theme: { colors } }) => colors.transparent}; + } + } - &:before { - border-bottom: solid 1px rgba(0, 0, 0, 0.12); - } - &:after { - border-bottom-color: ${({ theme: { colors } }) => colors.accent}; + &:before { + border-bottom: solid 1px rgba(0, 0, 0, 0.12); + } + &:after { + border-bottom-color: ${({ theme: { colors } }) => colors.accent}; + } + &:hover:before { + border-bottom: solid 2px ${({ theme: { colors } }) => colors.accent} !important; + } + color: ${({ theme: { colors } }) => colors.primary}; + font-size: 16px; + font-weight: 300; } - &:hover:before { - border-bottom: solid 2px ${({ theme: { colors } }) => colors.accent} !important; - } - color: ${({ theme: { colors } }) => colors.primary}; - font-size: 16px; - font-weight: 300; - } `; interface Props { - label: string; - value: string | number | object; - children?: React.ReactNode; - renderValue?: (val: any) => React.ReactNode; - onChange: (event: any) => void; + label: string; + value: string | number | object; + id?: string; + children?: React.ReactNode; + renderValue?: (val: any) => React.ReactNode; + onChange: (event: any) => void; } const CustomSelect = (props: Props) => { - const { label, value, children, onChange, renderValue, ...others } = props; - return ( - - {label} - - {children} - - - ); + const { label, value, id, children, onChange, renderValue, ...others } = props; + return ( + + {label} + + {children} + + + ); }; export default CustomSelect; diff --git a/src/components/CustomTextArea/index.tsx b/src/components/CustomTextArea/index.tsx index 0e0e06cd..7f1295f6 100644 --- a/src/components/CustomTextArea/index.tsx +++ b/src/components/CustomTextArea/index.tsx @@ -8,112 +8,112 @@ import styled from 'styled-components'; import themes from '../../styles/theme'; const styles: any = { - cssContainer: { - width: '100%' - }, - cssLabel: { - color: themes.colors.gray15, - zIndex: 10, - fontSize: '16px', - pointerEvents: 'none', - '&$cssFocused': { - color: themes.colors.gray3 - } - }, - cssFormControl: { - transform: 'translate(22px, 34px) scale(1)' - }, - cssShrink: { - transform: 'translate(0, 1.5px) scale(0.75)' - }, - cssFocused: {}, - cssInput: { - backgroundColor: themes.colors.gray14, - border: `1px solid ${themes.colors.gray14}`, - fontSize: '14px', - color: themes.colors.blue5, - padding: '10px 22px 5px 22px' - }, - cssText: { - color: themes.colors.error1, - fontSize: '12px', - marginTop: '5px', - lineHeight: '18px', - height: '18px' - } + cssContainer: { + width: '100%', + }, + cssLabel: { + color: themes.colors.gray15, + zIndex: 10, + fontSize: '16px', + pointerEvents: 'none', + '&$cssFocused': { + color: themes.colors.gray3, + }, + }, + cssFormControl: { + transform: 'translate(22px, 34px) scale(1)', + }, + cssShrink: { + transform: 'translate(0, 1.5px) scale(0.75)', + }, + cssFocused: {}, + cssInput: { + backgroundColor: themes.colors.gray14, + border: `1px solid ${themes.colors.gray14}`, + fontSize: '14px', + color: themes.colors.blue5, + padding: '10px 22px 5px 22px', + }, + cssText: { + color: themes.colors.error1, + fontSize: '12px', + marginTop: '5px', + lineHeight: '18px', + height: '18px', + }, }; const LabelWrapper = styled(InputLabel)` - &&& { - &.MuiInputLabel-root { - z-index: 10; - transform: translate(22px, 34px) scale(1); - font-size: 16px; - } - &.Mui-focused { - color: ${({ theme: { colors } }) => colors.gray3}; + &&& { + &.MuiInputLabel-root { + z-index: 10; + transform: translate(22px, 34px) scale(1); + font-size: 16px; + } + &.Mui-focused { + color: ${({ theme: { colors } }) => colors.gray3}; + } + &.MuiInputLabel-shrink { + transform: translate(0, 1.5px) scale(0.75); + } } - &.MuiInputLabel-shrink { - transform: translate(0, 1.5px) scale(0.75); - } - } `; const FormControlWrapper = styled(FormControl)` - width: 100%; + width: 100%; `; const InputWrapper = styled(Input)` - &&& { - &.MuiInput-root { - background-color: ${({ theme: { colors } }) => colors.gray14}; - border: 1px solid ${({ theme: { colors } }) => colors.gray14}; - padding: 10px 22px 5px 22px; - font-size: 14px; - color: ${({ theme: { colors } }) => colors.blue5}; + &&& { + &.MuiInput-root { + background-color: ${({ theme: { colors } }) => colors.gray14}; + border: 1px solid ${({ theme: { colors } }) => colors.gray14}; + padding: 10px 22px 5px 22px; + font-size: 14px; + color: ${({ theme: { colors } }) => colors.blue5}; + } } - } `; const ErrorWrapper = styled(FormHelperText)` - &&& { - color: ${({ theme: { colors } }) => colors.error1}; - font-size: 12px; - margin: 5px 0 0 0; - line-height: 18px; - height: 18px; - } + &&& { + color: ${({ theme: { colors } }) => colors.error1}; + font-size: 12px; + margin: 5px 0 0 0; + line-height: 18px; + height: 18px; + } `; interface Props { - label: string; - errorText?: string | React.ReactNode; - onChange: (val: string) => void; - classes: any; - defaultValue?: string; + label: string; + errorText?: string | React.ReactNode; + onChange: (val: string) => void; + classes: any; + defaultValue?: string; } const CustomTextArea = (props: Props) => { - const { label, onChange, defaultValue, errorText, classes, ...other } = props; - return ( - - {label} - onChange(event.target.value)} - multiline={true} - rows={5} - rowsMax={5} - defaultValue={defaultValue} - {...other} - /> - {errorText} - - ); + const { label, onChange, defaultValue, errorText, classes, ...other } = props; + return ( + + {label} + onChange(event.target.value)} + multiline={true} + rows={5} + rowsMax={5} + defaultValue={defaultValue} + {...other} + /> + {errorText} + + ); }; CustomTextArea.defaultProps = { - errorText: '' + errorText: '', }; export default withStyles(styles)(CustomTextArea); diff --git a/src/components/Fees/index.tsx b/src/components/Fees/index.tsx index 1692f4d9..39815df5 100644 --- a/src/components/Fees/index.tsx +++ b/src/components/Fees/index.tsx @@ -19,11 +19,12 @@ interface Props { fee: number; miniFee?: number; tooltip?: React.ReactNode; + dataSpectron?: string; onChange: (val: number) => void; } function Fee(props: Props) { - const { onChange, low, medium, high, fee, miniFee, tooltip } = props; + const { onChange, low, medium, high, fee, miniFee, tooltip, dataSpectron } = props; const { t } = useTranslation(); const [open, setOpen] = useState(false); const [error, setError] = useState(''); @@ -93,6 +94,7 @@ function Fee(props: Props) { return ( + {t(feeTitle)}: {formatAmount(value)} {tooltip} @@ -127,7 +129,7 @@ function Fee(props: Props) { {getCustomMenuItem()} {t('components.fees.custom')} - + @@ -142,7 +144,7 @@ function Fee(props: Props) { onChange={handleCustomChange} errorText={error} /> - handleSetCustom()} disabled={!!error}> + handleSetCustom()} disabled={!!error}> {t('components.fees.set_custom_fee')} diff --git a/src/components/InputAddress/index.tsx b/src/components/InputAddress/index.tsx index 8578a305..f4fd90dd 100644 --- a/src/components/InputAddress/index.tsx +++ b/src/components/InputAddress/index.tsx @@ -59,12 +59,13 @@ interface Props { tooltip?: boolean; address?: string; operationType: 'send' | 'delegate' | 'invoke' | 'send_babylon' | 'tz1'; // TODO: enum + dataSpectron?: string; onIssue?: (error: boolean) => void; onAddressType?: (type: AddressType) => void; } function InputAddress(props: Props) { - const { label, onChange, operationType, address, tooltip, onIssue, onAddressType } = props; + const { label, onChange, operationType, dataSpectron, address, tooltip, onIssue, onAddressType } = props; const { t } = useTranslation(); const [error, setError] = useState(''); const { selectedNode, nodesList } = useSelector((state: RootState) => state.settings, shallowEqual); @@ -167,7 +168,7 @@ function InputAddress(props: Props) { const inputDebounce = debounce(300, onValidateAddress); return ( - + inputDebounce(value)} errorText={error} /> {tooltip && ( diff --git a/src/components/InteractContractModal/DeployContract.tsx b/src/components/InteractContractModal/DeployContract.tsx index d7de75d9..7a0ec638 100644 --- a/src/components/InteractContractModal/DeployContract.tsx +++ b/src/components/InteractContractModal/DeployContract.tsx @@ -146,20 +146,21 @@ function DeployContract(props: Props) { }, [enterNum]); return ( - + updateState({ michelsonCode: val })} /> - + updateState({ parameters: val })} /> - + updateState({ codeFormat: val })} /> @@ -176,10 +177,10 @@ function DeployContract(props: Props) { - + updateState({ storage: val })} /> - + updateState({ gas: val })} /> @@ -208,13 +209,14 @@ function DeployContract(props: Props) { {!isLedger && ( )} - + {t('general.verbs.deploy')} diff --git a/src/components/InteractContractModal/InvokeContract.tsx b/src/components/InteractContractModal/InvokeContract.tsx index 0cb9562a..6fd273d0 100644 --- a/src/components/InteractContractModal/InvokeContract.tsx +++ b/src/components/InteractContractModal/InvokeContract.tsx @@ -163,6 +163,7 @@ function InvokeContract(props: Props) { updateState({ contractAddress: val })} @@ -176,32 +177,37 @@ function InvokeContract(props: Props) { )} - + updateState({ parameters: val })} /> - + updateState({ codeFormat: val })} /> - updateState({ entryPoint: val })} /> + updateState({ entryPoint: val })} + /> - + updateState({ storage: Number(val) })} /> - + updateState({ gas: Number(val) })} /> )} - + {t('general.verbs.invoke')} diff --git a/src/components/LanguageSelector/index.tsx b/src/components/LanguageSelector/index.tsx index dd00565d..a8091f38 100644 --- a/src/components/LanguageSelector/index.tsx +++ b/src/components/LanguageSelector/index.tsx @@ -23,7 +23,7 @@ function LanguageSelector(props: Props) { const [open, setOpen] = useState(false); function renderOptions() { - return Object.keys(localesMap).map(key => { + return Object.keys(localesMap).map((key) => { return ( onLanguageChange(key)}>
{localesMap[key]}
@@ -52,7 +52,7 @@ function LanguageSelector(props: Props) { {t('general.nouns.language')} - setOpen(!open)}> + setOpen(!open)}> {localesMap[locale]} @@ -63,22 +63,22 @@ function LanguageSelector(props: Props) { anchorEl={domRef.current} anchorOrigin={{ vertical: 'center', - horizontal: 'left' + horizontal: 'left', }} transformOrigin={{ vertical: 'center', - horizontal: 'left' + horizontal: 'left', }} PaperProps={{ style: { - width: domRef.current ? domRef.current.clientWidth : 300 - } + width: domRef.current ? domRef.current.clientWidth : 300, + }, }} onClose={() => setOpen(false)} > - {renderOptions()} + {renderOptions()} diff --git a/src/components/MessageBar/MessageContent.tsx b/src/components/MessageBar/MessageContent.tsx index e44f8313..429b672a 100644 --- a/src/components/MessageBar/MessageContent.tsx +++ b/src/components/MessageBar/MessageContent.tsx @@ -129,9 +129,9 @@ const MessageContent = (props: Props) => { } return ( - - onClose()} /> - + + onClose()} /> + {!!hash && } {t(content.substring(0, 80), { localeParam })} {content.length > 0 && ( diff --git a/src/components/NumericInput/index.tsx b/src/components/NumericInput/index.tsx index 583b36a6..5ba5b43d 100644 --- a/src/components/NumericInput/index.tsx +++ b/src/components/NumericInput/index.tsx @@ -14,10 +14,11 @@ interface Props { precision: number; maxValue?: number; minValue?: number; + dataSpectron?: string; } const NumericInput = (props: Props) => { - const { symbol, amount, label, errorText, onChange, precision, maxValue, minValue } = props; + const { symbol, amount, label, errorText, onChange, precision, maxValue, minValue, dataSpectron } = props; function validateInput(text: string) { const b = new BigNumber(text); @@ -38,7 +39,7 @@ const NumericInput = (props: Props) => { return ( - validateInput(t)} type="number" errorText={errorText} /> + validateInput(t)} type="number" errorText={errorText} /> {!symbol ? : {symbol}} ); diff --git a/src/components/PasswordInput/index.tsx b/src/components/PasswordInput/index.tsx index 38042ff4..ad9d1920 100644 --- a/src/components/PasswordInput/index.tsx +++ b/src/components/PasswordInput/index.tsx @@ -4,47 +4,50 @@ import { useTranslation } from 'react-i18next'; import TextField from '../TextField'; const Container = styled.div` - position: relative; + position: relative; `; const ShowHidePwd = styled.div` - position: absolute; - right: 10px; - top: 22px; - color: ${({ theme: { colors } }) => colors.accent}; - font-size: 12px; - font-weight: 500; + position: absolute; + right: 10px; + top: 22px; + color: ${({ theme: { colors } }) => colors.accent}; + font-size: 12px; + font-weight: 500; `; interface Props { - label: string; - containerStyle?: object; - password: string; - onChange: (val: string) => void; + label: string; + id?: string; + containerStyle?: object; + password: string; + dataSpectron?: string; + onChange: (val: string) => void; } function PasswordInput(props: Props) { - const { label, password, onChange, containerStyle } = props; - const { t } = useTranslation(); - const [isShowed, setIsShowed] = useState(false); - return ( - - onChange(newVal)} - right={42} - /> - setIsShowed(!isShowed)}> - {t(isShowed ? 'general.verbs.hide' : 'general.verbs.show')} - - - ); + const { label, id, password, dataSpectron, onChange, containerStyle } = props; + const { t } = useTranslation(); + const [isShowed, setIsShowed] = useState(false); + return ( + + onChange(newVal)} + right={42} + /> + setIsShowed(!isShowed)}> + {t(isShowed ? 'general.verbs.hide' : 'general.verbs.show')} + + + ); } PasswordInput.defaultProps = { - containerStyle: {} + containerStyle: {}, }; export default PasswordInput; diff --git a/src/components/SecurityNoticeModal/index.tsx b/src/components/SecurityNoticeModal/index.tsx index b8354a19..517a399a 100644 --- a/src/components/SecurityNoticeModal/index.tsx +++ b/src/components/SecurityNoticeModal/index.tsx @@ -145,13 +145,15 @@ function SecurityNoticeModal(props: Props) { {t('components.securityNoticeModal.learn_more')} - + setIsUnderstand(e.target.checked)} value="understand" />} + data-spectron="understand-check" + control={ setIsUnderstand(e.target.checked)} value="understand" />} label={t('components.securityNoticeModal.understand_check')} /> setIsNotShowMessage(e.target.checked)} value="showmessage" />} + data-spectron="dont-message" + control={ setIsNotShowMessage(e.target.checked)} value="showmessage" />} label={t('components.securityNoticeModal.dont_message')} /> @@ -160,7 +162,7 @@ function SecurityNoticeModal(props: Props) { onCloseFunc()}> {t('general.verbs.cancel')} - onProceedFunc()}> + onProceedFunc()}> {t('general.verbs.proceed')}
diff --git a/src/components/TextField/index.tsx b/src/components/TextField/index.tsx index 0efa806a..db88999d 100644 --- a/src/components/TextField/index.tsx +++ b/src/components/TextField/index.tsx @@ -62,6 +62,7 @@ const NumberFormatCustom: React.ComponentType = (props: Props1) => { }; interface Props { + id?: string; label: string; type?: string; errorText?: string | React.ReactNode; @@ -72,15 +73,17 @@ interface Props { onChange?: (val: string) => void; endAdornment?: React.ReactElement; readOnly?: boolean; + dataSpectron?: string; } function TextField(props: Props) { - const { label, type, onChange, errorText, disabled, right, endAdornment, readOnly, ...other } = props; + const { id, dataSpectron, label, type, onChange, errorText, disabled, right, endAdornment, readOnly, ...other } = props; return ( - {label} + {label} ) => { diff --git a/src/components/TezosAddress/index.tsx b/src/components/TezosAddress/index.tsx index 02affc3d..8e919223 100644 --- a/src/components/TezosAddress/index.tsx +++ b/src/components/TezosAddress/index.tsx @@ -51,7 +51,7 @@ const TezosAddress = (props: Props) => { } return ( -
+
{addressType} {addressTail} diff --git a/src/components/TezosAmount/index.tsx b/src/components/TezosAmount/index.tsx index daec1f41..4dc508aa 100644 --- a/src/components/TezosAmount/index.tsx +++ b/src/components/TezosAmount/index.tsx @@ -72,10 +72,11 @@ interface Props { format: number; showTooltip?: boolean; symbol?: string; + dataSpectron?: string; } const TezosAmount = (props: Props) => { - const { size, color, amount, iconName, weight, showTooltip, format, symbol } = props; + const { size, color, amount, iconName, weight, showTooltip, format, symbol, dataSpectron } = props; function getRealValue() { if (!!symbol) { return { @@ -104,14 +105,14 @@ const TezosAmount = (props: Props) => { } const { strBalance, view } = getRealValue(); return showTooltip ? ( - }> + }> {view} {getIcon()} ) : ( - + {view} {getIcon()} diff --git a/src/components/TezosNumericInput/index.tsx b/src/components/TezosNumericInput/index.tsx index fd247703..b218231f 100644 --- a/src/components/TezosNumericInput/index.tsx +++ b/src/components/TezosNumericInput/index.tsx @@ -31,10 +31,11 @@ interface Props { decimalSeparator: string; errorText?: string | React.ReactNode; symbol?: string; + dataSpectron?: string; } const TezosNumericInput = (props: Props) => { - const { symbol, amount, label, decimalSeparator, errorText, onChange } = props; + const { symbol, amount, label, decimalSeparator, errorText, dataSpectron, onChange } = props; function validateInput(val) { const preventSeparatorAtStart = new RegExp(`^[${decimalSeparator}]`, 'g'); @@ -61,8 +62,8 @@ const TezosNumericInput = (props: Props) => { onChange(validatedAmount); } return ( - - validateInput(newVal)} type="text" errorText={errorText} /> + + validateInput(newVal)} type="text" errorText={errorText} /> {!symbol ? : {symbol}} ); diff --git a/src/components/TokenNav/index.tsx b/src/components/TokenNav/index.tsx index 4a1e34dc..37aea8fa 100644 --- a/src/components/TokenNav/index.tsx +++ b/src/components/TokenNav/index.tsx @@ -43,11 +43,12 @@ const TokenBalance = styled.p<{ isActive: boolean }>` interface Props { isActive: boolean; token: Token; + dataSpectron?: string; onClick?: () => void; } function TokenNav(props: Props) { - const { isActive, token, onClick } = props; + const { isActive, token, dataSpectron, onClick } = props; const icon = token.icon ? token.icon : defaultIcon; @@ -55,11 +56,13 @@ function TokenNav(props: Props) { const displayName = shortName.length < token.displayName.length ? shortName + '...' : token.displayName; return ( - + - {displayName} - + + {displayName} + + )` +const StyledTooltip = styled((props) => )` & .tooltip { padding: ${ms(-2)}; color: ${({ theme: { colors } }) => colors.primary}; @@ -40,8 +40,8 @@ const StyledTooltip = styled(props => ( - +const TooltipWrapper = ({ dataSpectron, children, content, position }: TooltipProps) => ( + {children} ); diff --git a/src/components/Tooltip/types.tsx b/src/components/Tooltip/types.tsx index 182046de..bd88c30d 100644 --- a/src/components/Tooltip/types.tsx +++ b/src/components/Tooltip/types.tsx @@ -1,4 +1,5 @@ export interface TooltipProps { + dataSpectron?: string; content: string | React.ReactNode; children?: React.ReactNode; position?: string; diff --git a/src/components/TopBar/index.tsx b/src/components/TopBar/index.tsx index dd5f32c1..6032e0d8 100644 --- a/src/components/TopBar/index.tsx +++ b/src/components/TopBar/index.tsx @@ -14,98 +14,98 @@ import { goHomeAndClearState } from '../../reduxContent/wallet/thunks'; import { helpUrl } from '../../config.json'; -const Container = styled.div<{ isExtended?: boolean }>` - display: flex; - justify-content: space-between; - align-items: center; - padding: ${ms(0)} ${ms(3)}; - flex-shrink: 0; - margin-bottom: ${({ isExtended }) => (isExtended ? '50px' : 0)}; +const Container = styled.div<{ isExtended: boolean }>` + display: flex; + justify-content: space-between; + align-items: center; + padding: ${ms(0)} ${ms(3)}; + flex-shrink: 0; + margin-bottom: ${({ isExtended }) => (isExtended ? '50px' : 0)}; `; const InfoContainer = styled.div` - display: flex; - align-items: center; - margin-right: auto; + display: flex; + align-items: center; + margin-right: auto; `; const Text = styled.span` - font-size: ${ms(2)}; - font-family: ${({ theme }) => theme.typo.fontFamily.primary}; - font-weight: ${({ theme }) => theme.typo.weights.light}; - color: ${({ theme: { colors } }) => colors.primary}; - padding: 0 ${ms(2)}; - border-right: 1px solid ${({ theme: { colors } }) => colors.gray2}; - letter-spacing: 0.9px; + font-size: ${ms(2)}; + font-family: ${({ theme }) => theme.typo.fontFamily.primary}; + font-weight: ${({ theme }) => theme.typo.weights.light}; + color: ${({ theme: { colors } }) => colors.primary}; + padding: 0 ${ms(2)}; + border-right: 1px solid ${({ theme: { colors } }) => colors.gray2}; + letter-spacing: 0.9px; `; const ButtonContainer = styled(Button)` - text-align: center; - min-width: 57px; - margin: 0 5px; - color: ${({ theme: { colors } }) => colors.primary}; - opacity: 0.6; + text-align: center; + min-width: 57px; + margin: 0 5px; + color: ${({ theme: { colors } }) => colors.primary}; + opacity: 0.6; `; const ButtonText = styled.div` - font-size: 10px; - font-weight: bold; - letter-spacing: 0.4px; - line-height: 28px; - cursor: pointer; + font-size: 10px; + font-weight: bold; + letter-spacing: 0.4px; + line-height: 28px; + cursor: pointer; `; const Icon = styled(TezosIcon)` - cursor: pointer; + cursor: pointer; `; const HelpIcon = styled(TezosIcon)` - cursor: pointer; - position: relative; - top: 2px; + cursor: pointer; + position: relative; + top: 2px; `; interface Props { - isLoggedIn: boolean; - walletName: string; - isExtended: boolean; + isLoggedIn: boolean; + walletName: string; + isExtended: boolean; } const TopBar = (props: Props) => { - const history = useHistory(); - const { isLoggedIn, walletName, isExtended } = props; - const { t } = useTranslation(); - const dispatch = useDispatch(); + const history = useHistory(); + const { isLoggedIn, walletName, isExtended } = props; + const { t } = useTranslation(); + const dispatch = useDispatch(); - function logout() { - dispatch(goHomeAndClearState()); - } + function logout() { + dispatch(goHomeAndClearState()); + } - function goToSettings() { - history.push('/settings'); - } + function goToSettings() { + history.push('/settings'); + } - return ( - - - - {isLoggedIn && {walletName}} - - openLink(helpUrl)} buttonTheme="plain"> - - {t('components.settingController.help')} - - goToSettings()} buttonTheme="plain"> - - {t('components.settingController.settings')} - - {isLoggedIn && ( - logout()}> - - {t('components.settingController.logout')} - - )} - - ); + return ( + + + + {isLoggedIn && {walletName}} + + openLink(helpUrl)} buttonTheme="plain"> + + {t('components.settingController.help')} + + goToSettings()} buttonTheme="plain"> + + {t('components.settingController.settings')} + + {isLoggedIn && ( + logout()}> + + {t('components.settingController.logout')} + + )} + + ); }; export default TopBar; diff --git a/src/components/TransactionsLabel/index.tsx b/src/components/TransactionsLabel/index.tsx index 1a710a7b..93089745 100644 --- a/src/components/TransactionsLabel/index.tsx +++ b/src/components/TransactionsLabel/index.tsx @@ -5,7 +5,7 @@ import moment from 'moment'; const DateFormat = { lastDay: '[Yesterday]', sameDay: '[Today]', - sameElse: 'MMMM DD' + sameElse: 'MMMM DD', }; const DateContainer = styled.div` @@ -26,16 +26,17 @@ const TransactionsDate = styled.div` interface Props { date: Date | string; skipFormat?: boolean; + dataSpectron?: string; } function TransactionsLabel(props: Props) { - const { date, skipFormat } = props; + const { date, skipFormat, dataSpectron } = props; const time = skipFormat ? date : moment(date).calendar(undefined, DateFormat); return ( - {time} + {time} ); } diff --git a/src/components/Update/index.tsx b/src/components/Update/index.tsx index 5444fcc4..43c81b83 100644 --- a/src/components/Update/index.tsx +++ b/src/components/Update/index.tsx @@ -6,69 +6,71 @@ import { useTranslation } from 'react-i18next'; import { ms } from '../../styles/helpers'; const Container = styled.div` - display: flex; - align-items: center; + display: flex; + align-items: center; `; const Text = styled.span` - font-size: ${ms(-1.7)}; - font-weight: 100; - color: ${({ theme: { colors } }) => colors.white}; - opacity: 0.8; - margin: 0 ${ms(-2)} 0 0; + font-size: ${ms(-1.7)}; + font-weight: 100; + color: ${({ theme: { colors } }) => colors.white}; + opacity: 0.8; + margin: 0 ${ms(-2)} 0 0; `; const SpinningRefreshIcon = styled(RefreshIcon)` - -webkit-animation: spin 0.5s linear infinite; - -moz-animation: spin 0.5s linear infinite; - animation: spin 0.5s linear infinite; + -webkit-animation: spin 0.5s linear infinite; + -moz-animation: spin 0.5s linear infinite; + animation: spin 0.5s linear infinite; - @-moz-keyframes spin { - 100% { - -moz-transform: rotate(360deg); + @-moz-keyframes spin { + 100% { + -moz-transform: rotate(360deg); + } } - } - @-webkit-keyframes spin { - 100% { - -webkit-transform: rotate(360deg); + @-webkit-keyframes spin { + 100% { + -webkit-transform: rotate(360deg); + } } - } - @keyframes spin { - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); + @keyframes spin { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } } - } `; interface Props { - isReady?: boolean; - isWalletSyncing?: boolean; - onClick?: () => void; - time: Date; + isReady?: boolean; + isWalletSyncing?: boolean; + onClick?: () => void; + id?: string; + time: Date; } function Update(props: Props) { - const { isReady, isWalletSyncing, onClick, time } = props; - const { t } = useTranslation(); - const Refresh = isReady && isWalletSyncing ? SpinningRefreshIcon : RefreshIcon; - return ( - - - {t('components.update.last_updated', { - date: moment(time).format('LT') - })} - - - - ); + const { isReady, isWalletSyncing, onClick, time, id } = props; + const { t } = useTranslation(); + const Refresh = isReady && isWalletSyncing ? SpinningRefreshIcon : RefreshIcon; + return ( + + + {t('components.update.last_updated', { + date: moment(time).format('LT'), + })} + + + + ); } export default Update; diff --git a/src/components/ValidInput/index.tsx b/src/components/ValidInput/index.tsx index 2b64ca59..c4313acf 100644 --- a/src/components/ValidInput/index.tsx +++ b/src/components/ValidInput/index.tsx @@ -36,7 +36,7 @@ const InputWrapper = styled(Input)<{ score: number }>` &:after { border-bottom-color: ${({ score }) => getBorderColors(score)}; } - + } &.MuiInput-focused { &:hover:not(.Mui-disabled):before { @@ -46,7 +46,7 @@ const InputWrapper = styled(Input)<{ score: number }>` border-bottom-color: ${({ score }) => getBorderColors(score)}; } } - + color: ${({ theme: { colors } }) => colors.primary}; font-size: 16px; font-weight: 300; @@ -125,11 +125,12 @@ interface Props { visibilityIcon?: boolean | undefined; changFunc: (val: string) => void; onShow: () => void; + dataSpectron?: string; } function InputValid(props: Props) { const { t } = useTranslation(); - const { label, error, suggestion, score, status, isShowed, changFunc, onShow, visibilityIcon } = props; + const { dataSpectron, label, error, suggestion, score, status, isShowed, changFunc, onShow, visibilityIcon } = props; const borderColor = getBorderColors(score); function getIcon(val) { @@ -147,18 +148,28 @@ function InputValid(props: Props) { {label} - changFunc(event.target.value)} score={score} /> + changFunc(event.target.value)} + score={score} + /> {getIcon(score)} - + {visibilityIcon && (isShowed ? : )} {!visibilityIcon && t(isShowed ? 'general.verbs.hide' : 'general.verbs.show')} - {!!error && {error}} + {!!error && ( + + {error} + + )} {!!suggestion && suggestion} diff --git a/src/containers/HomeAdd/index.tsx b/src/containers/HomeAdd/index.tsx index ea670cb8..83f9774f 100644 --- a/src/containers/HomeAdd/index.tsx +++ b/src/containers/HomeAdd/index.tsx @@ -117,6 +117,7 @@ function AddAddress() { - setIsShowedPwd(!isShowedPwd)} style={{ cursor: 'pointer' }}> + setIsShowedPwd(!isShowedPwd)} style={{ cursor: 'pointer' }}> {t(isShowedPwd ? 'general.verbs.hide' : 'general.verbs.show')} - + @@ -136,8 +137,14 @@ function AddAddress() { - setPkh(val)} right={30} /> - + setPkh(val)} + right={30} + /> + @@ -148,13 +155,14 @@ function AddAddress() { setUsername(val)} right={30} /> - + @@ -163,12 +171,13 @@ function AddAddress() { setActivationCode(val)} right={30} /> - + @@ -185,7 +194,7 @@ function AddAddress() { return ( - {t('containers.homeAddAddress.add_account')} + {t('containers.homeAddAddress.add_account')} {Object.values(ADD_ADDRESS_TYPES).map((tabName) => ( setActiveTab(tabName)}> diff --git a/src/containers/Landing/index.tsx b/src/containers/Landing/index.tsx index 4c05b019..fb4fb5f1 100644 --- a/src/containers/Landing/index.tsx +++ b/src/containers/Landing/index.tsx @@ -109,10 +109,12 @@ function Landing(props: Props) { setIsTos(e.target.checked)} name="checkedB" color="primary" />} label={t('components.landingCarousel.agree_terms')} /> setIsPP(e.target.checked)} name="checkedB" color="primary" />} label={t('components.landingCarousel.agree_policy')} /> @@ -131,7 +133,7 @@ function Landing(props: Props) { return ( - {t('components.termsModal.welcome_to', { name })} + {t('components.termsModal.welcome_to', { name })} {index === 0 && {t('components.languageSelectModal.select_language')}} @@ -157,20 +159,35 @@ function Landing(props: Props) { const getNextButton = (onClickHandler, hasNext, label) => { if (!hasNext) { return ( - gotoMainPage()}> + gotoMainPage()}> {t('general.get_started')} ); } if (selectedIndex === 1 && (!isTos || !isPP)) { return ( - } isleft={0} disabled={true}> + } + isleft={0} + disabled={true} + > {t('general.next')} ); } return ( - } isleft={0}> + } + isleft={0} + > {t('general.next')} ); diff --git a/src/containers/LoginCreate/index.tsx b/src/containers/LoginCreate/index.tsx index f7cde3a3..b948169f 100644 --- a/src/containers/LoginCreate/index.tsx +++ b/src/containers/LoginCreate/index.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { useSelector, useDispatch } from 'react-redux'; -import { remote } from 'electron'; +import { remote, ipcRenderer } from 'electron'; import path from 'path'; import zxcvbn from 'zxcvbn'; import { useTranslation } from 'react-i18next'; @@ -53,6 +53,30 @@ function LoginCreate() { const [confirmPwdScore, setConfirmPwdScore] = useState(0); const [confirmPwdText, setConfirmPwdText] = useState(''); + function saveFile(event) { + if (event.detail === 0 && walletLocation && walletFileName) { + return; + } + + // [TESTING] + if (ipcRenderer.sendSync('is-spectron')) { + event.preventDefault(); + const newWallet = ipcRenderer.sendSync('new-wallet'); + setWalletLocation(path.dirname(newWallet)); + setWalletFileName(path.basename(newWallet)); + return; + } + + const currentWindow = remote.getCurrentWindow(); + remote.dialog.showSaveDialog(currentWindow, { filters: dialogFilters }).then((result) => { + const filePath = result.filePath; + if (filePath) { + setWalletLocation(path.dirname(filePath)); + setWalletFileName(path.basename(filePath)); + } + }); + } + function onChangePassword(pwd: string) { if (pwd) { const pwdStrength = zxcvbn(pwd); @@ -131,6 +155,24 @@ function LoginCreate() { onLogin(CREATE); } } + function getWalletFileSection() { + if (walletFileName) { + return ( + + + {walletFileName} + + ); + } + + return ( + <> + + Name your wallet file and select a file location + + + ); + } const isDisabled = isLoading || !isPasswordValidation || !isPasswordMatched; @@ -145,12 +187,19 @@ function LoginCreate() { {/* {getWalletFileSection()} - } size="small" variant="outlined" onClick={evt => saveFile(evt)}> + } + size="small" + variant="outlined" + onClick={(evt) => saveFile(evt)} + > {t('containers.loginCreate.create_new_wallet_btn')} */} onPasswordShow(0)} /> {activePath && ( - + {t('containers.loginHome.selectedPath')} {activePath} )} @@ -145,7 +145,13 @@ function LoginHome(props: Props) { goTo('import')} disabled={!isAgreement}> {t('containers.loginHome.open_exisiting_wallet_btn')} - goTo('create')} disabled={!isAgreement}> + goTo('create')} + disabled={!isAgreement} + > {t('containers.loginHome.create_new_wallet_btn')} @@ -153,7 +159,10 @@ function LoginHome(props: Props) {
{t('containers.loginHome.want_to_import_fundraiser_paper_wallet')} - goTo('create')}>Create a wallet first. + goTo('create')}> + Create a wallet + {' '} + first.
diff --git a/src/containers/LoginImport/index.tsx b/src/containers/LoginImport/index.tsx index 0f9deec8..13771e9d 100644 --- a/src/containers/LoginImport/index.tsx +++ b/src/containers/LoginImport/index.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import styled from 'styled-components'; -import { remote } from 'electron'; +import { remote, ipcRenderer } from 'electron'; import path from 'path'; import { useTranslation } from 'react-i18next'; import Button from '@material-ui/core/Button'; @@ -85,6 +85,15 @@ function LoginImport() { return; } + // [TESTING] + if (ipcRenderer.sendSync('is-spectron')) { + event.preventDefault(); + const testingWallet = ipcRenderer.sendSync('testing-wallet'); + setWalletLocation(path.dirname(testingWallet)); + setWalletFileName(path.basename(testingWallet)); + return; + } + const currentWindow = remote.getCurrentWindow(); remote.dialog .showOpenDialog(currentWindow, { @@ -120,13 +129,18 @@ function LoginImport() { {t('containers.loginImport.open_wallet_label')} - + {t('containers.loginImport.select_file_btn')} - {walletFileName} + {walletFileName} - setPassword(pwd)} /> - onLogin(IMPORT)} color="secondary" variant="extended" disabled={isDisabled}> + setPassword(pwd)} + /> + onLogin(IMPORT)} color="secondary" variant="extended" disabled={isDisabled}> {t('general.verbs.open')} diff --git a/src/containers/Settings/CustomSelectItem.tsx b/src/containers/Settings/CustomSelectItem.tsx index 8724868b..d11954de 100644 --- a/src/containers/Settings/CustomSelectItem.tsx +++ b/src/containers/Settings/CustomSelectItem.tsx @@ -2,15 +2,15 @@ import React from 'react'; import { SelectRenderWrapper, NodeUrlSpan } from './styles'; interface Props { - value: string; - url?: string; + value: string; + url?: string; } const SettingsCustomSelectItem = ({ value, url }: Props) => ( - - {value} - {url && ({url})} - + + {value} + {url && ({url})} + ); export default SettingsCustomSelectItem; diff --git a/src/containers/Settings/container.tsx b/src/containers/Settings/container.tsx index 58ad658b..90be339f 100644 --- a/src/containers/Settings/container.tsx +++ b/src/containers/Settings/container.tsx @@ -108,14 +108,14 @@ const SettingsContainer = () => { return ( - +

{`${t('containers.homeSettings.general_settings')}, ${name} ${version} (${LocalVersionIndex})`}

{t('containers.homeSettings.select_display_language')} - + @@ -127,6 +127,7 @@ const SettingsContainer = () => { { { {!!activeTokens.length && ( <> Your Tokens - + {activeTokens.map((token, index) => ( onHover(token.address)} onMouseLeave={() => onHover('')}> diff --git a/src/contracts/BabylonDelegation/components/Delegate.tsx b/src/contracts/BabylonDelegation/components/Delegate.tsx index bd30146e..14ec2c35 100644 --- a/src/contracts/BabylonDelegation/components/Delegate.tsx +++ b/src/contracts/BabylonDelegation/components/Delegate.tsx @@ -33,6 +33,7 @@ import { interface Props { isReady: boolean; + id?: string; } function Delegate(props: Props) { @@ -47,7 +48,7 @@ function Delegate(props: Props) { const { isLoading, isLedger, selectedAccountHash } = useSelector((state: RootState) => state.app, shallowEqual); - const { isReady } = props; + const { isReady, id } = props; const isDisabled = !isReady || isLoading || isAddressIssue || !newAddress || (!passPhrase && !isLedger); @@ -84,9 +85,10 @@ function Delegate(props: Props) { }; return ( - onEnterPress(event.key)}> - + onEnterPress(event.key)}> + setIsAddressIssue(val)} /> - + - + {t('components.delegateConfirmationModal.delegate_warning')} @@ -122,13 +124,14 @@ function Delegate(props: Props) { {!isLedger && ( setPassPhrase(val)} containerStyle={{ width: '60%', marginTop: '10px' }} /> )} - onDelegate()}> + onDelegate()}> {t('components.delegate.change_delegate')} diff --git a/src/contracts/BabylonDelegation/components/Deposit.tsx b/src/contracts/BabylonDelegation/components/Deposit.tsx index ab4602c6..cd4b06e1 100644 --- a/src/contracts/BabylonDelegation/components/Deposit.tsx +++ b/src/contracts/BabylonDelegation/components/Deposit.tsx @@ -97,9 +97,10 @@ function Deposit(props: Props) { }); return ( - onEnterPress(event.key, isDisabled)}> + onEnterPress(event.key, isDisabled)}> - {warningTxt} + {warningTxt} {!isLedger && ( setPassPhrase(val)} containerStyle={{ width: '60%', marginTop: '10px' }} /> )} - onInvokeOperation()}> + onInvokeOperation()}> {t('general.verbs.deposit')} diff --git a/src/contracts/BabylonDelegation/components/Send.tsx b/src/contracts/BabylonDelegation/components/Send.tsx index e160de1b..db3286fa 100644 --- a/src/contracts/BabylonDelegation/components/Send.tsx +++ b/src/contracts/BabylonDelegation/components/Send.tsx @@ -229,7 +229,7 @@ function Send(props: Props) { return ( {t('components.send.burn_tooltip_title')} - + The recipient address you entered has a zero balance. Sending funds to an empty Manager address (tz1,2,3) requires a one-time 0.06425 XTZ burn fee. @@ -258,16 +258,17 @@ function Send(props: Props) { const isDisabled = amount === '0' || !amount || !toAddress || !isReady || isIssue || isLoading || isAddressIssue; return ( - + {t('components.send.send_xtz')} setIsAddressIssue(err)} /> - + - onUseMax}>{t('general.verbs.use_max')} + onUseMax}> + {t('general.verbs.use_max')} + @@ -298,8 +301,8 @@ function Send(props: Props) { /> {isBurn && ( - - + + @@ -311,15 +314,15 @@ function Send(props: Props) { -
+
{t('general.nouns.total')}
- + {t('general.nouns.remaining_balance')} - + - onValidateAmount()} buttonTheme="primary"> + onValidateAmount()} buttonTheme="primary"> {t('general.verbs.send')} diff --git a/src/contracts/BabylonDelegation/components/Transaction/index.tsx b/src/contracts/BabylonDelegation/components/Transaction/index.tsx index 047c994b..303e6309 100644 --- a/src/contracts/BabylonDelegation/components/Transaction/index.tsx +++ b/src/contracts/BabylonDelegation/components/Transaction/index.tsx @@ -263,20 +263,20 @@ function Transaction(props: Props) { const origination = transaction.kind === 'origination' && selectedAccountHash !== selectedParentHash; const activation = transaction.kind === 'activation' && selectedAccountHash === selectedParentHash; return ( - +
- + {transaction.status === READY || origination || activation ? timeFormatter(transaction.timestamp) : t('components.transaction.pending')} {sign} - +
- + {state} {address ? {preposition} : null} @@ -289,14 +289,14 @@ function Transaction(props: Props) { /> {isBurn && ( - + {t('components.transaction.burn')}: )} {isBurn && isFee && } {isFee && ( - + {t('general.nouns.fee')}: diff --git a/src/contracts/BabylonDelegation/components/Withdraw.tsx b/src/contracts/BabylonDelegation/components/Withdraw.tsx index 3fdeeee3..7090e603 100644 --- a/src/contracts/BabylonDelegation/components/Withdraw.tsx +++ b/src/contracts/BabylonDelegation/components/Withdraw.tsx @@ -98,9 +98,10 @@ function Withdraw(props: Props) { }); return ( - onEnterPress(event.key, isDisabled)}> + onEnterPress(event.key, isDisabled)}> - {warningTxt} + {warningTxt} {!isLedger && ( setPassPhrase(val)} containerStyle={{ width: '60%', marginTop: '10px' }} /> )} - onInvokeOperation()}> + onInvokeOperation()}> {t('general.verbs.withdraw')} diff --git a/src/contracts/BabylonDelegation/container.tsx b/src/contracts/BabylonDelegation/container.tsx index bc62da92..70a19fd0 100644 --- a/src/contracts/BabylonDelegation/container.tsx +++ b/src/contracts/BabylonDelegation/container.tsx @@ -117,7 +117,7 @@ function ActionPanel() { totalNumber={JSTransactions.length} firstNumber={firstNumber} lastNumber={lastNumber} - onClick={val => setCurrentPage(val)} + onClick={(val) => setCurrentPage(val)} /> )} {isLoading && } @@ -138,7 +138,7 @@ function ActionPanel() { /> - {tabs.map(tab => { + {tabs.map((tab) => { const ready = isReady(status, storeType, tab); return ( { return ( - {code} + {code} ); diff --git a/src/contracts/GenericContract/components/Invoke.tsx b/src/contracts/GenericContract/components/Invoke.tsx index 66201d9d..7ff51683 100644 --- a/src/contracts/GenericContract/components/Invoke.tsx +++ b/src/contracts/GenericContract/components/Invoke.tsx @@ -153,35 +153,43 @@ function Invoke(props: Props) { } return ( - onEnterPress(event.key)}> + onEnterPress(event.key)}> - setParameters(val)} /> + setParameters(val)} /> - + setCodeFormat(val)} /> - setEntryPoint(val)} /> + setEntryPoint(val)} /> - setStorage(Number(val))} /> + setStorage(Number(val))} + /> - setGas(Number(val))} /> + setGas(Number(val))} /> setAmount(val)} /> - {t('general.verbs.use_max')} + + {t('general.verbs.use_max')} + setFee(val)} /> @@ -191,13 +199,14 @@ function Invoke(props: Props) { {!isLedger && ( setPassPhrase(val)} containerStyle={{ width: '60%', marginTop: '10px' }} /> )} - onInvokeOperation()}> + onInvokeOperation()}> {t('general.verbs.invoke')} diff --git a/src/contracts/GenericContract/components/Transaction/index.tsx b/src/contracts/GenericContract/components/Transaction/index.tsx index 047c994b..303e6309 100644 --- a/src/contracts/GenericContract/components/Transaction/index.tsx +++ b/src/contracts/GenericContract/components/Transaction/index.tsx @@ -263,20 +263,20 @@ function Transaction(props: Props) { const origination = transaction.kind === 'origination' && selectedAccountHash !== selectedParentHash; const activation = transaction.kind === 'activation' && selectedAccountHash === selectedParentHash; return ( - +
- + {transaction.status === READY || origination || activation ? timeFormatter(transaction.timestamp) : t('components.transaction.pending')} {sign} - +
- + {state} {address ? {preposition} : null} @@ -289,14 +289,14 @@ function Transaction(props: Props) { /> {isBurn && ( - + {t('components.transaction.burn')}: )} {isBurn && isFee && } {isFee && ( - + {t('general.nouns.fee')}: diff --git a/src/contracts/GenericContract/components/Transactions/index.tsx b/src/contracts/GenericContract/components/Transactions/index.tsx index be930af1..8234ee3b 100644 --- a/src/contracts/GenericContract/components/Transactions/index.tsx +++ b/src/contracts/GenericContract/components/Transactions/index.tsx @@ -39,5 +39,9 @@ export default function Transactions(props: Props) { ); - return {Object.keys(transactionsByDate).map((day, index) => renderDayTransactions(day, transactionsByDate[day], index))}; + return ( + + {Object.keys(transactionsByDate).map((day, index) => renderDayTransactions(day, transactionsByDate[day], index))} + + ); } diff --git a/src/contracts/ImplicitAccount/components/Delegate.tsx b/src/contracts/ImplicitAccount/components/Delegate.tsx index 503ab7ce..dcc70f29 100644 --- a/src/contracts/ImplicitAccount/components/Delegate.tsx +++ b/src/contracts/ImplicitAccount/components/Delegate.tsx @@ -102,6 +102,7 @@ function Delegate(props: Props) { onEnterPress(event.key)}> {!isLedger && ( setPassPhrase(val)} containerStyle={{ width: '60%', marginTop: '10px' }} /> )} - onDelegate()}> + onDelegate()}> {t('components.delegate.change_delegate')} - + {isManagerReady ? ( dispatch(setModalOpen(true, 'delegate_contract'))} /> ) : ( diff --git a/src/contracts/ImplicitAccount/components/Receive.tsx b/src/contracts/ImplicitAccount/components/Receive.tsx index 78f7f3b2..d9e061ad 100644 --- a/src/contracts/ImplicitAccount/components/Receive.tsx +++ b/src/contracts/ImplicitAccount/components/Receive.tsx @@ -64,7 +64,7 @@ function Receive(props: Props) { }, [address]); return ( - + diff --git a/src/contracts/ImplicitAccount/components/Send.tsx b/src/contracts/ImplicitAccount/components/Send.tsx index 1b02dc58..611c5b45 100644 --- a/src/contracts/ImplicitAccount/components/Send.tsx +++ b/src/contracts/ImplicitAccount/components/Send.tsx @@ -247,7 +247,7 @@ function Send(props: Props) { return ( {t('components.send.burn_tooltip_title')} - + The recipient address you entered has a zero balance. Sending funds to an empty Manager address (tz1,2,3) requires a one-time 0.06425 XTZ burn fee. @@ -276,9 +276,10 @@ function Send(props: Props) { const isDisabled = amount === '0' || !amount || !toAddress || !isReady || isIssue || isLoading || isAddressIssue; return ( - + {t('components.send.send_xtz')} setIsAddressIssue(err)} onAddressType={(type) => setAddressType(type)} /> - + - onUseMax()}>{t('general.verbs.use_max')} + onUseMax()}> + {t('general.verbs.use_max')} + @@ -317,7 +320,7 @@ function Send(props: Props) { /> {isBurn && ( - + @@ -330,15 +333,15 @@ function Send(props: Props) { -
+
{t('general.nouns.total')}
- + {t('general.nouns.remaining_balance')} - + - onValidateAmount()} buttonTheme="primary"> + onValidateAmount()} buttonTheme="primary"> {t('general.verbs.send')} diff --git a/src/contracts/ImplicitAccount/components/Transaction/index.tsx b/src/contracts/ImplicitAccount/components/Transaction/index.tsx index 719a70c8..6a76c3fb 100644 --- a/src/contracts/ImplicitAccount/components/Transaction/index.tsx +++ b/src/contracts/ImplicitAccount/components/Transaction/index.tsx @@ -283,18 +283,18 @@ function Transaction(props: Props) { } return ( - +
- {transactionTimestamp} + {transactionTimestamp} {sign} - +
- + {state} {address ? {preposition} : null} @@ -307,14 +307,14 @@ function Transaction(props: Props) { /> {isBurn && ( - + {t('components.transaction.burn')}: )} {isBurn && isFee && } {isFee && ( - + {t('general.nouns.fee')}: diff --git a/src/contracts/ImplicitAccount/components/Transactions/index.tsx b/src/contracts/ImplicitAccount/components/Transactions/index.tsx index be930af1..063ee060 100644 --- a/src/contracts/ImplicitAccount/components/Transactions/index.tsx +++ b/src/contracts/ImplicitAccount/components/Transactions/index.tsx @@ -31,13 +31,17 @@ export default function Transactions(props: Props) { }, {}); const renderDayTransactions = (day, grTransactions, grIndex) => ( - - + + {grTransactions.map((transaction, index) => { return ; })} ); - return {Object.keys(transactionsByDate).map((day, index) => renderDayTransactions(day, transactionsByDate[day], index))}; + return ( + + {Object.keys(transactionsByDate).map((day, index) => renderDayTransactions(day, transactionsByDate[day], index))} + + ); } diff --git a/src/contracts/components/BalanceBanner/index.tsx b/src/contracts/components/BalanceBanner/index.tsx index 5d6a2553..f64a6617 100644 --- a/src/contracts/components/BalanceBanner/index.tsx +++ b/src/contracts/components/BalanceBanner/index.tsx @@ -52,14 +52,14 @@ function BalanceBanner(props: Props) { } return ( - + {breadcrumbs} - {displayName}{' '} + {displayName}{' '} {token.helpLink && ( <> openLink(token.helpLink || '')}> @@ -70,7 +70,15 @@ function BalanceBanner(props: Props) { )} - +
- + {token.details && token.details.paused === false && 'Token is active.'}{' '} {token.details && token.details.supply && 'Total supply is ' + formatAmount(token.details.supply) + '.'} {token.details && token.details.holders && ' ' + Number(token.details.holders) + ' holders.'} diff --git a/src/contracts/components/Send/index.tsx b/src/contracts/components/Send/index.tsx index 2e304641..bed49859 100644 --- a/src/contracts/components/Send/index.tsx +++ b/src/contracts/components/Send/index.tsx @@ -84,6 +84,7 @@ function Send(props: Props) { onEnterPress(event.key)}> setAmount(val)} @@ -110,7 +112,7 @@ function Send(props: Props) { - + {!isLedger && ( )} - onSend()}> + onSend()}> {t('general.verbs.send')} diff --git a/src/contracts/components/TransactionContainer/index.tsx b/src/contracts/components/TransactionContainer/index.tsx index cb63e3e0..b6f5c4b6 100644 --- a/src/contracts/components/TransactionContainer/index.tsx +++ b/src/contracts/components/TransactionContainer/index.tsx @@ -16,10 +16,10 @@ const TransactionContainer = (props: Props) => { }, {}); return ( - + {Object.keys(transactionsByDate).map((day, indexParent) => ( - - + + {transactionsByDate[day].map((transaction, indexChild) => { return ; })} diff --git a/src/contracts/components/TransactionRow/index.tsx b/src/contracts/components/TransactionRow/index.tsx index faca47a2..2a640ab1 100644 --- a/src/contracts/components/TransactionRow/index.tsx +++ b/src/contracts/components/TransactionRow/index.tsx @@ -26,7 +26,7 @@ const openLink = (element, nodesList: Node[], selectedNode: string) => { return openBlockExplorerForOperation(element, currentNode.network); }; -const timeFormatter = timestamp => { +const timeFormatter = (timestamp) => { const time = new Date(timestamp); return moment(time).format('LT'); }; @@ -43,7 +43,7 @@ const getStatus = (transaction, selectedParentHash, t) => { state: t('components.transaction.sent'), isFee, color: isAmount ? 'error1' : 'gray8', - sign: isAmount ? '-' : '' + sign: isAmount ? '-' : '', }; } else if (transaction.destination === selectedParentHash && !transaction.entryPoint) { return { @@ -52,7 +52,7 @@ const getStatus = (transaction, selectedParentHash, t) => { state: t('components.transaction.received'), isFee, color: isAmount ? 'check' : 'gray8', - sign: isAmount ? '+' : '' + sign: isAmount ? '+' : '', }; } else { return { @@ -61,7 +61,7 @@ const getStatus = (transaction, selectedParentHash, t) => { state: t('components.transaction.invoked'), isFee, color: 'gray0', - sign: '' + sign: '', }; } }; @@ -76,14 +76,16 @@ function Transaction(props: Props) { const { t } = useTranslation(); const fee = transaction.fee ? transaction.fee : 0; const { icon, preposition, state, isFee, color, sign } = getStatus(transaction, selectedParentHash, t); - const { selectedNode, nodesList } = useSelector(rootstate => rootstate.settings, shallowEqual); + const { selectedNode, nodesList } = useSelector((rootstate) => rootstate.settings, shallowEqual); const address = getAddress(transaction, selectedParentHash); return ( - +
- {transaction.status === READY ? timeFormatter(transaction.timestamp) : t('components.transaction.pending')} - + + {transaction.status === READY ? timeFormatter(transaction.timestamp) : t('components.transaction.pending')} + + {sign} - + {state} {address ? {preposition} : null} @@ -119,7 +121,7 @@ function Transaction(props: Props) { {isFee && ( - + {t('general.nouns.fee')}: diff --git a/src/featureModals/KeyDetails/KeyDetails.tsx b/src/featureModals/KeyDetails/KeyDetails.tsx index aef26738..9f62d424 100644 --- a/src/featureModals/KeyDetails/KeyDetails.tsx +++ b/src/featureModals/KeyDetails/KeyDetails.tsx @@ -10,7 +10,19 @@ import CopyButton from '../../components/CopyButton'; import PasswordInput from '../../components/PasswordInput'; import { RootState } from '../../types/store'; -import { CloseIconWrapper, ModalContainer, ModalTitle, ModalWrapper, KeyWrapper, KeyTitle, KeyAddress, Keys, SecretKeyMessage, InvokeButton, ButtonContainer } from '../style'; +import { + CloseIconWrapper, + ModalContainer, + ModalTitle, + ModalWrapper, + KeyWrapper, + KeyTitle, + KeyAddress, + Keys, + SecretKeyMessage, + InvokeButton, + ButtonContainer, +} from '../style'; interface Props { open: boolean; @@ -43,26 +55,26 @@ const KeyDetails = (props: Props) => { const stringSecretKey = TezosMessageUtils.readKeyWithHint(rawSecretKey, 'edsk'); setSecretKey(stringSecretKey); - setSecretKeyVisible(true) + setSecretKeyVisible(true); }; return ( {open ? ( - - onClose()} /> + + onClose()} /> {t('components.keyDetailsModal.title')} {t('components.keyDetailsModal.address')} - + {address} {t('components.keyDetailsModal.publicKey')} - + {publicKey} @@ -85,7 +97,7 @@ const KeyDetails = (props: Props) => { )} {secretKeyVisible && ( <> - + {secretKey} @@ -96,7 +108,7 @@ const KeyDetails = (props: Props) => { {isLedger && ( {t('components.keyDetailsModal.secretKey')} - {t('components.keyDetailsModal.hardwareSignerNotice')} + {t('components.keyDetailsModal.hardwareSignerNotice')} )} diff --git a/src/featureModals/SignVerify/components/Sign.tsx b/src/featureModals/SignVerify/components/Sign.tsx index b5e6a385..d1aa455d 100644 --- a/src/featureModals/SignVerify/components/Sign.tsx +++ b/src/featureModals/SignVerify/components/Sign.tsx @@ -105,6 +105,7 @@ const Sign = () => { {error && result && {result}} {!error && result && ( { {isLedger && ledgerModalOpen && <>Please confirm the operation on the Ledger device} - + {t('general.verbs.sign')} diff --git a/src/featureModals/SignVerify/components/Verify.tsx b/src/featureModals/SignVerify/components/Verify.tsx index 10d3894f..8267e32c 100644 --- a/src/featureModals/SignVerify/components/Verify.tsx +++ b/src/featureModals/SignVerify/components/Verify.tsx @@ -69,9 +69,10 @@ const Verify = () => { setMessage(val)} /> - setSignature(val)} /> + setSignature(val)} /> { />