diff --git a/package-lock.json b/package-lock.json index 5427ddd..2ea4fb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,12 +45,12 @@ } }, "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", + "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.1" } }, "@babel/compat-data": { @@ -65,19 +65,19 @@ } }, "@babel/core": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.1.tgz", - "integrity": "sha512-u8XiZ6sMXW/gPmoP5ijonSUln4unazG291X0XAQ5h0s8qnAFr6BRRZGUEK+jtRWdmB0NTJQt7Uga25q8GetIIg==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.2.tgz", + "integrity": "sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==", "dev": true, "requires": { "@babel/code-frame": "^7.10.1", - "@babel/generator": "^7.10.1", + "@babel/generator": "^7.10.2", "@babel/helper-module-transforms": "^7.10.1", "@babel/helpers": "^7.10.1", - "@babel/parser": "^7.10.1", + "@babel/parser": "^7.10.2", "@babel/template": "^7.10.1", "@babel/traverse": "^7.10.1", - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.2", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -88,24 +88,15 @@ "source-map": "^0.5.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" } }, "debug": { @@ -126,15 +117,28 @@ } }, "@babel/generator": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.1.tgz", - "integrity": "sha512-AT0YPLQw9DI21tliuJIdplVfLHya6mcGa8ctkv7n4Qv+hYacJrKmNWIteAK1P9iyLikFIAkwqJ7HAOqIDLFfgA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.2.tgz", + "integrity": "sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==", "dev": true, "requires": { - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.2", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-annotate-as-pure": { @@ -178,9 +182,9 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.1.tgz", - "integrity": "sha512-YuF8IrgSmX/+MV2plPkjEnzlC2wf+gaok8ehMNN0jodF3/sejZauExqpEVGbJua62oaWoNYIXwz4RmAsVcGyHw==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz", + "integrity": "sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==", "dev": true, "requires": { "@babel/compat-data": "^7.10.1", @@ -191,9 +195,9 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.1.tgz", - "integrity": "sha512-bwhdehBJZt84HuPUcP1HaTLuc/EywVS8rc3FgsEPDcivg+DCW+SHuLHVkYOmcBA1ZfI+Z/oZjQc/+bPmIO7uAA==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz", + "integrity": "sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==", "dev": true, "requires": { "@babel/helper-function-name": "^7.10.1", @@ -396,20 +400,20 @@ } }, "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.10.1", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", + "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.10.1", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz", - "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.2.tgz", + "integrity": "sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -1001,13 +1005,13 @@ } }, "@babel/preset-env": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.1.tgz", - "integrity": "sha512-bGWNfjfXRLnqbN2T4lB3pMfoic8dkRrmHpVZamSFHzGy5xklyHTobZ28TVUD2grhE5WDnu67tBj8oslIhkiOMQ==", + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.2.tgz", + "integrity": "sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==", "dev": true, "requires": { "@babel/compat-data": "^7.10.1", - "@babel/helper-compilation-targets": "^7.10.1", + "@babel/helper-compilation-targets": "^7.10.2", "@babel/helper-module-imports": "^7.10.1", "@babel/helper-plugin-utils": "^7.10.1", "@babel/plugin-proposal-async-generator-functions": "^7.10.1", @@ -1064,12 +1068,25 @@ "@babel/plugin-transform-unicode-escapes": "^7.10.1", "@babel/plugin-transform-unicode-regex": "^7.10.1", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.10.1", + "@babel/types": "^7.10.2", "browserslist": "^4.12.0", "core-js-compat": "^3.6.2", "invariant": "^2.2.2", "levenary": "^1.1.1", "semver": "^5.5.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.10.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.2.tgz", + "integrity": "sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.1", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/preset-modules": { @@ -1127,28 +1144,6 @@ "@babel/code-frame": "^7.10.1", "@babel/parser": "^7.10.1", "@babel/types": "^7.10.1" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - } } }, "@babel/traverse": { @@ -1168,26 +1163,6 @@ "lodash": "^4.17.13" }, "dependencies": { - "@babel/code-frame": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.1.tgz", - "integrity": "sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.1" - } - }, - "@babel/highlight": { - "version": "7.10.1", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.1.tgz", - "integrity": "sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.1", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", @@ -1583,6 +1558,23 @@ "fastq": "^1.6.0" } }, + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, "@scarf/scarf": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.0.5.tgz", @@ -1701,9 +1693,9 @@ "dev": true }, "@types/node": { - "version": "14.0.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.6.tgz", - "integrity": "sha512-FbNmu4F67d3oZMWBV6Y4MaPER+0EpE9eIYf2yaHhCWovc1dlXCZkqGX4NLHfVVr6umt20TNBdRzrNJIzIKfdbw==", + "version": "14.0.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.11.tgz", + "integrity": "sha512-lCvvI24L21ZVeIiyIUHZ5Oflv1hhHQ5E1S25IRlKIXaRkVgmXpJMI3wUJkmym2bTbCe+WoIibQnMVAU3FguaOg==", "dev": true }, "@types/normalize-package-data": { @@ -1772,9 +1764,9 @@ } }, "@types/react-table": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@types/react-table/-/react-table-7.0.18.tgz", - "integrity": "sha512-O4iKmVYVQz+6Nl9LsLtWQz9Unsmq0UySJrh5hpV5d+wrf15skhB0dqI9ocCNovJpcYxGjHrn3VbeSyAcaxHZtA==", + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/@types/react-table/-/react-table-7.0.19.tgz", + "integrity": "sha512-RYyEY7Yry6F2JsKhHeFsGdzuFF1hMqBStQrrazDzpBl4m/ECGHJxFVQjLBRzRwK+47ZKNPm79f7qEpHirbiCLA==", "dev": true, "requires": { "@types/react": "*" @@ -1884,12 +1876,12 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.0.2.tgz", - "integrity": "sha512-ER3bSS/A/pKQT/hjMGCK8UQzlL0yLjuCZ/G8CDFJFVTfl3X65fvq2lNYqOG8JPTfrPa2RULCdwfOyFjZEMNExQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.1.0.tgz", + "integrity": "sha512-D52KwdgkjYc+fmTZKW7CZpH5ZBJREJKZXRrveMiRCmlzZ+Rw9wRVJ1JAmHQ9b/+Ehy1ZeaylofDB9wwXUt83wg==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "3.0.2", + "@typescript-eslint/experimental-utils": "3.1.0", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.0.0", "semver": "^7.3.2", @@ -1905,33 +1897,33 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.0.2.tgz", - "integrity": "sha512-4Wc4EczvoY183SSEnKgqAfkj1eLtRgBQ04AAeG+m4RhTVyaazxc1uI8IHf0qLmu7xXe9j1nn+UoDJjbmGmuqXQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.1.0.tgz", + "integrity": "sha512-Zf8JVC2K1svqPIk1CB/ehCiWPaERJBBokbMfNTNRczCbQSlQXaXtO/7OfYz9wZaecNvdSvVADt6/XQuIxhC79w==", "dev": true, "requires": { "@types/json-schema": "^7.0.3", - "@typescript-eslint/typescript-estree": "3.0.2", + "@typescript-eslint/typescript-estree": "3.1.0", "eslint-scope": "^5.0.0", "eslint-utils": "^2.0.0" } }, "@typescript-eslint/parser": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.0.2.tgz", - "integrity": "sha512-80Z7s83e8QXHNUspqVlWwb4t5gdz/1bBBmafElbK1wwAwiD/yvJsFyHRxlEpNrt4rdK6eB3p+2WEFkEDHAKk9w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.1.0.tgz", + "integrity": "sha512-NcDSJK8qTA2tPfyGiPes9HtVKLbksmuYjlgGAUs7Ld2K0swdWibnCq9IJx9kJN8JJdgUJSorFiGaPHBgH81F/Q==", "dev": true, "requires": { "@types/eslint-visitor-keys": "^1.0.0", - "@typescript-eslint/experimental-utils": "3.0.2", - "@typescript-eslint/typescript-estree": "3.0.2", + "@typescript-eslint/experimental-utils": "3.1.0", + "@typescript-eslint/typescript-estree": "3.1.0", "eslint-visitor-keys": "^1.1.0" } }, "@typescript-eslint/typescript-estree": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.0.2.tgz", - "integrity": "sha512-cs84mxgC9zQ6viV8MEcigfIKQmKtBkZNDYf8Gru2M+MhnA6z9q0NFMZm2IEzKqAwN8lY5mFVd1Z8DiHj6zQ3Tw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.1.0.tgz", + "integrity": "sha512-+4nfYauqeQvK55PgFrmBWFVYb6IskLyOosYEmhH3mSVhfBp9AIJnjExdgDmKWoOBHRcPM8Ihfm2BFpZf0euUZQ==", "dev": true, "requires": { "debug": "^4.1.1", @@ -3455,11 +3447,12 @@ "dev": true }, "cacache": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.3.tgz", - "integrity": "sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.4.tgz", + "integrity": "sha512-YlnKQqTbD/6iyoJvEY3KJftjrdBYroCbxxYXzhOzsFLWlp6KX4BOlEf4mTx0cMUfVaTS3ENL2QtDWeRYoGLkkw==", "dev": true, "requires": { + "@npmcli/move-file": "^1.0.1", "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "glob": "^7.1.4", @@ -3470,7 +3463,6 @@ "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.2", "mkdirp": "^1.0.3", - "move-file": "^2.0.0", "p-map": "^4.0.0", "promise-inflight": "^1.0.1", "rimraf": "^3.0.2", @@ -5223,9 +5215,9 @@ "dev": true }, "eslint": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.1.0.tgz", - "integrity": "sha512-DfS3b8iHMK5z/YLSme8K5cge168I8j8o1uiVmFCgnnjxZQbCGyraF8bMl7Ju4yfBmCuxD7shOF7eqGkcuIHfsA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.2.0.tgz", + "integrity": "sha512-B3BtEyaDKC5MlfDa2Ha8/D6DsS4fju95zs0hjS3HdGazw+LNayai38A25qMppK37wWGWNYSPOR6oYzlz5MHsRQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -5234,10 +5226,10 @@ "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", + "eslint-scope": "^5.1.0", "eslint-utils": "^2.0.0", - "eslint-visitor-keys": "^1.1.0", - "espree": "^7.0.0", + "eslint-visitor-keys": "^1.2.0", + "espree": "^7.1.0", "esquery": "^1.2.0", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", @@ -5321,6 +5313,12 @@ "ms": "^2.1.1" } }, + "eslint-visitor-keys": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz", + "integrity": "sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ==", + "dev": true + }, "glob-parent": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", @@ -5750,9 +5748,9 @@ "dev": true }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz", + "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==", "dev": true, "requires": { "esrecurse": "^4.1.0", @@ -5775,14 +5773,22 @@ "dev": true }, "espree": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.0.0.tgz", - "integrity": "sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz", + "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==", "dev": true, "requires": { - "acorn": "^7.1.1", + "acorn": "^7.2.0", "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" + "eslint-visitor-keys": "^1.2.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz", + "integrity": "sha512-WFb4ihckKil6hu3Dp798xdzSfddwKKU3+nGniKF6HfeW6OLd2OUDEPP7TcHtB5+QXOKg2s6B2DaMPE1Nn/kxKQ==", + "dev": true + } } }, "esprima": { @@ -6502,9 +6508,9 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "flush-write-stream": { @@ -9426,9 +9432,9 @@ } }, "min-indent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", - "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true }, "mini-create-react-context": { @@ -9657,23 +9663,6 @@ "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", @@ -11511,9 +11500,9 @@ } }, "recoil": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.0.7.tgz", - "integrity": "sha512-U/0kniHLk131hKhAX35QGdghVf3+PSkLcFIFoNBNy+yv62qCLm3TE5c3v4x4WYzuKgw1fxU3GGhKHAUYdyRnTQ==" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.0.8.tgz", + "integrity": "sha512-lfIH6y9A0wQ6piucwWFZfpp9KNQ+mFdTPFPFL0m0sRCrfsuwz3lyVaaofHY6/O4BXekDoXyjYodPBgCSdw9HCw==" }, "redent": { "version": "1.0.0", @@ -11527,9 +11516,9 @@ } }, "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", "dev": true }, "regenerate-unicode-properties": { @@ -11952,9 +11941,9 @@ "dev": true }, "sass": { - "version": "1.26.7", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.7.tgz", - "integrity": "sha512-xgNazdkr6yvgHEfNaOjKtZzhDZmKYMCmoRKMPrTDo7YvjaITIzU2DDYsIUuN/atAg7/JOxPeCQHH7TtCo5Tq2g==", + "version": "1.26.8", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.26.8.tgz", + "integrity": "sha512-yvtzyrKLGiXQu7H12ekXqsfoGT/aTKeMDyVzCB675k1HYuaj0py63i8Uf4SI9CHXj6apDhpfwbUr3gGOjdpu2Q==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" @@ -13005,14 +12994,14 @@ "dev": true }, "stylelint": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.5.0.tgz", - "integrity": "sha512-+Jy7ieKAWKTf2tmcAE7jgScxH39Urb87i0bjK/enScFaGWWaFn4kAPwepGOSk2b7CLUDVt/O6kwA0x0p/V7moQ==", + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.6.0.tgz", + "integrity": "sha512-55gG2pNjVr183JJM/tlr3KAua6vTVX7Ho/lgKKuCIWszTZ1gmrXjX4Wok53SI8wRYFPbwKAcJGULQ77OJxTcNw==", "dev": true, "requires": { "@stylelint/postcss-css-in-js": "^0.37.1", "@stylelint/postcss-markdown": "^0.36.1", - "autoprefixer": "^9.7.6", + "autoprefixer": "^9.8.0", "balanced-match": "^1.0.0", "chalk": "^4.0.0", "cosmiconfig": "^6.0.0", @@ -13021,10 +13010,10 @@ "file-entry-cache": "^5.0.1", "get-stdin": "^8.0.0", "global-modules": "^2.0.0", - "globby": "^11.0.0", + "globby": "^11.0.1", "globjoin": "^0.1.4", "html-tags": "^3.1.0", - "ignore": "^5.1.4", + "ignore": "^5.1.8", "import-lazy": "^4.0.0", "imurmurhash": "^0.1.4", "known-css-properties": "^0.19.0", @@ -13035,7 +13024,7 @@ "meow": "^7.0.1", "micromatch": "^4.0.2", "normalize-selector": "^0.2.0", - "postcss": "^7.0.30", + "postcss": "^7.0.32", "postcss-html": "^0.36.0", "postcss-less": "^3.1.4", "postcss-media-query-parser": "^0.2.3", @@ -13043,7 +13032,7 @@ "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^4.0.2", "postcss-sass": "^0.4.4", - "postcss-scss": "^2.0.0", + "postcss-scss": "^2.1.1", "postcss-selector-parser": "^6.0.2", "postcss-syntax": "^0.36.2", "postcss-value-parser": "^4.1.0", @@ -13056,7 +13045,7 @@ "sugarss": "^2.0.0", "svg-tags": "^1.0.0", "table": "^5.4.6", - "v8-compile-cache": "^2.1.0", + "v8-compile-cache": "^2.1.1", "write-file-atomic": "^3.0.3" }, "dependencies": { @@ -13177,9 +13166,9 @@ "dev": true }, "globby": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", - "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", "dev": true, "requires": { "array-union": "^2.1.0", @@ -13197,9 +13186,9 @@ "dev": true }, "ignore": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.6.tgz", - "integrity": "sha512-cgXgkypZBcCnOgSihyeqbo6gjIaIyDqPQB7Ra4vhE9m6kigdGoQDMHjviFhRZo3IMlRy6yElosoviMs5YxZXUA==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true }, "import-lazy": { @@ -13315,9 +13304,9 @@ "dev": true }, "postcss": { - "version": "7.0.30", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.30.tgz", - "integrity": "sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ==", + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", "dev": true, "requires": { "chalk": "^2.4.2", @@ -13835,17 +13824,17 @@ } }, "terser-webpack-plugin": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.2.tgz", - "integrity": "sha512-QeBHLJzKJHCnrPNlZj5EmOF6wwvzpVGDHvTrySIH8+jZEXfcKKCiriRmF6945rKzuZDnkOEU/LDv7qtPiiyP/Q==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz", + "integrity": "sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw==", "dev": true, "requires": { - "cacache": "^15.0.3", + "cacache": "^15.0.4", "find-cache-dir": "^3.3.1", "jest-worker": "^26.0.0", "p-limit": "^2.3.0", "schema-utils": "^2.6.6", - "serialize-javascript": "^3.0.0", + "serialize-javascript": "^3.1.0", "source-map": "^0.6.1", "terser": "^4.6.13", "webpack-sources": "^1.4.3" @@ -14247,9 +14236,9 @@ } }, "typescript": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", - "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz", + "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==", "dev": true }, "unbzip2-stream": { @@ -14622,9 +14611,9 @@ "dev": true }, "v8-compile-cache": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", - "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "dev": true }, "validate-npm-package-license": { diff --git a/package.json b/package.json index a750dec..48186d4 100644 --- a/package.json +++ b/package.json @@ -29,28 +29,28 @@ }, "devDependencies": { "@babel/cli": "^7.10.1", - "@babel/core": "^7.10.1", - "@babel/preset-env": "^7.10.1", + "@babel/core": "^7.10.2", + "@babel/preset-env": "^7.10.2", "@babel/preset-react": "^7.10.1", "@hot-loader/react-dom": "^16.13.0", "@types/classnames": "^2.2.10", "@types/lodash-es": "^4.17.3", - "@types/node": "^14.0.6", + "@types/node": "^14.0.11", "@types/react": "^16.9.35", "@types/react-dom": "^16.9.8", "@types/react-router-dom": "^5.1.5", - "@types/react-table": "^7.0.18", + "@types/react-table": "^7.0.19", "@types/react-virtualized-auto-sizer": "^1.0.0", "@types/react-window": "^1.8.2", "@types/recoil": "0.0.0", - "@typescript-eslint/eslint-plugin": "^3.0.2", - "@typescript-eslint/parser": "^3.0.2", + "@typescript-eslint/eslint-plugin": "^3.1.0", + "@typescript-eslint/parser": "^3.1.0", "autoprefixer": "^9.8.0", "awesome-typescript-loader": "^5.2.1", "babel-loader": "^8.1.0", "babel-preset-minify": "^0.5.1", "css-loader": "^3.5.3", - "eslint": "^7.1.0", + "eslint": "^7.2.0", "eslint-config-standard": "^14.1.1", "eslint-loader": "^4.0.2", "eslint-plugin-import": "^2.20.2", @@ -65,14 +65,14 @@ "offline-plugin": "^5.0.7", "postcss-loader": "^3.0.0", "react-hot-loader": "^4.12.21", - "sass": "^1.26.7", + "sass": "^1.26.8", "sass-loader": "^8.0.2", "style-loader": "^1.2.1", - "stylelint": "^13.5.0", + "stylelint": "^13.6.0", "stylelint-config-standard": "^20.0.0", "stylelint-webpack-plugin": "^2.0.0", - "terser-webpack-plugin": "^3.0.2", - "typescript": "^3.9.3", + "terser-webpack-plugin": "^3.0.3", + "typescript": "^3.9.5", "webpack": "^4.43.0", "webpack-cli": "^3.3.11", "webpack-dev-middleware": "^3.7.2", @@ -93,7 +93,7 @@ "react-table": "^7.1.0", "react-virtualized-auto-sizer": "^1.0.2", "react-window": "^1.8.5", - "recoil": "0.0.7", + "recoil": "0.0.8", "swr": "^0.2.2", "use-immer": "^0.4.0" } diff --git a/src/components/Loading/index.tsx b/src/components/Loading/index.tsx index 993a55c..152cbf7 100644 --- a/src/components/Loading/index.tsx +++ b/src/components/Loading/index.tsx @@ -7,14 +7,15 @@ import './style.scss' interface LoadingProps extends BaseComponentProps { visible: boolean + spinnerClassName?: string } export function Loading (props: LoadingProps) { - const classname = classnames('loading', 'visible') + const classname = classnames('loading', 'visible', props.className) return props.visible ? (
- +
) : null diff --git a/src/containers/Proxies/index.tsx b/src/containers/Proxies/index.tsx index f4d1f85..5e592de 100644 --- a/src/containers/Proxies/index.tsx +++ b/src/containers/Proxies/index.tsx @@ -62,10 +62,12 @@ function ProxyGroups () { } function ProxyProviders () { - const { providers } = useProxyProviders() + const { providers, update } = useProxyProviders() const { useTranslation } = useI18n() const { t } = useTranslation('Proxies') + useSWR('providers', update) + return <> { providers.length !== 0 && @@ -134,10 +136,7 @@ function Proxies () { export default function ProxyContainer () { const { update: updateProxy } = useProxy() - const { update: updateProvider } = useProxyProviders() - useSWR('proxies', updateProxy) - useSWR('providers', updateProvider) return (
diff --git a/src/containers/Rules/Provider/index.tsx b/src/containers/Rules/Provider/index.tsx new file mode 100644 index 0000000..b4447cf --- /dev/null +++ b/src/containers/Rules/Provider/index.tsx @@ -0,0 +1,48 @@ +import * as React from 'react' +import classnames from 'classnames' +import { Card, Tag, Icon } from '@components' +import { useI18n, useRuleProviders } from '@stores' +import { fromNow } from '@lib/date' +import { RuleProvider, updateRuleProvider } from '@lib/request' +import { useVisible } from '@lib/hook' +import './style.scss' + +interface ProvidersProps { + provider: RuleProvider +} + +export function Provider (props: ProvidersProps) { + const { update } = useRuleProviders() + const { useTranslation, lang } = useI18n() + + const { provider } = props + const { t } = useTranslation('Proxies') + + const { visible, hide, show } = useVisible() + + function handleUpdate () { + show() + updateRuleProvider(provider.name).then(() => update()).finally(() => hide()) + } + + const updateClassnames = classnames('rule-provider-icon', { 'rule-provider-loading': visible }) + + return ( + +
+
+ { provider.name } + { provider.vehicleType } + { provider.behavior } +
+
+ { + provider.updatedAt && + { `${t('providerUpdateTime')}: ${fromNow(new Date(provider.updatedAt), lang)}`} + } + +
+
+
+ ) +} diff --git a/src/containers/Rules/Provider/style.scss b/src/containers/Rules/Provider/style.scss new file mode 100644 index 0000000..87cbded --- /dev/null +++ b/src/containers/Rules/Provider/style.scss @@ -0,0 +1,79 @@ +@import '~@styles/variables'; + +.rule-provider { + position: relative; + display: flex; + flex-direction: column; + font-size: 16px; + padding: 20px; + color: $color-black-light; +} + +.rule-provider-header { + display: flex; + align-items: center; + justify-content: space-between; +} + +.rule-provider-header-part { + display: flex; + align-items: center; +} + +.rule-provider-name { + width: 120px; + margin-right: 6px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.rule-provider-behavior { + margin-left: 12px; + background-color: $color-primary-dark; + color: #fff; +} + +.rule-provider-spinner { + transform: scale(0.4); +} + +.rule-provider-proxies { + list-style: none; +} + +.rule-provider-item { + box-shadow: 0 0 24px 0 rgba(44, 138, 248, 0.2); + + &:hover { + box-shadow: 0 0 24px 0 rgba(84, 117, 154, 0.4); + } +} + +.rule-provider-update { + line-height: 14px; + font-size: 14px; +} + +.rule-provider-icon { + display: block; + margin-left: 20px; + cursor: pointer; + + &.rule-provider-loading::before { + color: $color-gray-darken; + cursor: not-allowed; + animation: spinner 2s infinite linear; + } +} + +@media (max-width: 768px) { + .rule-provider-header { + flex-direction: column; + align-items: flex-start; + } + + .rule-provider-header-part { + margin: 6px 0; + } +} diff --git a/src/containers/Rules/index.tsx b/src/containers/Rules/index.tsx index 48d6eee..dc50f6b 100644 --- a/src/containers/Rules/index.tsx +++ b/src/containers/Rules/index.tsx @@ -1,11 +1,43 @@ -import React from 'react' +import React, { useLayoutEffect } from 'react' import { Header, Card, Row, Col } from '@components' -import { useI18n, useRule } from '@stores' +import { useI18n, useRule, useRuleProviders, useVersion } from '@stores' import { FixedSizeList as List } from 'react-window' import AutoSizer from 'react-virtualized-auto-sizer' import useSWR from 'swr' +import { Provider } from './Provider' import './style.scss' +function RuleProviders () { + const { providers, update } = useRuleProviders() + const { premium } = useVersion() + const { useTranslation } = useI18n() + const { t } = useTranslation('Rules') + + useLayoutEffect(() => { + if (premium) { + update() + } + }, [premium]) + + return <> + { + providers.length !== 0 && +
+
+
    + { + providers.map(p => ( +
  • + +
  • + )) + } +
+
+ } + +} + export default function Rules () { const { rules, update } = useRule() const { useTranslation } = useI18n() @@ -34,6 +66,7 @@ export default function Rules () { return (
+
diff --git a/src/containers/Settings/index.tsx b/src/containers/Settings/index.tsx index 76429fc..383bb51 100644 --- a/src/containers/Settings/index.tsx +++ b/src/containers/Settings/index.tsx @@ -4,7 +4,7 @@ import { Header, Card, Row, Col, Switch, ButtonSelect, ButtonSelectOptions, Inpu import { useI18n, useClashXData, useAPIInfo, useGeneral, useIdentity } from '@stores' import { updateConfig } from '@lib/request' import { useObject } from '@lib/hook' -import { isClashX, jsBridge } from '@lib/jsBridge' +import { jsBridge } from '@lib/jsBridge' import { Lang } from '@i18n' import './style.scss' @@ -19,15 +19,12 @@ export default function Settings () { const { t } = useTranslation('Settings') const [info, set] = useObject({ socks5ProxyPort: 7891, - httpProxyPort: 7890, - isClashX: false + httpProxyPort: 7890 }) useEffect(() => { fetchGeneral() - if (isClashX()) { - fetchClashXData().then(() => set('isClashX', true)) - } + fetchClashXData() }, []) useEffect(() => { @@ -96,7 +93,7 @@ export default function Settings () { {t('labels.startAtLogin')} - + @@ -115,7 +112,7 @@ export default function Settings () { diff --git a/src/containers/Sidebar/index.tsx b/src/containers/Sidebar/index.tsx index e37fb3f..bac28f0 100644 --- a/src/containers/Sidebar/index.tsx +++ b/src/containers/Sidebar/index.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { NavLink } from 'react-router-dom' import classnames from 'classnames' -import { useI18n, useVersion } from '@stores' +import { useI18n, useVersion, useClashXData } from '@stores' import './style.scss' import logo from '@assets/logo.png' @@ -20,9 +20,11 @@ export default function Sidebar (props: SidebarProps) { const { routes } = props const { useTranslation } = useI18n() const { version, premium, update } = useVersion() + const { data: { isClashX }, update: updateClashXData } = useClashXData() const { t } = useTranslation('SideBar') useSWR('version', update) + useSWR('clashx', updateClashXData) const navlinks = routes.map( ({ path, name, exact, noMobile }) => ( @@ -39,7 +41,7 @@ export default function Sidebar (props: SidebarProps) { { navlinks }
- Clash { t('Version') } + Clash{ isClashX && 'X' } { t('Version') } { version } { premium && Premium }
diff --git a/src/i18n/en_US.ts b/src/i18n/en_US.ts index 6ed55ef..8470a7e 100644 --- a/src/i18n/en_US.ts +++ b/src/i18n/en_US.ts @@ -41,7 +41,9 @@ export default { title: 'Logs' }, Rules: { - title: 'Rules' + title: 'Rules', + providerTitle: 'Providers', + providerUpdateTime: 'Last updated at' }, Connections: { title: 'Connections', diff --git a/src/i18n/zh_CN.ts b/src/i18n/zh_CN.ts index 15f4b9b..6ca740f 100644 --- a/src/i18n/zh_CN.ts +++ b/src/i18n/zh_CN.ts @@ -41,7 +41,9 @@ export default { title: '日志' }, Rules: { - title: '规则' + title: '规则', + providerTitle: '规则集', + providerUpdateTime: '最后更新于' }, Connections: { title: '连接', diff --git a/src/lib/request.ts b/src/lib/request.ts index 3b53358..f350dbf 100644 --- a/src/lib/request.ts +++ b/src/lib/request.ts @@ -25,23 +25,32 @@ export interface Rule { } export interface Proxies { - proxies: { - [key: string]: Proxy | Group - } + proxies: Record } export interface Provider { name: string proxies: Array - type: 'Proxy' | 'Rule' + type: 'Proxy' vehicleType: 'HTTP' | 'File' | 'Compatible' updatedAt?: string } +export interface RuleProvider { + name: string + type: 'Rule' + vehicleType: 'HTTP' | 'File' + behavior: string + ruleCount: number + updatedAt?: string +} + +export interface RuleProviders { + providers: Record +} + export interface ProxyProviders { - providers: { - [key: string]: Provider - } + providers: Record } interface History { @@ -159,11 +168,21 @@ export async function getProxyProviders () { }) } +export async function getRuleProviders () { + const req = await getInstance() + return req.get('providers/rules') +} + export async function updateProvider (name: string) { const req = await getInstance() return req.put(`providers/proxies/${encodeURIComponent(name)}`) } +export async function updateRuleProvider (name: string) { + const req = await getInstance() + return req.put(`providers/rules/${encodeURIComponent(name)}`) +} + export async function healthCheckProvider (name: string) { const req = await getInstance() return req.get(`providers/proxies/${encodeURIComponent(name)}/healthcheck`) diff --git a/src/stores/recoil.ts b/src/stores/recoil.ts index 25bb52b..ed4618e 100644 --- a/src/stores/recoil.ts +++ b/src/stores/recoil.ts @@ -7,7 +7,7 @@ import { getLanguage, setLanguage, Lang, locales, Language } from '@i18n' import { useRecoilObjectWithImmer } from '@lib/recoil' import * as API from '@lib/request' import { setLocalStorageItem, partition, to } from '@lib/helper' -import { jsBridge } from '@lib/jsBridge' +import { jsBridge, isClashX } from '@lib/jsBridge' import * as Models from '@models' const identity = atom({ @@ -62,6 +62,32 @@ export function useI18n () { return { lang, locales, setLang, useTranslation } } +export const version = atom({ + key: 'version', + default: { + version: '', + premium: false + } +}) + +export function useVersion () { + const [data, set] = useRecoilState(version) + const { set: setIdentity } = useIdentity() + + async function update () { + const [resp, err] = await to(API.getVersion()) + setIdentity(!err) + + set( + err + ? { version: '', premium: false } + : { version: resp.data.version, premium: !!resp.data.premium } + ) + } + + return { version: data.version, premium: data.premium, update } +} + export const config = atom({ key: 'config', default: { @@ -97,6 +123,31 @@ export function useProxyProviders () { return { providers: data, update } } +export const ruleProvider = atom({ + key: 'ruleProvider', + default: [] as API.RuleProvider[] +}) + +export function useRuleProviders () { + const [data, set] = useRecoilState(ruleProvider) + const [{ premium }] = useRecoilState(version) + + async function update () { + if (!premium) { + return + } + + const ruleProviders = await API.getRuleProviders() + + const providers = Object.keys(ruleProviders.data.providers) + .map(name => ruleProviders.data.providers[name]) + + set(providers) + } + + return { providers: data, update } +} + export const general = atom({ key: 'general', default: {} as Models.Data['general'] @@ -179,35 +230,10 @@ export const proxyMapping = selector({ } }) -export const version = atom({ - key: 'version', - default: { - version: '', - premium: false - } -}) - -export function useVersion () { - const [data, set] = useRecoilState(version) - const { set: setIdentity } = useIdentity() - - async function update () { - const [resp, err] = await to(API.getVersion()) - setIdentity(!err) - - set( - err - ? { version: '', premium: false } - : { version: resp.data.version, premium: !!resp.data.premium } - ) - } - - return { version: data.version, premium: data.premium, update } -} - export const clashxData = atom({ key: 'clashxData', default: { + isClashX: false, startAtLogin: false, systemProxy: false } @@ -217,10 +243,14 @@ export function useClashXData () { const [data, set] = useRecoilState(clashxData) async function update () { + if (!isClashX()) { + return + } + const startAtLogin = await jsBridge.getStartAtLogin() const systemProxy = await jsBridge.isSystemProxySet() - set({ startAtLogin, systemProxy }) + set({ startAtLogin, systemProxy, isClashX: true }) } return { data, update }