aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--package-lock.json816
-rw-r--r--package.json1
-rw-r--r--src/@types/stores.types.ts3
-rw-r--r--src/components/settings/settings/EditSettingsForm.jsx12
-rw-r--r--src/config.ts139
-rw-r--r--src/containers/settings/EditSettingsScreen.tsx54
-rw-r--r--src/helpers/translation-helpers.ts47
-rw-r--r--src/i18n/locales/en-US.json3
-rw-r--r--src/index.ts13
-rw-r--r--src/models/IContextMenuParams.ts7
-rw-r--r--src/stores/ServicesStore.ts21
-rw-r--r--src/webview/contextMenu.ts6
-rw-r--r--src/webview/contextMenuBuilder.ts255
-rw-r--r--src/webview/recipe.js6
14 files changed, 1328 insertions, 55 deletions
diff --git a/package-lock.json b/package-lock.json
index ed75ec4ef..7c21ac15a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -82,6 +82,7 @@
82 "semver": "7.3.7", 82 "semver": "7.3.7",
83 "sqlite3": "5.0.8", 83 "sqlite3": "5.0.8",
84 "tar": "6.1.11", 84 "tar": "6.1.11",
85 "translate-google": "1.5.0",
85 "tslib": "2.4.0", 86 "tslib": "2.4.0",
86 "useragent-generator": "1.1.1-amkt-22079-finish.0", 87 "useragent-generator": "1.1.1-amkt-22079-finish.0",
87 "uuid": "8.3.2", 88 "uuid": "8.3.2",
@@ -4675,6 +4676,17 @@
4675 "@types/node": "*" 4676 "@types/node": "*"
4676 } 4677 }
4677 }, 4678 },
4679 "node_modules/@types/cacheable-request": {
4680 "version": "6.0.2",
4681 "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
4682 "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
4683 "dependencies": {
4684 "@types/http-cache-semantics": "*",
4685 "@types/keyv": "*",
4686 "@types/node": "*",
4687 "@types/responselike": "*"
4688 }
4689 },
4678 "node_modules/@types/color": { 4690 "node_modules/@types/color": {
4679 "version": "3.0.3", 4691 "version": "3.0.3",
4680 "resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.3.tgz", 4692 "resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.3.tgz",
@@ -4820,6 +4832,11 @@
4820 "hoist-non-react-statics": "^3.3.0" 4832 "hoist-non-react-statics": "^3.3.0"
4821 } 4833 }
4822 }, 4834 },
4835 "node_modules/@types/http-cache-semantics": {
4836 "version": "4.0.1",
4837 "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
4838 "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
4839 },
4823 "node_modules/@types/http-proxy": { 4840 "node_modules/@types/http-proxy": {
4824 "version": "1.17.9", 4841 "version": "1.17.9",
4825 "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", 4842 "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz",
@@ -4863,6 +4880,11 @@
4863 "pretty-format": "^28.0.0" 4880 "pretty-format": "^28.0.0"
4864 } 4881 }
4865 }, 4882 },
4883 "node_modules/@types/json-buffer": {
4884 "version": "3.0.0",
4885 "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz",
4886 "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ=="
4887 },
4866 "node_modules/@types/json-schema": { 4888 "node_modules/@types/json-schema": {
4867 "version": "7.0.11", 4889 "version": "7.0.11",
4868 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", 4890 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
@@ -4881,6 +4903,14 @@
4881 "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", 4903 "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
4882 "dev": true 4904 "dev": true
4883 }, 4905 },
4906 "node_modules/@types/keyv": {
4907 "version": "3.1.4",
4908 "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
4909 "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
4910 "dependencies": {
4911 "@types/node": "*"
4912 }
4913 },
4884 "node_modules/@types/lodash": { 4914 "node_modules/@types/lodash": {
4885 "version": "4.14.182", 4915 "version": "4.14.182",
4886 "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", 4916 "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz",
@@ -4930,8 +4960,7 @@
4930 "node_modules/@types/node": { 4960 "node_modules/@types/node": {
4931 "version": "16.11.33", 4961 "version": "16.11.33",
4932 "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.33.tgz", 4962 "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.33.tgz",
4933 "integrity": "sha512-0PJ0vg+JyU0MIan58IOIFRtSvsb7Ri+7Wltx2qAg94eMOrpg4+uuP3aUHCpxXc1i0jCXiC+zIamSZh3l9AbcQA==", 4963 "integrity": "sha512-0PJ0vg+JyU0MIan58IOIFRtSvsb7Ri+7Wltx2qAg94eMOrpg4+uuP3aUHCpxXc1i0jCXiC+zIamSZh3l9AbcQA=="
4934 "dev": true
4935 }, 4964 },
4936 "node_modules/@types/normalize-package-data": { 4965 "node_modules/@types/normalize-package-data": {
4937 "version": "2.4.1", 4966 "version": "2.4.1",
@@ -4998,6 +5027,14 @@
4998 "@types/react": "^17" 5027 "@types/react": "^17"
4999 } 5028 }
5000 }, 5029 },
5030 "node_modules/@types/responselike": {
5031 "version": "1.0.0",
5032 "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
5033 "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
5034 "dependencies": {
5035 "@types/node": "*"
5036 }
5037 },
5001 "node_modules/@types/retry": { 5038 "node_modules/@types/retry": {
5002 "version": "0.12.0", 5039 "version": "0.12.0",
5003 "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", 5040 "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
@@ -8004,6 +8041,14 @@
8004 "node": ">=0.10.0" 8041 "node": ">=0.10.0"
8005 } 8042 }
8006 }, 8043 },
8044 "node_modules/cacheable-lookup": {
8045 "version": "5.0.4",
8046 "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
8047 "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
8048 "engines": {
8049 "node": ">=10.6.0"
8050 }
8051 },
8007 "node_modules/cacheable-request": { 8052 "node_modules/cacheable-request": {
8008 "version": "6.1.0", 8053 "version": "6.1.0",
8009 "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", 8054 "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
@@ -8559,7 +8604,6 @@
8559 "version": "1.0.2", 8604 "version": "1.0.2",
8560 "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 8605 "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
8561 "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", 8606 "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==",
8562 "dev": true,
8563 "dependencies": { 8607 "dependencies": {
8564 "mimic-response": "^1.0.0" 8608 "mimic-response": "^1.0.0"
8565 } 8609 }
@@ -8787,6 +8831,23 @@
8787 "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 8831 "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
8788 "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 8832 "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
8789 }, 8833 },
8834 "node_modules/compress-brotli": {
8835 "version": "1.3.8",
8836 "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz",
8837 "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==",
8838 "dependencies": {
8839 "@types/json-buffer": "~3.0.0",
8840 "json-buffer": "~3.0.1"
8841 },
8842 "engines": {
8843 "node": ">= 12"
8844 }
8845 },
8846 "node_modules/compress-brotli/node_modules/json-buffer": {
8847 "version": "3.0.1",
8848 "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
8849 "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
8850 },
8790 "node_modules/compressible": { 8851 "node_modules/compressible": {
8791 "version": "2.0.18", 8852 "version": "2.0.18",
8792 "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", 8853 "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -9746,6 +9807,14 @@
9746 "node": ">=0.10.0" 9807 "node": ">=0.10.0"
9747 } 9808 }
9748 }, 9809 },
9810 "node_modules/detect-indent": {
9811 "version": "6.0.0",
9812 "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz",
9813 "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==",
9814 "engines": {
9815 "node": ">=8"
9816 }
9817 },
9749 "node_modules/detect-libc": { 9818 "node_modules/detect-libc": {
9750 "version": "2.0.1", 9819 "version": "2.0.1",
9751 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", 9820 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
@@ -9905,6 +9974,14 @@
9905 "node": ">=6" 9974 "node": ">=6"
9906 } 9975 }
9907 }, 9976 },
9977 "node_modules/docopt": {
9978 "version": "0.6.2",
9979 "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz",
9980 "integrity": "sha512-NqTbaYeE4gA/wU1hdKFdU+AFahpDOpgGLzHP42k6H6DKExJd0A55KEVWYhL9FEmHmgeLvEU2vuKXDuU+4yToOw==",
9981 "engines": {
9982 "node": ">=0.10.0"
9983 }
9984 },
9908 "node_modules/doctrine": { 9985 "node_modules/doctrine": {
9909 "version": "3.0.0", 9986 "version": "3.0.0",
9910 "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 9987 "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -9925,6 +10002,19 @@
9925 "@babel/runtime": "^7.1.2" 10002 "@babel/runtime": "^7.1.2"
9926 } 10003 }
9927 }, 10004 },
10005 "node_modules/dot-json": {
10006 "version": "1.2.2",
10007 "resolved": "https://registry.npmjs.org/dot-json/-/dot-json-1.2.2.tgz",
10008 "integrity": "sha512-AKL+GsO4wSEU4LU+fAk/PqN4nQ6PB1vT3HpMiZous9xCzK5S0kh4DzfUY0EfU67jsIXLlu0ty71659N9Nmg+Tw==",
10009 "dependencies": {
10010 "detect-indent": "~6.0.0",
10011 "docopt": "~0.6.2",
10012 "underscore-keypath": "~0.0.22"
10013 },
10014 "bin": {
10015 "dot-json": "bin/dot-json.js"
10016 }
10017 },
9928 "node_modules/dot-prop": { 10018 "node_modules/dot-prop": {
9929 "version": "5.3.0", 10019 "version": "5.3.0",
9930 "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", 10020 "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
@@ -14085,8 +14175,7 @@
14085 "node_modules/http-cache-semantics": { 14175 "node_modules/http-cache-semantics": {
14086 "version": "4.1.0", 14176 "version": "4.1.0",
14087 "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", 14177 "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
14088 "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", 14178 "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
14089 "devOptional": true
14090 }, 14179 },
14091 "node_modules/http-deceiver": { 14180 "node_modules/http-deceiver": {
14092 "version": "1.2.7", 14181 "version": "1.2.7",
@@ -14194,6 +14283,29 @@
14194 "npm": ">=1.3.7" 14283 "npm": ">=1.3.7"
14195 } 14284 }
14196 }, 14285 },
14286 "node_modules/http2-wrapper": {
14287 "version": "1.0.3",
14288 "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
14289 "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
14290 "dependencies": {
14291 "quick-lru": "^5.1.1",
14292 "resolve-alpn": "^1.0.0"
14293 },
14294 "engines": {
14295 "node": ">=10.19.0"
14296 }
14297 },
14298 "node_modules/http2-wrapper/node_modules/quick-lru": {
14299 "version": "5.1.1",
14300 "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
14301 "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
14302 "engines": {
14303 "node": ">=10"
14304 },
14305 "funding": {
14306 "url": "https://github.com/sponsors/sindresorhus"
14307 }
14308 },
14197 "node_modules/https-proxy-agent": { 14309 "node_modules/https-proxy-agent": {
14198 "version": "5.0.1", 14310 "version": "5.0.1",
14199 "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 14311 "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
@@ -14429,7 +14541,6 @@
14429 "version": "0.1.4", 14541 "version": "0.1.4",
14430 "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 14542 "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
14431 "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 14543 "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
14432 "devOptional": true,
14433 "engines": { 14544 "engines": {
14434 "node": ">=0.8.19" 14545 "node": ">=0.8.19"
14435 } 14546 }
@@ -14939,6 +15050,14 @@
14939 "node": ">=10" 15050 "node": ">=10"
14940 } 15051 }
14941 }, 15052 },
15053 "node_modules/is-keyword-js": {
15054 "version": "1.0.3",
15055 "resolved": "https://registry.npmjs.org/is-keyword-js/-/is-keyword-js-1.0.3.tgz",
15056 "integrity": "sha512-EW8wNCNvomPa/jsH1g0DmLfPakkRCRTcTML1v1fZMLiVCvQ/1YB+tKsRzShBiWQhqrYCi5a+WsepA4Z8TA9iaA==",
15057 "engines": {
15058 "node": ">=0.10.0"
15059 }
15060 },
14942 "node_modules/is-lambda": { 15061 "node_modules/is-lambda": {
14943 "version": "1.0.1", 15062 "version": "1.0.1",
14944 "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", 15063 "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
@@ -15019,7 +15138,6 @@
15019 "version": "2.0.0", 15138 "version": "2.0.0",
15020 "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", 15139 "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
15021 "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", 15140 "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
15022 "dev": true,
15023 "engines": { 15141 "engines": {
15024 "node": ">=8" 15142 "node": ">=8"
15025 } 15143 }
@@ -15152,8 +15270,7 @@
15152 "node_modules/is-typedarray": { 15270 "node_modules/is-typedarray": {
15153 "version": "1.0.0", 15271 "version": "1.0.0",
15154 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 15272 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
15155 "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", 15273 "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
15156 "devOptional": true
15157 }, 15274 },
15158 "node_modules/is-unc-path": { 15275 "node_modules/is-unc-path": {
15159 "version": "1.0.0", 15276 "version": "1.0.0",
@@ -15166,6 +15283,11 @@
15166 "node": ">=0.10.0" 15283 "node": ">=0.10.0"
15167 } 15284 }
15168 }, 15285 },
15286 "node_modules/is-url": {
15287 "version": "1.2.4",
15288 "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
15289 "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
15290 },
15169 "node_modules/is-utf8": { 15291 "node_modules/is-utf8": {
15170 "version": "0.2.1", 15292 "version": "0.2.1",
15171 "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 15293 "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
@@ -17921,8 +18043,7 @@
17921 "node_modules/lodash.clonedeep": { 18043 "node_modules/lodash.clonedeep": {
17922 "version": "4.5.0", 18044 "version": "4.5.0",
17923 "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 18045 "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
17924 "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", 18046 "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
17925 "dev": true
17926 }, 18047 },
17927 "node_modules/lodash.debounce": { 18048 "node_modules/lodash.debounce": {
17928 "version": "4.0.8", 18049 "version": "4.0.8",
@@ -18667,7 +18788,6 @@
18667 "version": "1.0.1", 18788 "version": "1.0.1",
18668 "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 18789 "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
18669 "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 18790 "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
18670 "dev": true,
18671 "engines": { 18791 "engines": {
18672 "node": ">=4" 18792 "node": ">=4"
18673 } 18793 }
@@ -19456,6 +19576,14 @@
19456 "set-blocking": "^2.0.0" 19576 "set-blocking": "^2.0.0"
19457 } 19577 }
19458 }, 19578 },
19579 "node_modules/num-or-not": {
19580 "version": "1.0.1",
19581 "resolved": "https://registry.npmjs.org/num-or-not/-/num-or-not-1.0.1.tgz",
19582 "integrity": "sha512-IMyEpYE7hBjD/fKvZu7/jhy05scXUYy0KXOoKVjoFNU6di56wpGjCok3SoC9k51993v9N7GSLPf+9PuWq220cg==",
19583 "dependencies": {
19584 "trim": "0.0.1"
19585 }
19586 },
19459 "node_modules/number-is-nan": { 19587 "node_modules/number-is-nan": {
19460 "version": "1.0.1", 19588 "version": "1.0.1",
19461 "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 19589 "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
@@ -22501,6 +22629,11 @@
22501 "url": "https://github.com/sponsors/ljharb" 22629 "url": "https://github.com/sponsors/ljharb"
22502 } 22630 }
22503 }, 22631 },
22632 "node_modules/resolve-alpn": {
22633 "version": "1.2.1",
22634 "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
22635 "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
22636 },
22504 "node_modules/resolve-cwd": { 22637 "node_modules/resolve-cwd": {
22505 "version": "3.0.0", 22638 "version": "3.0.0",
22506 "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 22639 "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
@@ -22712,6 +22845,11 @@
22712 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 22845 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
22713 "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 22846 "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
22714 }, 22847 },
22848 "node_modules/safe-eval": {
22849 "version": "0.4.1",
22850 "resolved": "https://registry.npmjs.org/safe-eval/-/safe-eval-0.4.1.tgz",
22851 "integrity": "sha512-wmiu4RSYVZ690RP1+cv/LxfPK1dIlEN35aW7iv4SMYdqDrHbkll4+NJcHmKm7PbCuI1df1otOcPwgcc2iFR85g=="
22852 },
22715 "node_modules/safe-json-parse": { 22853 "node_modules/safe-json-parse": {
22716 "version": "1.0.1", 22854 "version": "1.0.1",
22717 "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", 22855 "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz",
@@ -25051,6 +25189,274 @@
25051 "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 25189 "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
25052 "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 25190 "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
25053 }, 25191 },
25192 "node_modules/translate-google": {
25193 "version": "1.5.0",
25194 "resolved": "https://registry.npmjs.org/translate-google/-/translate-google-1.5.0.tgz",
25195 "integrity": "sha512-wI/oX3U3t78PthVkvO7BdvKRcjb03JaUs53oAhs0NVmzFJUEm5ROiYWH7gomRHFZ5bL7LKxrFRx8Qy/l1eB46g==",
25196 "dependencies": {
25197 "configstore": "^6.0.0",
25198 "got": "^11.8.2",
25199 "is-keyword-js": "^1.0.3",
25200 "is-url": "^1.2.4",
25201 "lodash": "^4.17.21",
25202 "num-or-not": "^1.0.1",
25203 "safe-eval": "^0.4.1",
25204 "user-agents": "^1.0.779"
25205 }
25206 },
25207 "node_modules/translate-google/node_modules/@sindresorhus/is": {
25208 "version": "4.6.0",
25209 "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
25210 "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
25211 "engines": {
25212 "node": ">=10"
25213 },
25214 "funding": {
25215 "url": "https://github.com/sindresorhus/is?sponsor=1"
25216 }
25217 },
25218 "node_modules/translate-google/node_modules/@szmarczak/http-timer": {
25219 "version": "4.0.6",
25220 "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
25221 "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
25222 "dependencies": {
25223 "defer-to-connect": "^2.0.0"
25224 },
25225 "engines": {
25226 "node": ">=10"
25227 }
25228 },
25229 "node_modules/translate-google/node_modules/cacheable-request": {
25230 "version": "7.0.2",
25231 "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
25232 "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
25233 "dependencies": {
25234 "clone-response": "^1.0.2",
25235 "get-stream": "^5.1.0",
25236 "http-cache-semantics": "^4.0.0",
25237 "keyv": "^4.0.0",
25238 "lowercase-keys": "^2.0.0",
25239 "normalize-url": "^6.0.1",
25240 "responselike": "^2.0.0"
25241 },
25242 "engines": {
25243 "node": ">=8"
25244 }
25245 },
25246 "node_modules/translate-google/node_modules/configstore": {
25247 "version": "6.0.0",
25248 "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz",
25249 "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==",
25250 "dependencies": {
25251 "dot-prop": "^6.0.1",
25252 "graceful-fs": "^4.2.6",
25253 "unique-string": "^3.0.0",
25254 "write-file-atomic": "^3.0.3",
25255 "xdg-basedir": "^5.0.1"
25256 },
25257 "engines": {
25258 "node": ">=12"
25259 },
25260 "funding": {
25261 "url": "https://github.com/yeoman/configstore?sponsor=1"
25262 }
25263 },
25264 "node_modules/translate-google/node_modules/crypto-random-string": {
25265 "version": "4.0.0",
25266 "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz",
25267 "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==",
25268 "dependencies": {
25269 "type-fest": "^1.0.1"
25270 },
25271 "engines": {
25272 "node": ">=12"
25273 },
25274 "funding": {
25275 "url": "https://github.com/sponsors/sindresorhus"
25276 }
25277 },
25278 "node_modules/translate-google/node_modules/decompress-response": {
25279 "version": "6.0.0",
25280 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
25281 "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
25282 "dependencies": {
25283 "mimic-response": "^3.1.0"
25284 },
25285 "engines": {
25286 "node": ">=10"
25287 },
25288 "funding": {
25289 "url": "https://github.com/sponsors/sindresorhus"
25290 }
25291 },
25292 "node_modules/translate-google/node_modules/defer-to-connect": {
25293 "version": "2.0.1",
25294 "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
25295 "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
25296 "engines": {
25297 "node": ">=10"
25298 }
25299 },
25300 "node_modules/translate-google/node_modules/dot-prop": {
25301 "version": "6.0.1",
25302 "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
25303 "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
25304 "dependencies": {
25305 "is-obj": "^2.0.0"
25306 },
25307 "engines": {
25308 "node": ">=10"
25309 },
25310 "funding": {
25311 "url": "https://github.com/sponsors/sindresorhus"
25312 }
25313 },
25314 "node_modules/translate-google/node_modules/get-stream": {
25315 "version": "5.2.0",
25316 "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
25317 "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
25318 "dependencies": {
25319 "pump": "^3.0.0"
25320 },
25321 "engines": {
25322 "node": ">=8"
25323 },
25324 "funding": {
25325 "url": "https://github.com/sponsors/sindresorhus"
25326 }
25327 },
25328 "node_modules/translate-google/node_modules/got": {
25329 "version": "11.8.5",
25330 "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz",
25331 "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==",
25332 "dependencies": {
25333 "@sindresorhus/is": "^4.0.0",
25334 "@szmarczak/http-timer": "^4.0.5",
25335 "@types/cacheable-request": "^6.0.1",
25336 "@types/responselike": "^1.0.0",
25337 "cacheable-lookup": "^5.0.3",
25338 "cacheable-request": "^7.0.2",
25339 "decompress-response": "^6.0.0",
25340 "http2-wrapper": "^1.0.0-beta.5.2",
25341 "lowercase-keys": "^2.0.0",
25342 "p-cancelable": "^2.0.0",
25343 "responselike": "^2.0.0"
25344 },
25345 "engines": {
25346 "node": ">=10.19.0"
25347 },
25348 "funding": {
25349 "url": "https://github.com/sindresorhus/got?sponsor=1"
25350 }
25351 },
25352 "node_modules/translate-google/node_modules/json-buffer": {
25353 "version": "3.0.1",
25354 "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
25355 "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
25356 },
25357 "node_modules/translate-google/node_modules/keyv": {
25358 "version": "4.3.3",
25359 "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.3.tgz",
25360 "integrity": "sha512-AcysI17RvakTh8ir03+a3zJr5r0ovnAH/XTXei/4HIv3bL2K/jzvgivLK9UuI/JbU1aJjM3NSAnVvVVd3n+4DQ==",
25361 "dependencies": {
25362 "compress-brotli": "^1.3.8",
25363 "json-buffer": "3.0.1"
25364 }
25365 },
25366 "node_modules/translate-google/node_modules/lowercase-keys": {
25367 "version": "2.0.0",
25368 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
25369 "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
25370 "engines": {
25371 "node": ">=8"
25372 }
25373 },
25374 "node_modules/translate-google/node_modules/mimic-response": {
25375 "version": "3.1.0",
25376 "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
25377 "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
25378 "engines": {
25379 "node": ">=10"
25380 },
25381 "funding": {
25382 "url": "https://github.com/sponsors/sindresorhus"
25383 }
25384 },
25385 "node_modules/translate-google/node_modules/p-cancelable": {
25386 "version": "2.1.1",
25387 "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
25388 "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
25389 "engines": {
25390 "node": ">=8"
25391 }
25392 },
25393 "node_modules/translate-google/node_modules/pump": {
25394 "version": "3.0.0",
25395 "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
25396 "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
25397 "dependencies": {
25398 "end-of-stream": "^1.1.0",
25399 "once": "^1.3.1"
25400 }
25401 },
25402 "node_modules/translate-google/node_modules/responselike": {
25403 "version": "2.0.1",
25404 "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
25405 "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
25406 "dependencies": {
25407 "lowercase-keys": "^2.0.0"
25408 },
25409 "funding": {
25410 "url": "https://github.com/sponsors/sindresorhus"
25411 }
25412 },
25413 "node_modules/translate-google/node_modules/type-fest": {
25414 "version": "1.4.0",
25415 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
25416 "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
25417 "engines": {
25418 "node": ">=10"
25419 },
25420 "funding": {
25421 "url": "https://github.com/sponsors/sindresorhus"
25422 }
25423 },
25424 "node_modules/translate-google/node_modules/unique-string": {
25425 "version": "3.0.0",
25426 "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz",
25427 "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==",
25428 "dependencies": {
25429 "crypto-random-string": "^4.0.0"
25430 },
25431 "engines": {
25432 "node": ">=12"
25433 },
25434 "funding": {
25435 "url": "https://github.com/sponsors/sindresorhus"
25436 }
25437 },
25438 "node_modules/translate-google/node_modules/write-file-atomic": {
25439 "version": "3.0.3",
25440 "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
25441 "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
25442 "dependencies": {
25443 "imurmurhash": "^0.1.4",
25444 "is-typedarray": "^1.0.0",
25445 "signal-exit": "^3.0.2",
25446 "typedarray-to-buffer": "^3.1.5"
25447 }
25448 },
25449 "node_modules/translate-google/node_modules/xdg-basedir": {
25450 "version": "5.1.0",
25451 "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz",
25452 "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==",
25453 "engines": {
25454 "node": ">=12"
25455 },
25456 "funding": {
25457 "url": "https://github.com/sponsors/sindresorhus"
25458 }
25459 },
25054 "node_modules/traverse": { 25460 "node_modules/traverse": {
25055 "version": "0.3.9", 25461 "version": "0.3.9",
25056 "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", 25462 "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
@@ -25068,6 +25474,11 @@
25068 "tree-kill": "cli.js" 25474 "tree-kill": "cli.js"
25069 } 25475 }
25070 }, 25476 },
25477 "node_modules/trim": {
25478 "version": "0.0.1",
25479 "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
25480 "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ=="
25481 },
25071 "node_modules/trim-newlines": { 25482 "node_modules/trim-newlines": {
25072 "version": "3.0.1", 25483 "version": "3.0.1",
25073 "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", 25484 "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
@@ -25415,7 +25826,6 @@
25415 "version": "3.1.5", 25826 "version": "3.1.5",
25416 "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 25827 "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
25417 "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 25828 "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
25418 "dev": true,
25419 "dependencies": { 25829 "dependencies": {
25420 "is-typedarray": "^1.0.0" 25830 "is-typedarray": "^1.0.0"
25421 } 25831 }
@@ -25479,6 +25889,19 @@
25479 "node": ">=0.10.0" 25889 "node": ">=0.10.0"
25480 } 25890 }
25481 }, 25891 },
25892 "node_modules/underscore": {
25893 "version": "1.13.4",
25894 "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz",
25895 "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ=="
25896 },
25897 "node_modules/underscore-keypath": {
25898 "version": "0.0.22",
25899 "resolved": "https://registry.npmjs.org/underscore-keypath/-/underscore-keypath-0.0.22.tgz",
25900 "integrity": "sha512-fU7aYj1J2LQd+jqdQ67AlCOZKK3Pl+VErS8fGYcgZG75XB9/bY+RLM+F2xEcKHhHNtLvqqFyXAoZQlLYfec3Xg==",
25901 "dependencies": {
25902 "underscore": "*"
25903 }
25904 },
25482 "node_modules/undertaker": { 25905 "node_modules/undertaker": {
25483 "version": "1.3.0", 25906 "version": "1.3.0",
25484 "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", 25907 "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz",
@@ -26010,6 +26433,15 @@
26010 "node": ">=0.10.0" 26433 "node": ">=0.10.0"
26011 } 26434 }
26012 }, 26435 },
26436 "node_modules/user-agents": {
26437 "version": "1.0.1099",
26438 "resolved": "https://registry.npmjs.org/user-agents/-/user-agents-1.0.1099.tgz",
26439 "integrity": "sha512-udTGqrQs7qbdOGfzFyZAvuRlx/TSZij3k+LRT7TnaWRfWkPGbDj/mIJRSe2BJfc9RXdbNO+qos6C9xdXXVi9kA==",
26440 "dependencies": {
26441 "dot-json": "^1.2.2",
26442 "lodash.clonedeep": "^4.5.0"
26443 }
26444 },
26013 "node_modules/useragent": { 26445 "node_modules/useragent": {
26014 "version": "2.3.0", 26446 "version": "2.3.0",
26015 "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", 26447 "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz",
@@ -30892,6 +31324,17 @@
30892 "@types/node": "*" 31324 "@types/node": "*"
30893 } 31325 }
30894 }, 31326 },
31327 "@types/cacheable-request": {
31328 "version": "6.0.2",
31329 "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
31330 "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
31331 "requires": {
31332 "@types/http-cache-semantics": "*",
31333 "@types/keyv": "*",
31334 "@types/node": "*",
31335 "@types/responselike": "*"
31336 }
31337 },
30895 "@types/color": { 31338 "@types/color": {
30896 "version": "3.0.3", 31339 "version": "3.0.3",
30897 "resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.3.tgz", 31340 "resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.3.tgz",
@@ -31037,6 +31480,11 @@
31037 "hoist-non-react-statics": "^3.3.0" 31480 "hoist-non-react-statics": "^3.3.0"
31038 } 31481 }
31039 }, 31482 },
31483 "@types/http-cache-semantics": {
31484 "version": "4.0.1",
31485 "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
31486 "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
31487 },
31040 "@types/http-proxy": { 31488 "@types/http-proxy": {
31041 "version": "1.17.9", 31489 "version": "1.17.9",
31042 "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", 31490 "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz",
@@ -31080,6 +31528,11 @@
31080 "pretty-format": "^28.0.0" 31528 "pretty-format": "^28.0.0"
31081 } 31529 }
31082 }, 31530 },
31531 "@types/json-buffer": {
31532 "version": "3.0.0",
31533 "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz",
31534 "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ=="
31535 },
31083 "@types/json-schema": { 31536 "@types/json-schema": {
31084 "version": "7.0.11", 31537 "version": "7.0.11",
31085 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", 31538 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
@@ -31098,6 +31551,14 @@
31098 "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", 31551 "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
31099 "dev": true 31552 "dev": true
31100 }, 31553 },
31554 "@types/keyv": {
31555 "version": "3.1.4",
31556 "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
31557 "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
31558 "requires": {
31559 "@types/node": "*"
31560 }
31561 },
31101 "@types/lodash": { 31562 "@types/lodash": {
31102 "version": "4.14.182", 31563 "version": "4.14.182",
31103 "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", 31564 "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz",
@@ -31147,8 +31608,7 @@
31147 "@types/node": { 31608 "@types/node": {
31148 "version": "16.11.33", 31609 "version": "16.11.33",
31149 "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.33.tgz", 31610 "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.33.tgz",
31150 "integrity": "sha512-0PJ0vg+JyU0MIan58IOIFRtSvsb7Ri+7Wltx2qAg94eMOrpg4+uuP3aUHCpxXc1i0jCXiC+zIamSZh3l9AbcQA==", 31611 "integrity": "sha512-0PJ0vg+JyU0MIan58IOIFRtSvsb7Ri+7Wltx2qAg94eMOrpg4+uuP3aUHCpxXc1i0jCXiC+zIamSZh3l9AbcQA=="
31151 "dev": true
31152 }, 31612 },
31153 "@types/normalize-package-data": { 31613 "@types/normalize-package-data": {
31154 "version": "2.4.1", 31614 "version": "2.4.1",
@@ -31215,6 +31675,14 @@
31215 "@types/react": "^17" 31675 "@types/react": "^17"
31216 } 31676 }
31217 }, 31677 },
31678 "@types/responselike": {
31679 "version": "1.0.0",
31680 "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
31681 "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
31682 "requires": {
31683 "@types/node": "*"
31684 }
31685 },
31218 "@types/retry": { 31686 "@types/retry": {
31219 "version": "0.12.0", 31687 "version": "0.12.0",
31220 "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", 31688 "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
@@ -33527,6 +33995,11 @@
33527 } 33995 }
33528 } 33996 }
33529 }, 33997 },
33998 "cacheable-lookup": {
33999 "version": "5.0.4",
34000 "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
34001 "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="
34002 },
33530 "cacheable-request": { 34003 "cacheable-request": {
33531 "version": "6.1.0", 34004 "version": "6.1.0",
33532 "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", 34005 "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
@@ -33965,7 +34438,6 @@
33965 "version": "1.0.2", 34438 "version": "1.0.2",
33966 "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", 34439 "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
33967 "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", 34440 "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==",
33968 "dev": true,
33969 "requires": { 34441 "requires": {
33970 "mimic-response": "^1.0.0" 34442 "mimic-response": "^1.0.0"
33971 } 34443 }
@@ -34166,6 +34638,22 @@
34166 "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", 34638 "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
34167 "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 34639 "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
34168 }, 34640 },
34641 "compress-brotli": {
34642 "version": "1.3.8",
34643 "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz",
34644 "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==",
34645 "requires": {
34646 "@types/json-buffer": "~3.0.0",
34647 "json-buffer": "~3.0.1"
34648 },
34649 "dependencies": {
34650 "json-buffer": {
34651 "version": "3.0.1",
34652 "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
34653 "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
34654 }
34655 }
34656 },
34169 "compressible": { 34657 "compressible": {
34170 "version": "2.0.18", 34658 "version": "2.0.18",
34171 "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", 34659 "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
@@ -34908,6 +35396,11 @@
34908 "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", 35396 "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
34909 "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==" 35397 "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q=="
34910 }, 35398 },
35399 "detect-indent": {
35400 "version": "6.0.0",
35401 "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz",
35402 "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA=="
35403 },
34911 "detect-libc": { 35404 "detect-libc": {
34912 "version": "2.0.1", 35405 "version": "2.0.1",
34913 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", 35406 "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
@@ -35031,6 +35524,11 @@
35031 "@leichtgewicht/ip-codec": "^2.0.1" 35524 "@leichtgewicht/ip-codec": "^2.0.1"
35032 } 35525 }
35033 }, 35526 },
35527 "docopt": {
35528 "version": "0.6.2",
35529 "resolved": "https://registry.npmjs.org/docopt/-/docopt-0.6.2.tgz",
35530 "integrity": "sha512-NqTbaYeE4gA/wU1hdKFdU+AFahpDOpgGLzHP42k6H6DKExJd0A55KEVWYhL9FEmHmgeLvEU2vuKXDuU+4yToOw=="
35531 },
35034 "doctrine": { 35532 "doctrine": {
35035 "version": "3.0.0", 35533 "version": "3.0.0",
35036 "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 35534 "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -35048,6 +35546,16 @@
35048 "@babel/runtime": "^7.1.2" 35546 "@babel/runtime": "^7.1.2"
35049 } 35547 }
35050 }, 35548 },
35549 "dot-json": {
35550 "version": "1.2.2",
35551 "resolved": "https://registry.npmjs.org/dot-json/-/dot-json-1.2.2.tgz",
35552 "integrity": "sha512-AKL+GsO4wSEU4LU+fAk/PqN4nQ6PB1vT3HpMiZous9xCzK5S0kh4DzfUY0EfU67jsIXLlu0ty71659N9Nmg+Tw==",
35553 "requires": {
35554 "detect-indent": "~6.0.0",
35555 "docopt": "~0.6.2",
35556 "underscore-keypath": "~0.0.22"
35557 }
35558 },
35051 "dot-prop": { 35559 "dot-prop": {
35052 "version": "5.3.0", 35560 "version": "5.3.0",
35053 "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", 35561 "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
@@ -38372,8 +38880,7 @@
38372 "http-cache-semantics": { 38880 "http-cache-semantics": {
38373 "version": "4.1.0", 38881 "version": "4.1.0",
38374 "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", 38882 "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
38375 "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", 38883 "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
38376 "devOptional": true
38377 }, 38884 },
38378 "http-deceiver": { 38885 "http-deceiver": {
38379 "version": "1.2.7", 38886 "version": "1.2.7",
@@ -38453,6 +38960,22 @@
38453 "sshpk": "^1.7.0" 38960 "sshpk": "^1.7.0"
38454 } 38961 }
38455 }, 38962 },
38963 "http2-wrapper": {
38964 "version": "1.0.3",
38965 "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
38966 "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
38967 "requires": {
38968 "quick-lru": "^5.1.1",
38969 "resolve-alpn": "^1.0.0"
38970 },
38971 "dependencies": {
38972 "quick-lru": {
38973 "version": "5.1.1",
38974 "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
38975 "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
38976 }
38977 }
38978 },
38456 "https-proxy-agent": { 38979 "https-proxy-agent": {
38457 "version": "5.0.1", 38980 "version": "5.0.1",
38458 "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", 38981 "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
@@ -38611,8 +39134,7 @@
38611 "imurmurhash": { 39134 "imurmurhash": {
38612 "version": "0.1.4", 39135 "version": "0.1.4",
38613 "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 39136 "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
38614 "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 39137 "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="
38615 "devOptional": true
38616 }, 39138 },
38617 "indent-string": { 39139 "indent-string": {
38618 "version": "3.2.0", 39140 "version": "3.2.0",
@@ -38988,6 +39510,11 @@
38988 } 39510 }
38989 } 39511 }
38990 }, 39512 },
39513 "is-keyword-js": {
39514 "version": "1.0.3",
39515 "resolved": "https://registry.npmjs.org/is-keyword-js/-/is-keyword-js-1.0.3.tgz",
39516 "integrity": "sha512-EW8wNCNvomPa/jsH1g0DmLfPakkRCRTcTML1v1fZMLiVCvQ/1YB+tKsRzShBiWQhqrYCi5a+WsepA4Z8TA9iaA=="
39517 },
38991 "is-lambda": { 39518 "is-lambda": {
38992 "version": "1.0.1", 39519 "version": "1.0.1",
38993 "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", 39520 "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
@@ -39042,8 +39569,7 @@
39042 "is-obj": { 39569 "is-obj": {
39043 "version": "2.0.0", 39570 "version": "2.0.0",
39044 "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", 39571 "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
39045 "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", 39572 "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
39046 "dev": true
39047 }, 39573 },
39048 "is-path-inside": { 39574 "is-path-inside": {
39049 "version": "3.0.3", 39575 "version": "3.0.3",
@@ -39131,8 +39657,7 @@
39131 "is-typedarray": { 39657 "is-typedarray": {
39132 "version": "1.0.0", 39658 "version": "1.0.0",
39133 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 39659 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
39134 "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", 39660 "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
39135 "devOptional": true
39136 }, 39661 },
39137 "is-unc-path": { 39662 "is-unc-path": {
39138 "version": "1.0.0", 39663 "version": "1.0.0",
@@ -39142,6 +39667,11 @@
39142 "unc-path-regex": "^0.1.2" 39667 "unc-path-regex": "^0.1.2"
39143 } 39668 }
39144 }, 39669 },
39670 "is-url": {
39671 "version": "1.2.4",
39672 "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
39673 "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww=="
39674 },
39145 "is-utf8": { 39675 "is-utf8": {
39146 "version": "0.2.1", 39676 "version": "0.2.1",
39147 "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 39677 "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
@@ -41244,8 +41774,7 @@
41244 "lodash.clonedeep": { 41774 "lodash.clonedeep": {
41245 "version": "4.5.0", 41775 "version": "4.5.0",
41246 "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", 41776 "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
41247 "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", 41777 "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ=="
41248 "dev": true
41249 }, 41778 },
41250 "lodash.debounce": { 41779 "lodash.debounce": {
41251 "version": "4.0.8", 41780 "version": "4.0.8",
@@ -41852,8 +42381,7 @@
41852 "mimic-response": { 42381 "mimic-response": {
41853 "version": "1.0.1", 42382 "version": "1.0.1",
41854 "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 42383 "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
41855 "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 42384 "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
41856 "dev": true
41857 }, 42385 },
41858 "min-indent": { 42386 "min-indent": {
41859 "version": "1.0.1", 42387 "version": "1.0.1",
@@ -42447,6 +42975,14 @@
42447 "set-blocking": "^2.0.0" 42975 "set-blocking": "^2.0.0"
42448 } 42976 }
42449 }, 42977 },
42978 "num-or-not": {
42979 "version": "1.0.1",
42980 "resolved": "https://registry.npmjs.org/num-or-not/-/num-or-not-1.0.1.tgz",
42981 "integrity": "sha512-IMyEpYE7hBjD/fKvZu7/jhy05scXUYy0KXOoKVjoFNU6di56wpGjCok3SoC9k51993v9N7GSLPf+9PuWq220cg==",
42982 "requires": {
42983 "trim": "0.0.1"
42984 }
42985 },
42450 "number-is-nan": { 42986 "number-is-nan": {
42451 "version": "1.0.1", 42987 "version": "1.0.1",
42452 "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 42988 "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
@@ -44824,6 +45360,11 @@
44824 "supports-preserve-symlinks-flag": "^1.0.0" 45360 "supports-preserve-symlinks-flag": "^1.0.0"
44825 } 45361 }
44826 }, 45362 },
45363 "resolve-alpn": {
45364 "version": "1.2.1",
45365 "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
45366 "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
45367 },
44827 "resolve-cwd": { 45368 "resolve-cwd": {
44828 "version": "3.0.0", 45369 "version": "3.0.0",
44829 "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", 45370 "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
@@ -44974,6 +45515,11 @@
44974 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 45515 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
44975 "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 45516 "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
44976 }, 45517 },
45518 "safe-eval": {
45519 "version": "0.4.1",
45520 "resolved": "https://registry.npmjs.org/safe-eval/-/safe-eval-0.4.1.tgz",
45521 "integrity": "sha512-wmiu4RSYVZ690RP1+cv/LxfPK1dIlEN35aW7iv4SMYdqDrHbkll4+NJcHmKm7PbCuI1df1otOcPwgcc2iFR85g=="
45522 },
44977 "safe-json-parse": { 45523 "safe-json-parse": {
44978 "version": "1.0.1", 45524 "version": "1.0.1",
44979 "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", 45525 "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz",
@@ -46860,6 +47406,192 @@
46860 "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 47406 "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
46861 "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 47407 "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
46862 }, 47408 },
47409 "translate-google": {
47410 "version": "1.5.0",
47411 "resolved": "https://registry.npmjs.org/translate-google/-/translate-google-1.5.0.tgz",
47412 "integrity": "sha512-wI/oX3U3t78PthVkvO7BdvKRcjb03JaUs53oAhs0NVmzFJUEm5ROiYWH7gomRHFZ5bL7LKxrFRx8Qy/l1eB46g==",
47413 "requires": {
47414 "configstore": "^6.0.0",
47415 "got": "^11.8.2",
47416 "is-keyword-js": "^1.0.3",
47417 "is-url": "^1.2.4",
47418 "lodash": "^4.17.21",
47419 "num-or-not": "^1.0.1",
47420 "safe-eval": "^0.4.1",
47421 "user-agents": "^1.0.779"
47422 },
47423 "dependencies": {
47424 "@sindresorhus/is": {
47425 "version": "4.6.0",
47426 "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
47427 "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="
47428 },
47429 "@szmarczak/http-timer": {
47430 "version": "4.0.6",
47431 "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
47432 "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
47433 "requires": {
47434 "defer-to-connect": "^2.0.0"
47435 }
47436 },
47437 "cacheable-request": {
47438 "version": "7.0.2",
47439 "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
47440 "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
47441 "requires": {
47442 "clone-response": "^1.0.2",
47443 "get-stream": "^5.1.0",
47444 "http-cache-semantics": "^4.0.0",
47445 "keyv": "^4.0.0",
47446 "lowercase-keys": "^2.0.0",
47447 "normalize-url": "^6.0.1",
47448 "responselike": "^2.0.0"
47449 }
47450 },
47451 "configstore": {
47452 "version": "6.0.0",
47453 "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz",
47454 "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==",
47455 "requires": {
47456 "dot-prop": "^6.0.1",
47457 "graceful-fs": "^4.2.6",
47458 "unique-string": "^3.0.0",
47459 "write-file-atomic": "^3.0.3",
47460 "xdg-basedir": "^5.0.1"
47461 }
47462 },
47463 "crypto-random-string": {
47464 "version": "4.0.0",
47465 "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz",
47466 "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==",
47467 "requires": {
47468 "type-fest": "^1.0.1"
47469 }
47470 },
47471 "decompress-response": {
47472 "version": "6.0.0",
47473 "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
47474 "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
47475 "requires": {
47476 "mimic-response": "^3.1.0"
47477 }
47478 },
47479 "defer-to-connect": {
47480 "version": "2.0.1",
47481 "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
47482 "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="
47483 },
47484 "dot-prop": {
47485 "version": "6.0.1",
47486 "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
47487 "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
47488 "requires": {
47489 "is-obj": "^2.0.0"
47490 }
47491 },
47492 "get-stream": {
47493 "version": "5.2.0",
47494 "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
47495 "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
47496 "requires": {
47497 "pump": "^3.0.0"
47498 }
47499 },
47500 "got": {
47501 "version": "11.8.5",
47502 "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz",
47503 "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==",
47504 "requires": {
47505 "@sindresorhus/is": "^4.0.0",
47506 "@szmarczak/http-timer": "^4.0.5",
47507 "@types/cacheable-request": "^6.0.1",
47508 "@types/responselike": "^1.0.0",
47509 "cacheable-lookup": "^5.0.3",
47510 "cacheable-request": "^7.0.2",
47511 "decompress-response": "^6.0.0",
47512 "http2-wrapper": "^1.0.0-beta.5.2",
47513 "lowercase-keys": "^2.0.0",
47514 "p-cancelable": "^2.0.0",
47515 "responselike": "^2.0.0"
47516 }
47517 },
47518 "json-buffer": {
47519 "version": "3.0.1",
47520 "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
47521 "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
47522 },
47523 "keyv": {
47524 "version": "4.3.3",
47525 "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.3.3.tgz",
47526 "integrity": "sha512-AcysI17RvakTh8ir03+a3zJr5r0ovnAH/XTXei/4HIv3bL2K/jzvgivLK9UuI/JbU1aJjM3NSAnVvVVd3n+4DQ==",
47527 "requires": {
47528 "compress-brotli": "^1.3.8",
47529 "json-buffer": "3.0.1"
47530 }
47531 },
47532 "lowercase-keys": {
47533 "version": "2.0.0",
47534 "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
47535 "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
47536 },
47537 "mimic-response": {
47538 "version": "3.1.0",
47539 "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
47540 "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
47541 },
47542 "p-cancelable": {
47543 "version": "2.1.1",
47544 "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
47545 "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="
47546 },
47547 "pump": {
47548 "version": "3.0.0",
47549 "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
47550 "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
47551 "requires": {
47552 "end-of-stream": "^1.1.0",
47553 "once": "^1.3.1"
47554 }
47555 },
47556 "responselike": {
47557 "version": "2.0.1",
47558 "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
47559 "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
47560 "requires": {
47561 "lowercase-keys": "^2.0.0"
47562 }
47563 },
47564 "type-fest": {
47565 "version": "1.4.0",
47566 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
47567 "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="
47568 },
47569 "unique-string": {
47570 "version": "3.0.0",
47571 "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz",
47572 "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==",
47573 "requires": {
47574 "crypto-random-string": "^4.0.0"
47575 }
47576 },
47577 "write-file-atomic": {
47578 "version": "3.0.3",
47579 "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
47580 "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
47581 "requires": {
47582 "imurmurhash": "^0.1.4",
47583 "is-typedarray": "^1.0.0",
47584 "signal-exit": "^3.0.2",
47585 "typedarray-to-buffer": "^3.1.5"
47586 }
47587 },
47588 "xdg-basedir": {
47589 "version": "5.1.0",
47590 "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz",
47591 "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ=="
47592 }
47593 }
47594 },
46863 "traverse": { 47595 "traverse": {
46864 "version": "0.3.9", 47596 "version": "0.3.9",
46865 "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", 47597 "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
@@ -46871,6 +47603,11 @@
46871 "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", 47603 "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
46872 "dev": true 47604 "dev": true
46873 }, 47605 },
47606 "trim": {
47607 "version": "0.0.1",
47608 "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
47609 "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ=="
47610 },
46874 "trim-newlines": { 47611 "trim-newlines": {
46875 "version": "3.0.1", 47612 "version": "3.0.1",
46876 "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", 47613 "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
@@ -47130,7 +47867,6 @@
47130 "version": "3.1.5", 47867 "version": "3.1.5",
47131 "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 47868 "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
47132 "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 47869 "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
47133 "dev": true,
47134 "requires": { 47870 "requires": {
47135 "is-typedarray": "^1.0.0" 47871 "is-typedarray": "^1.0.0"
47136 } 47872 }
@@ -47172,6 +47908,19 @@
47172 "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 47908 "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
47173 "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==" 47909 "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg=="
47174 }, 47910 },
47911 "underscore": {
47912 "version": "1.13.4",
47913 "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz",
47914 "integrity": "sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ=="
47915 },
47916 "underscore-keypath": {
47917 "version": "0.0.22",
47918 "resolved": "https://registry.npmjs.org/underscore-keypath/-/underscore-keypath-0.0.22.tgz",
47919 "integrity": "sha512-fU7aYj1J2LQd+jqdQ67AlCOZKK3Pl+VErS8fGYcgZG75XB9/bY+RLM+F2xEcKHhHNtLvqqFyXAoZQlLYfec3Xg==",
47920 "requires": {
47921 "underscore": "*"
47922 }
47923 },
47175 "undertaker": { 47924 "undertaker": {
47176 "version": "1.3.0", 47925 "version": "1.3.0",
47177 "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", 47926 "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz",
@@ -47581,6 +48330,15 @@
47581 "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", 48330 "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
47582 "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" 48331 "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
47583 }, 48332 },
48333 "user-agents": {
48334 "version": "1.0.1099",
48335 "resolved": "https://registry.npmjs.org/user-agents/-/user-agents-1.0.1099.tgz",
48336 "integrity": "sha512-udTGqrQs7qbdOGfzFyZAvuRlx/TSZij3k+LRT7TnaWRfWkPGbDj/mIJRSe2BJfc9RXdbNO+qos6C9xdXXVi9kA==",
48337 "requires": {
48338 "dot-json": "^1.2.2",
48339 "lodash.clonedeep": "^4.5.0"
48340 }
48341 },
47584 "useragent": { 48342 "useragent": {
47585 "version": "2.3.0", 48343 "version": "2.3.0",
47586 "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", 48344 "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz",
diff --git a/package.json b/package.json
index d7f1fba89..863db5413 100644
--- a/package.json
+++ b/package.json
@@ -117,6 +117,7 @@
117 "semver": "7.3.7", 117 "semver": "7.3.7",
118 "sqlite3": "5.0.8", 118 "sqlite3": "5.0.8",
119 "tar": "6.1.11", 119 "tar": "6.1.11",
120 "translate-google": "1.5.0",
120 "tslib": "2.4.0", 121 "tslib": "2.4.0",
121 "useragent-generator": "1.1.1-amkt-22079-finish.0", 122 "useragent-generator": "1.1.1-amkt-22079-finish.0",
122 "uuid": "8.3.2", 123 "uuid": "8.3.2",
diff --git a/src/@types/stores.types.ts b/src/@types/stores.types.ts
index eec18c11e..13870a43a 100644
--- a/src/@types/stores.types.ts
+++ b/src/@types/stores.types.ts
@@ -90,6 +90,7 @@ interface AppStore extends TypedStore {
90 darkMode: boolean; 90 darkMode: boolean;
91 dictionaries: []; 91 dictionaries: [];
92 enableSpellchecking: boolean; 92 enableSpellchecking: boolean;
93 enableTranslator: boolean;
93 fetchDataInterval: 4; 94 fetchDataInterval: 4;
94 get(key: string): any; 95 get(key: string): any;
95 getAppCacheSizeRequest: () => void; 96 getAppCacheSizeRequest: () => void;
@@ -106,6 +107,8 @@ interface AppStore extends TypedStore {
106 reloadAfterResume: boolean; 107 reloadAfterResume: boolean;
107 reloadAfterResumeTime: number; 108 reloadAfterResumeTime: number;
108 searchEngine: string; 109 searchEngine: string;
110 translatorEngine: string;
111 translatorLanguage: string;
109 spellcheckerLanguage: string; 112 spellcheckerLanguage: string;
110 splitMode: boolean; 113 splitMode: boolean;
111 splitColumns: number; 114 splitColumns: number;
diff --git a/src/components/settings/settings/EditSettingsForm.jsx b/src/components/settings/settings/EditSettingsForm.jsx
index 0e5be38ed..e6cba922b 100644
--- a/src/components/settings/settings/EditSettingsForm.jsx
+++ b/src/components/settings/settings/EditSettingsForm.jsx
@@ -870,12 +870,24 @@ class EditSettingsForm extends Component {
870 {intl.formatMessage(messages.spellCheckerLanguageInfo)} 870 {intl.formatMessage(messages.spellCheckerLanguageInfo)}
871 </p> 871 </p>
872 )} 872 )}
873
873 <p className="settings__help"> 874 <p className="settings__help">
874 {intl.formatMessage(messages.appRestartRequired)} 875 {intl.formatMessage(messages.appRestartRequired)}
875 </p> 876 </p>
876 877
877 <Hr /> 878 <Hr />
878 879
880 <Toggle field={form.$('enableTranslator')} />
881
882 {form.$('enableTranslator').value && (
883 <Select field={form.$('translatorEngine')} />
884 )}
885 {form.$('enableTranslator').value && (
886 <Select field={form.$('translatorLanguage')} />
887 )}
888
889 <Hr />
890
879 <a 891 <a
880 href={FERDIUM_TRANSLATION} 892 href={FERDIUM_TRANSLATION}
881 target="_blank" 893 target="_blank"
diff --git a/src/config.ts b/src/config.ts
index 150b7101d..c8cb09d84 100644
--- a/src/config.ts
+++ b/src/config.ts
@@ -24,6 +24,8 @@ export const LIVE_WS_API = 'wss://api.franzinfra.com';
24export const LOCAL_API_WEBSITE = 'http://localhost:3333'; 24export const LOCAL_API_WEBSITE = 'http://localhost:3333';
25export const DEV_API_FRANZ_WEBSITE = 'https://meetfranz.com'; 25export const DEV_API_FRANZ_WEBSITE = 'https://meetfranz.com';
26export const LIVE_API_FERDIUM_WEBSITE = 'https://ferdium.org'; 26export const LIVE_API_FERDIUM_WEBSITE = 'https://ferdium.org';
27export const LIVE_API_FERDIUM_LIBRETRANSLATE =
28 'https://translator.ferdium.org/translate';
27 29
28export const STATS_API = 'https://stats.franzinfra.com'; 30export const STATS_API = 'https://stats.franzinfra.com';
29 31
@@ -84,6 +86,140 @@ export const SEARCH_ENGINE_NAMES = {
84 [SEARCH_ENGINE_DDG]: 'DuckDuckGo', 86 [SEARCH_ENGINE_DDG]: 'DuckDuckGo',
85}; 87};
86 88
89export const TRANSLATOR_ENGINE_GOOGLE = 'Google';
90export const TRANSLATOR_ENGINE_LIBRETRANSLATE = 'LibreTranslate';
91export const TRANSLATOR_ENGINE_NAMES = {
92 [TRANSLATOR_ENGINE_LIBRETRANSLATE]:
93 'Ferdium Translator (Powered by LibreTranslate)',
94 [TRANSLATOR_ENGINE_GOOGLE]: 'Google',
95};
96
97export const LIBRETRANSLATE_TRANSLATOR_LANGUAGES = {
98 ar: 'Arabic',
99 zh: 'Chinese',
100 en: 'English',
101 fr: 'French',
102 de: 'German',
103 hi: 'Hindi',
104 id: 'Indonesian',
105 ga: 'Irish',
106 it: 'Italian',
107 ja: 'Japanese',
108 ko: 'Korean',
109 pl: 'Polish',
110 pt: 'Portuguese',
111 ru: 'Russian',
112 es: 'Spanish',
113 tr: 'Turkish',
114 vi: 'Vietnamese',
115};
116
117export const GOOGLE_TRANSLATOR_LANGUAGES = {
118 af: 'Afrikaans',
119 sq: 'Albanian',
120 ar: 'Arabic',
121 hy: 'Armenian',
122 az: 'Azerbaijani',
123 eu: 'Basque',
124 be: 'Belarusian',
125 bn: 'Bengali',
126 bs: 'Bosnian',
127 bg: 'Bulgarian',
128 ca: 'Catalan',
129 ceb: 'Cebuano',
130 ny: 'Chichewa',
131 'zh-cn': 'Chinese Simplified',
132 'zh-tw': 'Chinese Traditional',
133 co: 'Corsican',
134 hr: 'Croatian',
135 cs: 'Czech',
136 da: 'Danish',
137 nl: 'Dutch',
138 en: 'English',
139 eo: 'Esperanto',
140 et: 'Estonian',
141 tl: 'Filipino',
142 fi: 'Finnish',
143 fr: 'French',
144 fy: 'Frisian',
145 gl: 'Galician',
146 ka: 'Georgian',
147 de: 'German',
148 el: 'Greek',
149 gu: 'Gujarati',
150 ht: 'Haitian Creole',
151 ha: 'Hausa',
152 haw: 'Hawaiian',
153 iw: 'Hebrew',
154 hi: 'Hindi',
155 hmn: 'Hmong',
156 hu: 'Hungarian',
157 is: 'Icelandic',
158 ig: 'Igbo',
159 id: 'Indonesian',
160 ga: 'Irish',
161 it: 'Italian',
162 ja: 'Japanese',
163 jw: 'Javanese',
164 kn: 'Kannada',
165 kk: 'Kazakh',
166 km: 'Khmer',
167 ko: 'Korean',
168 ku: 'Kurdish (Kurmanji)',
169 ky: 'Kyrgyz',
170 lo: 'Lao',
171 la: 'Latin',
172 lv: 'Latvian',
173 lt: 'Lithuanian',
174 lb: 'Luxembourgish',
175 mk: 'Macedonian',
176 mg: 'Malagasy',
177 ms: 'Malay',
178 ml: 'Malayalam',
179 mt: 'Maltese',
180 mi: 'Maori',
181 mr: 'Marathi',
182 mn: 'Mongolian',
183 my: 'Myanmar (Burmese)',
184 ne: 'Nepali',
185 no: 'Norwegian',
186 ps: 'Pashto',
187 fa: 'Persian',
188 pl: 'Polish',
189 pt: 'Portuguese',
190 ma: 'Punjabi',
191 ro: 'Romanian',
192 ru: 'Russian',
193 sm: 'Samoan',
194 gd: 'Scots Gaelic',
195 sr: 'Serbian',
196 st: 'Sesotho',
197 sn: 'Shona',
198 sd: 'Sindhi',
199 si: 'Sinhala',
200 sk: 'Slovak',
201 sl: 'Slovenian',
202 so: 'Somali',
203 es: 'Spanish',
204 su: 'Sudanese',
205 sw: 'Swahili',
206 sv: 'Swedish',
207 tg: 'Tajik',
208 ta: 'Tamil',
209 te: 'Telugu',
210 th: 'Thai',
211 tr: 'Turkish',
212 uk: 'Ukrainian',
213 ur: 'Urdu',
214 uz: 'Uzbek',
215 vi: 'Vietnamese',
216 cy: 'Welsh',
217 xh: 'Xhosa',
218 yi: 'Yiddish',
219 yo: 'Yoruba',
220 zu: 'Zulu',
221};
222
87export const SEARCH_ENGINE_URLS = { 223export const SEARCH_ENGINE_URLS = {
88 [SEARCH_ENGINE_STARTPAGE]: ({ searchTerm }) => 224 [SEARCH_ENGINE_STARTPAGE]: ({ searchTerm }) =>
89 `https://www.startpage.com/sp/search?query=${searchTerm}`, 225 `https://www.startpage.com/sp/search?query=${searchTerm}`,
@@ -222,6 +358,7 @@ export const DEFAULT_APP_SETTINGS = {
222 showMessageBadgeWhenMuted: true, 358 showMessageBadgeWhenMuted: true,
223 showDragArea: false, 359 showDragArea: false,
224 enableSpellchecking: true, 360 enableSpellchecking: true,
361 enableTranslator: false,
225 spellcheckerLanguage: 'en-us', 362 spellcheckerLanguage: 'en-us',
226 darkMode: false, 363 darkMode: false,
227 navigationBarManualActive: false, 364 navigationBarManualActive: false,
@@ -261,6 +398,8 @@ export const DEFAULT_APP_SETTINGS = {
261 iconSize: iconSizeBias, 398 iconSize: iconSizeBias,
262 navigationBarBehaviour: 'custom', 399 navigationBarBehaviour: 'custom',
263 searchEngine: SEARCH_ENGINE_STARTPAGE, 400 searchEngine: SEARCH_ENGINE_STARTPAGE,
401 translatorLanguage: 'en',
402 translatorEngine: TRANSLATOR_ENGINE_LIBRETRANSLATE,
264 useHorizontalStyle: false, 403 useHorizontalStyle: false,
265 hideCollapseButton: false, 404 hideCollapseButton: false,
266 isMenuCollapsed: false, 405 isMenuCollapsed: false,
diff --git a/src/containers/settings/EditSettingsScreen.tsx b/src/containers/settings/EditSettingsScreen.tsx
index fbbed629a..a4d7ba0eb 100644
--- a/src/containers/settings/EditSettingsScreen.tsx
+++ b/src/containers/settings/EditSettingsScreen.tsx
@@ -15,6 +15,10 @@ import {
15 ICON_SIZES, 15 ICON_SIZES,
16 NAVIGATION_BAR_BEHAVIOURS, 16 NAVIGATION_BAR_BEHAVIOURS,
17 SEARCH_ENGINE_NAMES, 17 SEARCH_ENGINE_NAMES,
18 TRANSLATOR_ENGINE_NAMES,
19 GOOGLE_TRANSLATOR_LANGUAGES,
20 TRANSLATOR_ENGINE_GOOGLE,
21 LIBRETRANSLATE_TRANSLATOR_LANGUAGES,
18 TODO_APPS, 22 TODO_APPS,
19 DEFAULT_SETTING_KEEP_ALL_WORKSPACES_LOADED, 23 DEFAULT_SETTING_KEEP_ALL_WORKSPACES_LOADED,
20 DEFAULT_IS_FEATURE_ENABLED_BY_USER, 24 DEFAULT_IS_FEATURE_ENABLED_BY_USER,
@@ -103,6 +107,14 @@ const messages = defineMessages({
103 id: 'settings.app.form.searchEngine', 107 id: 'settings.app.form.searchEngine',
104 defaultMessage: 'Search engine', 108 defaultMessage: 'Search engine',
105 }, 109 },
110 translatorEngine: {
111 id: 'settings.app.form.translatorEngine',
112 defaultMessage: 'Translator Engine',
113 },
114 translatorLanguage: {
115 id: 'settings.app.form.translatorLanguage',
116 defaultMessage: 'Default Translator language',
117 },
106 hibernateOnStartup: { 118 hibernateOnStartup: {
107 id: 'settings.app.form.hibernateOnStartup', 119 id: 'settings.app.form.hibernateOnStartup',
108 defaultMessage: 'Keep services in hibernation on startup', 120 defaultMessage: 'Keep services in hibernation on startup',
@@ -267,6 +279,10 @@ const messages = defineMessages({
267 id: 'settings.app.form.enableSpellchecking', 279 id: 'settings.app.form.enableSpellchecking',
268 defaultMessage: 'Enable spell checking', 280 defaultMessage: 'Enable spell checking',
269 }, 281 },
282 enableTranslator: {
283 id: 'settings.app.form.enableTranslator',
284 defaultMessage: 'Enable Translator',
285 },
270 enableGPUAcceleration: { 286 enableGPUAcceleration: {
271 id: 'settings.app.form.enableGPUAcceleration', 287 id: 'settings.app.form.enableGPUAcceleration',
272 defaultMessage: 'Enable GPU Acceleration', 288 defaultMessage: 'Enable GPU Acceleration',
@@ -342,6 +358,8 @@ class EditSettingsScreen extends Component<EditSettingsScreenProps> {
342 notifyTaskBarOnMessage: Boolean(settingsData.notifyTaskBarOnMessage), 358 notifyTaskBarOnMessage: Boolean(settingsData.notifyTaskBarOnMessage),
343 navigationBarBehaviour: settingsData.navigationBarBehaviour, 359 navigationBarBehaviour: settingsData.navigationBarBehaviour,
344 searchEngine: settingsData.searchEngine, 360 searchEngine: settingsData.searchEngine,
361 translatorEngine: settingsData.translatorEngine,
362 translatorLanguage: settingsData.translatorLanguage,
345 hibernateOnStartup: Boolean(settingsData.hibernateOnStartup), 363 hibernateOnStartup: Boolean(settingsData.hibernateOnStartup),
346 hibernationStrategy: Number(settingsData.hibernationStrategy), 364 hibernationStrategy: Number(settingsData.hibernationStrategy),
347 wakeUpStrategy: Number(settingsData.wakeUpStrategy), 365 wakeUpStrategy: Number(settingsData.wakeUpStrategy),
@@ -394,6 +412,7 @@ class EditSettingsScreen extends Component<EditSettingsScreenProps> {
394 ), 412 ),
395 showDragArea: Boolean(settingsData.showDragArea), 413 showDragArea: Boolean(settingsData.showDragArea),
396 enableSpellchecking: Boolean(settingsData.enableSpellchecking), 414 enableSpellchecking: Boolean(settingsData.enableSpellchecking),
415 enableTranslator: Boolean(settingsData.enableTranslator),
397 spellcheckerLanguage: settingsData.spellcheckerLanguage, 416 spellcheckerLanguage: settingsData.spellcheckerLanguage,
398 userAgentPref: settingsData.userAgentPref, 417 userAgentPref: settingsData.userAgentPref,
399 beta: Boolean(settingsData.beta), // we need this info in the main process as well 418 beta: Boolean(settingsData.beta), // we need this info in the main process as well
@@ -451,6 +470,16 @@ class EditSettingsScreen extends Component<EditSettingsScreenProps> {
451 sort: false, 470 sort: false,
452 }); 471 });
453 472
473 const translatorEngines = getSelectOptions({
474 locales: TRANSLATOR_ENGINE_NAMES,
475 sort: false,
476 });
477
478 const translatorLanguages = getSelectOptions({
479 locales: LIBRETRANSLATE_TRANSLATOR_LANGUAGES,
480 sort: false,
481 });
482
454 const hibernationStrategies = getSelectOptions({ 483 const hibernationStrategies = getSelectOptions({
455 locales: HIBERNATION_STRATEGIES, 484 locales: HIBERNATION_STRATEGIES,
456 sort: false, 485 sort: false,
@@ -574,6 +603,18 @@ class EditSettingsScreen extends Component<EditSettingsScreenProps> {
574 default: DEFAULT_APP_SETTINGS.searchEngine, 603 default: DEFAULT_APP_SETTINGS.searchEngine,
575 options: searchEngines, 604 options: searchEngines,
576 }, 605 },
606 translatorEngine: {
607 label: intl.formatMessage(messages.translatorEngine),
608 value: settings.all.app.translatorEngine,
609 default: DEFAULT_APP_SETTINGS.translatorEngine,
610 options: translatorEngines,
611 },
612 translatorLanguage: {
613 label: intl.formatMessage(messages.translatorLanguage),
614 value: settings.all.app.translatorLanguage,
615 default: DEFAULT_APP_SETTINGS.translatorLanguage,
616 options: translatorLanguages,
617 },
577 hibernateOnStartup: { 618 hibernateOnStartup: {
578 label: intl.formatMessage(messages.hibernateOnStartup), 619 label: intl.formatMessage(messages.hibernateOnStartup),
579 value: settings.all.app.hibernateOnStartup, 620 value: settings.all.app.hibernateOnStartup,
@@ -677,6 +718,11 @@ class EditSettingsScreen extends Component<EditSettingsScreenProps> {
677 value: settings.all.app.enableSpellchecking, 718 value: settings.all.app.enableSpellchecking,
678 default: DEFAULT_APP_SETTINGS.enableSpellchecking, 719 default: DEFAULT_APP_SETTINGS.enableSpellchecking,
679 }, 720 },
721 enableTranslator: {
722 label: intl.formatMessage(messages.enableTranslator),
723 value: settings.all.app.enableTranslator,
724 default: DEFAULT_APP_SETTINGS.enableTranslator,
725 },
680 spellcheckerLanguage: { 726 spellcheckerLanguage: {
681 label: intl.formatMessage(globalMessages.spellcheckerLanguage), 727 label: intl.formatMessage(globalMessages.spellcheckerLanguage),
682 value: settings.all.app.spellcheckerLanguage, 728 value: settings.all.app.spellcheckerLanguage,
@@ -828,6 +874,14 @@ class EditSettingsScreen extends Component<EditSettingsScreenProps> {
828 }, 874 },
829 }; 875 };
830 876
877 if (settings.app.translatorEngine === TRANSLATOR_ENGINE_GOOGLE) {
878 const translatorGoogleLanguages = getSelectOptions({
879 locales: GOOGLE_TRANSLATOR_LANGUAGES,
880 sort: false,
881 });
882 config.fields.translatorLanguage.options = translatorGoogleLanguages;
883 }
884
831 if (workspaces.isFeatureActive) { 885 if (workspaces.isFeatureActive) {
832 config.fields.keepAllWorkspacesLoaded = { 886 config.fields.keepAllWorkspacesLoaded = {
833 label: intl.formatMessage(messages.keepAllWorkspacesLoaded), 887 label: intl.formatMessage(messages.keepAllWorkspacesLoaded),
diff --git a/src/helpers/translation-helpers.ts b/src/helpers/translation-helpers.ts
new file mode 100644
index 000000000..215b2a49c
--- /dev/null
+++ b/src/helpers/translation-helpers.ts
@@ -0,0 +1,47 @@
1import fetch from 'node-fetch';
2import translateGoogle from 'translate-google';
3import { LIVE_API_FERDIUM_LIBRETRANSLATE } from '../config';
4
5export async function translateTo(
6 text: string,
7 translateToLanguage: string,
8 translatorEngine: string,
9): Promise<{ text: string; error: boolean }> {
10 const errorText =
11 // TODO: Need to support i18n
12 'FERDIUM ERROR: An error occured. Please select less text to translate or try again later.';
13
14 if (translatorEngine === 'Google') {
15 try {
16 const res = await translateGoogle(text, {
17 to: translateToLanguage,
18 });
19
20 return { text: res, error: false };
21 } catch {
22 return { text: errorText, error: true };
23 }
24 } else if (translatorEngine === 'LibreTranslate') {
25 try {
26 const res = await fetch(LIVE_API_FERDIUM_LIBRETRANSLATE, {
27 method: 'POST',
28 body: JSON.stringify({
29 q: text,
30 source: 'auto',
31 target: translateToLanguage,
32 }),
33 headers: {
34 'Content-Type': 'application/json',
35 },
36 });
37
38 const response = await res.json();
39
40 return { text: response.translatedText, error: false };
41 } catch {
42 return { text: errorText, error: true };
43 }
44 }
45
46 return { text: errorText, error: true };
47}
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index a98bc2f77..4dc8bad82 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -219,6 +219,7 @@
219 "settings.app.form.enableSpellchecking": "Enable spell checking", 219 "settings.app.form.enableSpellchecking": "Enable spell checking",
220 "settings.app.form.enableSystemTray": "Always show Ferdium in System Tray", 220 "settings.app.form.enableSystemTray": "Always show Ferdium in System Tray",
221 "settings.app.form.enableTodos": "Enable Ferdium Todos", 221 "settings.app.form.enableTodos": "Enable Ferdium Todos",
222 "settings.app.form.enableTranslator": "Enable Translator",
222 "settings.app.form.grayscaleServicesDim": "Grayscale dim level", 223 "settings.app.form.grayscaleServicesDim": "Grayscale dim level",
223 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup", 224 "settings.app.form.hibernateOnStartup": "Keep services in hibernation on startup",
224 "settings.app.form.hibernationStrategy": "Hibernation strategy", 225 "settings.app.form.hibernationStrategy": "Hibernation strategy",
@@ -256,6 +257,8 @@
256 "settings.app.form.splitColumns": "Number of columns", 257 "settings.app.form.splitColumns": "Number of columns",
257 "settings.app.form.splitMode": "Enable Split View Mode", 258 "settings.app.form.splitMode": "Enable Split View Mode",
258 "settings.app.form.startMinimized": "Start minimized", 259 "settings.app.form.startMinimized": "Start minimized",
260 "settings.app.form.translatorEngine": "Translator Engine",
261 "settings.app.form.translatorLanguage": "Default Translator language",
259 "settings.app.form.universalDarkMode": "Enable universal Dark Mode", 262 "settings.app.form.universalDarkMode": "Enable universal Dark Mode",
260 "settings.app.form.useGrayscaleServices": "Use grayscale services", 263 "settings.app.form.useGrayscaleServices": "Use grayscale services",
261 "settings.app.form.useHorizontalStyle": "Use horizontal style", 264 "settings.app.form.useHorizontalStyle": "Use horizontal style",
diff --git a/src/index.ts b/src/index.ts
index 05e222a25..7c80ca955 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -45,6 +45,7 @@ import './electron/exception';
45import { asarPath } from './helpers/asar-helpers'; 45import { asarPath } from './helpers/asar-helpers';
46import { openExternalUrl } from './helpers/url-helpers'; 46import { openExternalUrl } from './helpers/url-helpers';
47import userAgent from './helpers/userAgent-helpers'; 47import userAgent from './helpers/userAgent-helpers';
48import { translateTo } from './helpers/translation-helpers';
48 49
49const debug = require('./preload-safe-debug')('Ferdium:App'); 50const debug = require('./preload-safe-debug')('Ferdium:App');
50 51
@@ -500,6 +501,18 @@ app.on('login', (event, _webContents, _request, authInfo, callback) => {
500 } 501 }
501}); 502});
502 503
504ipcMain.handle(
505 'translate',
506 async (_e, { text, translateToLanguage, translatorEngine }) => {
507 const response = await translateTo(
508 text,
509 translateToLanguage,
510 translatorEngine,
511 );
512 return response;
513 },
514);
515
503// TODO: evaluate if we need to store the authCallback for every service 516// TODO: evaluate if we need to store the authCallback for every service
504ipcMain.on('feature-basic-auth-credentials', (_e, { user, password }) => { 517ipcMain.on('feature-basic-auth-credentials', (_e, { user, password }) => {
505 debug('Received basic auth credentials', user, '********'); 518 debug('Received basic auth credentials', user, '********');
diff --git a/src/models/IContextMenuParams.ts b/src/models/IContextMenuParams.ts
new file mode 100644
index 000000000..c661b4595
--- /dev/null
+++ b/src/models/IContextMenuParams.ts
@@ -0,0 +1,7 @@
1export default interface IContextMenuParams extends Electron.ContextMenuParams {
2 enableTranslator: boolean;
3 clipboardNotifications: boolean;
4 searchEngine: string;
5 translatorEngine: string;
6 translatorLanguage: string;
7}
diff --git a/src/stores/ServicesStore.ts b/src/stores/ServicesStore.ts
index 83ec7d18e..00cf33b17 100644
--- a/src/stores/ServicesStore.ts
+++ b/src/stores/ServicesStore.ts
@@ -158,6 +158,13 @@ export default class ServicesStore extends TypedStore {
158 ); 158 );
159 159
160 reaction( 160 reaction(
161 () => this.stores.settings.app.enableTranslator,
162 () => {
163 this._shareSettingsWithServiceProcess();
164 },
165 );
166
167 reaction(
161 () => this.stores.settings.app.spellcheckerLanguage, 168 () => this.stores.settings.app.spellcheckerLanguage,
162 () => { 169 () => {
163 this._shareSettingsWithServiceProcess(); 170 this._shareSettingsWithServiceProcess();
@@ -207,6 +214,20 @@ export default class ServicesStore extends TypedStore {
207 ); 214 );
208 215
209 reaction( 216 reaction(
217 () => this.stores.settings.app.translatorEngine,
218 () => {
219 this._shareSettingsWithServiceProcess();
220 },
221 );
222
223 reaction(
224 () => this.stores.settings.app.translatorLanguage,
225 () => {
226 this._shareSettingsWithServiceProcess();
227 },
228 );
229
230 reaction(
210 () => this.stores.settings.app.clipboardNotifications, 231 () => this.stores.settings.app.clipboardNotifications,
211 () => { 232 () => {
212 this._shareSettingsWithServiceProcess(); 233 this._shareSettingsWithServiceProcess();
diff --git a/src/webview/contextMenu.ts b/src/webview/contextMenu.ts
index 72f927ef4..61771854f 100644
--- a/src/webview/contextMenu.ts
+++ b/src/webview/contextMenu.ts
@@ -9,6 +9,9 @@ export default async function setupContextMenu(
9 getSpellcheckerLanguage: () => void, 9 getSpellcheckerLanguage: () => void,
10 getSearchEngine: () => void, 10 getSearchEngine: () => void,
11 getClipboardNotifications: () => void, 11 getClipboardNotifications: () => void,
12 getEnableTranslator: () => void,
13 getTranslatorEngine: () => void,
14 getTranslatorLanguage: () => void,
12) { 15) {
13 const contextMenuBuilder = new ContextMenuBuilder(webContents); 16 const contextMenuBuilder = new ContextMenuBuilder(webContents);
14 17
@@ -19,6 +22,9 @@ export default async function setupContextMenu(
19 ...props, 22 ...props,
20 searchEngine: getSearchEngine(), 23 searchEngine: getSearchEngine(),
21 clipboardNotifications: getClipboardNotifications(), 24 clipboardNotifications: getClipboardNotifications(),
25 enableTranslator: getEnableTranslator(),
26 translatorEngine: getTranslatorEngine(),
27 translatorLanguage: getTranslatorLanguage(),
22 }, 28 },
23 // @ts-expect-error Expected 1 arguments, but got 4. 29 // @ts-expect-error Expected 1 arguments, but got 4.
24 isSpellcheckEnabled(), 30 isSpellcheckEnabled(),
diff --git a/src/webview/contextMenuBuilder.ts b/src/webview/contextMenuBuilder.ts
index 7bd86556e..2e64977c1 100644
--- a/src/webview/contextMenuBuilder.ts
+++ b/src/webview/contextMenuBuilder.ts
@@ -11,8 +11,16 @@ import { clipboard, ipcRenderer, nativeImage, WebContents } from 'electron';
11import { Menu, MenuItem } from '@electron/remote'; 11import { Menu, MenuItem } from '@electron/remote';
12import { cmdOrCtrlShortcutKey, isMac } from '../environment'; 12import { cmdOrCtrlShortcutKey, isMac } from '../environment';
13 13
14import { SEARCH_ENGINE_NAMES, SEARCH_ENGINE_URLS } from '../config'; 14import {
15 SEARCH_ENGINE_NAMES,
16 SEARCH_ENGINE_URLS,
17 GOOGLE_TRANSLATOR_LANGUAGES,
18 TRANSLATOR_ENGINE_GOOGLE,
19 TRANSLATOR_ENGINE_LIBRETRANSLATE,
20 LIBRETRANSLATE_TRANSLATOR_LANGUAGES,
21} from '../config';
15import { openExternalUrl } from '../helpers/url-helpers'; 22import { openExternalUrl } from '../helpers/url-helpers';
23import IContextMenuParams from '../models/IContextMenuParams';
16 24
17function matchesWord(string: string) { 25function matchesWord(string: string) {
18 const regex = 26 const regex =
@@ -21,6 +29,83 @@ function matchesWord(string: string) {
21 return string.match(regex); 29 return string.match(regex);
22} 30}
23 31
32function childOf(node, ancestor) {
33 let child = node;
34 while (child !== null) {
35 if (child === ancestor) return true;
36 child = child.parentNode;
37 }
38 return false;
39}
40
41function translatePopup(res, isError: boolean = false) {
42 const elementExists = document.querySelector('#container-ferdium-translator');
43 if (elementExists) {
44 elementExists.remove();
45 }
46
47 const style = document.createElement('style');
48 style.innerHTML = `
49 .container-ferdium-translator {
50 position: fixed;
51 opacity: 0.9;
52 z-index: 999999;
53 ${
54 isError
55 ? `background: rgb(255 37 37);`
56 : `background: rgb(131 131 131);`
57 }
58 border-radius: 8px;
59 top: 5%;
60 left: 50%;
61 transform: translate(-50%, -5%);
62 display: flex;
63 flex-direction: row;
64 -webkit-box-shadow: 0px 10px 13px -7px #000000, 5px 5px 13px 9px rgba(0,0,0,0);
65 overflow: auto;
66 max-height: 95%;
67 max-width: 90%;
68 width: max-content;
69 height: max-content;
70 -webkit-animation: scale-up-center 0.4s cubic-bezier(0.390, 0.575, 0.565, 1.000) both;
71 }
72 .container-ferdium-translator > p {
73 color: white;
74 margin: 10px;
75 text-align: justify;
76 }
77
78 @-webkit-keyframes scale-up-center {
79 0% {
80 -webkit-transform: translate(-50%, -50%) scale(0.5);
81 }
82 100% {
83 -webkit-transform: translate(-50%, -50%) scale(1);
84 }
85 }
86 `;
87 document.head.append(style);
88
89 const para = document.createElement('p');
90
91 const node = document.createTextNode(res);
92 para.append(node);
93
94 const div = document.createElement('div');
95 div.setAttribute('id', 'container-ferdium-translator');
96 div.setAttribute('class', 'container-ferdium-translator');
97
98 div.append(para);
99
100 document.body.insertBefore(div, document.body.firstChild);
101
102 document.addEventListener('click', e => {
103 if (div !== e.target && !childOf(e.target, div)) {
104 div?.remove();
105 }
106 });
107}
108
24interface ContextMenuStringTable { 109interface ContextMenuStringTable {
25 lookUpDefinition: ({ word }: { word: string }) => string; 110 lookUpDefinition: ({ word }: { word: string }) => string;
26 cut: () => string; 111 cut: () => string;
@@ -28,6 +113,17 @@ interface ContextMenuStringTable {
28 paste: () => string; 113 paste: () => string;
29 pasteAndMatchStyle: () => string; 114 pasteAndMatchStyle: () => string;
30 searchWith: ({ searchEngine }: { searchEngine: string }) => string; 115 searchWith: ({ searchEngine }: { searchEngine: string }) => string;
116 translate: () => string;
117 quickTranslate: ({
118 translatorLanguage,
119 }: {
120 translatorLanguage: string;
121 }) => string;
122 translateLanguage: ({
123 translatorLanguage,
124 }: {
125 translatorLanguage: string;
126 }) => string;
31 openLinkUrl: () => string; 127 openLinkUrl: () => string;
32 openLinkInFerdiumUrl: () => string; 128 openLinkInFerdiumUrl: () => string;
33 openInBrowser: () => string; 129 openInBrowser: () => string;
@@ -52,6 +148,10 @@ const contextMenuStringTable: ContextMenuStringTable = {
52 paste: () => 'Paste', 148 paste: () => 'Paste',
53 pasteAndMatchStyle: () => 'Paste and match style', 149 pasteAndMatchStyle: () => 'Paste and match style',
54 searchWith: ({ searchEngine }) => `Search with ${searchEngine}`, 150 searchWith: ({ searchEngine }) => `Search with ${searchEngine}`,
151 translate: () => `Translate to ...`,
152 quickTranslate: ({ translatorLanguage }) =>
153 `Translate to ${translatorLanguage}`,
154 translateLanguage: ({ translatorLanguage }) => `${translatorLanguage}`,
55 openLinkUrl: () => 'Open Link', 155 openLinkUrl: () => 'Open Link',
56 openLinkInFerdiumUrl: () => 'Open Link in Ferdium', 156 openLinkInFerdiumUrl: () => 'Open Link in Ferdium',
57 openInBrowser: () => 'Open in Browser', 157 openInBrowser: () => 'Open in Browser',
@@ -127,7 +227,7 @@ export class ContextMenuBuilder {
127 * 227 *
128 * @param contextInfo The object returned from the 'context-menu' Electron event. 228 * @param contextInfo The object returned from the 'context-menu' Electron event.
129 */ 229 */
130 async showPopupMenu(contextInfo: Electron.ContextMenuParams): Promise<void> { 230 async showPopupMenu(contextInfo: IContextMenuParams): Promise<void> {
131 const menu = await this.buildMenuForElement(contextInfo); 231 const menu = await this.buildMenuForElement(contextInfo);
132 if (!menu) return; 232 if (!menu) return;
133 menu.popup(); 233 menu.popup();
@@ -139,7 +239,7 @@ export class ContextMenuBuilder {
139 * the list but use most of the default behavior. 239 * the list but use most of the default behavior.
140 */ 240 */
141 async buildMenuForElement( 241 async buildMenuForElement(
142 info: Electron.ContextMenuParams, 242 info: IContextMenuParams,
143 ): Promise<Electron.CrossProcessExports.Menu> { 243 ): Promise<Electron.CrossProcessExports.Menu> {
144 if (info.linkURL && info.linkURL.length > 0) { 244 if (info.linkURL && info.linkURL.length > 0) {
145 return this.buildMenuForLink(info); 245 return this.buildMenuForLink(info);
@@ -165,12 +265,17 @@ export class ContextMenuBuilder {
165 * @return {Menu} The `Menu` 265 * @return {Menu} The `Menu`
166 */ 266 */
167 buildMenuForTextInput( 267 buildMenuForTextInput(
168 menuInfo: Electron.ContextMenuParams, 268 menuInfo: IContextMenuParams,
169 ): Electron.CrossProcessExports.Menu { 269 ): Electron.CrossProcessExports.Menu {
170 const menu = new Menu(); 270 const menu = new Menu();
171 271
272 const { enableTranslator } = menuInfo;
273
172 this.addSpellingItems(menu, menuInfo); 274 this.addSpellingItems(menu, menuInfo);
173 this.addSearchItems(menu, menuInfo); 275 this.addSearchItems(menu, menuInfo);
276 if (enableTranslator) {
277 this.addTranslateItems(menu, menuInfo);
278 }
174 279
175 this.addCut(menu, menuInfo); 280 this.addCut(menu, menuInfo);
176 this.addCopy(menu, menuInfo); 281 this.addCopy(menu, menuInfo);
@@ -194,7 +299,7 @@ export class ContextMenuBuilder {
194 * @return {Menu} The `Menu` 299 * @return {Menu} The `Menu`
195 */ 300 */
196 buildMenuForLink( 301 buildMenuForLink(
197 menuInfo: Electron.ContextMenuParams, 302 menuInfo: IContextMenuParams,
198 ): Electron.CrossProcessExports.Menu { 303 ): Electron.CrossProcessExports.Menu {
199 const menu = new Menu(); 304 const menu = new Menu();
200 const isEmailAddress = menuInfo.linkURL.startsWith('mailto:'); 305 const isEmailAddress = menuInfo.linkURL.startsWith('mailto:');
@@ -208,7 +313,6 @@ export class ContextMenuBuilder {
208 const url = isEmailAddress ? menuInfo.linkText : menuInfo.linkURL; 313 const url = isEmailAddress ? menuInfo.linkText : menuInfo.linkURL;
209 clipboard.writeText(url); 314 clipboard.writeText(url);
210 this._sendNotificationOnClipboardEvent( 315 this._sendNotificationOnClipboardEvent(
211 // @ts-expect-error Property 'clipboardNotifications' does not exist on type 'ContextMenuParams'.
212 menuInfo.clipboardNotifications, 316 menuInfo.clipboardNotifications,
213 () => `Link URL copied: ${url}`, 317 () => `Link URL copied: ${url}`,
214 ); 318 );
@@ -257,11 +361,16 @@ export class ContextMenuBuilder {
257 * Builds a menu applicable to a text field. 361 * Builds a menu applicable to a text field.
258 */ 362 */
259 buildMenuForText( 363 buildMenuForText(
260 menuInfo: Electron.ContextMenuParams, 364 menuInfo: IContextMenuParams,
261 ): Electron.CrossProcessExports.Menu { 365 ): Electron.CrossProcessExports.Menu {
262 const menu = new Menu(); 366 const menu = new Menu();
263 367
368 const { enableTranslator } = menuInfo;
369
264 this.addSearchItems(menu, menuInfo); 370 this.addSearchItems(menu, menuInfo);
371 if (enableTranslator) {
372 this.addTranslateItems(menu, menuInfo);
373 }
265 this.addCopy(menu, menuInfo); 374 this.addCopy(menu, menuInfo);
266 this.addInspectElement(menu, menuInfo); 375 this.addInspectElement(menu, menuInfo);
267 // @ts-expect-error Expected 1 arguments, but got 2. 376 // @ts-expect-error Expected 1 arguments, but got 2.
@@ -283,7 +392,7 @@ export class ContextMenuBuilder {
283 * @return {Menu} The `Menu` 392 * @return {Menu} The `Menu`
284 */ 393 */
285 buildMenuForImage( 394 buildMenuForImage(
286 menuInfo: Electron.ContextMenuParams, 395 menuInfo: IContextMenuParams,
287 ): Electron.CrossProcessExports.Menu { 396 ): Electron.CrossProcessExports.Menu {
288 const menu = new Menu(); 397 const menu = new Menu();
289 398
@@ -303,7 +412,7 @@ export class ContextMenuBuilder {
303 */ 412 */
304 addSpellingItems( 413 addSpellingItems(
305 menu: Electron.CrossProcessExports.Menu, 414 menu: Electron.CrossProcessExports.Menu,
306 menuInfo: Electron.ContextMenuParams, 415 menuInfo: IContextMenuParams,
307 ) { 416 ) {
308 const webContents = this.getWebContents(); 417 const webContents = this.getWebContents();
309 // Add each spelling suggestion 418 // Add each spelling suggestion
@@ -338,7 +447,7 @@ export class ContextMenuBuilder {
338 */ 447 */
339 addSearchItems( 448 addSearchItems(
340 menu: Electron.CrossProcessExports.Menu, 449 menu: Electron.CrossProcessExports.Menu,
341 menuInfo: Electron.ContextMenuParams, 450 menuInfo: IContextMenuParams,
342 ) { 451 ) {
343 if (!menuInfo.selectionText || menuInfo.selectionText.length === 0) { 452 if (!menuInfo.selectionText || menuInfo.selectionText.length === 0) {
344 return menu; 453 return menu;
@@ -364,11 +473,9 @@ export class ContextMenuBuilder {
364 473
365 const search = new MenuItem({ 474 const search = new MenuItem({
366 label: this.stringTable.searchWith({ 475 label: this.stringTable.searchWith({
367 // @ts-expect-error Property 'searchEngine' does not exist on type 'ContextMenuParams'.
368 searchEngine: SEARCH_ENGINE_NAMES[menuInfo.searchEngine], 476 searchEngine: SEARCH_ENGINE_NAMES[menuInfo.searchEngine],
369 }), 477 }),
370 click: () => { 478 click: () => {
371 // @ts-expect-error Property 'searchEngine' does not exist on type 'ContextMenuParams'.
372 const url = SEARCH_ENGINE_URLS[menuInfo.searchEngine]({ 479 const url = SEARCH_ENGINE_URLS[menuInfo.searchEngine]({
373 searchTerm: encodeURIComponent(menuInfo.selectionText), 480 searchTerm: encodeURIComponent(menuInfo.selectionText),
374 }); 481 });
@@ -382,7 +489,106 @@ export class ContextMenuBuilder {
382 return menu; 489 return menu;
383 } 490 }
384 491
385 isSrcUrlValid(menuInfo: Electron.ContextMenuParams) { 492 /**
493 * Adds translate-related menu items.
494 */
495 addTranslateItems(
496 menu: Electron.CrossProcessExports.Menu,
497 menuInfo: IContextMenuParams,
498 ) {
499 const { translatorEngine } = menuInfo;
500
501 if (!menuInfo.selectionText || menuInfo.selectionText.length === 0) {
502 return menu;
503 }
504
505 const match = matchesWord(menuInfo.selectionText);
506 if (!match || match.length === 0) {
507 return menu;
508 }
509
510 const generateTranslationItems = async (
511 translateToLanguage: string,
512 translatorEngine: string,
513 ) => {
514 // TODO: Need to support i18n
515 translatePopup('Loading...', false);
516
517 const translatedText = await ipcRenderer.invoke('translate', {
518 text: menuInfo.selectionText,
519 translateToLanguage,
520 translatorEngine,
521 });
522
523 translatePopup(translatedText.text, translatedText.error);
524 };
525
526 let arrayLanguagesAfterEngine;
527 if (translatorEngine === TRANSLATOR_ENGINE_LIBRETRANSLATE) {
528 arrayLanguagesAfterEngine = LIBRETRANSLATE_TRANSLATOR_LANGUAGES;
529 } else if (translatorEngine === TRANSLATOR_ENGINE_GOOGLE) {
530 arrayLanguagesAfterEngine = GOOGLE_TRANSLATOR_LANGUAGES;
531 }
532
533 const arrayLanguages = Object.keys(arrayLanguagesAfterEngine).map(
534 code => arrayLanguagesAfterEngine[code],
535 );
536
537 const menuLanguages = new Menu();
538
539 const getLanguageCode = (obj, val): string =>
540 Object.keys(obj).find(key => obj[key] === val)!;
541
542 for (const language in arrayLanguages) {
543 if (arrayLanguages[language]) {
544 const languageItem = new MenuItem({
545 label: this.stringTable.translateLanguage({
546 translatorLanguage: arrayLanguages[language],
547 }),
548 click: () => {
549 const translateToLanguageCode = getLanguageCode(
550 arrayLanguagesAfterEngine,
551 arrayLanguages[language],
552 );
553 generateTranslationItems(translateToLanguageCode, translatorEngine);
554 },
555 });
556 menuLanguages.append(languageItem);
557 }
558 }
559
560 const translateToLanguage =
561 arrayLanguagesAfterEngine[menuInfo.translatorLanguage];
562
563 const translateToLanguageCode = getLanguageCode(
564 arrayLanguagesAfterEngine,
565 translateToLanguage,
566 );
567 const quickTranslateItem = new MenuItem({
568 label: this.stringTable.quickTranslate({
569 translatorLanguage: translateToLanguage,
570 }),
571 click: () => {
572 generateTranslationItems(translateToLanguageCode, translatorEngine);
573 },
574 });
575
576 const translateItem = new MenuItem({
577 label: this.stringTable.translate(),
578 submenu: menuLanguages,
579 click: () => {
580 generateTranslationItems(translateToLanguageCode, translatorEngine);
581 },
582 });
583
584 menu.append(translateItem);
585 menu.append(quickTranslateItem);
586 this.addSeparator(menu);
587
588 return menu;
589 }
590
591 isSrcUrlValid(menuInfo: IContextMenuParams) {
386 return menuInfo.srcURL && menuInfo.srcURL.length > 0; 592 return menuInfo.srcURL && menuInfo.srcURL.length > 0;
387 } 593 }
388 594
@@ -391,7 +597,7 @@ export class ContextMenuBuilder {
391 */ 597 */
392 addImageItems( 598 addImageItems(
393 menu: Electron.CrossProcessExports.Menu, 599 menu: Electron.CrossProcessExports.Menu,
394 menuInfo: Electron.ContextMenuParams, 600 menuInfo: IContextMenuParams,
395 ) { 601 ) {
396 const copyImage = new MenuItem({ 602 const copyImage = new MenuItem({
397 label: this.stringTable.copyImage(), 603 label: this.stringTable.copyImage(),
@@ -403,7 +609,6 @@ export class ContextMenuBuilder {
403 ); 609 );
404 610
405 this._sendNotificationOnClipboardEvent( 611 this._sendNotificationOnClipboardEvent(
406 // @ts-expect-error Property 'clipboardNotifications' does not exist on type 'ContextMenuParams'.
407 menuInfo.clipboardNotifications, 612 menuInfo.clipboardNotifications,
408 () => `Image copied from URL: ${menuInfo.srcURL}`, 613 () => `Image copied from URL: ${menuInfo.srcURL}`,
409 ); 614 );
@@ -418,7 +623,6 @@ export class ContextMenuBuilder {
418 click: () => { 623 click: () => {
419 const result = clipboard.writeText(menuInfo.srcURL); 624 const result = clipboard.writeText(menuInfo.srcURL);
420 this._sendNotificationOnClipboardEvent( 625 this._sendNotificationOnClipboardEvent(
421 // @ts-expect-error Property 'clipboardNotifications' does not exist on type 'ContextMenuParams'.
422 menuInfo.clipboardNotifications, 626 menuInfo.clipboardNotifications,
423 () => `Image URL copied: ${menuInfo.srcURL}`, 627 () => `Image URL copied: ${menuInfo.srcURL}`,
424 ); 628 );
@@ -446,7 +650,6 @@ export class ContextMenuBuilder {
446 }); 650 });
447 }); 651 });
448 this._sendNotificationOnClipboardEvent( 652 this._sendNotificationOnClipboardEvent(
449 // @ts-expect-error Property 'clipboardNotifications' does not exist on type 'ContextMenuParams'.
450 menuInfo.clipboardNotifications, 653 menuInfo.clipboardNotifications,
451 () => `Image downloaded: ${urlWithoutBlob}`, 654 () => `Image downloaded: ${urlWithoutBlob}`,
452 ); 655 );
@@ -464,7 +667,7 @@ export class ContextMenuBuilder {
464 */ 667 */
465 addCut( 668 addCut(
466 menu: Electron.CrossProcessExports.Menu, 669 menu: Electron.CrossProcessExports.Menu,
467 menuInfo: Electron.ContextMenuParams, 670 menuInfo: IContextMenuParams,
468 ) { 671 ) {
469 const webContents = this.getWebContents(); 672 const webContents = this.getWebContents();
470 menu.append( 673 menu.append(
@@ -484,7 +687,7 @@ export class ContextMenuBuilder {
484 */ 687 */
485 addCopy( 688 addCopy(
486 menu: Electron.CrossProcessExports.Menu, 689 menu: Electron.CrossProcessExports.Menu,
487 menuInfo: Electron.ContextMenuParams, 690 menuInfo: IContextMenuParams,
488 ) { 691 ) {
489 const webContents = this.getWebContents(); 692 const webContents = this.getWebContents();
490 menu.append( 693 menu.append(
@@ -504,7 +707,7 @@ export class ContextMenuBuilder {
504 */ 707 */
505 addPaste( 708 addPaste(
506 menu: Electron.CrossProcessExports.Menu, 709 menu: Electron.CrossProcessExports.Menu,
507 menuInfo: Electron.ContextMenuParams, 710 menuInfo: IContextMenuParams,
508 ) { 711 ) {
509 const webContents = this.getWebContents(); 712 const webContents = this.getWebContents();
510 menu.append( 713 menu.append(
@@ -521,7 +724,7 @@ export class ContextMenuBuilder {
521 724
522 addPastePlain( 725 addPastePlain(
523 menu: Electron.CrossProcessExports.Menu, 726 menu: Electron.CrossProcessExports.Menu,
524 menuInfo: Electron.ContextMenuParams, 727 menuInfo: IContextMenuParams,
525 ) { 728 ) {
526 if ( 729 if (
527 menuInfo.editFlags.canPaste && 730 menuInfo.editFlags.canPaste &&
@@ -552,7 +755,7 @@ export class ContextMenuBuilder {
552 */ 755 */
553 addInspectElement( 756 addInspectElement(
554 menu: Electron.CrossProcessExports.Menu, 757 menu: Electron.CrossProcessExports.Menu,
555 menuInfo: Electron.ContextMenuParams, 758 menuInfo: IContextMenuParams,
556 needsSeparator = true, 759 needsSeparator = true,
557 ) { 760 ) {
558 const webContents = this.getWebContents(); 761 const webContents = this.getWebContents();
@@ -609,6 +812,7 @@ export class ContextMenuBuilder {
609 */ 812 */
610 goBack(menu: Electron.CrossProcessExports.Menu) { 813 goBack(menu: Electron.CrossProcessExports.Menu) {
611 const webContents = this.getWebContents(); 814 const webContents = this.getWebContents();
815
612 menu.append( 816 menu.append(
613 new MenuItem({ 817 new MenuItem({
614 label: this.stringTable.goBack(), 818 label: this.stringTable.goBack(),
@@ -643,7 +847,7 @@ export class ContextMenuBuilder {
643 */ 847 */
644 copyPageUrl( 848 copyPageUrl(
645 menu: Electron.CrossProcessExports.Menu, 849 menu: Electron.CrossProcessExports.Menu,
646 menuInfo: Electron.ContextMenuParams, 850 menuInfo: IContextMenuParams,
647 ) { 851 ) {
648 menu.append( 852 menu.append(
649 new MenuItem({ 853 new MenuItem({
@@ -652,7 +856,6 @@ export class ContextMenuBuilder {
652 click: () => { 856 click: () => {
653 clipboard.writeText(window.location.href); 857 clipboard.writeText(window.location.href);
654 this._sendNotificationOnClipboardEvent( 858 this._sendNotificationOnClipboardEvent(
655 // @ts-expect-error Property 'clipboardNotifications' does not exist on type 'ContextMenuParams'.
656 menuInfo?.clipboardNotifications, 859 menuInfo?.clipboardNotifications,
657 () => `Page URL copied: ${window.location.href}`, 860 () => `Page URL copied: ${window.location.href}`,
658 ); 861 );
@@ -668,7 +871,7 @@ export class ContextMenuBuilder {
668 */ 871 */
669 goToHomePage( 872 goToHomePage(
670 menu: Electron.CrossProcessExports.Menu, 873 menu: Electron.CrossProcessExports.Menu,
671 menuInfo: Electron.ContextMenuParams, 874 menuInfo: IContextMenuParams,
672 ) { 875 ) {
673 const baseURL = new window.URL(menuInfo.pageURL); 876 const baseURL = new window.URL(menuInfo.pageURL);
674 menu.append( 877 menu.append(
@@ -691,7 +894,7 @@ export class ContextMenuBuilder {
691 */ 894 */
692 openInBrowser( 895 openInBrowser(
693 menu: Electron.CrossProcessExports.Menu, 896 menu: Electron.CrossProcessExports.Menu,
694 menuInfo: Electron.ContextMenuParams, 897 menuInfo: IContextMenuParams,
695 ) { 898 ) {
696 menu.append( 899 menu.append(
697 new MenuItem({ 900 new MenuItem({
diff --git a/src/webview/recipe.js b/src/webview/recipe.js
index 8c93da202..acf4f9f31 100644
--- a/src/webview/recipe.js
+++ b/src/webview/recipe.js
@@ -188,6 +188,9 @@ class RecipeController {
188 () => this.spellcheckerLanguage, 188 () => this.spellcheckerLanguage,
189 () => this.settings.app.searchEngine, 189 () => this.settings.app.searchEngine,
190 () => this.settings.app.clipboardNotifications, 190 () => this.settings.app.clipboardNotifications,
191 () => this.settings.app.enableTranslator,
192 () => this.settings.app.translatorEngine,
193 () => this.settings.app.translatorLanguage,
191 ); 194 );
192 195
193 autorun(() => this.update()); 196 autorun(() => this.update());
@@ -293,6 +296,9 @@ class RecipeController {
293 ); 296 );
294 debug('darkReaderSettigs', this.settings.service.darkReaderSettings); 297 debug('darkReaderSettigs', this.settings.service.darkReaderSettings);
295 debug('searchEngine', this.settings.app.searchEngine); 298 debug('searchEngine', this.settings.app.searchEngine);
299 debug('enableTranslator', this.settings.app.enableTranslator);
300 debug('translatorEngine', this.settings.app.translatorEngine);
301 debug('translatorLanguage', this.settings.app.translatorLanguage);
296 302
297 if (this.userscript && this.userscript.internal_setSettings) { 303 if (this.userscript && this.userscript.internal_setSettings) {
298 this.userscript.internal_setSettings(this.settings); 304 this.userscript.internal_setSettings(this.settings);